Pregunta:
Trabajo en un proyecto de C ++ bastante grande. Uno de los aspectos más frustrantes de su organización son las funciones muy grandes ubicadas dentro de archivos ridículamente grandes.
A menudo quiero buscar cualquier instancia de una variable global particular o llamada de función, restringida a la función actual. ¿Existe una fórmula razonablemente simple para lograr esto?
(Tengo ctags instalados y uso Tagbar … lo que podría ser útil para esto)
Respuesta:
Así es como lo haría yo. Agregue esto a su .vimrc
vnoremap if [[O][
Explicación: vnoremap significa mapear el lado izquierdo if
al lado derecho [[mO][
mientras está en modo visual. if
significa En función , aunque puede cambiar el nombre de esto si lo desea. [[
salta al comienzo de la función. O
mueve al otro extremo del texto seleccionado visualmente y luego ][
mueve al final de la función.
Entonces, si desea buscar en una función, ahora ingresa al modo visual con v
, y selecciona toda la función con if
. Ahora salga del modo visual con <esc>
y busque con /\%V
\%V
restringe su búsqueda al texto previamente seleccionado. Si no desea tener que presionar <esc>/\%V
, también puede agregar esto a su .vimrc
:
vnoremap / <esc>/\%V
Entonces, su secuencia de pulsaciones de teclas se vería así:
vif/foo<enter>
y esto encontrará todas las apariciones de foo en la función actual.
La única desventaja de este método es que espera que las llaves de apertura y cierre tengan 0 sangría. Si trabaja habitualmente con un código que no lo tiene, p. Ej.
int foo() {
bar()
}
entonces esta versión un poco más complicada funcionará:
vnoremap if ][ma%O'a
Esto solo espera que la llave de cierre tenga 0 sangría. Si la riostra de apertura tiene sangrías, aún funciona, aunque tiene una marca. Si usa regularmente la marca 'a', puede mover esto, por ejemplo
vnoremap if ][mb%O'b
vnoremap if ][mc%O'c
...