Existe-t-il un moyen de convertir une macro Emacs en Elisp, pas comme le fait M-x insert-kbd-macro
, l'activité réelle devenant des déclarations Elisp.Convertir la macro Emacs en Elisp
Merci pour votre aide.
Existe-t-il un moyen de convertir une macro Emacs en Elisp, pas comme le fait M-x insert-kbd-macro
, l'activité réelle devenant des déclarations Elisp.Convertir la macro Emacs en Elisp
Merci pour votre aide.
Non, désolé. Il n'y a pas de manière triviale de convertir une macro Emacs en Elisp.
Mise à jour: Emacs a commencé à travailler sur ce chemin. Voir this thread comme point de départ. Ce n'est toujours pas possible (juin 2010), mais il y a de l'activité.
La première raison à laquelle je peux penser est de traiter des commandes interactives et de traduire des séquences de touches en arguments appropriés pour les fonctions.
Pensez à la séquence suivante:
Cx b .em TAB RET
Cela commence la commande de passer à un tampon, types trois caractères, utilise la touche de tabulation pour compléter et RET accepter . Le Lisp équivalent pour le résultat final (dans une session emacs où la touche de tabulation est unique) est:
(switch-to-buffer ".emacs")
Pensant à la fin, il y a aussi des interactions avec l'expansion de tous les types (dabbrev
, hippie-expand
, etc.).
Un point de départ peut être M-x edit-dernière-kbd-macro qui (dans mon cas) montre ceci:
;; 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
Ce qui vous donne au moins quelques-uns des noms de fonction. Mais vous verrez que RET est étiqueté comme 'newline-and-indent
ce qui est incorrect car au moment de l'exécution de la macro, le mini-tampon est actif et la liaison est en fait 'minibuffer-complete-and-exit
. De même, la liaison correcte pour TAB est 'minibuffer-complete
.
J'ai fait un paquet qui permet à peu près exactement cela à https://github.com/Silex/elmacro
Il a quelques bizarreries, mais cela fonctionne assez bien ... par exemple, la macro suivante:
F3 C-e M-b M-u C-a C-n F4
le elisp suivant Génère :
(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))
Merci pour la mise à jour, Trey. Semble intéressant. – Sahas