2009-11-11 5 views
18

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.

Répondre

22

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.

+0

Merci pour la mise à jour, Trey. Semble intéressant. – Sahas

4

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)) 
Questions connexes