¿Cómo obtener una vista previa del comando de sustitución?


9

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 cbandera 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?


2
ese es un elemento de la lista de deseos en el rastreador de errores vim (lo siento, no lo encuentro actualmente)
Christian Brabandt

2
Por lo que vale, generalmente uso la sustitución en la primera línea para reemplazar sin el %, 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 ...
statox

2
@ChristianBrabandt lo encontró . Todavía está con prioridad sin clasificar ...
Vitor Eiji

2
@VitorEiji que no era en lo que estaba pensando. Pero en realidad no importa, ya que actualmente no es posible. Neovim ofrece la opción 'inccommand', que podría funcionar (o no, realmente no lo hago ahora)
Christian Brabandt

El mal anticipa la sustitución; Sin embargo, no sé cómo lo hace.
Geremia

Respuestas:


2

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 ncon la siguiente área.

Para su caso específicamente:

  1. Buscar áreas: /\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
  2. Comience a grabar una macro qq.
  3. Aplicar :s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
  4. Deja de grabar macro q
  5. Deshacer ( u) o ir al siguiente resultado de búsqueda ( n).
  6. Aplicar macro @q.
  7. Repita los pasos 5 y 6 según sea necesario.

Obviamente no es exactamente lo que estabas buscando, pero esto generalmente es lo que hago.


¡Eso es genial! Nunca me di cuenta de que cuando haces una búsqueda con /él también se comporta como una selección visual, agradable.
the_velour_fog

@the_velour_fog " /... 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 lo nlleva a la próxima aparición.
Tumbler41

1
Si no especifica un patrón :s/pattern/replacement, usará la última cadena de búsqueda, por lo que en el paso 3 puede aplicar :s//betterFunction(\1, \3)/gpara guardar algo de escritura.
Haegin

@ Tumbler41 ah, gracias por aclarar. Sí, también hago esta técnica básica de búsqueda , luego aplico macro , usualmente lleno primero el arglista y uso :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/.../..../gcy comenzar a volar a través de la operación
the_velour_fog
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.