VimとCtagsのヒントとテクニック[終了]


485

インストールしたところです Vim(またはgVim)にCtags(C ++開発に役立つ)をしました。お気に入りのコマンド、マクロ、ショートカット、それに付随するヒントを見つけたいと思います...

あなたの最高の武器を共有します。Vim開発のC ++に推奨する他のVimアドオンは何ですか?

編集 Ctagsと組み合わせて使用​​する他のアドオンは何ですか?

EDIT2あなたがタグを使うのgvimのバージョンは何?違いはありますか?

EDIT3どのようにして、大規模プロジェクトと小規模プロジェクトの両方のプログラミングエクスペリエンスを強化しますか?


15
最良の結果を得るために、あふれんばかりの
idbrii

17
おそらく、KEVは建設的ではありませんか?
フロイド

27
にもかかわらずclosed as not constructive、ほぼ2年前、それは私にとってとても建設的である
sazary

15
この質問を閉じる本当の理由は、「この質問は非常に役立つものの、Q&AのStackOverflowポリシーに適合しないはずです。頑固に閉じ続けながら、この質問と回答をQuoraに移動し、そのサイトを成長させてください。質問と答え"。
ディエゴピノ

2
SOのルールを考えると、この質問が閉じられた理由を理解しています。しかし、400を超える賛成投票の質問に300を超える賛成回答のフラグを付けて削除することは、少し不機嫌ですよね。
DevSolar 2015

回答:


394

Ctrl+ ]-定義に移動
Ctrl+ T-定義から戻ります。
Ctrl+ W Ctrl+ ]-水平分割で定義を開きます

これらの行をvimrcに追加します
map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>

Ctrl+\ -新しいタブで定義を開く
Alt+ ]-垂直分割で定義を開く

タグが生成された後。次のキーを使用して、関数にタグを付けたり付けたりできます。

Ctrl+ Left MouseClick-定義に戻る
Ctrl+ Right MouseClick-定義から戻る


8
C-] =>(コントロールキー)および]キーC-T =>(コントロールキー)およびTキー初心者がctagを使用する場合にのみ使用します。新しいタブトリックをありがとう
kumar 2009

6
同様に、ウィンドウを分割した後は、Shift Ctrl-w C-]キーを押しながらC-w Tt キーを押して、その分割を新しいタブに変更できます。
ダッシュトムバン

1
@Will端末からvimを使用している場合は、オプションのキーがaltキーのように動作するように端末の設定を変更する必要があります。MacVimを使用している場合は、この行をvimrc 'set macmeta'に追加します。macmeta、:h macmetaのドキュメントがあります。
Amjith 2012年

17
g C-]とても便利です。複数の定義から1つを選択するためのクイックダイアログが開きます。
Vincenzo Pii

3
g]も便利です。カーソルをタグ名の上に置いてを押すg]と、一致するタグのリストが表示されます。
zeekvfu 2013

176

常に私の.vimrcに入る1行:

set tags=./tags;/

これにより、現在のディレクトリで「タグ」が検索され、ルートが見つかるまでツリーがルートに向かって処理されます。IOW、ソースツリーのルートだけでなく、どこにいてもかまいません。


37
ルートに上がるのは過度です。代わりに家まで行くことをお勧めします:tags + = tags; $ HOME
gotgenes

37
私が取り組んでいるソースツリーは、常にホームディレクトリにあるわけではありません... $ HOMEはルートから2つのディレクトリにある傾向があるので...さて、さらに2つのディレクトリルックアップを実行できます。:)
uzi

6
私はウジに同意します。私のcwdが/ home / me / programming / foo / bar / baz / bang / bamである場合、8つのディレクトリルックアップだけです。それは速度の許容範囲に依存すると思いますが、私のマシンで1つのディレクトリを検索する時間は8とそれほど変わりません。
ネイト・マレー

1
それはあなたのシナリオに依存します。/homeにおよそ8,000のディレクトリがあり、それは少し遅くなる傾向があるため、私のマシンの1つでgotgenes提案を使用する必要があります。
jkerian

1
同様のものはありcscopeますか?
szx

45

