485

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

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

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

EDIT2タグで使用するgVimのバージョンは何ですか?それは違いを生みますか?

EDIT3大小のプロジェクトのプログラミング体験をどのように強化しますか?

4

15 に答える 15

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-定義からジャンプします

于 2009-02-19T04:54:36.517 に答える
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」は、Makefile から C およびヘッダー ファイルのリストを抽出する別のスクリプトです。このようにして、プロジェクトで実際に使用されるファイルのみにインデックスを付けます。

于 2009-02-19T15:40:48.993 に答える
27

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

set tags+=/usr/local/share/ctags/qt4
于 2009-02-19T01:41:54.997 に答える
23

上記のすべてと...

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

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

于 2009-03-05T19:45:51.550 に答える
16

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>

于 2009-02-19T01:40:35.063 に答える
10

同じ名前の複数の定義

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

于 2010-04-22T19:06:43.110 に答える
8

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

于 2009-02-19T01:45:25.083 に答える
6

taglistプラグインは必須だと思います。認識しているすべてのタグ (開いたフ​​ァイル) を別のウィンドウに一覧表示し、大きなファイルを簡単にナビゲートできるようにします。

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

于 2009-02-21T09:52:25.367 に答える
5

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

彼らは ctags と cscope を使用します。

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

于 2009-03-05T10:50:56.280 に答える
5

私の実験的なプラグインでタグ操作をカプセル化しました。

vim での C++ 開発に関しては、既に回答済みです。自分のスイートと他のいくつかのプラグインを使用しています。

于 2009-02-19T15:03:22.667 に答える
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 -
于 2009-04-17T23:22:01.137 に答える
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>
于 2010-12-27T06:11:09.170 に答える
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()
于 2011-05-04T18:50:34.420 に答える
1

上記の SetCscope() 関数をもう一度繰り返します。これは、「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
于 2011-06-13T16:53:19.567 に答える