Estoy tratando de leer mucho código C / Perl a través de Vim que contiene muchos nombres de variables de una sola letra.
Sería bueno tener algún comando que pudiera ayudarme a cambiar el nombre de una variable a algo más significativo mientras estoy en el proceso de leer el código para poder leer el resto más rápido.
¿Hay algún comando en Vim que me permita hacer esto rápidamente?
No creo que las expresiones regulares funcionen porque:
el mismo nombre de una sola letra puede tener diferentes propósitos en diferentes bloques de alcance
la misma combinación de letras podría ser parte de otro nombre var más grande, o en una cadena o comentario ... no querría modificar esos
¿Alguna solución conocida?
fuente
:
) dos veces. La primera vez que lo presioné, lo vi:'<,'>
. Si escribías/
desde allí, no funcionaba; Tuve que escribir otros dos puntos antes dels/
.<C-R>
el comando sustituto, simplemente omitir la búsqueda hará que vim use el último patrón buscado, que en este caso se creó a partir delgd
comando. Así que basta con hacerlo:s//<newname>/gc
.AFAIK, no hay soporte de refactorización real en VIM. Cuando hago un cambio de nombre con la intención de refactorizar, generalmente tomo las siguientes precauciones:
Mi cambio final se parece a esto
Me encantaría estar equivocado acerca de que no hay una herramienta de refactorización para VIM, pero no la he visto.
fuente
Sé que es una pregunta antigua, y la forma de @ mykola-golubyev obviamente ES la mejor respuesta para el caso particular en la pregunta OP (que, supongo, está pasando por un código ofuscado donde es probable que tenga varios bloques con los mismos nombres de var) ; pero con el nombre de la pregunta como ese, muchas personas que vienen aquí desde las búsquedas de Google probablemente buscan formas menos específicas de la situación para cambiar el nombre de las variables en VIM, y esas pueden ser más concisas
Me sorprende que nadie sugiera de esta manera:
El
*
es el mismo quegn
- se busca la siguiente aparición de la palabra bajo el cursor y se convierte en el último patrón buscado, por lo que cuando se omite el patrón de búsqueda en el comando sustituto, VIM asume éste es el patrón a buscar.Para pequeñas cantidades de copias var, una aún más rápida:
Buscar ocurrencia,
cw
es el comando para cambiar palabra ,n
pasa a la siguiente ocurrencia del último término buscado y.
repite el último comando (que es cambiar palabra a NEWNAME )(Los créditos para que yo sepa todo esto van a @doomedbunnies en Reddit )
Otro truco genial es este: ( créditos a @ nobe4 )
cgn
es "cambiar lo que sea el resultado de (encontrar la siguiente aparición)". Ahora que este es el último comando , no es necesarion
que vaya a la siguiente aparición, por lo que de nuevo hay menos trazos y, lo que es más importante, no es necesario alternarn
y.
. Pero, obviamente, este tiene el inconveniente de no tener una forma de omitir una ocurrencia.A continuación se muestran algunos beneficios:
*
ogn
para la selección de palabras es muy rápido: solo presionar una tecla (bueno, digamos 1.5)*
ogn
se asegura de que no obtenga coincidencias dentro de otras palabras, al igual que lo:%s/<C-R>//gc
hace. Es mejor que escribir a:%s/\<OLDNAME\>/NEWNAME/gc
mano: personalmente, tiendo a olvidar usar las\<
cosas para limitar las coincidencias a palabras completas solamente.n
para omitir coincidencias no deseadas, probablemente incluso menos que los golpes adicionales necesarios para limitar el alcance. En circunstancias normales, lo más probable es que sus variables estén algo localizadas en un determinado bloque de código de todos modos.fuente
Pon esto en tu .vimrc
Llámalo con
:call Rnvar()
expand("<cword>")
obtiene la palabra debajo del cursor. Los usos cadena de búsqueda%
de archivos en el alcance y los\(\W\)
patrones buscan caracteres que no son de texto en el límite de la palabra para reemplazar, y guardarlos en las variables\1
y\2
de manera que se puede volver a insertar en el patrón de sustitución.fuente
Puede usar el modificador 'c' en la búsqueda global y reemplazar que le pediría confirmación para cada reemplazo. Llevaría más tiempo, pero podría funcionar para un archivo de código no enorme:
La c significa confirmar.
fuente
En c, es posible que pueda hacer algunos progresos con cscope. Intenta comprender la sintaxis, por lo que tendría la posibilidad de saber cuándo la letra era una variable.
fuente
Si se trata de varios archivos, puede considerar echar un vistazo a sed. Use buscar para tomar sus archivos y xargs más sed para reemplazarlos. Supongamos que desea reemplazar a con a_better_name en todos los archivos que coincidan con * .c, podría hacerlo
encontrar . -nombre "* .c" | xargs sed -i -e 's / a / a_better_name / g'
Tenga en cuenta que esto reemplazará TODAS las apariciones de a, por lo que es posible que desee una expresión regular más sólida.
fuente