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);

采用第一个定义,而不是第二个正确的定义。另外,还会g]提示您提供选项,但这并不是我要的。

谢谢

Answers:


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

langvim-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 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;
}

gdabc

  • abc(1,2) 跳到第一行,和
  • abc(1,2,3) 跳到第五行。

环境和版本:

  • 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无法在另一个翻译单元中找到定义的函数定义。我们有(/ had)clang-indexer(未真正维护)和其他一些插件。如今,我想检查实现语言服务器协议的clangd +插件。
卢克·赫米特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.