Saltar a la definición de función

Resuelto Jon Clegg asked hace 15 años • 12 respuestas

¿Cómo puedo saltar a la definición de una función usando Vim? Por ejemplo, con Visual Assist, puedo escribir Alt+g debajo de una función y se abre un menú contextual que enumera los archivos con definiciones.

¿Cómo puedo hacer algo como esto en vim?

Jon Clegg avatar Mar 12 '09 01:03 Jon Clegg
Aceptado

Utilice etiquetas. Genere un archivo de etiquetas e indique a vim dónde está usando el comando :tags. Luego puedes saltar a la definición de la función usando Ctrl:]

Hay más trucos y consejos sobre etiquetas en esta pregunta .

Paul Tomblin avatar Mar 11 '2009 18:03 Paul Tomblin

Si todo está contenido en un archivo, existe el comando gd(como en 'ir a definición'), que lo llevará a la primera aparición en el archivo de la palabra debajo del cursor, que suele ser la definición.

Scottie T avatar Mar 11 '2009 18:03 Scottie T

g*hace un trabajo decente sin configurar ctags.

Es decir, escriba g( *o simplemente *, consulte a continuación) para buscar la palabra debajo del cursor (en este caso, el nombre de la función). Luego presione npara ir a la siguiente ocurrencia (o Shift- npara la anterior).

No salta directamente a la definición, dado que este comando solo busca la palabra debajo del cursor, pero si no quieres lidiar con la configuración de etiquetas en este momento, al menos puedes evitar tener que volver a configurarlas. -escriba el nombre de la función para buscar su definición.

--Editar-- Aunque he estado usando g* durante mucho tiempo, ¡recientemente descubrí dos atajos para estos atajos!

(a) *saltará a la siguiente aparición de la palabra debajo del cursor. (No es necesario escribir el gcomando 'goto' en vi).

(b) #vuelve a la ocurrencia anterior, de manera similar.

N y n todavía funcionan, pero '#' suele ser muy útil para iniciar la búsqueda inicialmente en la dirección inversa, por ejemplo, cuando se busca la declaración de una variable debajo del cursor.

Brent Faust avatar Oct 12 '2011 21:10 Brent Faust

Utilice gdo gDmientras coloca el cursor en cualquier variable de su programa.

  1. gd Lo llevará a la declaración local.
  2. gD Lo llevará a la declaración global.

Se pueden encontrar más opciones de navegación aquí .

Utilice cscope para hacer referencias cruzadas a proyectos grandes, como el kernel de Linux.

0x90 avatar Nov 19 '2013 02:11 0x90

TL;DR:

Puede hacer esto usando la funcionalidad interna de VIM, pero una forma moderna (y mucho más fácil) en VIM clásico es usar COC para una fácil instalación de complementos y activar la finalización automática y uno o más servidores de idiomas (LS) para saltar a la definición. (y mucho más). Para obtener aún más funcionalidad (pero no es necesaria para saltar a la definición), puede instalar uno o más depuradores y obtener una experiencia IDE completa.

El mejor segundo es usar la funcionalidad nativa VIM llamada define-searchpero fue inventada para #definela directiva del preprocesador C y para la mayoría de los otros lenguajes requiere configuración adicional, para algunos no es posible en absoluto (también se pierden otras características del IDE). Finalmente, una alternativa a eso es ctagso (en mi humilde opinión, mejor) GNU global .

Todo lo de esta publicación es aplicable tanto a VIM como a NeoVIM; sin embargo, si realmente estás usando NeoVIM, te recomiendo seguir este tutorial sobre cómo crear tu init.luaconfiguración con un ejemplo totalmente utilizable y cada línea explicada: te brindará una experiencia IDE notablemente más rápida, pero desafortunadamente no funciona en VIM clásico.

Inicio rápido:

  1. instale vim-plug para administrar sus complementos VIM
  2. agregue COC y (opcionalmente) Vimspector en la parte superior de ~/.vimrc:
    call plug#begin()
    Plug 'neoclide/coc.nvim', {'branch': 'release'}
    Plug 'puremourning/vimspector'
    call plug#end()
    
    " key mappings example
    nmap <silent> gd <Plug>(coc-definition)
    nmap <silent> gD <Plug>(coc-implementation)
    nmap <silent> gr <Plug>(coc-references)
    " there's way more, see `:help coc-key-mappings@en'
    
  3. llame :source $MYVIMRC | PlugInstallpara recargar la configuración de VIM y descargar complementos
  4. reinicie vimy llame :CocInstall coc-marketplacepara obtener fácil acceso a las extensiones COC
  5. llamar :CocList marketplacey buscar servidores de idiomas, por ejemplo:
  • escribe pythonpara encontrar coc-jedi,
  • escriba phppara buscar coc-phpls, etc.
  1. (opcionalmente) consulte :h VimspectorInstallpara instalar depuradores adicionales, por ejemplo:
  • :VimspectorInstall debugpy,
  • :VimspectorInstall vscode-php-debug, etc.

