Vim, ctags et surcharge


10

Existe-t-il un moyen de faire vim sauter automatiquement à la bonne définition correspondante en cas de définitions multiples. Notre code C ++ utilise fortement la surcharge de fonctions et la gestion des ctags par vim ne semble pas être prête pour cela.

Par exemple,

void abc(int a, int b) {

}

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

}

Étrangement, ctrl]sur

abc(1,2,3);

prend la 1ère définition et non la bonne définition qui est la 2ème. En outre, g]demande des options, mais ce n'est pas ce que je recherche.

Merci

Réponses:


4

La documentation ( :help ctrl-]) dit:

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] Ce n'est peut-être pas ce que vous cherchez, mais c'est le meilleur que vous puissiez obtenir à Vim.

Fondamentalement, vous ne pouvez pas vous attendre à ce que ctags et Vim comprennent votre code, vous devrez donc rechercher un indexeur plus intelligent (comme cscope, GNU GLOBAL ou quelque chose basé sur clang) ou utiliser un IDE réel.


1

clangd & vim-lsp

J'ai testé clangdpour voir si les fonctions surchargées sont réellement distinguées lors de la recherche de la définition correcte à partir d'une ligne de code où l'une des fonctions surchargées est utilisée. Dans ma configuration de test minimale en utilisant le plugin vim, vim-lspcela a fonctionné.

Configuration minimale

$MYVIMRC est

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

Dont l' installation vim-lspnécessite async.vimdans 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/

Maintenant, votre configuration vim devrait ressembler (en omettant les fichiers et dossiers plus profondément imbriqués)

~/.vim
❯ tree -L 4 -F
.
├── pack/
│   └── prabirshrestha/
│       └── start/
│           ├── async.vim/
│           └── vim-lsp/
└── vimrc

5 directories, 1 file

Tester

Considérez maintenant le fichier 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;
}

En appuyant gdsur abcde

  • abc(1,2) saute à la première ligne et
  • abc(1,2,3) saute à la cinquième ligne.

Environnement et versions:

  • vim: MacVim 8.1.950 (155); installé à partir de DMG à partir de github sur macOS 10.14.3
  • clangd: 7.0.0; installé avec $ brew install llvm(pas $PATHpar défaut, utilisez le chemin absolu)
  • vim-lsp: e3f6933 (7 mars 2019) et async.vim: f301455 (13 févr.2019 )

0

Comme l'a indiqué romanl, ctagsne comprend pas vraiment le code, donc le mieux qu'il puisse faire est de vous diriger vers des fonctions partageant le nom que vous recherchez.

Cependant, je pense que le clang_completeplugin fournit les fonctionnalités que vous recherchez. Il utilise le clangcompilateur pour trouver la fonction qui correspond réellement à celle que vous recherchez, et pas seulement celle qui partage le même nom. Il remplacera la ctrl-]fonctionnalité de ctags.

J'ai également vu qu'il est YouCompleteMerendu clang_completeobsolète, mais comme je ne l'ai pas encore utilisé, je ne peux pas garantir son utilité.

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


Je ne peux pas parler de clang_complete , cependant, YCM ne peut pas trouver une définition de fonction définie (sic) dans une autre unité de traduction. Nous avons (/ avions) clang-indexer (pas vraiment maintenu), et quelques autres plugins. De nos jours, je dirais de vérifier les plugins clangd + implémentant le Language Server Protocol.
Luc Hermitte
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.