2009-11-11 156 views
18

有沒有辦法將emacs宏轉換爲elisp,而不是像M-x insert-kbd-macro那樣,實際的活動變成elisp語句。將Emacs宏轉換爲Elisp

感謝您的幫助。

回答

22

不,對不起。將emacs宏轉換爲elisp沒有簡單的方法。

更新: Emacs已經有一些工作開始了這條道路。以this thread爲起點。這仍然是不可能的(2010年6月),但有活動。

我能想到的第一個原因是處理交互式命令並將鍵擊轉換爲適當的函數參數。

認爲以下序列組成:

CX b .EM TAB RET

這開始命令切換到緩衝器,類型三個字符,使用TAB完成來完成它和RET接受。爲最終結果的等效口齒不清(在其中完成TAB是唯一的一個emacs的會議)是:完成

(switch-to-buffer ".emacs") 

思考,也有與所有類型(dabbrevhippie-expand等)的膨脹的相互作用。

的一個起點可以M-X編輯,最後大骨節病宏這(對我來說)顯示了這個:

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

其中至少給你一些的函數名。但是您會看到RET被標記爲'newline-and-indent,這是不正確的,因爲在執行宏時,小緩衝區處於活動狀態,綁定實際上是'minibuffer-complete-and-exit。類似地,對於TAB的適當綁定是'minibuffer-complete

+0

感謝您的更新,Trey。看起來很有趣。 – Sahas 2010-08-06 04:50:15

4

我做了一個包,允許幾乎正是這種在https://github.com/Silex/elmacro

它有一些怪癖,但它工作得很好...例如,下面的宏:

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

生成以下的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))