C開発用のもう1つの便利なプラグインはcscope です。Ctagsで定義にジャンプできるのと同じように、Cscopeは呼び出しにジャンプします関数にます。

〜/ bin /ディレクトリにcscopeがある場合は、以下を.vimrcに追加し、g ^]を使用して呼び出し元の関数に移動します(:help cscopeを参照)。

if has("cscope")
    set csprg=~/bin/cscope
    set csto=0
    set cst
    set nocsverb
    " add any database in current directory
    if filereadable("cscope.out")
        cs add cscope.out
        " else add database pointed to by environment
    elseif $CSCOPE_DB != ""
        cs add $CSCOPE_DB
    endif
endif

ほとんど忘れて... ctagsと同じように-データベースを生成(および定期的に更新)する必要があります。次のスクリプトを使用します

select_files > cscope.files
ctags -L cscope.files
ctags -e -L cscope.files
cscope -ub -i cscope.files

ここで、「select_files」は、CおよびヘッダーファイルのリストをMakefileから抽出する別のスクリプトです。この方法で、プロジェクトで実際に使用されているファイルのみにインデックスを付けます。


ctagsに対するcscopeの利点は何ですか?彼らはお互いを褒め合いますか?
Whaledawg、2009

4
彼らはお互いを補完します。Ctagsは、シンボルまたは関数の定義を検索します。Cscopeは、関数を呼び出すすべての場所を見つけることができます。両方を使用すると、大きなソースツリーでのナビゲーションが非常に簡単になります。
nimrodm 2009

1
ただし、AFAIK cscopeには、C ++の理解が制限されています。
Luc Hermitte、

限られており、あまり良くありません。しかし、それが何をするか(使用法にジャンプする)には、これより良い代替手段はありません。その主な問題は、関数呼び出し(F)にジャンプしたいとき、あなたはしばしば...精神的に結果を代わりにシンボル(複数可)を使用していることをどこかにジャンプし、フィルタリングする必要があるということです
グレッグ・ロジャース

2
@Whaledawgはい、CTRL +を押すと、サウンドカードが出力に「clap.wav」を送信します:)
Patrizio Rullo

27

ディレクトリをctagsルックアップに追加できます。たとえば、Qt4用に作成されたctagsインデックスがあり、これを.vimrcに持っています。

set tags+=/usr/local/share/ctags/qt4

23

上記のすべてと...

code_complete:関数パラメーターの完了、コードスニペットなど。

taglist.vim:ソースコードブラウザー(C / C ++、java、perl、python、tcl、sql、phpなどをサポート)


5
taglist.vimが最もダウンロードされたvimプラグインであることを追加すると良いと思います。
16:09にamit

16

タグスタックをポップ/プッシュするには、ALT左とALT右を使用します。

" Alt-right/left to navigate forward/backward in the tags stack
map <M-Left> <C-T>
map <M-Right> <C-]>

hjkl移動に使用する場合は<M-h><M-l>代わりにマップすることができます。


ctrl-]やctrl-tと同じではありません-おそらく、あなたの提案は少しすっきりしています。

@サーシャ、許して?あなたが何を言っているのか分からない。= Xこれは、:helpでも機能します。
ストレッジャー2009

2
これはデフォルトよりも直感的でクリーンだと思います。
Ayman

1
@Aymanしかし、hjklと矢印キーのように、祖母から手を離さないという原則にも違反しています。
TankorSmash 2013

@TankorSmash、どんな原則?
ストレッジャー2013

10

同じ名前のいくつかの定義

<C-w>g<C-]>定義を分割して開くだけでなく、定義に移動する:tjumpか、定義が複数ある場合は、選択する定義のリストを表示します。


2
最初のコマンドと同様に、vimには:ptagプレビューウィンドウで定義を開くコマンドがあります。
idbrii

1
最初にカーソルをプレビューウィンドウに移動しなくても、他のウィンドウから:pcで閉じることができるので、プレビューウィンドウは便利です。
Heikki Naski、2012年

:h CursorHold-example設定可能なタイムアウト後にプレビューウィンドウのカーソルの下にあるアイテムのタグを表示する、ptagを使用したきちんとしたautocmdトリックもあります。
ダッシュトムバン2013年

