¿Cómo guardar una macro de teclado como una función Lisp?

41

Con mucha frecuencia tendría que realizar el conjunto de pasos que requieren múltiples pulsaciones de teclas. Para la misma sesión, esos pasos se pueden grabar en una macro de teclado.

Un ejemplo es guardar una operación de búsqueda / reemplazo ejecutada con frecuencia como una macro de teclado. Pero esa macro se pierde cuando salgo de emacs.

¿Cómo puedo guardar mi macro de teclado de uso frecuente como una función Lisp?

En aras de la simplicidad, quiero guardar la acción de reemplazar "abc" con "def" como una función para poder reutilizarlo en las sesiones de emacs.

Kaushal Modi
fuente

Respuestas:

48

Estos son los pasos que puede seguir:

  • Seleccione la región que desea hacer la búsqueda-reemplazo.
  • Comience a grabar macro.

    M-x start-kbd-macro

  • Haga lo requerido M-x query-replace-regexp(reemplace "abc" con "def") y use !para forzar la búsqueda-reemplazo en toda la región.
  • Deja de grabar macro.

    M-x kmacro-end-or-call-macro.

  • Haz M-x kmacro-name-last-macroy dale a la macro un nombre descriptivo como replace-abc-with-def. Entonces podrá volver a llamar a esa macro haciendo M-x replace-abc-with-def.
  • Ahora guarde esta macro como una función en un archivo que cargue durante la inicialización de emacs; por ejemplo init.el,.
    • M-x insert-kbd-macro
    • Seleccione su macro con nombre para insertarla allí.

La replace-abc-with-defdefinición de función creada automáticamente se ve así:

(fset 'replace-abc-with-def
   (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([59 39 return 97 98 99 return 100 101 102 return 33] 0 "%d")) arg)))

Ahora puedes M-x replace-abc-with-defen todas tus sesiones de emacs.

Kaushal Modi
fuente
1
+1 para insert-kbd-macro. Esa es la respuesta a la pregunta (y el resto de esta respuesta proporciona ayuda adicional).
Dibujó
66
Tenga en cuenta también que Emacs puede generar dos formatos diferentes para macros de teclado. Cuál obtiene cuando insert-kbd-macrodepende de si lo nombró usando kmacro-name-last-macro(como en la respuesta anterior) o name-last-kbd-macro.
phils
1
Tenga en cuenta que si usa el name-last-kbd-macroformato (como se menciona anteriormente en @phils) terminará con una cadena, no una función. fsetting eso a un símbolo le permite ejecutar la macro usando Mx, pero no llamarlo desde lisp ( commandp-> t, functionp-> nil). Curiosamente, incluso llamarlo a través de call-interactivelyno funciona (aunque puede usarlo execute-kbd-macropara ejecutarlo).
Pyrocrasty
24

@lunaryorn ya mencionó elmacro, pero como autor de este paquete, pensé que sería bueno dar un ejemplo.

Si graba una macro como esta:

F3 C-e M-b M-u C-a C-n F4

Entonces haciendo M-x elmacro-show-last-macro upcase-last-wordproduce un buffer con:

(defun upcase-last-word ()
  "Change me!"
  (interactive)
  (move-end-of-line 1)
  (backward-word 1)
  (upcase-word 1)
  (move-beginning-of-line 1)
  (next-line 1 1))
Sílex
fuente
17

El paquete elmacro le permite ver la última macro grabada con Emacs Lisp adecuada M-x elmacro-show-last-macro.

Lunaryorn
fuente
77
Alguien que recomienda mi paquete \ o /
Silex