web-dev-qa-db-ja.com

VimとCtagsのヒントとコツ

私はVim(あるいはgVim)と一緒に Ctags (C++の開発を支援するため)をインストールしました。そしてあなたの好きなコマンド、マクロを見つけたいと思います。 、ショートカット、それに伴うヒント...

あなたの最高の兵器を共有しましょう。 Vim開発でのC++には他にどのVimアドオンをお勧めしますか?

EDITCtagsと組み合わせて他にどのようなアドオンを使用しますか?

EDIT2どのバージョンのgVimをタグとともに使用しますか?違いはありますか?

EDIT3大小両方のプロジェクトで、プログラミングの経験をどのように高めますか?

485
Sasha

Ctrl+] - 定義に進む
Ctrl+T - 定義から戻ります。
Ctrl+WCtrl+] - 水平分割で定義を開く

これらの行を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 - 定義から戻る

394
Amjith

いつも私の.vimrcに入る一行:

set tags=./tags;/

これはカレントディレクトリで "tags"を探し、見つけられるまでルートに向かってツリーを進めます。つまり、ソースツリーのルートではなく、どこにでも配置できます。

177
uzi

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'はMakefileからCとヘッダファイルのリストを抽出する別のスクリプトです。このようにして、プロジェクトで実際に使用されているファイルだけにインデックスを付けます。

45
nimrodm

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

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

上記のすべてと...

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

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

23
Johan

私はALT-leftとALT-rightを使ってタグスタックをポップ/プッシュ/タグスタックからプッシュします。

" 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>をマップできます。

16
strager

同じ名前の複数の定義

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

10
Heikki Naski

私が一番使っているコマンドはC-]で、カーソルの下の関数の定義にジャンプします。より頻繁にそれを使用して、より多くの電話に従うことができます。その後、C-oはあなたを1レベル戻し、C-iはさらに深くなります。

8
raimue

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

私は主にPythonの開発にそれを使っていますが、C/C++のためだけに良いものになることができます。

6
Walter

私は十分な大きさのc ++プロジェクトをサポートするために2年間私のvimプラグインを適応させてきました。あなたはそれらを見てみることができます。

彼らはctagsとcscsopeを使います。

http://www.vim.org/scripts/script.php?script_id=1638
http://www.vim.org/scripts/script.php?script_id=2507

5
Mykola Golubyev

私は自分の 実験用プラグイン でタグ操作をカプセル化しました。

VimでのC++開発に関して、私はすでに と答えました :私は自分のスイートと他のいくつかのプラグインを使います。

5
Luc Hermitte

私は.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 -
4
alanwj

私はmacosでvimを使っていますが、オリジナルのctagsはうまく動かないので、最新版をダウンロードしてmake make make installします。 ctgasを/ usr/local/bin/ctagsにインストールします(元のものを維持するため)

"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>
2
Zhenyu Li

上記のSetCcope()関数をもう一度繰り返します。 "cscope.out"が次のディレクトリにあることなく、cscopeのプリパスが一致するように設定します。

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
1
saoret.one

上記の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()
1
dergachev