¿Cómo puedo ver y editar mi grabación (es decir, macro grabada)?

39

Estoy usando repeticiones complejas para registrar mis operaciones ( qqpara grabar, algunas operaciones , qpara detener) y cometí un error.

¿Es posible ver lo que he grabado y corregir el error, en lugar de volver a hacerlo?

Invocar caracteres grabados por @qobras, pero no puedo verlo en mis asignaciones ( :map q- No mapping found).

Y no hay mucha información en la Ayuda escribiendo: :help recording.

kenorb
fuente

Respuestas:

42

Nota: supongo que está usando el aregistro para la totalidad de esta respuesta, pero puede usar cualquier registro

Nota2: <1b>es Esc; puedes insertar esto con Ctrl+vy luego Esc. También puede aparecer como ^[(según la displayconfiguración).


No es un mapeo; entonces tiene sentido que :mapno funcione. Está grabado en un registro, y puede verlo y editarlo como cualquier registro.

Todo lo que qhace es "borrar este registro y agregarle cualquier tecla" , y todo lo que @hace es "evaluar un registro como comandos" .

No hay nada "diferente" en una macro, puede invocar cualquier registro como macro.


Para ver solo use:

:echo @a

Como cualquier registro.

También puede usar :registerspara ver todos los registros.


Para editar puedes hacer varias cosas:

La forma más sencilla de asignarlo es @aasí:

:let @a='iasd<1b>'

Esto iniciará el modo de inserción ( i), insertar asdy Escape de vuelta al modo normal.

Esto no es muy útil para una edición extensa; podría usar funciones (es decir substitute()), o tal vez agregar algo ( :let @a=@a . 'more'), pero cambiar algo en el medio no es tan fácil.

He descubierto que la mejor manera de hacerlo es iniciar un nuevo búfer con :splito :tabnewy editar el registro al insertarlo allí, editarlo y luego copiarlo nuevamente.

Puede usar "apcual insertará el texto en el búfer (donde aestá su registro):

iThis is A<1b>

Ahora solo puedo cambiar la línea a quizás:

iThis is an edited macro<1b>

Luego hago ^v$"aypara tirar (copiar) esta línea al aregistro:

  • ^ para inicio de línea
  • v para modo visual
  • $ para fin de línea
  • "ay tirar de la selección para registrarse a

Si lo desea, puede hacerlo sin usar el modo visual con ^"ay$.

Ahora puede usar @a, como si esto fuera lo que grabó originalmente.

También puede usar yy, y luego @", que es un poco más rápido. Sin embargo, esto también copiará la nueva línea final y puede causar efectos secundarios ... Otra forma de hacerlo más rápido es usar una macro :-)

Martin Tournoij
fuente
2
Me gustaría señalar que introducir un movimiento en línea en su registro tendrá un efecto secundario de incluir un carácter de nueva línea, como si hubiera presionado Enteral final de su grabación. En muchos casos, esto puede ser benigno, pero en escenarios en los que ha elaborado cuidadosamente la posición del cursor al final de la grabación, puede afectar la repetibilidad.
tommcdo
@tommcdo Derecha; solo puede usar vy seleccionar la línea completa (sin la nueva línea).
Martin Tournoij
@Carpetsmoker " v^$"aypara tirar (copiar) esta línea al aregistro". ¿No debería ser eso ^antes del v, y con $todavía no estás copiando la nueva línea? Creo que debería ser: 0v$h"ay(¡sí dolorosamente largo!)
joeytwiddle
2
@joeytwiddle no, se $mueve al final de la línea, pero no incluye la nueva línea. Es la diferencia entre 0y$y yy. Poner hdespués de $eso solo significaría que te perderías el último personaje.
evilsoup
Una cosa que puede hacer para hacer la edición: deje que @ a = escriba comandos más fácilmente editables es escribir: <Ctrl-f>, seleccione y edite la línea en cuestión (la última línea, por defecto, si está editando el última línea que ingresó) usando vim como de costumbre. Presione regresar cuando haya terminado de ejecutar la línea, o <Ctrl-c> para salir.
9

Para conseguir algo con lo que trabajar ...

qajjjq

Comenzará a grabar una macro en el aregistro.

Puede ver muchos de sus registros actuales (utilizados para macros, extracción, eliminación, etc.) con el :regcomando, o puede especificar un registro para mostrar proporcionando su nombre. Por ejemplo, para mostrar el registro a:

:reg a

rendimientos

--- Registers ---
"a   jjj

Puede agregar a un registro con nombre existente utilizando la letra mayúscula correspondiente. Esto funciona no solo para grabar macros, sino también para tirar. Por ejemplo:

qAkkkq
:reg a

rendimientos

--- Registers ---
"a   jjjkkk

Si desea utilizar la sintaxis let para editar una macro existente, puede hacer lo siguiente:

let @a='<C-r>a'

que se expandirá a

let @a='jjjkkk'

y luego puede cambiar las pulsaciones de teclas individuales.

Tenga en cuenta que puede usar <C-r>(es decir, control + r) para pegar desde cualquier registro en modo de línea de comandos (o en modo de inserción, para el caso).

Además, cuando está en modo de línea de comandos, si escribe <C-f>esto, aparecerá la ventana de línea de comandos, en la que puede ver / editar los comandos anteriores emitidos, y puede editar su comando actual antes de llamarlo. Presione enter en el comando que desea enviar.

El beneficio de esto es que puede usar sus comandos normales de movimiento / sustitución dentro de este búfer para editar su macro. Por ejemplo:

let @a='<C-r>a'<C-f>

traerá a colación:

:118 reg
:119 reg a
:120 let @a='jjjkkk'

Si tiene el comando 120, puede hacer:

s/kkk/}
<return>
:reg a

rendimientos

--- Registers ---
"a   jjj}

Por supuesto, puede pegar el contenido del registro en su búfer y cambiarlo allí. Pero puede hacer todo lo que necesita sin contaminar su búfer de trabajo.

Zach Ingbretsen
fuente