Caso de uso clásico:
- Empiezas a grabar una macro:
C-x (
- Haces algunas cosas, digamos
hello
. - Ejecutas un comando que arroja un error, digamos
C-g
(por ejemplo, ejecutas por errorC-s
y tienes que cancelarlo conC-g
, ahora tu trabajo está perdido).
Ahora tu grabación hasta ahora está perdida.
Me gustaría continuar donde lo dejé antes de ejecutar un comando que interrumpió mi grabación. Lo miré C-h f start-kbd-macro
, pero está escrito en C, por lo que no puedo modificarlo. También busqué una variable como current-kbd-macro
, pero no encontré ninguna hasta ahora.
¿Se puede recuperar?
Actualizar:
No podía entender por qué C-u C-x (
no funcionaba para mí, pero descubrí que es porque estaba probando con C-g
.
Resulta que C-g
es especial, si activa un tipo diferente de error, por ejemplo
C-x ( M-: (signal 'quit nil)
Entonces esto detendrá la grabación, pero last-kbd-macro
contendrá "M-: M-( signal 'quit nil"
, pero con
C-x ( C-g
Esto detiene la grabación y descarta todo lo grabado. Como usuario feliz de Cg (como lo son al menos dos de mis amigos), esta es una distinción bastante desafortunada. Intenté editar keyboard-quit
, pero no hay nada que pueda hacer allí.
Parece que la única forma de recuperar esto es a través de recent-keys
y descubrir automáticamente dónde se llamó a start-kbd-macro (o similar), como en kmacro-edit-lossage
.
fuente
Ejecute
kmacro-start-macro-or-insert-counter
con el prefijo (C-u
) para agregar a la macro anterior.fuente
C-u C-u
) establece tanto elAPPEND
yNO-EXEC
argumentos astart-kbd-macro
, que le permite anexar sin la repetición inicial de la macro-tan-lejos. Este comportamiento se documenta en el manual, sin embargo:(emacs) Basic Keyboard Macro
Combinar las buenas respuestas de stsquad y artagnon da (en mi opinión) una solución total al problema que es completamente razonable:
Tal vez la necesidad de editar la pérdida como macro no es ideal , pero (a) seguramente necesitaría editar la macro independientemente, si abortó la grabación, y (b) esto no debería estar sucediendo muy a menudo, si solo recuerda cómo detener la macro normalmente (por ejemplo, con en <f4>lugar de C-g).
Nada de lo cual quiere decir que no sería útil si la macro abortada se almacenara en algún lugar; es solo que no creo que esto realmente suceda. Probablemente valdría la pena M-x
report-emacs-bug
sugerir esta característica.fuente
La solución canónica es C-x C-k C-e(
kmacro-edit-macro
) que le permitirá pasar por cada pulsación de tecla e insertar / eliminar lo que desee. La sintaxis del comando para el editor es un poco breve, pero?
mostrará una guía. Hay un editor más natural vinculado a C-x C-k e(edit-kbd-macro
) que proporciona un editor de macros de texto sin formato con comentarios.Otra opción es la M-x
insert-kbd-macro
que le permitirá editar la macro como Lisp, pero no es la cosa más legible del mundo.En lo que respecta a las variables, está buscando
last-kbd-macro
ykmacro-ring
.Como menciona que no ha completado su macro, puede crearla a partir de su pérdida. C-x C-k e C-h ly eliminar hasta 300 caracteres anteriores.
fuente
last-kbd-macro
tampocokmacro-ring
contener las teclas pulsadas antesC-g
o sucedió un error. Puse específicamente INCOMPLETE en mayúsculas en mi título anticipando respuestas tan malas. Gracias por intentar ayudar, sin embargo.C-x C-k e C-h l
editar,C-c C-c
luegoC-u f3
continuar con la grabación (observando que lo últimof3
primero reproducirá la macro hasta ahora antes de esperar más información). Tal vez la necesidad de editar la pérdida como macro no es ideal , pero (a) seguramente necesitaría editar la macro independientemente, si abortó la grabación, y (b) esto no debería estar sucediendo muy a menudo, si solo recuerda cómo detener la macro normalmente.