Saltar a la definición de función
¿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?
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 .
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.
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 g
comando '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.
Utilice gd
o gD
mientras coloca el cursor en cualquier variable de su programa.
gd
Lo llevará a la declaración local.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.
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-search
pero fue inventada para #define
la 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 ctags
o (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.lua
configuració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:
- instale vim-plug para administrar sus complementos VIM
- 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'
- llame
:source $MYVIMRC | PlugInstall
para recargar la configuración de VIM y descargar complementos - reinicie
vim
y llame:CocInstall coc-marketplace
para obtener fácil acceso a las extensiones COC - llamar
:CocList marketplace
y buscar servidores de idiomas, por ejemplo:
- escribe
python
para encontrarcoc-jedi
, - escriba
php
para buscarcoc-phpls
, etc.
- (opcionalmente) consulte
:h VimspectorInstall
para 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 nvim
y 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 :ij
y :dj
que significa include-jump
y 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.vim
y set include=$regex
patrones set define=$regex
como 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 ctags
la 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).