Vim, ctags e sovraccarico


10

Esiste un modo per fare in modo che vim passi automaticamente alla giusta definizione corrispondente in caso di più definizioni. Il nostro codice C ++ utilizza fortemente il sovraccarico delle funzioni e la gestione di ctags da parte di vim non sembra essere pronta per questo.

Per esempio,

void abc(int a, int b) {

}

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

}

Stranamente, ctrl]avanti

abc(1,2,3);

porta alla prima definizione e non alla definizione corretta che è la seconda. Inoltre, g]richiede opzioni ma non è quello che sto cercando.

Grazie

Risposte:


4

La documentazione ( :help ctrl-]) dice:

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] potrebbe non essere quello che stai cercando, ma è il massimo che puoi ottenere in Vim.

Fondamentalmente, non puoi aspettarti che ctags e Vim comprendano il tuo codice, quindi dovrai cercare un indicizzatore più intelligente (come cscope, GNU GLOBAL o qualcosa basato su clang) o usare un IDE reale.


1

clangd & vim-lsp

Ho testato clangdper vedere se le funzioni sovraccaricate sono effettivamente distinte quando si cerca la definizione corretta da una riga di codice in cui viene utilizzata una delle funzioni sovraccaricate. Nella mia configurazione di test minima usando il plugin vim vim-lspha funzionato.

Configurazione minima

$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

La cui installazione vim-lsprichiede 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/

Ora dovrebbe apparire la tua configurazione di vim (omettendo file e cartelle più annidati)

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

5 directories, 1 file

Test

Ora considera il 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;
}

Premendo gdsu abcdi

  • abc(1,2) passa alla prima riga e di
  • abc(1,2,3) passa alla quinta riga.

Ambiente e versioni:

  • vim: MacVim 8.1.950 (155); installato da DMG da github su macOS 10.14.3
  • clangd: 7.0.0; installato con $ brew install llvm(non in $PATHper impostazione predefinita, usa il percorso assoluto)
  • vim-lsp: e3f6933 (7 marzo 2019) e async.vim: f301455 (13 febbraio 2019)

0

Come diceva romanl, ctagsnon capisco davvero il codice, quindi il meglio che può fare è indicarti funzioni che condividono il nome che stai cercando.

Tuttavia, credo che il clang_completeplugin offra le funzionalità che cerchi. Fa uso del clangcompilatore per trovare la funzione che corrisponde effettivamente a quella che stai cercando e non solo a quella che condivide lo stesso nome. Sostituirà la ctrl-]funzionalità di ctags.

Ho anche visto che ha reso obsoleto il YouCompleteMerendering clang_complete, ma poiché devo ancora usarlo da solo, non posso garantirne l'utilità.

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


Non posso dire di clang_complete , tuttavia, YCM non riesce a trovare una definizione di funzione definita (sic) in un'altra unità di traduzione. Abbiamo (/ avevamo) clang-indexer (non realmente gestito) e alcuni altri plugin. Oggi direi di controllare i plug-in clangd + che implementano il Protocollo Server lingua.
Luc Hermitte,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.