私は主に vim / gvim をエディターとして使用しており、lxr (Linux クロス リファレンス)とcscopeまたはctagsを組み合わせてカーネル ソースを探索することを検討しています。ただし、cscopeもctagsも使用したことがないので、主なエディターとしての vim の使用を考慮して、どちらか一方を選択する理由を知りたいと思います。
4 に答える
ctags は 2 つの機能を有効にします: 関数呼び出しからその定義へのジャンプを可能にし、オムニ補完を可能にします。1 つ目は、メソッドの呼び出し中にg]
orCTRL-]
を押すと、そのメソッドが定義または実装されている場所にジャンプすることを意味します。2 番目の機能は、foo.
またはを入力するfoo->
と、foo が構造体の場合、フィールド補完を含むポップアップ メニューが表示されることを意味します。
cscope には最初の機能である using もありますがset cscopetag
、最後の機能はありません。ただし、cscope はさらに、関数が呼び出された任意の場所にジャンプする機能も追加します。
したがって、コード ベースを飛び回る限り、ctags は関数が実装されている場所にしか誘導しませんが、cscope は関数が呼び出された場所も表示できます。
なぜあなたはどちらかを選ぶのですか?そうですね、両方使ってます。ctags はセットアップが簡単で、実行が速く、一方向にジャンプすることだけを気にする場合は、表示される行が少なくなります。実行するだけ:!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 のもう 1 つの欠点が軽減されます。
nmap <C-@><C-@> :cs find s <C-R>=expand("<cword>")<CR><CR>
一連の同様のバインディングをセットアップするcscope_maps.vim プラグインがあります。すべてのオプションが何を意味するのか思い出せないので、ctrl-space に固執する傾向があります。
結論として、ctags は設定が簡単で、他に何もしなくてもほとんど機能します。オムニコンプリートにも不可欠です。cscope は、大規模でほとんど知られていないコード ベースを維持する必要がある場合に、より多くの機能を提供しますが、より多くの作業が必要になります。
私も数ヶ月前に同じ状況でした...
ctags の精度の欠如は苦痛であり、cscope はすべてのマクロ関連のものに対してはるかに優れていることがわかります (Linux カーネルには多数のマクロがあります)。
使用法に関しては、実際には簡単です...カーネルのルートで cscope -R と入力するだけで、何も心配する必要はありません..(つまり、探索したいだけなら完璧です...)
次に、キー バインドはすべて Ctrl-\ に基づいています (Ctrl にアレルギーがある場合は、再マップできます)。主に s と g を使用します。
カーネル用に開発していたので、完成形はあまり必要ありませんでした....
とにかく、cscope を選んでください。これははるかに便利で正確です。
うーん...おそらくctagsの代わりにetagsを使用する必要があります...
cscopeを使用すると、コールチェーン、つまり、誰がこの関数を呼び出し、この関数がどの関数を呼び出すかを確認できます。
これがetags/ctagsを使用して実行できるかどうかはわかりません...
これは1つの機能にすぎません...特定の関数定義を含むファイルを見つけるのはどうですか?これはcscopeでのみ取得できます。
私はcscopeとetagsの両方を使用していますが、特にLinuxカーネルなどの大規模なコードベースで作業する場合は、どちらもさまざまな用途に適しています。実際、Linux Kernel / Xenを使い始めたとき、cscopeとetagsを使い始めました。
LXRは、クリックしたり、ネットワークを経由したりする必要があるため、優れていませんが、カーネルコード上にcscopeおよびtagsデータベースを構築でき、ネットワークを経由する必要はありません(lxrとは異なります)。