私は主にエディターとしてvim / gvimを使用しており、カーネルソースの調査にlxr(Linuxクロスリファレンス)とcscopeまたはctagsの組み合わせを使用することを検討しています。ただし、cscopeもctagsも使用したことがないので、vimをプライマリエディタとして使用することを考慮して、なぜ一方を他方よりも選択するのかについて聞きたいと思います。
私は主にエディターとしてvim / gvimを使用しており、カーネルソースの調査にlxr(Linuxクロスリファレンス)とcscopeまたはctagsの組み合わせを使用することを検討しています。ただし、cscopeもctagsも使用したことがないので、vimをプライマリエディタとして使用することを考慮して、なぜ一方を他方よりも選択するのかについて聞きたいと思います。
回答:
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はより多くの機能を提供しますが、より多くの脚の作業が必要です。
cscopetag
(cst
)を使用して:tag
、CTRL-]
最初にcscopeを検索し、次にタグを付けます
g C-]
は名前に一致するタグのリストを表示します。それでも、探している適切な定義を手動で見つける必要があります。
私は数ヶ月前に同じ状況でした...
ctagsの精度の欠如はa ..の苦痛であり、すべてのマクロ関連のものに対してcscopeの方がはるかに優れていることがわかります(Linuxカーネルには多数のマクロがあります)。
使用方法に関しては、それは実際には簡単です...カーネルのルートでcscope -Rと入力するだけで、心配することは何もありません。
次に、キーバインディングはすべてCtrl- \に基づいています(Ctrlにアレルギーがある場合は再マッピングできます)。主にsとgを使用します。
カーネル用に開発していたので、それほどの完成度は必要ありませんでした...
とにかく、cscopeを使用してください。これははるかに便利で正確です。
うーん...あなたはおそらくctagsの代わりにetagsを使うべきです...
cscopeを使用すると、呼び出しチェーンを確認できます。つまり、誰がこの関数を呼び出し、どの関数がこの関数を呼び出しますか?
これがetags / ctagsを使用して実行できるかどうかはわかりません...
これは1つの機能にすぎません...特定の関数定義を含むファイルを見つけるのはどうですか?これはcscopeでのみ取得できます。
私はcscopeとetagの両方を使用していますが、特にLinuxカーネルなどの大規模なコードベースで作業する場合は、どちらも異なる目的に適しています。実際、Linux Kernel / Xenを使い始めたとき、cscopeとetagsを使い始めました。
LXRは素晴らしいものではありません。クリックしたり、ネットワーク経由で移動したりする必要があるためです。一方、カーネルコードでcscopeおよびタグデータベースを構築でき、ネットワーク経由で移動する必要はありません(lxrとは異なります)。
make tags
カーネルのルートディレクトリで行って、ジャンプして遊んでいましたが、ほとんどの場合、間違った場所に行き着きました。私はctagsがcプリプロセッサに問題があることを読みましたが、ctagsがlxrで使用されていることを考えると、明らかにできることがあるはずです。