Historia completa:

El servidor de idiomas (LS) es una aplicación independiente (una para cada lenguaje de programación) que se ejecuta en segundo plano y analiza todo su proyecto en tiempo real exponiendo capacidades adicionales a su editor (cualquier editor, no solo vim). Obtienes cosas como:

  • finalización de etiquetas con reconocimiento de espacio de nombres
  • saltar a la definición
  • saltar al error siguiente/anterior
  • encontrar todas las referencias a un objeto
  • encontrar todas las implementaciones de interfaz
  • cambiar el nombre en todo un proyecto
  • documentación al pasar el mouse
  • fragmentos, acciones de código, formato, linting y más...

La comunicación con los servidores de idiomas se realiza a través del Protocolo de servidor de idiomas (LSP). Ambos nvimy vim8(o superior) admiten LSP a través de complementos, siendo el más popular Conquer of Completion (COC).

La lista de servidores de idiomas desarrollados activamente y sus capacidades está disponible en el sitio web de Lang Server . No todos ellos los proporcionan las extensiones COC. Si desea utilizar uno de ellos, puede escribir una extensión COC usted mismo o instalar LS manualmente y utilizar la combinación de los siguientes complementos VIM como alternativa a COC:

  • LanguageClient : maneja LSP
  • deoplete : activa la finalización a medida que escribes

La comunicación con los depuradores se realiza a través del Protocolo adaptador de depuración (DAP). El complemento DAP más popular para VIM es Vimspector .

Language Server Protocol (LSP) fue creado por Microsoft para Visual Studio Code y lanzado como un proyecto de código abierto con una licencia MIT permisiva (estandarizada mediante colaboración con Red Hat y Codenvy). Más tarde, Microsoft también lanzó el Protocolo de adaptador de depuración (DAP). Cualquier idioma admitido por VSCode es compatible con VIM.

Para VIM clásico, personalmente recomiendo usar COC + servidores de idiomas proporcionados por extensiones COC + ALE para linting adicional (pero con soporte LSP deshabilitado para evitar conflictos con COC) + Vimspector + depuradores proporcionados por Vimspector (llamados "gadgets") + el siguiente complemento VIM -En s:

call plug#begin()
Plug 'neoclide/coc.nvim'
Plug 'dense-analysis/ale'
Plug 'puremourning/vimspector'
Plug 'scrooloose/nerdtree'
Plug 'scrooloose/nerdcommenter'
Plug 'sheerun/vim-polyglot'
Plug 'yggdroot/indentline'
Plug 'tpope/vim-surround'
Plug 'kana/vim-textobj-user'
  \| Plug 'glts/vim-textobj-comment'
Plug 'janko/vim-test'
Plug 'vim-scripts/vcscommand.vim'
Plug 'mhinz/vim-signify'
call plug#end()

Puedes buscar en Google cada uno para ver qué hacen.

VIM nativo salta a la definición:

Si realmente no desea utilizar Language Server y aun así desea un salto algo decente a la definición con la funcionalidad VIM nativa, debe familiarizarse con :ijy :djque significa include-jumpy definition-jump. Estos comandos VIM le permiten saltar a cualquier archivo incluido en su proyecto o saltar a cualquier símbolo definido que esté en cualquiera de los archivos incluidos. Sin embargo, para que eso funcione, VIM tiene que saber cómo se ven las líneas que incluyen archivos o definen símbolos en cualquier idioma en el que codifique. Puede configurarlo por idioma con ~/.vim/ftplugin/$file_type.vimy set include=$regexpatrones set define=$regexcomo se describe en :h include-search, aunque, crear esos Los patrones son un poco un arte y, a veces, no es posible en absoluto, por ejemplo, para idiomas donde la definición de símbolos o la importación de archivos pueden abarcar varias líneas (por ejemplo, Golang). Si ese es su caso, la alternativa habitual es ctagsla que se describe en otras respuestas o global , que es más popular en la comunidad de Emacs y requerirá algunos ajustes para ejecutar VIM (pero en mi humilde opinión, vale la pena).

cprn avatar Jul 05 '2018 15:07 cprn