En Vim, ¿cómo aplico una macro a un conjunto de líneas?

222

Tengo un archivo con un montón de líneas. He grabado una macro que realiza una operación en una sola línea. Quiero repetir esa macro en todas las líneas restantes en el archivo. ¿Hay una manera rápida de hacer esto?

Intenté Ctrl + Q, resalté un conjunto de líneas y presioné @@, pero eso no pareció funcionar.

Jordan Parmer
fuente
Pregunta fuera de tema: no estaba al tanto de las macros de VIM (o no quería estar al tanto: P) ¿Tiene algún enlace orientado al "lector vago" en las macros de VIM?
OscarRyz
Claro, esto: oreillynet.com/mac/blog/2006/07/… lo resume bastante bien.
Jordan Parmer el
También puede verificar: él complejo-repetir desde adentro vim
Sam

Respuestas:

354

Use el comando normal en modo Ex para ejecutar la macro en varias / todas las líneas:

Ejecute la macro almacenada en el registro a en las líneas 5 a 10.

:5,10norm! @a

Ejecute la macro almacenada en el registro a en las líneas 5 hasta el final del archivo.

:5,$norm! @a

Ejecute la macro almacenada en el registro a en todas las líneas.

:%norm! @a

Ejecute el almacén de macros en el registro a en todas las líneas que coincidan con el patrón .

:g/pattern/norm! @a

Para ejecutar la macro en líneas seleccionadas visualmente, presione V y j o k hasta que se seleccione la región deseada. Luego escriba :norm! @ay observe que se muestra la siguiente línea de entrada.

:'<,'>norm! @a

Enter : ayuda normal en vim para leer más.

El juez Maygarden
fuente
1
Sí, ayuda normal en vim o el enlace que acabo de agregar.
Juez Maygarden el
1
¡Cualquier cosa para ayudar a un usuario que no sea emacs!
Juez Maygarden
48
¡¡Agradable!! Consejo para principiantes: use V y luego j / k para resaltar las líneas que desee, luego escriba simplemente:norm! @a
Kevin Bourrillion el
77
Para agregar a la sugerencia muy útil de @KevinBourrillion, al presionar :después de resaltar las líneas, la línea de entrada Ex leerá :'<,'>en su lugar y luego agregará el resto de lo que Kevin sugirió. Esto hará que el último comando lee: :'<,'>norm! @a.
Deiwin
3
@GabeMoothart !Evita la reasignación de claves por parte del usuario. Es posible que no lo necesite, pero una respuesta que funcione para todos lo requiere.
Juez Maygarden
60

Use global para ejecutar la macro 'a' en todas las líneas que contienen 'patrón'

:g/pattern/normal! @a

Para obtener ayuda, consulte: :help global.

SergioAraujo
fuente
44
Solo para aclaraciones para futuros usuarios: este es un comando Ex global.
atp
39

También puedes hacer esto:

En modo normal:

[number of times to apply the macro] @ [register]

Por ejemplo:

1000@q

Aplica la macro en el registro q a las siguientes 1000 líneas.

Actualización: la respuesta aceptada es mucho mejor

Actualización: como señaló @kevinliu, es probable que desee finalizar la macro con un jpara ir a la siguiente línea.

Max Heiber
fuente
44
Esto se detiene en la última línea y no se ejecuta varias veces en la última línea, de lo que tenía miedo.
Hubro
@Hubro, estas respuestas de otros usuarios funcionaron para mí: :%norm! @ayvGG :norm! @a
Max Heiber
2
Por alguna razón, esto funcionó increíblemente, y la respuesta aceptada no. Mi macro implicaba insertar una nueva línea, hacer cosas y pasar a la siguiente línea.
jasonszhao
@jasonszhao sí mismo aquí. pero de todos modos no hay que decir 1000 pero todas las líneas hasta el final ... y aún cuidar la nueva línea, hacer cosas, etc.
ihightower
2
Creo que debe señalarse que su macro debe terminar con un jcomando para ir a la siguiente línea; de lo contrario, intentará aplicarla a la misma línea.
Kevin Liu
2

También hay un complemento llamado RangeMacro, ¡hace exactamente lo que quieres! Para todos los que no pueden adivinar por el nombre, lo que hace: repite una macro grabada para cada línea en un rango dado, sin importar si es por selección visual o por: 40,50 /: +10

Ver http://www.vim.org/scripts/script.php?script_id=3271

phux
fuente