我通常使用
在 emacs 中定义新的键绑定(bind)"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)。
最佳答案
您指定的序列确实简化了击键表示。您剩下的基本上是 您键入的一组击键。
已经有人问过你是否可以转换 emacs macro into elisp .
也许您在问是否可以让它更易于阅读? 如果是这样,那么您很幸运。
您可以使用 kbd
宏将打印的击键表示转换为等效的击键向量。
例如,导致 3
与 tj
的 query-replace
的序列如下所示: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")))
关于Emacs 击键表示混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3121274/