[解決済み] cscopeとctags、どちらを選ぶべきですか?[クローズド]
質問
私は主にエディタとして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 にも不可欠です。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ~/.vimrcを読み込まない
-
[解決済み] Vimのマッピングコマンドであるremap, noremap, nnoremap, vnoremapの違いは何ですか?
-
[解決済み] タブを4スペースに再定義
-
[解決済み] 開いているタブをすべて一度に閉じるにはどうすればよいですか?
-
[解決済み] viで2つの行を結合するにはどうしたらいいですか?
-
[解決済み] カーソル下の1単語を置換する方法は?
-
[解決済み] VIM挿入モードでの文字の繰り返し
-
[解決済み] vimでファイルを開いた後、バックディレクトリのブラウズに移動する
-
[解決済み] なぜvimが私のコードをラップするのを止められないのですか?
-
[解決済み] vimのクイックフィックス機能はどのように使うのですか?