Muy a menudo me encuentro en la necesidad de realizar una sustitución que tendrá coincidencias esparcidas por todo un archivo grande y con expresiones de búsqueda y reemplazo no triviales.
Por ejemplo, digamos que tengo algunas llamadas a funciones como okFunction(arg1, arg2 arg3)
. Los argumentos diferirán con cada llamada a la función, por supuesto. Ahora digamos que he descubierto una mejor función que no necesita arg2
. Puedo ajustar fácilmente todo el archivo con
:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc
Aunque conceptualmente simple, no estoy seguro de tener la sintaxis correcta en este patrón bastante largo. La c
bandera realmente ayuda aquí, pero el problema es que al pedir confirmación, vim no mostrará con qué se reemplazará la coincidencia. Quiero decir, mostrará la expresión de reemplazo, pero no el resultado evaluado. Si confirmo la sustitución con y
, vim saltará inmediatamente al próximo partido y no estaré listo para ver si cometí algún error.
He encontrado el complemento vim-over que resuelve parcialmente el problema, pero solo si todos los mathes son visibles en la pantalla cuando está escribiendo el comando. Una vez que presiona enter, el comportamiento es exactamente el mismo que describí anteriormente y no obtengo una vista previa.
Entonces, ¿hay alguna manera de obtener vim para evaluar la expresión de reemplazo cuando se solicita confirmación en comandos sustitutos?
fuente
%
, verifique que el resultado sea el que esperaba y luego use la sustitución con%
(solo son unas pocas teclas:):<up><c-b>%
. Claramente, una opción de vista previa sería mucho más eficiente que eso. Si bien no hay parche está disponible tal vez uno puede envolver la sustitución de una función Vimscript con este tipo de opción, pero que suena como un montón de trabajo ...Respuestas:
Una solución alternativa son las macros. Resalte todas las áreas problemáticas y realice la sustitución en una línea a la vez. Luego decida si lo quiere o no. Una vez que hayas terminado
n
con la siguiente área.Para su caso específicamente:
/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
qq
.:s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
q
u
) o ir al siguiente resultado de búsqueda (n
).@q
.Obviamente no es exactamente lo que estabas buscando, pero esto generalmente es lo que hago.
fuente
/
él también se comporta como una selección visual, agradable./
... se comporta como una selección visual". En realidad no lo hace. La razón por la que esto funciona es porque:s//
actúa en la línea actual y el uso lon
lleva a la próxima aparición.:s/pattern/replacement
, usará la última cadena de búsqueda, por lo que en el paso 3 puede aplicar:s//betterFunction(\1, \3)/g
para guardar algo de escritura.:vimgrep /pattern/ ##
luego aplico macro , de esa manera si resulta que mi patrón realmente coincide de manera consistente y lo macro es demasiado tedioso, entonces puedo rápidamente volver:argdo %s/.../..../gc
y comenzar a volar a través de la operación