vimで関数定義にジャンプ


241

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

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


2
gnu globalはctagsよりも優れています。
ジチャオ2013

6
@Jichao、あなたの経験についてもう少し詳しく教えてくれませんか?gnu globalはどの言語でよりよく機能しましたか?私が重要であるという点で、あなたが好んだ文脈について他に何かありますか?または、多くの異なるシナリオで使用していて、ほとんど/常にそれを好むように思われますか?あなたはそれについてより良い点は何ですか?ありがとう。
still_dreaming_1 14

@Jichao私はあなたのコメントをコミュニティWikiの回答に変えました。私はあなたの変更とこの回答の入力を歓迎します。
still_dreaming_1 14

回答:


213

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

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


2
phpはCによく似ているので、「あふれんばかりのctags」が動作します。Pythonモードかどうかはわかりません。
ポールトンブリン

5
Cscopeの経験はありません。何ですか?
ポールトンブリン

10
Cとの類似性は、CTagsサポートPHPとは関係ありません。PHPとPythonをサポートしています。見てctags.sourceforge.net/languages.htmlフルサポートを参照してください。
データ

1
ctagsを生成するにはどうすればよいですか?
dwaynemac '29

4
これらのctagsの操作方法を学習するのに最適な場所への参照を取得すると便利です。
Fzs2 2014

137

すべてが1つのファイルに含まれている場合、コマンドgd(「goto definition」など)があり、カーソルの下の単語のファイルで最初に出現する場所に移動します。


1
カーソルの下に単語がない場合はどうすればよいですか(むしろ入力します)。
Fuad Saud、2014年

@FuadSaudは、LucasBを使用してそれを検索します/
14年

6
/すべてのオカレンスに一致するため、ほとんどの場合正確ではありません。私は実際に:tag <function_name>ctagsを介して定義にジャンプするために実行できることを発見しました。
Fuad Saud 2014年

@Faud定義へジャンプ機能は、(すべてのIDEで)カーソルで識別子をポイントすることに依存しています。タイピング/検索は別の機能であり、混乱しています。
流血

101

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

つまり、を入力gして*(または単に*-以下を参照)、カーソルの下の単語(この場合は関数名)を検索します。次に、を押しnて、次の(またはShift- n前の場合)発生に移動します。

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

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

(a) *カーソルの下の次の単語にジャンプします。(gviで「goto」コマンドを入力する必要はありません)。

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

Nとnは引き続き機能しますが、たとえばカーソルの下にある変数の宣言を探す場合など、最初に逆方向から検索を開始するには、「#」が非常に役立つことがよくあります。


10
違い*とはg*、検索の単語の境界です。検索(同じながら、定期的な正規表現での)を検索ワード境界なし。*\<keyword\>\bkeyword\bg*keyword
Nicolai S

ファイル内に関数が100回出現*する場合、定義を見つける前に、平均50ヒットが表示されます。
naught101

49

gdまたはを使用gDプログラム内の任意の変数にカーソルを合わせながら、をします。

  1. gd ローカル宣言に移動します。
  2. gD グローバル宣言に移動します。

その他のナビゲーションオプションは、こちらにあります

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


14

Paul Tomblinが述べたように、ctagsを使用する必要があります。プラグインを使用して適切なプラグインを選択したり、カーソルの下にある関数の定義をプレビューしたりすることもできます。プラグインがないと、組み込みのctagsサポートがコンテキストを考慮せず、名前だけを使用するため、オーバーロードされた数百の 'doAction'メソッドの1つを選択しようとすると頭痛がします。

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

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

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

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


こんにちは@ mykola-golubyev、スクリプトのDetailed descriptionセクションで指定したリンク#2507が壊れています。別のものを提供してもらえますか?
FelikZ 2014

12

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

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

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

もちろん、この時点からctagsを使用していなければ、恥ずかしいはずです。ただし、このコーディング標準も役立つ追加機能です。


13
なぜ一部のコーダーがそのように署名を書くのかといつも疑問に思っていました!
Tarrasch 2012年

