Vim, ctags y sobrecarga

10

¿Hay alguna manera de hacer que vim salte a la definición de coincidencia correcta automáticamente en caso de múltiples definiciones? Nuestro código C ++ utiliza en gran medida la sobrecarga de funciones y el manejo de ctags de vim no parece estar listo para ello.

Por ejemplo,

void abc(int a, int b) {

}

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

}

Extrañamente, ctrl]en

abc(1,2,3);

toma la primera definición y no la definición correcta, que es la segunda. Además, g]solicita opciones, pero eso no es lo que estoy buscando.

Gracias

yumoji
fuente

Respuestas:

4

La documentación ( :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] Puede que no sea lo que estás buscando, pero eso es lo mejor que puedes conseguir en Vim.

Básicamente, no puede esperar que ctags y Vim entiendan su código, por lo que tendrá que buscar un indexador más inteligente (como cscope, GNU GLOBAL o algo basado en clang) o usar un IDE real.

romainl
fuente
1

clangd y vim-lsp

He probado clangdpara ver si las funciones sobrecargadas se distinguen realmente cuando busco la definición correcta de una línea de código donde se usa una de las funciones sobrecargadas. En mi configuración de prueba mínima usando el complemento vim vim-lspfuncionó.

Configuración mínima

$MYVIMRC es

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 instalación de los vim-lspcuales requiere async.vimen 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/

Ahora su configuración vim debería verse así (omitiendo archivos y carpetas más profundamente anidados)

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

5 directories, 1 file

Prueba

Ahora considere el archivo 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;
}

Al pulsar gdsobre el abcde

  • abc(1,2) salta a la primera línea, y de
  • abc(1,2,3) salta a la quinta línea.

Entorno y versiones:

  • vim: MacVim 8.1.950 (155); instalado desde DMG desde github en macOS 10.14.3
  • clangd: 7.0.0; instalado con $ brew install llvm(no en $PATHforma predeterminada, usar ruta absoluta)
  • vim-lsp: e3f6933 (7 de marzo de 2019) y async.vim: f301455 (13 de febrero de 2019)
Hotschke
fuente
0

Como dijo romanl, ctagsrealmente no entiende el código, por lo que lo mejor que puede hacer es señalarle las funciones que comparten el nombre que está buscando.

Sin embargo, creo que el clang_completecomplemento proporciona la funcionalidad que busca. Utiliza el clangcompilador para encontrar la función que realmente coincide con la que está buscando, y no solo una que comparte el mismo nombre. Anulará la ctrl-]funcionalidad de ctags.

También he visto que dice que las YouCompleteMeversiones están clang_completepasadas de moda, pero como aún no lo he usado, no puedo garantizar su utilidad.

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

Christian Gibbons
fuente
No puedo decir acerca de clang_complete , sin embargo, YCM no puede encontrar una definición de función definida (sic) en otra unidad de traducción. Tenemos (/ had) clang-indexer (no realmente mantenido), y algunos otros complementos. Hoy en día, diría que compruebe los complementos de clangd + que implementan el Protocolo de servidor de idiomas.
Luc Hermitte