vimを使用して関数定義にジャンプするにはどうすればよいですか?たとえば、Visual Assistを使用すると、関数の下にAlt+ を入力gすると、定義付きのファイルをリストするコンテキストメニューが開きます。
vimでこのようなことをするにはどうすればよいですか?
vimを使用して関数定義にジャンプするにはどうすればよいですか?たとえば、Visual Assistを使用すると、関数の下にAlt+ を入力gすると、定義付きのファイルをリストするコンテキストメニューが開きます。
vimでこのようなことをするにはどうすればよいですか?
回答:
ctagsを使用します。タグファイルを生成し、:tagsコマンドを使用してvimにファイルの場所を伝えます。次に、以下を使用して関数定義にジャンプできますCtrl-]
この質問には、より多くのタグのトリックとヒントがあります。
すべてが1つのファイルに含まれている場合、コマンドgd
(「goto definition」など)があり、カーソルの下の単語のファイルで最初に出現する場所に移動します。
/
/
すべてのオカレンスに一致するため、ほとんどの場合正確ではありません。私は実際に:tag <function_name>
ctagsを介して定義にジャンプするために実行できることを発見しました。
g* ctagsを設定せずにまともな仕事をします。
つまり、を入力gして*(または単に*-以下を参照)、カーソルの下の単語(この場合は関数名)を検索します。次に、を押しnて、次の(またはShift- n前の場合)発生に移動します。
このコマンドはカーソルの下の単語を検索するだけなので、定義に直接ジャンプすることはありませんが、現時点でctagsの設定に対処したくない場合は、少なくとも再実行する必要をなくすことができます。 -関数名を入力して、その定義を検索します。
-編集-長い間g *を使用してきましたが、最近これらのショートカットの2つのショートカットを発見しました!
(a) *カーソルの下の次の単語にジャンプします。(g
viで「goto」コマンドを入力する必要はありません)。
(b) #同様に、前の発生に移動します。
Nとnは引き続き機能しますが、たとえばカーソルの下にある変数の宣言を探す場合など、最初に逆方向から検索を開始するには、「#」が非常に役立つことがよくあります。
*
とはg*
、検索の単語の境界です。検索(同じながら、定期的な正規表現での)を検索ワード境界なし。*
\<keyword\>
\bkeyword\b
g*
keyword
*
する場合、定義を見つける前に、平均50ヒットが表示されます。
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にジャンプするときにコンテキストを選択するために書いたものです
。
Detailed description
セクションで指定したリンク#2507
が壊れています。別のものを提供してもらえますか?
別の一般的な手法は、最初の列に関数名を配置することです。これにより、簡単な検索で定義を見つけることができます。
int
main(int argc, char *argv[])
{
...
}
上記の関数は/^main
、ファイル内または:grep -r '^main' *.c
ディレクトリ。コードが適切にインデントされている限り、行の先頭で識別子が発生するのは関数の定義時のみです。
もちろん、この時点からctagsを使用していなければ、恥ずかしいはずです。ただし、このコーディング標準も役立つ追加機能です。
TL; DR:
最新の方法は、インテリセンスのような補完にCOCを使用し、ジャンプして定義するために1つ以上の言語サーバー(LS)を使用することです(さらに多くの方法)。さらに多くの機能(ただし、ジャンプ先の定義には必要ありません)については、1つ以上のデバッガーをインストールして、本格的なIDEエクスペリエンスを得ることができます。クイックスタート:
~/.vimrc
。
call plug#begin()
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'puremourning/vimspector'
call plug#end()
:source $MYVIMRC | PlugInstall
VIMプラグインをダウンロードするための呼び出しvim
して呼び出し:CocInstall coc-marketplace
、COC拡張機能に簡単にアクセスする:CocList marketplace
言語サーバーを呼び出して検索します。例:
python
検索するタイプcoc-jedi
、php
検索するタイプcoc-phpls
など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()
それぞれをグーグルして、彼らが何をしているかを見ることができます。
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)を使用します
2番目のPaulの応答:はい、ctags(特にexuberant-ctags(http://ctags.sourceforge.net/))は素晴らしいです。これもvimrcに追加したので、プロジェクト全体で1つのタグファイルを使用できます。
set tags=tags;/
をインストールしますcscope
。非常によく似てctags
いますが、より強力です。代わりに、定義に移動するにはCtrl+ ]、やりますCtrl+ \+ g。もちろん、両方を同時に使用することもできます。しかし、大きなプロジェクト(たとえばLinuxカーネル)では、cscopeは何マイルも先に進んでいます。