¿Cómo saltar a la llamada de función?

14

Después de generar un archivo de etiquetas con exuberant-ctagspuedo saltar de una llamada de función a su declaración con lo <C-]>cual es bastante conveniente.

Mi pregunta es cómo hacerlo de otra manera. Cuando mi cursor está en la definición de una función, ¿cómo puedo ir a las líneas donde se llama la función?

Cuando miro el archivo generado por ctags solo veo información relacionada con la ubicación de la definición y no de las llamadas, ¿significa que no puedo hacer eso, que Vim es una solución inteligente o que necesito usar algo? más que exuberant-ctags?

statox
fuente
Ack o Ag también funcionarán y puede encontrar envoltorios de complementos para estas herramientas de línea de comandos con bastante facilidad. Por ejemplo, github.com/mileszs/ack.vim y github.com/rking/ag.vim
dash-tom-bang

Respuestas:

11

No puede saltar a las llamadas de función con ctags. Para C / C ++ y Java existe cscope, y se integra muy bien con Vim (ver :help cscope). Para otros idiomas, puede encontrar una herramienta que genere / exporte cscopebases de datos compatibles (fi hscopepara Haskell, y starscopepara Ruby, Go y JavaScript). También se puede utilizar cscopecon GNU globales bases de datos, señalando cscopeprga gtags-cscope.

En una nota al margen: si no se desanima por el uso desconcertante de Engrish ,;) probablemente también desee usar ctags universales en lugar de exuberant-ctags. Este último no se ha actualizado en años. El primero es un tenedor mantenido activamente.

Sato Katsura
fuente
¿Cscope admite otros lenguajes que C / C ++ y Java?
edi9999
@ edi9999 cscopees compatible con C / C ++, Lex y Yacc. El soporte para Java es marginalmente útil. Puede obtener soporte para PHP (antiguo) PHP y JavaScript de GNU global, a través de la gtags-cscopeutilidad. Y, como dije anteriormente, hay otros indexadores que pueden exportar cscopebases de datos compatibles.
Sato Katsura
8

No puedes hacer eso con ctags.

Pruebe una alternativa más robusta como cscope (que incluso tiene su propia sección de ayuda :):help cscope o global .

romainl
fuente
¿Cscope admite otros lenguajes que C / C ++ y Java?
edi9999
Sí, al menos PHP y JavaScript.
romainl
1
@romainl Nope, en cscopesí mismo no admite ni PHP ni JavaScript. Sin embargo, puede indexar archivos PHP y JavaScript con GNU global, luego ejecutar gtags-cscopepara usar el gtagsarchivo resultante con cscope.
Sato Katsura
@SatoKatsura, sí, cscope admite JavaScript (y CSS, aparentemente).
romainl
2
@romainl Debería considerar mirar cscopelas fuentes en lugar de especular basándose en experimentos rápidos. cscopetiene un analizador de C bastante relajado. Eso es todo lo que tiene, y todo lo que hace. Con ese analizador "soporta" muchos idiomas, para valores adecuados de "soporte". Las construcciones se reconocen siempre que se vean más o menos como C. Por eso no se reconocen las clases de Java y las construcciones PHP más nuevas. Compare fi con starscope , que en realidad permite agregar nuevos idiomas.
Sato Katsura
8

Puede usar el comando grep de Vim para buscar todos los archivos en su proyecto:

:grep! "\<<cword>\>" . -r
:copen

Pongamos eso en una combinación de teclas:

nnoremap <F4> :grep! "\<<cword>\>" . -r<CR>:copen<CR>

Encuentro esta búsqueda clave de todo el proyecto invaluable cuando estoy explorando una gran base de código desconocida.

\<y \>son secuencias regexp que indican el inicio y el final de una palabra, por lo que no obtendrá coincidencias parciales. (La -wopción de grep podría ser otra forma de lograr esto).

Sin embargo, esta es una búsqueda poco inteligente , por lo que puede producir falsos positivos si la misma palabra aparece en contextos no relacionados.


A decir verdad, utilizo mi propia versión modificada del complemento grep.vim . Esto es un poco más amigable de usar:

  • Le permite editar el patrón de búsqueda, y también la línea de comando grep (para que pueda apuntar a carpetas específicas como en src/ lib/lugar de .) y recuerda los cambios.
  • Agregué soporte para la búsqueda de Google . Esto puede ser mucho más rápido que grep porque crea un índice de palabras en lugar de escanear cada archivo cada vez. En particular, csearch usa un estándar de expresión regular ligeramente diferente, por lo que \bdebe usarse en lugar de \<y \>.

Lo configuro y excluyo algunos archivos estándar como este .

Para un acceso rápido, creo dos combinaciones de teclas . F3me permite editar la línea de comandos, F4usa la línea de comandos configurada previamente sin ninguna pulsación de tecla adicional. El mecanismo es bastante feo y podría usar algo de limpieza, pero me ha servido bien.

joeytwiddle
fuente