2010-06-25 52 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))