source - Convertir la macro de Emacs en Elisp
emacs para linux (3)
Hice un paquete que permite casi exactamente esto en https://github.com/Silex/elmacro
Tiene algunas peculiaridades pero funciona bastante bien ... por ejemplo, la siguiente macro:
F3 C-e M-b M-u C-a C-n F4
Genera el siguiente elisp:
(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))
¿Hay una manera de convertir una macro de emacs en elisp, no como lo hace Mx insert-kbd-macro
, la actividad real se convierte en declaraciones elisp.
Gracias por tu ayuda.
No sé si estos comandos se introdujeron más recientemente que los comentarios anteriores, pero puede hacerlo de esta manera:
Asígnele un nombre a la macro del teclado con '' kmacro-name-last-macro
'', luego ejecute '' insert-kbd-macro
'' que le pide ese nombre e inserta una definición de función en la marca.
No, lo siento. No hay una forma trivial de convertir una macro de emacs en elisp.
Actualización: Se ha trabajado en Emacs para iniciar este camino. Ver este hilo como punto de partida. Todavía no es posible (junio de 2010), pero hay actividad.
La primera razón que se me ocurre es tratar con comandos interactivos y traducir las pulsaciones de teclas en argumentos adecuados para las funciones.
Piense en la siguiente secuencia:
Cx b .em TAB RET
Esto inicia el comando para cambiar a un búfer, escribe tres caracteres, usa la función TAB para completar y RET para aceptar. La luz equivalente para el resultado final (en una sesión de emacs en la que la finalización de TAB es única) es:
(switch-to-buffer ".emacs")
Pensando en la finalización, también hay interacciones con la expansión de todos los tipos ( dabbrev
, hippie-expand
, etc.).
Un punto de partida puede ser Mx edit-last-kbd-macro que (en mi caso) muestra esto:
;; Keyboard Macro Editor. Press C-c C-c to finish; press C-x k RET to cancel.
;; Original keys: C-x b .em <tab> RET
Command: last-kbd-macro
Key: none
Macro:
C-x b ;; switch-to-buffer
.em ;; self-insert-command * 3
<tab> ;; pabbrev-expand-maybe
RET ;; newline-and-indent
Lo que al menos te da algunos de los nombres de funciones. Pero verá que RET está etiquetado como ''newline-and-indent
cual es incorrecto porque en el momento de la ejecución de la macro, el minibúfer está activo y el enlace es, de hecho, ''minibuffer-complete-and-exit
. Del mismo modo, el enlace correcto para TAB es ''minibuffer-complete
.