PTAG: - :私は今バインドしましたTJUMP:で、この動作を組み合わせることでしょう愛私見Tjumpの<CR> <Cwの> <CR>より良い<] C>より作品のための1
アンドレアスFliesberg

:help参照...素晴らしい時々ある:help CTRL-W_g}:ptjump
アンドレアスFliesberg

8

私が最もよく使用するコマンドはC-]で、カーソルの下の関数の定義にジャンプします。より頻繁に使用して、より多くの通話をフォローできます。その後、Coは1レベル戻し、Ciはさらに深くなります。


16
CtはC-]スタックの1レベル前に戻り、Coは移動後に前のカーソル位置に戻ります。したがって、関数にC-]を押してからページダウンすると、Ctはすぐに戻り、Coは関数の先頭に戻ります。、その後コールバックします。
グレッグ・ヒューギル

6

taglistプラグインは必需品です。それは別のウィンドウでそれが知っているすべてのタグ(開いたファイル)をリストし、より大きなファイルをナビゲートすることを非常に簡単にします。

私は主にPython開発に使用しますが、C / C ++の場合にのみ優れています。




4

以下を.gvimrcファイルに入れます。これは、gvimの起動時に任意のポイントからツリーを検索してタグファイルを探します。

function SetTags()
    let curdir = getcwd()

    while !filereadable("tags") && getcwd() != "/"
        cd ..
    endwhile

    if filereadable("tags")
        execute "set tags=" . getcwd() . "/tags"
    endif

    execute "cd " . curdir
endfunction

call SetTags()

次に、次のようなスクリプトを使用して、ソースツリーの最上部にあるタグファイルを定期的に再生成します。

#!/bin/bash

find . -regex ".*\.\(c\|h\|hpp\|cc\|cpp\)" -print | ctags --totals --recurse --extra="+qf" --fields="+i" -L -

7
あなたは上向き検索を再発明しました。:hファイル検索を参照してください。stackoverflow.com/questions/563616/vimctags-tips-and-tricks/…
gotgenes 2009年

2

私はmacosでvimを使用しており、元のctagsがうまく機能しないため、最新のものをダウンロードしてmake make installを構成します。/ usr / local / bin / ctagsにctgasをインストールします(元のファイルを保持するため)

"taglist
let Tlist_Ctags_Cmd = "/usr/local/bin/ctags"
let Tlist_WinWidth = 50
map <leader>ta :TlistToggle<cr>
map <leader>bta :!/usr/local/bin/ctags -R .<CR>
set tags=tags;/
map <M-j> <C-]>
map <M-k> <C-T>

1

上記のSetTags()検索関数(同等のものに置き換える必要がありますset tags+=./tags;/)をcscopeで機能するように調整しました。動作するようです!

"cscope file-searching alternative
function SetCscope()
    let curdir = getcwd()

    while !filereadable("cscope.out") && getcwd() != "/"
            cd ..
                endwhile

    if filereadable("cscope.out")
            execute "cs add " . getcwd() . "/cscope.out"
                endif

    execute "cd " . curdir
    endfunction

call SetCscope()

3
gotgenesが言ったように、あなたは上向き検索を再発明しただけです。:hファイル検索を参照してください。関連する例については、このプラグインを参照してください。
idbrii

1

上記のSetCscope()関数の別の反復。これにより、cscope pre-pathは、「cscope.out」が次のディレクトリにない場合でも一致するように設定されます。

function s:FindFile(file)
    let curdir = getcwd()
    let found = curdir
    while !filereadable(a:file) && found != "/"
        cd ..
        let found = getcwd()
    endwhile
    execute "cd " . curdir
    return found
endfunction

if has('cscope')    
    let $CSCOPE_DIR=s:FindFile("cscope.out")
    let $CSCOPE_DB=$CSCOPE_DIR."/cscope.out"
    if filereadable($CSCOPE_DB)
        cscope add $CSCOPE_DB $CSCOPE_DIR
    endif

    command -nargs=0 Cscope !cscope -ub -R &
endif

3
gotgenesが言ったように、あなたは上向きの検索を再発明しただけです。:hファイル検索を参照してください。関連する例については、このプラグインを参照してください。
idbrii
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.