2009-02-28 15 views
80

Estoy tratando de leer una gran cantidad de código c/perl a través de vim que contienen muchos nombres de variables de una sola letra.Cambiar nombres de variables en Vim

Sería bueno tener algún comando que podría 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 evitamos trabajarían cos
1) el mismo nombre de una sola letra puede tener diferentes efectos en diferentes bloques de alcance
2) la misma combinación de letras podía parte de otro nombre var más grande, o en una cadena o comentario ... no quisiera modificar esos

¿Alguna solución conocida?

Respuesta

160

A continuación se muestra cómo cambiar el nombre de una variable que se define en el ámbito actual {}.

Mueva el cursor al uso variable. Presione gd. Lo que significa que mueve el cursor a la definición. Ahora presione [{ - esto lo llevará al alcance comenzar. Presione V - activará la selección de Visual Line. Presione % - Saltará al opuesto }, por lo que seleccionará el alcance completo. Presione :s/ - inicio del comando sustituto. <C-R>/ - insertará un patrón que coincida con el nombre de la variable (ese nombre estaba antes de presionar gd). /newname/gc<CR> - iniciará la búsqueda y reemplazará con la confirmación en cada coincidencia.

Ahora tiene que registrar una macro o incluso mejor - asignar una clave.

Estas son las asignaciones finales:

" For local replace 
nnoremap gr gd[{V%::s/<C-R>///gc<left><left><left> 

" For global replace 
nnoremap gR gD:%s/<C-R>///gc<left><left><left> 

poner esto en tu .vimrc o simplemente ejecutar. Después de presionar gr en la variable local, irá al comando :s, donde simplemente debe ingresar y presionar Ingresar.

+30

+1 para aprender más de 5 nuevos trucos de Vim que debería haber sabido antes. Gracias –

+0

Realmente útil, +1 especialmente porque se puede "extender" a otros idiomas fácilmente. –

+6

Nota: gd no funciona para localizar la variable en el ámbito inmediato de la definición en el modo Javascript en MacVim. Me lleva al primer uso del nombre de la variable en alguna función del archivo :( Si se encuentra dentro de un alcance y desea seleccionar ese ámbito, "va {" - "seleccionar visual alrededor de {" - es el camino ir. Creo que – Srikumar

2

Puede usar el modificador 'c' en la búsqueda global y reemplazar que le pediría confirmación para cada reemplazo. Se necesitaría más tiempo, pero que podría funcionar para un archivo de código no gigantescos:

%s/\$var/\$foo/gc 

El c representa la confirmación.

+0

La i significa ignorar caso. Quieres c, confirmar cada cambio. –

+0

No estoy seguro de que necesite escapar de $ foo ... –

+0

uy .. perdón por eso ... Se corrigió la respuesta – Adnan

8

AFAIK, no hay soporte de refactorización real en VIM. Al hacer un cambio de nombre con la intención de un refactor, generalmente tomo las siguientes precauciones.

  1. Limite el alcance del cambio de mis marcas de uso.
  2. Al ingresar la expresión regular, corchetee el nombre con \ <y>. Esto hará que coincida con una palabra completa, lo que reduce los tipos de cambio de nombre incorrectos que se producirán.
  3. No haga una sustitución de varias líneas para reducir las posibilidades de una mala sustitución
  4. Mire a través del código diff con cuidado si se trata de algo más que un pequeño cambio.

Mi cambio final es como la siguiente

:'a,'bs/\<foo\>/bar 

Me encantaría estar equivocado acerca de no ser una herramienta de refactorización para VIM pero yo no lo he visto.

+0

En Perl también puede agregar el tipo al patrón de búsqueda. es decir, $ para escalares, @ para arrays, hashes% para –

+0

@ Nathan: por desgracia, es un poco más difícil en Perl (5.x), como el sigilo de arrays y hashes cambios con el uso:% de hash -> conjunto de hash, $ hash {key} -> valor único, @hash {qw/ab /} hash slice. – user55400

0

en C, que puede ser capaz de hacer algo de progreso usando cscope. Hace un intento de entender la sintaxis, por lo que tendría una posibilidad de saber cuándo la letra era una variable.

0

Si se trata de varios archivos, puede considerar echar un vistazo a sed. Utilice find para tomar sus archivos y xargs plus sed para reemplazarlos. Digamos que quiere reemplazar a con un_nombre_de_mensaje en todos los archivos que coincidan con * .c, puede hacer

buscar. -name "* .c" | xargs sed -i -e 's/a/a_better_name/g'

Tenga en cuenta que esto va a reemplazar todas las apariciones de una, por lo que es posible que desee una expresión regular más robusta.

7

poner esto en su .vimrc

" Function to rename the variable under the cursor 
function! Rnvar() 
    let word_to_replace = expand("<cword>") 
    let replacement = input("new name: ") 
    execute '%s/\(\W\)' . word_to_replace . '\(\W\)/\1' . replacement . '\2/gc' 
endfunction 

de llamadas con :call Rnvar()

expand("<cword>") tiene la palabra bajo el cursor. La cadena de búsqueda usa % para el alcance del archivo, y los patrones \(\W\) buscan caracteres que no sean palabras en el límite de la palabra a reemplazar, y los guarda en las variables \1 y \2 para volver a insertarlos en el patrón de reemplazo.

Cuestiones relacionadas