keyboard-macros – Editar una macro de teclado almacenada y almacenar la versión editada

Pregunta:

En mi ~ / .emacs, hay varias macros de teclado almacenadas. Aparecen como (fset 'dhteu-macro-name ... . Por cierto, dhteu es solo una combinación alfabética aleatoria prefijada para evitar colisiones con cualquier comando existente.

Puedo Cx Ck e Mx proporcionar un nombre de macro y se abre un búfer que me permite editar la macro. Puedo editarlo y guardarlo con Cc Cc . Ahora, si Cx Ck e Mx mismo nombre de macro, veo la versión modificada. Intenté ejecutar la macro modificada en un búfer. La macro madificada se ejecuta correctamente.

Después de todo esto, naturalmente, quiero almacenar la macro. Entonces, visito ~/.emacs y Mx insert-kbd-macro . Espero que el nombre de la macro que acabo de editar esté disponible en este mensaje. No lo es.

Ingresar el nombre completo produce un error de no coincidencia.

Cx Ck n para darle otro nombre. Eso produce un error No keyboard macro defined .

Entonces, la pregunta es: ¿Cómo edito una macro de teclado almacenada y la guardo de nuevo?

Respuesta:

Este es un error en Emacs. Al guardar la macro, Emacs no agrega la propiedad kmacro , por lo que cuando inicia una nueva sesión, Emacs no recuerda que dhteu-macro-name es en realidad una macro de teclado.

El truco a continuación debería solucionar el problema.

(defun my-kmacro-hack (&rest _)
  (interactive
   (list (intern (completing-read
                  "Insert kbd macro (name): "
                  obarray
                  (lambda (elt)
                    (and (fboundp elt)
                         (or (stringp (symbol-function elt))
                             (vectorp (symbol-function elt))
                             (kmacro-extract-lambda (symbol-function elt)))))
                  t))
         current-prefix-arg))
  nil)
(advice-add 'insert-kbd-macro :before #'my-kmacro-hack)

Instalé una solución más limpia que entrará en la rama master de Emacs (es decir, para Emacs-27).

Leave a Comment

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

web tasarım