¿Cómo puedo saltar a una definición de función usando vim? Por ejemplo, con Visual Assist, puedo escribir Alt+ gdebajo de una función y se abre un menú contextual que enumera los archivos con definiciones.
¿Cómo puedo hacer algo así en vim?
¿Cómo puedo saltar a una definición de función usando vim? Por ejemplo, con Visual Assist, puedo escribir Alt+ gdebajo de una función y se abre un menú contextual que enumera los archivos con definiciones.
¿Cómo puedo hacer algo así en vim?
Respuestas:
Usa etiquetas. Genere un archivo de etiquetas y dígale a vim dónde está usando el comando: etiquetas. Luego puede saltar a la definición de la función usando Ctrl-]
Hay más trucos de etiquetas y consejos en esta pregunta .
Si todo está contenido en un archivo, está el comando gd
(como en 'ir a la definición'), que lo llevará a la primera aparición en el archivo de la palabra debajo del cursor, que a menudo es la definición.
/
/
Casi siempre no es preciso, ya que coincidirá con todas las ocurrencias. Descubrí que realmente puedes hacer :tag <function_name>
para saltar a la definición a través de ctags.
g* hace un trabajo decente sin configurar ctags.
Es decir, el tipo g, *(o simplemente *- véase más adelante) para buscar la palabra bajo el cursor (en este caso, el nombre de la función). Luego presione npara ir al siguiente (o Shift-n para) ocurrencia anterior.
No salta directamente a la definición, dado que este comando solo busca la palabra debajo del cursor, pero si no desea lidiar con la configuración de etiquetas en este momento, al menos puede evitar tener que volver a -tipee 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) #va a la ocurrencia anterior, de manera similar.
N yn todavía funcionan, pero '#' a menudo es muy útil para comenzar la búsqueda inicialmente en la dirección inversa, por ejemplo, cuando se busca la declaración de una variable debajo del cursor.
*
y g*
es el límite de palabras en la búsqueda. *
realiza una \<keyword\>
búsqueda (igual que \bkeyword\b
en la expresión regular regular), mientras g*
busca keyword
sin límites de palabras.
*
le llevará un promedio de 50 visitas antes de encontrar la definición.
Como Paul Tomblin mencionó, tienes que usar ctags . También podrías considerar usar complementos para seleccionar uno apropiado o para obtener una vista previa de la definición de la función debajo del cursor. Sin complementos, tendrá un dolor de cabeza al intentar seleccionar uno de los cientos de métodos 'doAction' sobrecargados, ya que el soporte integrado de ctags no tiene en cuenta el contexto, solo un nombre.
También puede usar cscope y su función 'buscar símbolo global'. Pero su vim debe compilarse con soporte + cscope, que no es una opción predeterminada de compilación.
Si sabe que la función está definida en el archivo actual, puede usar las teclas 'gD' en un modo normal para saltar a la definición del símbolo debajo del cursor.
Aquí está el complemento más descargado para la navegación
http://www.vim.org/scripts/script.php?script_id=273
Aquí hay uno que he escrito para seleccionar el contexto mientras salto a la etiqueta
http://www.vim.org/scripts/script.php?script_id=2507
Detailed description
sección del #2507
script está roto. ¿Puedes proporcionar otro por favor?
Otra técnica común es colocar el nombre de la función en la primera columna. Esto permite encontrar la definición con una simple búsqueda.
int
main(int argc, char *argv[])
{
...
}
La función anterior se puede encontrar /^main
dentro del archivo o :grep -r '^main' *.c
dentro de un directorio. Siempre que el código esté sangrado correctamente, la única vez que el identificador ocurrirá al comienzo de una línea es en la definición de la función.
Por supuesto, si no estás usando etiquetas desde este punto, ¡deberías avergonzarte de ti mismo! Sin embargo, este estándar de codificación también me parece una adición útil.
TL; DR:
La forma moderna es usar COC para completar de forma inteligente y uno o más servidores de lenguaje (LS) para saltar a la definición (y mucho más). Para una funcionalidad aún mayor (pero no es necesaria para saltar a la definición), puede instalar uno o más depuradores y obtener una experiencia IDE completa. Inicio rápido:
~/.vimrc
:
call plug#begin()
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'puremourning/vimspector'
call plug#end()
:source $MYVIMRC | PlugInstall
para descargar complementos VIMvim
y llamar :CocInstall coc-marketplace
para acceder fácilmente a las extensiones COC:CocList marketplace
y buscar servidores de idiomas, por ejemplo:
python
para encontrar coc-jedi
,php
para buscar coc-phpls
, etc.install_gadget.py --help
los depuradores disponibles, por ejemplo:
./install_gadget.py --enable-python
,./install_gadget.py --force-enable-php
etc.Respuesta completa:
Language Server (LS) es una aplicación independiente separada (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:
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, el más popular es 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 son provistos por extensiones COC. Si desea utilizar uno de ellos, puede escribir una extensión COC usted mismo o instalar LS manualmente y usar el combo de los siguientes complementos VIM como alternativa a COC:
La comunicación con los depuradores se realiza a través del Protocolo de 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 por la colaboración con Red Hat y Codenvy). Más tarde, Microsoft lanzó Protocolo de adaptador de depuración (DAP) también. Cualquier lenguaje compatible con VSCode es compatible con VIM.
Personalmente, recomiendo usar los servidores de idiomas COC + proporcionados por las extensiones COC + ALE para linting adicional (pero con el soporte LSP desactivado para evitar conflictos con COC) + Vimspector + depuradores proporcionados por Vimspector (llamados "gadgets") + siguientes complementos VIM:
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.
1- instala etiquetas exuberantes. Si está utilizando osx, este artículo muestra un pequeño truco: http://www.runtime-era.com/2012/05/exuberant-ctags-in-osx-107.html
2- Si solo desea incluir los ctags para los archivos en su directorio solamente, ejecute este comando en su directorio:
ctags -R
Esto creará un archivo de "etiquetas" para usted.
3- Si estás usando Ruby y deseas incluir las etiquetas de tus gemas (esto me ha sido de gran ayuda con RubyMotion y las gemas locales que he desarrollado), haz lo siguiente:
ctags --exclude=.git --exclude='*.log' -R * `bundle show --paths`
crédito: https://coderwall.com/p/lv1qww (Tenga en cuenta que omití la opción -e que genera etiquetas para emacs en lugar de vim)
4- Agregue la siguiente línea a su ~ / .vimrc
set autochdir
set tags+=./tags;
(¿Por qué el punto y coma: http://vim.wikia.com/wiki/Single_tags_file_for_a_source_tree )
5- Ve a la palabra que te gustaría seguir y presiona ctrl + ]
; si desea regresar, use ctrl+o
(fuente: https://stackoverflow.com/a/53929/226255 )
A la segunda respuesta de Paul: sí, ctags (especialmente exuberante-ctags ( http://ctags.sourceforge.net/ )) es genial. También he agregado esto a mi vimrc, por lo que puedo usar un archivo de etiquetas para un proyecto completo:
set tags=tags;/
Instalar cscope
. Funciona muy parecido ctags
pero más poderoso. Para ir a la definición, en lugar de Ctrl+ ], haz Ctrl+ \+ g. Por supuesto, puede usar ambos simultáneamente. Pero con un gran proyecto (por ejemplo, el kernel de Linux), cscope está muy por delante.