instalar - Obtenga ctags en vim para ir a la definición, no a la declaración
vim descargar (9)
Tengo el problema de que los ctags en vim / gvim me llevan a una declaración directa muchas veces en lugar de a la definición real de la función.
¿Alguna forma de evitar eso?
Agregue lo siguiente a su archivo .vimrc:
noremap <c-]> 2<c-]>
Esta línea hace que vim salte automáticamente a la segunda coincidencia (en lugar de la primera), que generalmente es la definición de la función.
Creo que Vim va a la primera etiqueta en el archivo de etiquetas de forma predeterminada. Puede seleccionar uno diferente si lo prefiere: use :tj
(similar a: tselect, pero auto-jump si solo hay una coincidencia) o Ctrl-]
seguido de :tn
).
La única forma de cambiar el valor predeterminado es cambiar el orden del archivo de etiquetas, pero no creo que ctags ofrezca una opción de línea de comandos para hacer esto.
Esto no es tan difícil como parece, ya que básicamente se necesita un script que abra el archivo de etiquetas, lo clasifique por el "tipo" de etiqueta y lo vuelva a escribir. El ''tipo'' en la etiqueta es un solo caracter que describe si es una función (f), un prototipo de función (p), una macro, un nombre enumerado, etc. etc. Si está utilizando Linux, podría, en teoría , se tan simple como:
#!/bin/sh
ctags -R -f - . | tac > tags
Como tac
invierte el orden de las líneas en un archivo, esto colocará automáticamente la definición primero. Sin embargo, se vuelve un poco más complicado ya que el encabezado debe mantenerse y Vim prefiere que el archivo de etiqueta sea ordenado, por lo que es mejor revisar el archivo y ordenar la primera entrada (el nombre de la etiqueta) en orden de avance y luego tipo en orden inverso. Por lo tanto, algo más complicado puede ser mejor.
Me disculpo por el enchufe desvergonzado, pero he escrito un plugin de Vim que (indirectamente) hace lo que necesita. Está destinado a agregar muchos grupos de resaltado adicionales para cosas como nombres de funciones, macros, enumeraciones, etc. Sin embargo, una de las otras cosas que hace es reordenar el archivo de etiquetas para que la implementación de la función llegue antes de la declaración de la función, por lo tanto logrando lo que quieres (tuve la misma necesidad que tú). Si no quiere ninguna de las funcionalidades de resaltado, probablemente podría despojarlo con bastante facilidad: es un programa de Python bastante simple y un script de Vim aún más simple, y está disponible desde mi sitio .
Creo que la forma más fácil es usar "g ctrl-]" en lugar de solo "ctrl-]". Si solo hay una coincidencia, te llevará allí. Si hay varias coincidencias, se enumerarán todas, lo que le permitirá elegir la que desea, al igual que: tselect. Lo mejor de ambos mundos. :)
Debería poder usar tn
y tp
para saltar a las diversas etiquetas coincidentes.
- Presiona
^]
para llevarte al primer partido. - Si esa no es la coincidencia que desea, escriba
:tn
para pasar a la siguiente. - Si escribió
:tn
muchas veces, puede escribir:tp
para volver al anterior.
Esta opción funcionó para mí mejor
Coloque la siguiente línea en su .vimrc y ahora puede usar el doble clic del mouse (en la variable/entry
en su archivo) para saltar a la ubicación etiquetada. Si se encuentra una coincidencia única, saltará de inmediato. Si hay varias entradas coincidentes, se solicitará la entrada del usuario.
:map <2-LeftMouse> g< c-]>
Hay varias maneras de hacer que Vim salte a una etiqueta directamente, si solo hay una coincidencia de etiqueta, de lo contrario, presente una lista de coincidencias de etiquetas.
Puede usar el comando ex '' tjump
''. Por ejemplo, el comando '' :tjump func1
'' saltará a la definición func1, si está definida solo una vez. Si func1 se define varias veces, se presentará una lista de etiquetas coincidentes.
Puede colocar el cursor sobre la etiqueta y presionar g Ctrl-]
.
Puede seleccionar visualmente un texto y presionar g Ctrl-]
para saltar o enumerar las etiquetas coincidentes.
Puede usar el comando ex '' stjump
''. Esto abrirá la etiqueta correspondiente o seleccionada de la lista de etiquetas en una nueva ventana.
Puede presionar Ctrl-W g Ctrl-]
para hacer a: stjump.
Help: :tjump, g_Ctrl-], v_g_CTRL-], :stjump, Ctrl-W_g_Ctrl-]
Puedes presionar 2 y luego CTRL + ] , esto irá directamente a la segunda coincidencia, en java, esta suele ser la implementación de alguna interfaz.
Tarde para la fiesta, pero para googlers entrantes vim tag:
He descubierto que usar cscope además de ctags es el camino a seguir, al menos para C / C ++. Es más inteligente acerca de los árboles de llamadas, y puede configurarlo para que vuelva a los ctags si falla. Simplemente ejecute "cscope -b" cada vez que ejecute ctags -R. y estarás listo para irte Si usa la configuración a continuación, podrá usar Ctrl -] / Ctrl-T como siempre, pero también puede agregar nuevos saltos ingeniosos como saltar a una declaración de función y mostrar un jumplist de llamadores de función.
" setup
if has("cscope")
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
endif
" jump to a function declaration
nmap <silent> <C-/> :cs find s <C-R>=expand("<cword>")<CR><CR>1<CR><CR>
" show a list of where function is called
nmap <silent> <C-_> :cs find c <C-R>=expand("<cword>")<CR><CR>
:tselect my_little_function
y obtendrías una lista de coincidencias. o si salta a una etiqueta y no está satisfecho con ella, escriba
:tselect
Y obtienes una lista de alternativas para la última etiqueta activa.