2009-03-11 87 views
158

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

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

+1

gnu global es mejor que ctags. – Jichao

+3

@Jichao, ¿puedes darnos un poco más de información sobre tu experiencia? ¿Con qué idiomas gnu global funcionó mejor para ti? ¿Hay algo más sobre el contexto que prefieres para que yo sea importante? ¿O tal vez lo has usado en muchos escenarios diferentes y parece que la mayoría/siempre lo prefieres? ¿Qué te gusta de eso mejor? Gracias. –

+0

@Jichao He convertido tu comentario en una respuesta wiki de la comunidad. Agradecería sus cambios y aportes para esta respuesta. –

Respuesta

127

Use ctags. Genere un archivo de etiquetas y dígale a vim dónde está usando el comando: tags. A continuación, sólo puede saltar a la definición de la función utilizando Ctrl - ]

Hay más tags trucos y consejos en this question.

+0

¿Esto funcionará para PHP? Olvidé mencionar que lo necesito para trabajar con C, C++, php y python. –

+2

php es como C lo suficiente como para que "Ctags exuberantes" funcionen con él. No sé si tiene un modo python. –

+3

¿No hay amor por Cscope? – greyfade

14

Como mencionó Paul Tomblin tienes que usar ctags. También podría considerar usar los complementos para seleccionar el 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 tratando de seleccionar uno de los cientos de métodos 'doAction' sobrecargados, ya que el soporte incorporado 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 tu vim tiene que compilarse con soporte de + 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 pasar a la definición del símbolo debajo del cursor.

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

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

+0

Hi @ mykola-golubyev, el enlace que proporcionó en la sección 'Descripción detallada' La secuencia de comandos # 2507' está rota. ¿Puedes proporcionarme otro por favor? – FelikZ

6

Para la segunda respuesta de Pablo: Sí, ctags (especialmente exuberante-ctags (http://ctags.sourceforge.net/)) es genial. También he añadido esto a mi vimrc, así que puedo utilizar un archivo de etiquetas para un proyecto completo:

set tags=tags;/ 
94

Si todo está contenido en un archivo, está el comando gd (como en la '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.

+1

¿Qué sucede si no tengo la palabra debajo del cursor (prefiero escribirla)? –

+0

@FuadSaud solo lo busca usando '/' – LucasB

+5

'/' casi siempre no es preciso, ya que va a coincidir con todas las ocurrencias. Descubrí que puedes hacer ': tag ' para saltar a la definición a través de ctags. –

13

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 puede entonces 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á utilizando ctags a partir de este momento, debería estar avergonzado de usted mismo! Sin embargo, creo que este estándar de codificación también es una adición útil.

+11

Siempre me he preguntado por qué algunos codificadores escriben sus firmas de esa manera. – Tarrasch

72

g * hace un trabajo decente sin crear ctags.

Es decir, escriba g * (o simplemente * - ver más abajo) para buscar la palabra debajo del cursor (en este caso, el nombre de la función). A continuación, presione n para pasar al siguiente (o Shift - n para anterior).

No salta directamente a la definición, dado que este comando simplemente busca la palabra debajo del cursor, pero si no desea tratar con la configuración de ctags en este momento, al menos puede salvarse tener que volver a escribir el nombre de la función para buscar su definición.

- Edite-- 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 y n todavía funcionan, pero '#' a menudo es muy útil para iniciar la búsqueda inicialmente en dirección inversa, por ejemplo, cuando se busca la declaración de una variable debajo del cursor.

+3

La diferencia entre '*' y 'g *' es el límite de palabras en la búsqueda. '*' hace una búsqueda '\ ' (igual que '\ bkeyword \ b' en la expresión regular), mientras que' g ​​* 'busca' keyword' sin límites de palabras. –

1

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

10

1- instalar ctags exuberantes. Si está utilizando OS X, este artículo muestra un pequeño truco: http://www.runtime-era.com/2012/05/exuberant-ctags-in-osx-107.html

2- Si sólo desea incluir los ctags para los archivos en el directorio solamente, ejecutar este comando en el directorio:

ctags -R 

Esto creará un archivo de "etiquetas" para usted.

3- Si está usando Ruby y desear incluir los ctags para sus gemas (esto ha sido de gran ayuda para mí con RubyMotion y joyas locales que he desarrollado), haga lo siguiente:

ctags --exclude=.git --exclude='*.log' -R * `bundle show --paths` 

de crédito: https://coderwall.com/p/lv1qww (Tenga en cuenta que he omitido la opción -e que genera etiquetas para emacs en vez de vim)

4- Agregue la línea siguiente 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- Ir a la palabra que le gustaría seguir y golpeó ctrl + ]; si desea volver atrás, use ctrl+o (fuente: https://stackoverflow.com/a/53929/226255)

25

Uso gd y gD, coloque el cursor en cualquier variable en su programa.

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

más opciones de navegación se pueden encontrar en here.

Utilice cscope para realizar referencias cruzadas de proyectos de gran tamaño, como el kernel de Linux.

3

Realmente no recomiendo usar etiquetas en Vim. Tuve que escribir mi propio complemento de etiquetas que es más avanzado que todos los demás complementos de etiquetas, así como dejar pasar mucho tiempo antes de poder finalmente entender y aceptar que las etiquetas 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 trata de 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 etiquetas.

+0

Pensamientos adicionales. Si bien es cierto que las etiquetas son muy limitadas, y las herramientas más perspicaces son más potentes, también tienden a tener errores. Parece que el problema subyacente tiene algo que ver con la cultura de la comunidad de plugins de Vim. Simplemente no prueban su código muy bien. Parte del problema es el lenguaje VimL en sí mismo. No lo alienta a pensar en sí mismo como un lenguaje completo y, por lo tanto, probar su código con pruebas automáticas no es práctico hasta que no esté muy avanzado con el idioma. Esto está frenando la comunidad de Vim, pero no sé cuál es la solución. –

+0

Siga con mis pensamientos. Pero no creo que ese sea todo el problema. Hay algo acerca de la idea de que solo estamos haciendo un complemento para extender la funcionalidad de Vim que nos hace desear hackearlo juntos. Incluso los complementos que dependen principalmente de lenguajes que se pueden probar de manera más natural para la parte principal de su implementación, generalmente no tienen muchas pruebas. Creo que el problema es que la mentalidad de TDD no se ha infiltrado por completo en la práctica de la programación. En mi opinión, nuestras herramientas deberían ser lo más probado, no menos importante. Lo último que quieres es que los errores en tus herramientas te ralenticen. –

+0

Seguimiento para seguimiento de otros pensamientos. Quiero decir, ¿qué pasa si contrataste a algunos trabajadores de la construcción para construir un edificio para ti? Digamos que a uno de ellos le gusta modificar sus herramientas. Él dice que puede ser más productivo al hacer esto. También adopta modificaciones de otras personas a quienes les gusta modificar sus herramientas. Pero luego sus herramientas se estropean con frecuencia porque las modificaciones no son muy profesionales. ¿Cómo te sentirías acerca de ellos si dijeran que estaba bien, porque estas son solo algunas herramientas que han pirateado juntas y prometen que serán más cuidadosas que eso con lo que construyen para ti? –

Cuestiones relacionadas