web-dev-qa-db-ja.com

vimの関数定義にジャンプします

Vimを使用して関数定義にジャンプするにはどうすればよいですか?たとえば、ビジュアルアシストでは、次のように入力できます Alt+g 関数の下で、定義を含むファイルをリストするコンテキストメニューを開きます。

Vimでこのようなことを行うにはどうすればよいですか?

202
Jon Clegg

Ctagsを使用します。タグファイルを生成し、:tagsコマンドを使用してvimに場所を伝えます。その後、次を使用して関数定義にジャンプできます。 Ctrl-]

この質問 には、さらに多くのタグトリックとヒントがあります。

173
Paul Tomblin

すべてが1つのファイルに含まれている場合、コマンドGd(「goto definition」のように)があります。定義。

114
Scottie T

g* ctagsを設定せずにまともな仕事をします。

つまり、タイプ g* (あるいは単に * -以下を参照)カーソルの下のWord(この場合は関数名)を検索します。次に n 次へ(または Shift-n 前の)発生。

このコマンドはカーソルの下のWordを検索するだけであるため、定義に直接ジャンプすることはありませんが、現時点でctagの設定に対処したくない場合は、少なくとも、 -関数名を入力して、その定義を検索します。

-編集-g *を長い間使用していますが、最近これらのショートカットの2つのショートカットを発見しました!

(a) * カーソルの下にあるWordの次の出現箇所にジャンプします。 (viで「goto」コマンドであるgを入力する必要はありません)。

(b) # 同様に、前の発生に移動します。

Nおよびnは引き続き機能しますが、たとえばカーソルの下の変数の宣言を検索する場合など、最初に逆方向に検索を開始するには「#」が非常に便利です。

92
Brent Faust

プログラム内の任意の変数にカーソルを置きながら、GdまたはGdを使用します。

  1. Gdは、ローカル宣言に移動します。
  2. Gdは、グローバル宣言に移動します。

より多くのナビゲーションオプションは here にあります。

Linuxカーネルなどの大規模プロジェクトを相互参照するには、 cscope を使用します。

40
0x90

Paul Tomblinが述べたように、ctagsを使用する必要があります。また、pluginsを使用して適切なプラグインを選択するか、カーソルの下の関数の定義をプレビューすることも検討できます。プラグインがなければ、ctagsサポートに組み込まれている何百ものオーバーロードされた「doAction」メソッドの1つを選択しようとする頭痛の種になります。

また、cscopeとその「グローバルシンボルの検索」機能を使用できます。ただし、vimはデフォルトのビルドオプションではない+ cscopeサポートを使用してコンパイルする必要があります。

関数が現在のファイルで定義されていることがわかっている場合、通常モードで「Gd」キーストロークを使用して、カーソルの下のシンボルの定義にジャンプできます。

これが最もダウンロードされたナビゲーション用プラグインです
http://www.vim.org/scripts/script.php?script_id=27

これは、タグにジャンプしながらコンテキストを選択するために書いたものです
http://www.vim.org/scripts/script.php?script_id=2507

14
Mykola Golubyev

別の一般的な手法は、関数名を最初の列に配置することです。これにより、簡単な検索で定義を見つけることができます。

int
main(int argc, char *argv[])
{
    ...
}

上記の関数は、ファイル内の/^mainまたはディレクトリ内の:grep -r '^main' *.cで見つかります。コードが適切にインデントされている限り、行の先頭で識別子が発生するのは関数定義時のみです。

もちろん、この時点からctagsを使用していない場合は、自分を恥ずかしく思うはずです!ただし、このコーディング標準も有用な追加であることがわかりました。

11
Judge Maygarden

1-熱狂的なctagsをインストールします。 osxを使用している場合、この記事ではちょっとしたトリックを示します。 http://www.runtime-era.com/2012/05/exuberant-ctags-in-osx-107.html

2-ディレクトリのファイルにのみctagsを含める場合は、ディレクトリで次のコマンドを実行します。

ctags -R

これにより、「タグ」ファイルが作成されます。

3- Rubyを使用していて、gemのctagsを含めたい場合(これは、RubyMotionと私が開発したローカルgemsで非常に役に立ちました)、次のようにします。

ctags --exclude=.git --exclude='*.log' -R * `bundle show --paths`

クレジット: https://coderwall.com/p/lv1qww (vimの代わりにemacsのタグを生成する-eオプションを省略したことに注意してください)

4-次の行を〜/ .vimrcに追加します

set autochdir 
set tags+=./tags;

(なぜセミコロン: http://vim.wikia.com/wiki/Single_tags_file_for_a_source_tree

5-フォローする単語に移動し、ctrl + ]を押します。戻りたい場合は、ctrl+oを使用します(ソース: https://stackoverflow.com/a/53929/226255

9
Abdo

2番目のPaulの応答:はい、ctags(特にexuberant-ctags( http://ctags.sourceforge.net/ ))は素晴らしいです。これをvimrcに追加したので、プロジェクト全体で1つのタグファイルを使用できます。

set tags=tags;/
6
David Wolever

Vimでタグを使用することは本当にお勧めしません。他のすべてのタグプラグインよりも高度な独自のタグプラグインを作成する必要がありました。また、タグが非常に限定的で誤検出が多すぎることを最終的に理解して受け入れる前に、多くの時間を費やさなければなりませんでした。

代わりに、使用している言語、プロジェクトの構造、および何かの定義にジャンプしようとしているコンテキストを本当に知っている、よりインテリジェントなツールを使用することをお勧めします。例として、 phpcd はPHPプロジェクトに最適です。 PHPリフレクションを使用して、コードの洞察を得ます。タグに依存しない他の言語用のオプションもあります。

5

これを行う最新の方法は、プロジェクト全体をリアルタイムで分析し、エディターに機能を提供する独立したスタンドアロンアプリケーション(プログラミング言語ごとに1つ)を実行することです 言語サーバー )。次のようなものが得られます:

  • 名前空間認識タグの補完
  • 定義にジャンプ
  • オブジェクトへのすべての参照を見つける
  • インターフェイスを実装するすべてのタイプを見つける
  • プロジェクト全体で名前を変更する
  • ホバーに関するドキュメント
  • 書式設定、リントなど.

nvimおよびvim8(またはそれ以上)では、Language Server Protocolプラグインをインストールしてlangサーバーと通信します。

  1. vim-lsp-client -言語サーバーとの通信を処理します
  2. deoplete -オプション、入力時にタグの補完をトリガーします

Lang Server Webサイトで、活発に開発されている言語サーバーとその機能のリストを見つけることができます。

Language Server Protocolは、Visual Studio Code用にMicrosoftによって作成され、オープンソースプロジェクトとしてリリースされました寛容なMITライセンス(Red HatおよびCodenvyとのコラボレーションにより標準化)。

選択したエディター(VIMのDAPプラグイン: vimspector )でDAPを完全に体験するには、IDE(デバッグアダプタープロトコル)とともにLSPを使用することをお勧めします。

4
cprn

cscopeをインストールします。 ctagsと非常によく似ていますが、より強力です。定義に移動するには、代わりに Ctrl + ]、 行う Ctrl + \ + g。もちろん、両方を同時に使用することもできます。しかし、大きなプロジェクト(Linuxカーネルなど)では、cscopeは何マイルも先を行っています。

Ctagを生成した後、vimで以下を使用することもできます。

:tag <f_name>

上記で関数の定義が表示されます。

0
Karun