2009-11-11 8 views
18

C'è un modo per convertire una macro emacs in elisp, non come quello che fa M-x insert-kbd-macro, l'attività effettiva che diventa istruzioni elisp.Converti la macro di Emacs in Elisp

Grazie per il vostro aiuto.

risposta

22

No, mi dispiace. Non esiste un modo banale per convertire una macro emacs in elisp.

Aggiornamento: C'è stato un po 'di lavoro su Emacs per iniziare questo percorso. Vedere this thread come punto di partenza. Non è ancora possibile (giugno 2010), ma c'è attività.

La prima ragione per cui riesco a pensare riguarda i comandi interattivi e la conversione delle sequenze di tasti in argomenti appropriati per le funzioni.

pensi al seguente sequenza:

Cx b .EM TAB RET

Questo inizia il comando per passare a un buffer, tipi di tre caratteri, utilizza completamento TAB per completare e RET accettare . Il lisp equivalente per il risultato finale (in una sessione di emacs in cui il completamento TAB è unico) è:

(switch-to-buffer ".emacs") 

Pensando di completamento, ci sono anche interazioni con l'espansione di tutti i tipi (dabbrev, hippie-expand, etc.).

Un punto di partenza può essere M-x Edit-last-kbd-macro che (nel mio caso) mostra questo:

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

cui almeno ti dà alcuni dei nomi delle funzioni. Ma vedrai che RET è etichettato come 'newline-and-indent che non è corretto perché al momento dell'esecuzione della macro, il minibuffer è attivo e il binding è in realtà 'minibuffer-complete-and-exit. Allo stesso modo, l'associazione corretta per TAB è 'minibuffer-complete.

+0

Grazie per l'aggiornamento, Trey. Sembra interessante. – Sahas

4

ho fatto un pacchetto che permette praticamente esattamente questo a https://github.com/Silex/elmacro

Ha alcune peculiarità ma funziona abbastanza bene ... per esempio, la seguente macro:

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

genera il seguente 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))