Emacs击键表示混乱

时间:2010-06-25 20:36:24

标签: emacs keyboard-shortcuts

我通常使用

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

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

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

3 个答案:

答案 0 :(得分:5)

您指定的序列确实简化了击键表示。您剩下的就是您键入的键击集。

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

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

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

例如,导致query-replace 3 tj的序列如下所示: M-%3 RET tj RET!

好吧,您可以使用以下方式手动设置:

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

如果你已经命名了宏'my-hand-crafted-kbd-macro,那么这段elisp代码应该为你生成以上内容:

(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"))

要在完成键盘宏 C-x)后自动执行此操作,您可以使用以下建议:

(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")))

答案 1 :(得分:1)

谢谢Trey 我将name-last-kbd-macro与你的insert-pretty-kbd-macro结合到了name-and-insert-last-kbd-macro

(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

答案 2 :(得分: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))