web-dev-qa-db-ja.com

宣言ではなく定義に移動するためにvimでctagsを取得します

Vim/gvimのctagsにより、関数の実際の定義ではなく、何度も前の宣言に進むという問題があります。

それを回避する方法はありますか?

47

最も簡単な方法は、単に「ctrl-]」ではなく「g ctrl-]」を使用することだと思います。一致が1つしかない場合は、そこに移動します。複数の一致がある場合、それらはすべて一覧表示され、:tselectのように、必要なものを選択できます。両方の世界のベスト。 :)

70
Derek

tnおよびtpを使用して、一致するさまざまなタグにジャンプできるはずです。

  • ^]を押すと、最初の試合に移動します。
  • 一致しない場合は、:tnと入力して次に進みます。
  • :tnを何度も入力した場合は、:tpを入力して前のページに戻ることができます。
9
Nathan Fellman

デフォルトでは、Vimはタグファイルの最初のタグに移動すると思います。必要に応じて別のものを選択できます::tj(:tselectに似ていますが、一致が1つしかない場合は自動ジャンプ)またはCtrl-]の後に:tnを使用します。

デフォルトを変更する唯一の方法は、タグファイルの順序を変更することですが、ctagsがこれを行うコマンドラインオプションを提供しているとは思いません。

これは、基本的にタグファイルを開き、タグの「種類」で並べ替えて再度書き出すスクリプトが必要なため、それほど難しくはありません。タグの「種類」は、それが関数(f)、関数プロトタイプ(p)、マクロ、列挙名などであるかどうかを説明する単一の文字です。Linuxを使用している場合は、 理論的には、次のようにシンプルに:

#!/bin/sh
ctags -R -f - . | tac > tags

tacはファイル内の行の順序を逆にするため、これにより自動的に定義が最初に配置されます。ただし、ヘッダーを維持する必要があるため少し複雑になり、Vimはタグファイルをソートすることを好むため、ファイルを調べて最初のエントリ(タグ名)を前方にソートしてから、逆の順序で種類。したがって、もっと複雑なものが良いかもしれません。

恥知らずなプラグインをお詫び申し上げますが、必要なことを(間接的に)実行するVimプラグインを作成しました。これは、関数名、マクロ、列挙型などの多くの追加の強調グループを追加することを目的としています。ただし、これが行う他のことの1つは、タグファイルを再ソートして、関数の実装が関数宣言の前に来るようにすることです。あなたが望むものを達成する(私はあなたと同じ必要がありました)。強調表示機能が必要ない場合は、おそらくすべてを簡単に取り除くことができます。これはかなり単純なpythonプログラムであり、さらに単純なVimスクリプトであり、 私のサイト

8
DrAl

パーティーに遅れますが、着信vimタグgooglersの場合:

少なくともC/C++では、ctagsに加えてcscopeを使用する方法が適していることがわかりました。呼び出しツリーについてはよりインテリジェントであり、失敗した場合はctagsにフォールバックするように設定できます。 ctags -Rを実行するたびに "cscope -b"を実行するだけです。これで準備は完了です。以下の設定を使用すると、いつものようにCtrl-]/Ctrl-Tを使用できますが、関数宣言へのジャンプや関数呼び出し元のジャンプリストの表示など、気の利いた新しいジャンプを追加することもできます。

" setup
if has("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
    set csverb
endif

" jump to a function declaration
nmap <silent> <C-\> :cs find s <C-R>=expand("<cword>")<CR><CR>1<CR><CR>
" show a list of where function is called
nmap <silent> <C-_> :cs find c <C-R>=expand("<cword>")<CR><CR>
2
Steve Goranson

このオプションは私にとってうまくいきました

次の行を.vimrcに挿入すると、マウスをダブルクリックして(ファイルのvariable/entry上で)、タグ付きの場所にジャンプできます。単一の一致が見つかると、すぐにジャンプします。複数のエントリが一致する場合は、ユーザー入力を要求します。

:map <2-LeftMouse> g< c-]>
:tselect my_little_function 

一致のリストが表示されます。または、タグにジャンプして満足できない場合は、次のように入力します。

:tselect

そして、最後のアクティブなタグの代替のリストを取得します。

1
Johan

以下を.vimrcファイルに追加します。

noremap <c-]> 2<c-]>

この行により、vimは自動的に(最初の一致ではなく)2番目の一致にジャンプします。これは通常、関数定義です。

1
Yariv

押すことができます 2 その後 CTRL+]、これは2番目の一致に直接移動します。Javaでは、これは通常、いくつかのインターフェースの実装です。

0
César Alforde

一致するタグが1つしかない場合は、Vimがタグに直接ジャンプするようにする方法がいくつかあります。それ以外の場合は、タグの一致のリストを表示します。

'tjump' exコマンドを使用できます。たとえば、コマンド ':tjump func1 'が1回だけ定義されている場合、定義func1にジャンプします。 func1が複数回定義されている場合、一致するタグのリストが表示されます。

タグの上にカーソルを置いてg Ctrl-]

テキストを視覚的に選択してg Ctrl-]一致するタグをジャンプまたは一覧表示します。

'stjump' exコマンドを使用できます。これにより、新しいウィンドウのタグリストから一致するタグまたは選択されたタグが開きます。

Ctrl-W g Ctrl-]:stjumpを実行します。

Help: :tjump, g_Ctrl-], v_g_CTRL-], :stjump, Ctrl-W_g_Ctrl-]
0
Tarek Saied