2010-06-25 75 views
3

我通常在emacs中使用Emacs按键表示混淆

"C-x (" --> (command kmacro-start-macro) 
"C-x)" --> (kmacro-end-macro) 
(name-last-kbd-macro) 
(insert-kbd-macro) 
定义新的键绑定。但是它生成的代码看起来不同于我在各种主要/次要模式和其他emacs实用程序中读取和修改的代码。
我最近遇到 this博客文章,这清除了我的一些混乱。

是否有一个简化击键表示的emacs工具? 理想情况下,从ahk keystroke notation转换为任何理智的emacs按键记号。

编辑:一些其他阅读来清除我的困惑: keybinding guide通过Jari Aalto。

回答

5

您指定的序列确实简化了击键表示。你留下的基本上是你键入的一组击键。

已经有人问您是否可以转换emacs macro into elisp

也许你问是否可以使它更具人类可读性? 如果是这样,那么你很幸运。

您可以使用​​宏将击键的打印表示转换为击键的等效向量。

例如,这导致3一个query-replacetj的顺序是这样的:M-%3 RET TJ RET!

好了,你可以手动设置了:

(fset 'my-hand-crafted-kbd-macro (kbd "M-% 3 RET tj RET !")) 

而这一块的elisp的代码应该生成上面你,如果你有一个名为宏'my-hand-crafted-kbd-macro

(defun insert-pretty-kbd-macro (macro-name) 
    (interactive (list (intern (completing-read 
           "Insert kbd macro (name): " 
           obarray 
           (lambda (elt) 
           (and (fboundp elt) 
            (or (stringp (symbol-function elt)) 
             (vectorp (symbol-function elt)) 
             (get elt 'kmacro)))) 
           t)))) 
    (interactive) 
    (insert "(fset '") 
    (prin1 macro-name (current-buffer)) 
    (insert "\n (kbd \"") 
    (insert (key-description (symbol-function macro-name))) 
    (insert "\"))\n")) 

要当你完成一个键盘宏Cx)时,你可以使用这个建议:

(defadvice kmacro-end-macro (after kmacro-end-macro-name-it-and-insert activate) 
    "user wants to insert elisp to reproduce the last kbd macro" 
    (let ((name (read-string "Name for this kbd macro: "))) 
    (insert "(fset '") 
    (insert name) 
    (insert "\n (kbd \"") 
    (insert (key-description last-kbd-macro)) 
    (insert "\"))\n"))) 
+0

在我的问题中是否可以将简单配方的前3个步骤合并? – Naveen 2010-06-25 22:09:28

+0

@Naveen是的,我可以在下周看看。 – 2010-06-25 23:12:38

1

谢谢Trey。
我把name-last-kbd-macro和你的insert-pretty-kbd-macro组合成了名称和插入最后kbd-宏

(defun name-and-insert-last-kbd-macro (macro-name) 
    (interactive (list (intern (completing-read 
           "Insert kbd macro (name): " 
           obarray 
           t)))) 
    (interactive) 
    (insert "(fset '") 
    (prin1 macro-name (current-buffer)) 
    (insert "\n (kbd \"") 
    (fset symbol last-kbd-macro) 
    (insert (key-description (symbol-function symbol))) 
    (insert "\"))\n"))
现在我可以开始用f8,
定义一个宏并结束测试/运行它与F9
,并且名称和F10插入:
(global-set-key [f8] 'kmacro-start-macro) 
(global-set-key [f9] 'kmacro-end-and-call-macro) 
(global-set-key [f10] 'name-and-insert-last-kbd-macro) 
(global-set-key [f12] 'menu-bar-open) ; originally bound to F10 

+0

我的答案中添加了一些代码,可以在完成宏时自动将其挂起。 – 2010-06-29 18:55:59

0

我做了一个包,允许几乎正是这种在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))