2009-11-11 10 views
18

Gibt es eine Möglichkeit, ein Emacs-Makro in elisp zu konvertieren, nicht wie das M-x insert-kbd-macro tut, wird die tatsächliche Aktivität elisp Anweisungen.Konvertieren von Emacs Makro in Elisp

Danke für Ihre Hilfe.

Antwort

22

Nein, tut mir leid. Es gibt keine einfache Möglichkeit, ein Emacs-Makro in elisp zu konvertieren.

Update: Es gab einige Arbeiten an Emacs, um diesen Weg zu beginnen. Siehe this thread als Ausgangspunkt. Es ist immer noch nicht möglich (Juni 2010), aber es gibt Aktivität.

Der erste Grund, den ich mir vorstellen kann, ist der Umgang mit interaktiven Befehlen und das Übersetzen von Tastenanschlägen in richtige Argumente für Funktionen.

Denken Sie an die folgende Sequenz:

Cx b .EM TAB RET

Dieser den Befehl beginnt mit einem Puffer zu wechseln, Typen drei Zeichen verwendet Tabulatorvervollständigung es und RET abschließen zu akzeptieren . Die äquivalente Lisp für das Endergebnis (in einer Emacs-Sitzung, in der der TAB-Abschluss einzigartig ist) ist:

(switch-to-buffer ".emacs") 

Denken der Fertigstellung gibt es auch Wechselwirkungen mit Expansion aller Art (dabbrev, hippie-expand, etc.).

Ein Ausgangspunkt kann M-x edit-last-kbd-macro sein, die (in meinem Fall) dies zeigt:

;; 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 

, die mindestens einige der Funktionsnamen gibt. Aber Sie werden sehen, dass RET als 'newline-and-indent gekennzeichnet ist, was falsch ist, da zum Zeitpunkt der Makroausführung der Minipuffer aktiv ist und die Bindung tatsächlich 'minibuffer-complete-and-exit ist. In ähnlicher Weise ist die geeignete Bindung für TAB'minibuffer-complete.

+0

Danke für das Update, Trey. Sieht interessant aus. – Sahas

4

Ich habe ein Paket, das ziemlich genau dies bei https://github.com/Silex/elmacro

Es erlaubt einige Macken hat, aber es funktioniert ziemlich gut ... zum Beispiel das folgende Makro:

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

generiert die folgende 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))