¿Cómo reanudar una grabación macro de teclado INCOMPLETA?

10

Caso de uso clásico:

  1. Empiezas a grabar una macro: C-x (
  2. Haces algunas cosas, digamos hello.
  3. Ejecutas un comando que arroja un error, digamos C-g(por ejemplo, ejecutas por error C-sy tienes que cancelarlo con C-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-ges 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-macrocontendrá "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-keysy descubrir automáticamente dónde se llamó a start-kbd-macro (o similar), como en kmacro-edit-lossage.

Christopher Done
fuente

Respuestas:

8

Empecé una implementación aquí que le permite volver a enlazar su C-x (a resmacro-start-macro.

Ahora, suponga que llega a la mitad de una macro y comete un error y golpea C-g, por ejemplo, corre C-spor error y entonces golpea C-gpara cancelarlo, o w / e.

C-x ( hello C-s C-g 

Ahora ejecute C-u C-x (lo que solicitará en el minibúfer con:

Reanudar macro con (RET: continuar, DEL: eliminar último): h e l l o C-s

Entonces presionas la tecla de retroceso ( DEL) para eliminar C-sy luego RETcontinuar. Ahora dice:

Agregar a la macro kbd ...

Y puedes continuar.

En total:

C-x (      -- start macro
hello
C-s        -- mistake
C-g        -- cancel mistake (and macro)
C-u C-x (  -- recover lost macro
DEL        -- remove mistake
RET        -- continue recording
world!

Conveniente, sin cambio de contexto, combinaciones de teclas mínimas para lograr la tarea, descubre automáticamente desde dónde comenzó su macro (a C-x () (recent-keys).

Christopher Done
fuente
1
Oye, eso suena muy bien. ¿Te importaría enviarlo como parche a Emacs?
Stefan
¡Puede hacerlo / volver a otorgar la licencia que desee! Voy a probarlo por un tiempo localmente antes de anunciarlo en cualquier lugar, para que pueda saber que es confiable. Sin embargo, los mantenedores de Emacs podrían pensar que es demasiado hacky. ;-)
Christopher Hecho el
Para incluirlo en Emacs, necesitamos que el autor firme el papeleo de copyright (el mismo papeleo también cubriría el modo dios, por supuesto).
Stefan
El enlace está roto ahora :(
DirtY iCE
2

Ejecute kmacro-start-macro-or-insert-countercon el prefijo ( C-u) para agregar a la macro anterior.

artagnon
fuente
2
La cadena de documentación no lo dice, pero un doble argumento prefijo ( C-u C-u) establece tanto el APPENDy NO-EXECargumentos a start-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
PHILS
Pruebe esto con el ejemplo en mi pregunta, no funciona.
Christopher Hecho el
2

Combinar las buenas respuestas de stsquad y artagnon da (en mi opinión) una solución total al problema que es completamente razonable:

  • C-xC-keC-hl para editar una macro generada a partir de la pérdida
  • editar la macro, para reducirla a la grabación original
  • C-cC-c para almacenar la macro editada
  • En C-u<f3>primer lugar, para volver a reproducir esa macro y luego continuar grabando las pulsaciones de teclas posteriores que se agregarán a la definición de macro
  • ... o C-uC-u<f3>para continuar grabando sin la reproducción inicial de la macro hasta ahora.

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-bugsugerir esta característica.

phils
fuente
Esto no soluciona el problema. Con su solución la mitad del tiempo, sería más fácil iniciar la macro nuevamente. He publicado una respuesta en otro lugar que resuelve bien el problema.
Christopher Hecho el
1
Claro, para casos simples comenzar de nuevo sería más fácil. Sin embargo, sigue siendo útil para el resto, lo que significa que algunas personas lo encontrarán útil; especialmente porque está disponible por defecto. Como indiqué, creo que la idea de un enfoque más automatizado es buena, así que estoy feliz de verte trabajando en una solución, y sin duda he votado tu respuesta.
phils
0

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-macroque 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-macroy kmacro-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.

stsquad
fuente
Esta es una mala respuesta que votaría si pudiera. No leíste la pregunta o la ignoras. Ni last-kbd-macrotampoco kmacro-ringcontener las teclas pulsadas antes C-go sucedió un error. Puse específicamente INCOMPLETE en mayúsculas en mi título anticipando respuestas tan malas. Gracias por intentar ayudar, sin embargo.
Christopher Hecho el
1
@ChristopherDone: seguro que puedes: agregué una nota en la parte inferior para mencionar la pérdida. Puede crear una macro de hasta 300 de sus caracteres previamente escritos.
stsquad
Sí, alguien mencionó la pérdida en #emacs. Solo quiero reanudar donde lo dejé. No quiero tener que abrir el editor y comenzar a eliminar cosas de eso cuando estoy haciendo algo.
Christopher Hecho el
2
La combinación de esto y las respuestas de artagnon dan una buena solución: C-x C-k e C-h leditar, C-c C-cluego C-u f3continuar con la grabación (observando que lo último f3primero 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.
phils
1
@phils +1 Tal vez deberías convertir eso en una respuesta separada.
itsjeyd