Emacs击键表示混乱

Nav*_*een 3 emacs keyboard-shortcuts

我通常在emacs中使用定义新的键绑定

"C-x (" --> (command kmacro-start-macro)
"C-x )" --> (kmacro-end-macro)
(name-last-kbd-macro)
(insert-kbd-macro)
但它生成的代码看起来与我在各种主要/次要模式和其他emacs实用程序中读取和修改的代码不同.
我最近发现了这篇博文,清除了我的一些困惑.

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

编辑:其他一些阅读清除我的困惑: Jari Aalto的键绑定指南.

Tre*_*son 5

您指定的序列确实简化了击键表示.你剩下的就是你输入的一组击键.

已经有人问你是否可以将emacs宏转换成elisp.

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

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

例如,这导致了该序列query-replace3tj看起来像:M-% 3 RET tj RET !

好吧,您可以手动设置:

(fset 'my-hand-crafted-kbd-macro (kbd "M-% 3 RET tj RET !"))
Run Code Online (Sandbox Code Playgroud)

如果您已命名宏,那么这段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"))
Run Code Online (Sandbox Code Playgroud)

要在完成键盘宏时自动执行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")))
Run Code Online (Sandbox Code Playgroud)