質問

私は主に vim / gvim をエディタとして使用しており、以下の組み合わせの使用を検討しています。 lxr (Linux 相互参照) そしてどちらか cスコープ または クタグ カーネルソースを探索するため。ただし、どちらも使ったことはありません cスコープ または クタグ 私の主なエディターとして vim を使用していることを考慮して、なぜ一方を他方よりも選択するのかを聞きたいです。

役に立ちましたか?

解決

ctag は 2 つの機能を有効にします。関数呼び出しからその定義にジャンプし、オムニ補完を行うことができます。1 つ目は、メソッドの呼び出しを終了したときに、 g] または CTRL-] そのメソッドが定義または実装されている場所にジャンプします。2 番目の機能は、次のことを意味します。 foo. または foo->, foo が構造体の場合、フィールド補完を含むポップアップ メニューが表示されます。

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

したがって、コードベースを飛び回ることに関する限り、ctag は関数が実装されている場所にのみ誘導しますが、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 検索を 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 を使用してください。これははるかに便利で正確です。

ふーむ...おそらく ctag の代わりに etag を使用する必要があります...

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

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

それはほんの 1 つの特徴です...特定の関数定義を含むファイルを見つけるのはどうでしょうか?これは cscope でのみ取得できます。

私が使う 両方 cscope と etag はどちらも、特に Linux カーネルなどの大規模なコードベースを扱う場合に、さまざまな用途に適しています。実際、私は Linux カーネル / Xen を使い始めたときに cscope と etags を使い始めました。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top