1. ホーム
  2. vim

[解決済み] cscopeとctags、どちらを選ぶべきですか?[クローズド]

2022-05-24 14:20:24

質問

私は主にエディタとしてvim / gvimを使用しており、以下の組み合わせを使用することを検討しています。 lxr (Linuxクロスリファレンス) cscope または ctags を使ってカーネルソースを探索することができます。 しかし、私はこれまで cscope または ctags のどちらかを選択し、私が主要なエディタとしてvimを使用していることを考慮した上で、どちらかを選択する理由を聞きたいと思います。

どのように解決するのですか?

ctags は、関数の呼び出しからその定義にジャンプできるようにすることと、オムニ補完の2つの機能を可能にします。最初の機能は、メソッドの呼び出しの上にいるときに g] または CTRL-] と入力すると、そのメソッドが定義または実装されている場所にジャンプします。二つ目の特徴は foo. または foo-> で、fooが構造体であれば、フィールド補完のポップアップメニューが表示されます。

cscope はまた、最初の機能である set cscopetag - を使うという最初の機能は持っていますが、最後の機能は持っていません。しかし、cscopeはさらに、関数が呼び出された場所のいずれかにジャンプする機能も追加しています。

コードベースを飛び回ることに関して言えば、ctags は関数が実装されている場所にしかたどり着けませんが、cscope は関数が呼び出されている場所も表示することができます。

なぜどちらかを選ぶのでしょうか?ctags はセットアップが簡単で、実行速度も速く、一方的にジャンプすることにしか関心がなければ、より少ない行数で表示されます。単に :!ctags -R .g] が使えるようになります。また、オムニ・コンプリートということも可能になります。

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

まず第一の問題を解決するために、私はbashスクリプトを用意しました。 cscope_gen.sh を実行すると、次のようになります。

#!/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 search を ctrl-space x 2 にマップして、cscope のもう一つの欠点を緩和しています。

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

そこに この cscope_maps.vim プラグインは があり、似たようなバインディングの束をセットアップしてくれます。私はすべてのオプションの意味を覚えていないので、Ctrl-spaceに固執する傾向があります。

結論から言うと、ctags はセットアップが簡単で、ほとんど何もしなくても動きますし、omni-complete にも不可欠です。