reproducir una macro vim hasta el final del búfer


85

Quiero ejecutar una macro que acabo de registrar en el registro " x" en cada línea de un búfer abierto, desde el cursor hasta el final del búfer, en vim. ¿Cómo puedo hacer eso?

Sé que puedo reproducir la macro n veces:

15@x

... o simplemente mantener presionado @hasta que llegue a la última línea, pero quiero presionar algunas teclas y terminar con eso.

Gracias por adelantado.


15 @ x no funciona en Windows gVIM
Mingjiang Shi

Respuestas:


101

Personalmente lo haría

VG:normal @x

Editar: cambio de registro al que especificó.


Buena esa. Me gusta que esta solución funcione solo en el área seleccionada.
Kevin

Mapeé esto a nnoremap <C - @> VG: norm @ q <CR>
PAS

Intenté esto con la macro "1z =] s" pero sólo corrige la ortografía de la primera palabra de cada línea, omitiendo el resto.
eligió el

@elig, probablemente quiera hacer una macro recursiva que encuentre las palabras faltantes en todas las líneas.
raman

67

Puedes hacer (en modo comando)

:%normal @x

Me gusta esta solución, pero ejecutará la macro en cada línea del búfer, OP preguntó solo desde su cursor hasta el final.
Porunga

24

hacer macro recursiva:

qa@aq

ex:

qa0gUwj@aq

UPCASE la primera palabra desde la línea actual hasta el final del archivo con una sola @a. Pero asegúrese de que "un registro esté vacío:

let @a=""

3
Excelente. Este enfoque es más útil que el %:normalenfoque, ya que respeta cualquier movimiento de línea dentro de la macro, por lo que es útil cuando las líneas no son idénticas en forma. Me resulta más fácil crear una macro 'a' para definir la acción y luego hacer que la macro 'b' haga el bit recursivo, es decir, qb @ a @ bq.
Paul Ruane

3
Evite esto si su macro implica una búsqueda, ya que continuará desde arriba. ctrl-cparar si eso sucede!
Iain Ballard

3
@IainBallard, :set nowrapscanhace que falle y se detenga al llegar al final del archivo.
ericbn

1
para borrar un registro, sólo tiene que hacer qaqantes de la macro: qaqqa0gUwj@aq. Además, si olvida poner el @qal final, siempre puede hacerlo qApara comenzar a agregar un registro, y luego hacerlo @q. Por lo general, grabo en reg q por alguna razón porque es fácil (especialmente para macros recursivas) y generalmente termino haciendo en qqqqqgUiwj@qqlugar de dos macros. Los primeros tres qs borran reg q, los dos qsegundos comienzan a grabar. Ver vim.wikia.com/wiki/Record_a_recursive_macro
dylnmc

Creo que para borrar el aregistro, se podría escribir simplementeqaq
Peter Perháč

11

999999@x, a menos que tenga un búfer muy grande ...


6
¿por qué no solo %:normal @xo 1,$:normal @x?
Nathan Fellman

3
esta es definitivamente la solución más elegante, supongo que 99999@xes lo natural que se te ocurre cuando tienes prisa :)
Peter

2
¿No lo ejecutará 9999999 @ x muchas veces en la última línea a menos que tenga exactamente 999999 líneas?
David Oneill

2
Solo lo probé. Cuelga la sesión. Probablemente continúe ejecutándolo un millón de veces sin detenerse al final de la línea.
CDR

1
Al menos en algunos casos, esto no se comportará como se esperaba. Considere tener una macro con buscar siguiente / buscar anterior en ella. Entonces, una vez que la repetición de la macro llegue al final del archivo, continuará desde el principio. vim doc sobre el tema . Para evitar el ajuste de la búsqueda, es posible que desee utilizar : set nowrapscan . Este es un ejemplo que se me ocurre, pero eso no significa que no haya más. :% normal @x es un camino a seguir, como sugirió @ryan_s en su respuesta anterior.
Sergey Markelov

-1

Desde vim wiki, versión abreviada: qqqqq para grabar la macro @qq para terminar de grabar @q para ejecutarla (y se ejecutará hasta el final del archivo)


1
Por favor, ¿puede agregar una referencia a la documentación?
aturegano

2
@aturegano Creo que el autor pretendía usar una macro recursiva. Consulte The Vim Wiki: Grabe una macro recursiva para obtener más información.
dylnmc
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.