2009-11-11 86 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))