web-dev-qa-db-ja.com

cscopeまたはctagsで、どちらを選択するのですか?

私は主にvim/gvimをエディターとして使用し、 lxr(Linux Cross Reference)cscope または ctags の組み合わせの使用を検討していますカーネルソースを探索するため。ただし、 cscope または ctags のいずれも使用したことがないため、vimをプライマリエディタとして使用することを考慮して、一方を選択する理由を知りたいと思います。 。

127

ctagsは、関数呼び出しから定義へのジャンプとオムニ補完の2つの機能を有効にします。最初の方法は、メソッドの呼び出しを終えたときに、g]またはCTRL-]を押すと、そのメソッドが定義または実装されている場所にジャンプすることを意味します。 2番目の機能は、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検索をctrl-space x 2にマッピングします。これにより、cscopeの他のダウナーが軽減されます。

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

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

結論として、ctagsはセットアップが簡単で、ほとんど何もせずに機能します。オムニコンプリートにとっても重要です。大規模でほとんど未知のコードベースを維持する必要がある場合、cscopeはより多くの機能を提供しますが、より多くの作業が必要です。

150
richq

私は数ヶ月前に同じ状況にありました...

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

使用法については、実際には簡単です...カーネルのルートでcscope -Rと入力するだけで、心配する必要はありません。

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

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

とにかく、cscopeに行くと、これははるかに便利で正確です。

15
LB40

うーん...おそらくctagsの代わりにetagsを使用する必要があります...

Cscopeを使用する場合、コールチェーン、つまり、この関数を誰が呼び出し、どの関数がこの関数を呼び出すのかを確認できますか?

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

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

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

LXRはあまりよくありません。クリックするか、ネットワークを介して移動する必要があるためです。一方、カーネルコードでcscopeおよびタグデータベースを構築し、ネットワークを介して移動する必要はありません(lxrとは異なります) )。

4
rmk

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

1
Hongbo Liu