keyboard-macros – Defina una macro de teclado para ejecutar indefinidamente otra macro de teclado y luego hacer otra cosa

Pregunta:

He definido una macro de teclado, vinculada a la pulsación 1 tecla 1 , digamos, y quiero definir una segunda macro de teclado que ejecute la primera indefinidamente y luego regrese al principio del búfer. Supongo que el primero siempre termina si se repite indefinidamente. Por ejemplo, podría ser una macro de teclado que opera en una línea y luego pasa a la siguiente.

Para definir la nueva macro de teclado, ingenuamente quiero escribir:

Cx ( Cu 0 Cx Ck 1 Cu Cu Cx ( M-< Cx )

En otras palabras, Cx ( para comenzar a grabar, Cu 0 para especificar la ejecución indefinida, Cx Ck 1 para especificar que la ejecución indefinida se refiere a la macro de teclado 1, Cu Cu Cx ( para reanudar la grabación de la nueva macro de teclado (ya que la grabación termina automáticamente después de la última iteración de la macro de teclado 1), M-< para volver al principio del búfer, y finalmente Cx ) para finalizar la grabación.

Si ato todo eso a una nueva secuencia de teclas y luego la invoco, encuentro que esta nueva macro de teclado llega tan lejos como para ejecutar la macro de teclado 1 (tantas veces como pueda) pero no termina con la M-< . ¿Estoy haciendo algo mal? ¿Existe otra forma de lograr lo que quiero?

Respuesta:

Lo que está haciendo actualmente no funciona porque la ejecución de las macros del teclado finaliza siempre que hay un error. Esto es lo que hace posible ejecutar macros de teclado "indefinidamente" (pero sin ingresar un bucle infinito) en primer lugar: si la ejecución de la macro no se detuviera por error, ingresaría un bucle infinito incluso si naturalmente llegara al final del búfer actual después de n ejecuciones. Como resultado, si llama a una macro que ejecuta otra macro indefinidamente, se producirá un error una vez que se alcance el final del búfer, y este error también terminará la macro "principal".

Para evitar esto, puede definir un comando personalizado que ignore los errores durante la ejecución de la macro y regrese al comienzo del búfer actual después de que se detenga la ejecución:

(defun kmacro-repeat-indefinitely-then-back-to-top ()
  "Repeat last keyboard macro indefinitely, ignoring errors, then
go back to beginning of buffer."
  (interactive)
  (ignore-errors (kmacro-call-macro 0))
  (goto-char (point-min)))

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım