Me gustaría ejecutar una macro en cada línea de una selección, en lugar de sumar el número de líneas en mi cabeza. Por ejemplo, podría escribir una macro para transformar:
Last, First
Dentro
First Last
y me gustaría que se ejecutara en todas estas líneas:
Stewart, John
Pumpkin, Freddy
Mai, Stefan
...
¿Alguna idea de los gurús de Vim?
EDITAR: Esto es solo un ejemplo, obviamente esto es triviamente regexable, pero hay otras instancias que surgen que no son tan fáciles que preferiría usar macros.
Respuestas:
Suponga que tiene una macro
q
que se ejecuta (y permanece) en una sola línea. Entonces podría ejecutarlo en cada línea de su selección con:(si ya tiene un grupo de líneas seleccionadas, presionar
:
produce:'<,'>
en la línea de comando)Por ejemplo, la siguiente macro pone en mayúscula cada palabra menos la primera de una línea:
Entonces ejecutándolo en lo siguiente (donde
+
se seleccionan las líneas)Con el
normal @q
comando anterior , produce:fuente
:let @q="^wgU$"
:'<,'>normal! @q
@q
. De:help normal
- "Si se proporciona [!], Las asignaciones no se utilizarán".@
en modo visual como esto:vnoremap @ :normal @
. De esa manera, aún puede hacer@a
lo que espera (aunque luego debe presionar Enter :()Seleccione las líneas y luego presione
:
para ingresar al modo de comando. Vim se completará automáticamente'<,'>
, lo que restringe el rango a las líneas seleccionadas. Para su ejemplo, puede usar el:s
comando para hacer el intercambio:Esto intercambiará dos palabras separadas por una coma en cada línea de la selección visual.
También puede usar
'<
y'>
como cualquier otro marcador o posición de línea, por ejemplo, como parte de un comando de movimiento, por lo que en el modo normald'<
se eliminará desde la posición actual del cursor hasta el inicio de la primera línea en la selección visual. Las marcas permanecen vigentes incluso si el bloque ya no se resalta visualmente.Si desea reproducir una macro grabada en cada línea, debe ejecutar la macro con el
:normal
comando. Desafortunadamente, el:normal
comando no opera en un rango de líneas, pero puede solucionarlo con el:global
comando. Esto ejecuta un:ex
comando en cada línea que coincide con una expresión regular, por lo que puede hacer esto:Explicación:
fuente
^
con ellos.
para hacer que la macro se ejecute solo en líneas que tengan algo de texto, ¿no?Puede agregar la función a continuación a su
~/.vimrc
o simplemente copiarla en su navegador y ejecutar:@+
La ventaja es que puede aplicar cualquier macro en la selección visual. Debe dar la letra macro como argumento, como:
fuente