void abc(int a, int b) {
}
void abc(int a, int b, int c) {
}
,ctrl]在
abc(1,2,3);
转到第一个定义,而不是第二个正确的定义。另外,g]会提示您提供选项,但这不是我想要的。
感谢
#1 楼
文档(: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。
#2 楼
clangd&vim-lsp
我已经测试了
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打包路径中$ 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)
:MacVim 8.1.950(155);从github上的DMG在macOS 10.14.3上安装abc(1,2,3)
:7.0.0;已安装vim
(默认情况下不在clangd
中,使用绝对路径)$ brew install llvm
:e3f6933(2019年3月7日)和
$PATH
:f301455(2019年2月13日)#3 楼
正如romanl所说,ctags
并不真正理解代码,因此,最好的办法是将您指向共享您正在搜索的名称的函数。您寻求的功能。它利用clang_complete
编译器来查找与您要查找的函数实际上匹配的函数,而不仅仅是具有相同名称的函数。它会覆盖clang
的ctrl-]
功能。我还看到它指出
ctags
会使YouCompleteMe
过时,但由于我自己尚未使用它,因此无法保证其实用性。clang_complete git repo:https://github.com/Rip-Rip/clang_complete
评论
我无法说出clang_complete,但是,YCM无法在另一个翻译单元中找到定义的函数定义。我们有(/ had)clang-indexer(未真正维护)和其他一些插件。如今,我想检查实现语言服务器协议的clangd +插件。
–卢克·赫米特(Luc Hermitte)
17-10-11在16:59