Vim、ctags、オーバーロード


10

複数の定義がある場合に、vimを適切な一致する定義に自動的にジャンプさせる方法はありますか?私たちのC ++コードは関数のオーバーロードを多用しており、vimによるctagsの処理は準備ができていないようです。

例えば、

void abc(int a, int b) {

}

void abc(int a, int b, int c) {

}

不思議なことにctrl]

abc(1,2,3);

2番目の正しい定義ではなく、最初の定義を取ります。また、g]オプションのプロンプトも表示されますが、それは私が探しているものではありません。

ありがとう

回答:


4

ドキュメント(:help ctrl-])は言う:

When there are several matching tags for {ident}, jump
to the [count] one.  When no [count] is given the
first one is jumped to.

g] あなたが探しているものではないかもしれませんが、それはあなたがVimで得ることができる最高のものです。

基本的に、ctagsとVimがコードを理解することは期待できないため、よりスマートなインデクサー(cscope、GNU GLOBAL、またはclangに基づく何かなど)を探すか、実際のIDEを使用する必要があります。


1

clangdvim-lsp

clangdオーバーロードされた関数の1つが使用されているコード行から正しい定義を探すときに、オーバーロードされた関数が実際に区別されるかどうかをテストしました。vimプラグインを使用した私の最小限のテスト構成では、vim-lspうまくいきました。

最小構成

$MYVIMRC です

source $VIMRUNTIME/defaults.vim
if executable('/usr/local/Cellar/llvm/7.0.0/bin/clangd')
    augroup Clangd
        autocmd User lsp_setup call lsp#register_server({
            \ 'name': 'clangd',
            \ 'cmd': {server_info->['/usr/local/Cellar/llvm/7.0.0/bin/clangd']},
            \ 'whitelist': ['c', 'cpp', 'objc', 'objcpp'],
            \ })
        autocmd FileType c,cpp,objc,objcpp nmap <buffer> gd <plug>(lsp-definition)
        autocmd FileType c,cpp,objc,objcpp setlocal omnifunc=lsp#complete
    augroup END
endif

vim8 packpathへのインストールがvim-lsp必要async.vim

$ cd ~/.vim
$ git clone https://github.com/prabirshrestha/async.vim pack/prabirshrestha/start/async.vim/
$ git clone https://github.com/prabirshrestha/vim-lsp   pack/prabirshrestha/start/vim-lsp/

これで、vim構成は次のようになります(より深くネストされたファイルとフォルダーを省略)

~/.vim
❯ tree -L 4 -F
.
├── pack/
│   └── prabirshrestha/
│       └── start/
│           ├── async.vim/
│           └── vim-lsp/
└── vimrc

5 directories, 1 file

テスト

次に、cppファイルを検討します。

void abc(int a, int b) {

}

void abc(int a, int b, int c) {

}

int main(int argc, char const *argv[])
{
    abc(1,2);
    abc(1,2,3);
    return 0;
}

押すとgdabc

  • abc(1,2) 最初の行にジャンプし、
  • abc(1,2,3) 5行目にジャンプします。

環境とバージョン:

  • vim:MacVim 8.1.950(155); macOS 10.14.3のgithubからDMGからインストール
  • clangd:7.0.0; とともにインストールされます$ brew install llvm$PATHデフォルトではありません。絶対パスを使用してください)
  • vim-lspe3f6933(2019年3月7日)およびasync.vimf301455(2019年2月13日)

0

romanlが述べたように、ctagsはコードを実際には理解していません。そのため、最善の方法は、検索している名前を共有する関数をポイントすることです。

しかし、私はclang_completeプラグインがあなたが求める機能を提供すると信じています。clangコンパイラを使用して、同じ名前を共有する関数だけでなく、検索している関数と実際に一致する関数を見つけます。のctrl-]機能を上書きしますctags

また、私はそれがあると述べ見ているYouCompleteMeレンダリングclang_complete時代遅れが、私はそれを自分で使用するためには至っていないとして、私はその有用性を保証することはできません。

clang_complete gitリポジトリ:https : //github.com/Rip-Rip/clang_complete


clang_completeについてはわかりませんが、YCMは別の翻訳単位で定義された(sic)関数定義を見つけることができません。clang-indexer(実際にはメンテナンスされていません)と(いくつかの)プラグインがいくつかあります。最近では、Language Server Protocolを実装するclangd +プラグインをチェックするように言います。
Luc Hermitte、2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.