Answers:
我进行了测试,clangd
以查看从使用其中一个重载函数的代码行中查找正确的定义时,是否真正区分了重载函数。在我使用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
安装vim-lsp
需要async.vim
到vim8 packpath
$ 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;
}
按gd
上abc
的
abc(1,2)
跳到第一行,和abc(1,2,3)
跳到第五行。环境和版本:
正如romanl所说,我ctags
并不真正理解代码,因此,它能做的最好的事情就是将您指向共享您正在搜索的名称的函数。
但是,我相信该clang_complete
插件可以提供您想要的功能。它利用clang
编译器来查找与您要搜索的函数实际上匹配的函数,而不仅仅是具有相同名称的函数。它将覆盖的ctrl-]
功能ctags
。
我还看到它表示YouCompleteMe
渲染已clang_complete
过时,但是由于我自己尚未使用它,因此我无法保证其实用性。
clang_complete git仓库:https : //github.com/Rip-Rip/clang_complete