Vim, ctags und Überladung

10

Gibt es eine Möglichkeit, vim bei mehreren Definitionen automatisch zur richtigen passenden Definition springen zu lassen? Unser C ++ - Code verwendet stark Funktionsüberladung und die Handhabung von ctags durch vim scheint nicht dafür bereit zu sein.

Zum Beispiel,

void abc(int a, int b) {

}

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

}

Seltsamerweise ctrl]weiter

abc(1,2,3);

nimmt zur 1. Definition und nicht zur korrekten Definition, die die 2. ist. Auch g]Aufforderungen für Optionen , aber das ist nicht das, was ich suche.

Vielen Dank

Yumoji
quelle

Antworten:

4

Die Dokumentation ( :help ctrl-]) sagt:

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] Vielleicht ist es nicht das, wonach Sie suchen, aber das ist das Beste, was Sie in Vim bekommen können.

Grundsätzlich können Sie nicht erwarten, dass ctags und Vim Ihren Code verstehen. Sie müssen daher nach einem intelligenteren Indexer suchen (wie cscope, GNU GLOBAL oder etwas, das auf clang basiert) oder eine tatsächliche IDE verwenden.

romainl
quelle
1

clangd & vim-lsp

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)
Hotschke
quelle
0

Wie Romanl sagte, ctagsversteht er den Code nicht wirklich. Das Beste, was er tun kann, ist, Sie auf Funktionen zu verweisen, die den Namen teilen, nach dem Sie suchen.

Ich glaube jedoch, dass das clang_completePlugin die Funktionalität bietet, die Sie suchen. Der clangCompiler wird verwendet, um die Funktion zu finden, die tatsächlich mit der gesuchten Funktion übereinstimmt, und nicht nur die Funktion mit demselben Namen. Es wird die ctrl-]Funktionalität von überschreiben ctags.

Ich habe auch gesehen, dass YouCompleteMeRenderings clang_completeveraltet sind, aber da ich es noch nicht selbst verwendet habe, kann ich seine Nützlichkeit nicht garantieren.

clang_complete git repo: https://github.com/Rip-Rip/clang_complete

Christian Gibbons
quelle
Ich kann nichts über clang_complete sagen , YCM kann jedoch keine in einer anderen Übersetzungseinheit definierte Funktionsdefinition finden. Wir haben (/ hatten) Clang-Indexer (nicht wirklich gewartet) und ein paar andere Plugins. Heutzutage würde ich sagen, Clangd + Plugins zu überprüfen, die das Language Server Protocol implementieren.
Luc Hermitte