また、最初の列に '{'を含む関数シグネチャを記述する場合は、]]を押してファイル内を進み、[[を押して後方に進むことで、各関数にすばやく移動できます。
BentChainRing

12

TL; DR:

最新の方法は、インテリセンスのような補完にCOCを使用し、ジャンプして定義するために1つ以上の言語サーバー(LS)を使用することです(さらに多くの方法)。さらに多くの機能(ただし、ジャンプ先の定義には必要ありません)については、1つ以上のデバッガーをインストールして、本格的なIDEエクスペリエンスを得ることができます。クイックスタート:

  1. vim-plugをインストールしてVIMプラグインを管理します
  2. の上部にCOCと(オプションで)Vimspectorを追加します~/.vimrc
    call plug#begin()
    Plug 'neoclide/coc.nvim', {'branch': 'release'}
    Plug 'puremourning/vimspector'
    call plug#end()
    
  3. :source $MYVIMRC | PlugInstallVIMプラグインをダウンロードするための呼び出し
  4. 再起動vimして呼び出し:CocInstall coc-marketplace、COC拡張機能に簡単にアクセスする
  5. :CocList marketplace言語サーバーを呼び出して検索します。例:
    • python検索するタイプcoc-jedi
    • php検索するタイプcoc-phplsなど
  6. (オプション)install_gadget.py --help使用可能なデバッガーを参照してください。例:
    • ./install_gadget.py --enable-python
    • ./install_gadget.py --force-enable-php、など

完全な答え:

言語サーバー(LS)は、バックグラウンドで実行され、プロジェクト全体をリアルタイムで分析する独立したスタンドアロンアプリケーション(プログラミング言語ごとに1つ)であり、追加機能をエディター(だけでなく、エディターvim)に公開します。次のようなものが得られます。

  • 名前空間対応のタグ補完
  • 定義にジャンプ
  • 次/前のエラーにジャンプ
  • オブジェクトへのすべての参照を見つける
  • すべてのインターフェース実装を見つける
  • プロジェクト全体で名前を変更する
  • ホバーに関するドキュメント
  • スニペット、コードアクション、フォーマット、リンティングなど...

言語サーバーとの通信は、言語サーバープロトコル(LSP)を介して行われます。両方nvimおよびvim8(またはそれ以上)プラグイン、最も人気のあるされることにより、支持LSP 完了の征服(COC)。

活発に開発されている言語サーバーとその機能のリストは、Lang Serverの Webサイトで入手できます。それらのすべてがCOC拡張機能によって提供されるわけではありません。これらのいずれかを使用する場合は、COC拡張を自分で作成するか、LSを手動でインストールして、COCの代わりに次のVIMプラグインの組み合わせを使用できます。

デバッガーとの通信は、Debug Adapter Protocol(DAP)を介して行われます。VIMで最も人気のあるDAPプラグインはVimspectorです。

言語サーバープロトコル(LSP)は、MicrosoftによってVisual Studio Code用に作成され、寛容なMITライセンス(Red HatおよびCodenvyとの共同作業により標準化された)を備えたオープンソースプロジェクトとしてリリースされました。その後、マイクロソフトはデバッグアダプタプロトコル(DAP)もリリースしました。VSCodeでサポートされているすべての言語がVIMでサポートされています。

私は個人的に、COC + COC拡張によって提供される言語サーバー+ 余分なリンティングのためのALEを使用することをお勧めします(ただし、COCとの競合を避けるためにLSPサポートを無効にします)+ Vimspector + Vimspectorによって提供されるデバッガー(「ガジェット」と呼ばれます)+次のVIMプラグイン:

call plug#begin()
Plug 'neoclide/coc.nvim'
Plug 'dense-analysis/ale'
Plug 'puremourning/vimspector'
Plug 'scrooloose/nerdtree'
Plug 'scrooloose/nerdcommenter'
Plug 'sheerun/vim-polyglot'
Plug 'yggdroot/indentline'
Plug 'tpope/vim-surround'
Plug 'kana/vim-textobj-user'
  \| Plug 'glts/vim-textobj-comment'
Plug 'janko/vim-test'
Plug 'vim-scripts/vcscommand.vim'
Plug 'mhinz/vim-signify'
call plug#end()

それぞれをグーグルして、彼らが何をしているかを見ることができます。


11

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と私が開発したローカルgemで私にとって本当に役に立ちました)、次のようにします。

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)を使用します


上記のMac記事へのリンクが壊れています。ここに更新されたリンクがあります:runtime-era.blogspot.com/2012/05/… 最善の策は、Homebrewなどのツールを使用してctagsをインストールすることです
ZaydH


2

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


1

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

:tag <f_name>

上記では、関数の定義について説明します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.