cscopeまたはctagsを選択する理由 [閉まっている]


130

私は主にエディターとしてvim / gvimを使用しており、カーネルソースの調査にlxr(Linuxクロスリファレンス)cscopeまたはctagsの組み合わせを使用することを検討しています。ただし、cscopectagsも使用したことがないので、vimをプライマリエディタとして使用することを考慮して、なぜ一方を他方よりも選択するのかについて聞きたいと思います。

回答:


156

ctagsは2つの機能を有効にします。関数呼び出しからその定義にジャンプできるようにすることと、オムニ補完です。あなたがメソッドの呼び出しを超えているとき、打つことを第一の手段g]またはCTRL-]そのメソッドが定義または実装されている場所にジャンプします。2番目の機能は、foo.またはを入力したときにfoo->、fooが構造体である場合、フィールド補完のあるポップアップメニューが表示されることを意味します。

cscopeには、最初の機能(使用)もありますset cscopetagが、最後の機能はありません。ただし、cscopeには、関数が呼び出された場所にジャンプする機能も追加されています。

したがって、コードベースをジャンプすることに関する限り、ctagsは関数が実装されている場所にあなたを導くだけですが、cscopeは関数が呼び出されている場所も示すことができます。

なぜどちらを選ぶのですか?まあ、私は両方を使用しています。ctagsは設定が簡単で、実行が高速です。1つの方向にジャンプするだけの場合は、表示される行が少なくなります。あなたはただ走ることができて:!ctags -R .、そしてg]ちょうど働きます。また、そのオムニ完全なことを可能にします。

Cscopeは、大きくて未知のコードベースに最適です。cscopeが解析するファイルの名前のリストを含むファイルを必要とするため、セットアップは面倒です。また、vimでは、デフォルトでキーバインディングは設定されていません:cscope blah blah。手動で実行する必要があります。

最初の問題を解決するために、cscope_gen.sh次のようなbashスクリプトを用意しました。

#!/bin/sh
find . -name '*.py' \
-o -name '*.java' \
-o -iname '*.[CH]' \
-o -name '*.cpp' \
-o -name '*.cc' \
-o -name '*.hpp'  \
> cscope.files

# -b: just build
# -q: create inverted index
cscope -b -q

これにより、興味のあるコードが検索され、cscope.filesリストが作成され、データベースが作成されます。そうすれば、すべてのセットアップ手順を覚える必要がなく、「:! cscope_gen.sh」を実行できます。

次のスニペットを使用して、cscope検索をctrl-space x 2にマッピングします。これにより、cscopeの他のダウンが軽減されます。

nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>

同様のバインディングの束をセットアップするこのcscope_maps.vimプラグインがあります。すべてのオプションの意味を思い出せないので、ctrl-spaceを使用する傾向があります。

つまり、ctagsの方が設定が簡単で、ほとんど何もしなくても機能します。オムニコンプリートにも不可欠です。大規模でほとんど未知のコードベースを維持する必要がある場合、cscopeはより多くの機能を提供しますが、より多くの脚の作業が必要です。


2
ctagsをより正確にする方法はありますか?私はmake tagsカーネルのルートディレクトリで行って、ジャンプして遊んでいましたが、ほとんどの場合、間違った場所に行き着きました。私はctagsがcプリプロセッサに問題があることを読みましたが、ctagsがlxrで使用されていることを考えると、明らかにできることがあるはずです。
ロバートS.バーンズ

2
深いマクロブードゥー教がある場合、ctagsのはおそらく失敗します:-(私は主に、物事の側にあまり依存しているC ++のもの、のためにそれを使用する(つまり、独自の問題を抱えているのに...)
richq

12
set cscopetagcst)を使用して:tagCTRL-]最初にcscopeを検索し、次にタグを付けます
Hasturkun

1
また、ctagsは再帰検索がかなり遅く、「ctags -L cscope.files」を使用するとタグの生成が大幅に高速化されます。
アーロンH.

1
@ RobertS.Barnesのある種のソリューションはを使用しています。vim g C-]は名前に一致するタグのリストを表示します。それでも、探している適切な定義を手動で見つける必要があります。
Hubert Kario、2012年

15

私は数ヶ月前に同じ状況でした...

ctagsの精度の欠如はa ..の苦痛であり、すべてのマクロ関連のものに対してcscopeの方がはるかに優れていることがわかります(Linuxカーネルには多数のマクロがあります)。

使用方法に関しては、それは実際には簡単です...カーネルのルートでcscope -Rと入力するだけで、心配することは何もありません。

次に、キーバインディングはすべてCtrl- \に基づいています(Ctrlにアレルギーがある場合は再マッピングできます)。主にsとgを使用します。

カーネル用に開発していたので、それほどの完成度は必要ありませんでした...

とにかく、cscopeを使用してください。これははるかに便利で正確です。


4
<<カーネルのルートでcscope -Rと入力するだけです。カーネルの下で「make cscope」と入力する方がよいでしょう。そうしないと、Linuxカーネルに存在するすべてのアーキテクチャになり、同じCシンボルに複数の定義ができてしまいます。
kumar 2014

4

うーん...あなたはおそらくctagsの代わりにetagsを使うべきです...

cscopeを使用すると、呼び出しチェーンを確認できます。つまり、誰がこの関数を呼び出し、どの関数がこの関数を呼び出しますか?

これがetags / ctagsを使用して実行できるかどうかはわかりません...

これは1つの機能にすぎません...特定の関数定義を含むファイルを見つけるのはどうですか?これはcscopeでのみ取得できます。

私はcscopeとetagの両方を使用していますが、特にLinuxカーネルなどの大規模なコードベースで作業する場合は、どちらも異なる目的に適しています。実際、Linux Kernel / Xenを使い始めたとき、cscopeとetagsを使い始めました。

LXRは素晴らしいものではありません。クリックしたり、ネットワーク経由で移動したりする必要があるためです。一方、カーネルコードでcscopeおよびタグデータベースを構築でき、ネットワーク経由で移動する必要はありません(lxrとは異なります)。


etagsはEmacs専用ではありませんか?私はg / vimのみを使用しています。
ロバートS.バーンズ

はい、そうです。manページから:etagsプログラムを使用して、emacs(1)が理解できる形式でタグテーブルファイルを作成します。ctagsプログラムは、vi(1)が理解できる形式で同様のテーブルを作成するために使用されます。
rmk 09

1
私が信じているetagsとctagsには2つのフレーバーがあります。1つはemacsで、もう1つは活発なctagsです。最初のものは最初にemacs用に作成されましたが、viにも使用できます。2つ目は、最初はvi用に作成されましたが、emacsにも使用できます。私はemacsユーザーですが、2つ目(熱狂的なctags)の方が使いやすいと思います。exuberant-ctagsパッケージをインストールすると、etags / ctagsバイナリへのリンクが変更され、別のバイナリをポイントします。
ustun

1

グローバルgtagの使用を提案します。vimプラグインgen_tagsを使用してgtagsをvimに統合できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.