Saltar a la definición de la función en vim

¿Cómo puedo ir a una definición de 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?

Usa ctags Genere un archivo de tags y dígale 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 tags en esta pregunta .

Si todo está contenido en un archivo, existe el comando gd (como en ‘definición goto’), que lo llevará a la primera aparición en el archivo de la palabra debajo del cursor, que a menudo es la definición.

g * hace un trabajo decente sin configurar ctags.

Es decir, escriba g , * (o simplemente * – vea abajo) para buscar la palabra debajo del cursor (en este caso, el nombre de la función). Luego presione n para ir a la siguiente aparición (o Shiftn para anterior).

No salta directamente a la definición, dado que este comando solo busca la palabra debajo del cursor, pero si no quiere ocuparse de la configuración de ctags en este momento, al menos puede evitar tener que re -type 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 g , el comando ‘goto’ en vi).

(b) # va a la aparición anterior, de manera similar.

N yn aún funcionan, pero ‘#’ a menudo es muy útil para comenzar la búsqueda inicialmente en la dirección inversa, por ejemplo, cuando se busca la statement de una variable debajo del cursor.

Use gd y gD , coloque el cursor sobre cualquier variable en su progtwig.

  1. gd lo llevará a la statement local.
  2. gD te llevará a la statement global.

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

Use cscope para referencias cruzadas de proyectos grandes, como el kernel de Linux.

Como Paul Tomblin mencionó, debes usar ctags . También podría considerar usar complementos para seleccionar el apropiado o para previsualizar la definición de la función debajo del cursor. Sin complementos, tendrás un dolor de cabeza tratando de seleccionar uno de los cientos de métodos ‘doAction’ sobrecargados, ya que el soporte de ctags integrado no tiene en cuenta el contexto, solo un nombre.

También puede usar cscope y su función ‘buscar símbolo global’. Pero tu vim tiene que comstackrse con soporte de + cscope que no es una opción predeterminada de comstackción.

Si sabe que la función está definida en el archivo actual, puede usar las teclas ‘gD’ en un modo normal para pasar a la definición del símbolo debajo del cursor.

Aquí está el plugin más descargado para navegación
http://www.vim.org/scripts/script.php?script_id=273

Aquí hay uno que he escrito para seleccionar el contexto mientras saltas para etiquetar
http://www.vim.org/scripts/script.php?script_id=2507

Otra técnica común es colocar el nombre de la función en la primera columna. Esto permite que la definición se encuentre con una búsqueda simple.

 int main(int argc, char *argv[]) { ... } 

La función anterior podría encontrarse con /^main dentro del archivo o con :grep -r '^main' *.c en un directorio. Siempre que el código esté apropiadamente sangrado, 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 utilizando ctags a partir de este momento, ¡deberías avergonzarte! Sin embargo, creo que este estándar de encoding también es una adición útil.

1- instalar ctags exuberantes. Si está usando 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 las tags de los archivos en su directorio solamente, ejecute este comando en su directorio:

 ctags -R 

Esto creará un archivo de “tags” para usted.

3- Si estás usando Ruby y deseas incluir los ctags para tus gems (esto ha sido realmente útil para mí con RubyMotion y las gems 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 tags 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 volver atrás, use ctrl+o (fuente: https://stackoverflow.com/a/53929/226255 )

Para secundar la respuesta de Paul: sí, ctags (especialmente exuberant-ctags ( http://ctags.sourceforge.net/ )) es genial. También agregué esto a mi vimrc, así que puedo usar un archivo de tags para un proyecto completo:

 set tags=tags;/ 

Realmente no recomiendo usar tags en Vim. Tuve que escribir mi propio complemento de tags que es más avanzado que todos los demás complementos de tags, así como dejar pasar mucho tiempo antes de poder finalmente entender y aceptar que las tags son demasiado limitadas y que hay demasiados falsos positivos.

En su lugar, le recomiendo usar herramientas más inteligentes que realmente conozcan el idioma con el que está trabajando, la estructura de su proyecto y el contexto desde el cual intenta saltar a la definición de algo. Como ejemplo, phpcd funciona muy bien para proyectos de PHP. Utiliza la reflexión de PHP para obtener información sobre su código. También hay otras opciones para otros idiomas que no dependen de las tags.

Instala cscope . Funciona muy parecido a ctags pero es más poderoso. Para ir a la definición, en lugar de Ctrl + ] , haga Ctrl + \ + g . Por supuesto, puede usar ambos al mismo tiempo. Pero con un gran proyecto (por ejemplo, kernel de Linux), cscope está muy avanzado.

Solo para agregar a las respuestas anteriores:

La forma alternativa y más actual de hacer esto (y otras funcionalidades similares a VSC) sería ejecutar un Servidor de Idioma . Debe ejecutar un proceso separado que analice su código en tiempo real y le proporcione capacidades al editor seleccionado (es una solución general). En nvim (y, creo, vim8 +) puede lograr esa comunicación instalando dos complementos que en conjunto proporcionan un soporte de Language Server Protocol:

  1. deoplete – proveedor de compleción de etiqueta
  2. vim-lsp-client – Soporte de LSP para proveedores de finalización de tags

Puede encontrar una lista de servidores de idiomas desarrollados activamente y sus capacidades en el sitio web de Lang Server .

Y sí, Language Server Protocol fue creado por Microsoft para Visual Studio Code y lanzado como un proyecto de código abierto con una licencia permisiva de MIT (estandarizada por colaboración con Red Hat y Codenvy).