Ich habe getestet clangd, ob überladene Funktionen tatsächlich unterschieden werden, wenn nach der richtigen Definition von einer Codezeile gesucht wird, in der eine der überladenen Funktionen verwendet wird. In meiner minimalen Testkonfiguration mit dem vim-Plugin hat vim-lspes funktioniert.
Minimale Konfiguration
$MYVIMRC ist
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
Die Installation vim-lsperfordert async.vimin 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/
Jetzt sollte Ihre vim-Konfiguration so aussehen (ohne tief verschachtelte Dateien und Ordner).
~/.vim
❯ tree -L 4 -F
.
├── pack/
│ └── prabirshrestha/
│ └── start/
│ ├── async.vim/
│ └── vim-lsp/
└── vimrc
5 directories, 1 file
Prüfung
Betrachten Sie nun die CPP-Datei
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;
}
Drücken Sie gdauf abcvon
abc(1,2) springt zur ersten Zeile und von
abc(1,2,3) springt zur fünften Zeile.
Umgebung und Versionen:
vim: MacVim 8.1.950 (155); installiert von DMG von github unter macOS 10.14.3
clangd: 7.0.0; installiert mit $ brew install llvm(nicht $PATHstandardmäßig in, absoluten Pfad verwenden)
vim-lsp: e3f6933 (7. März 2019) und async.vim: f301455 (13. Februar 2019)