我通常使用
"C-x (" --> (command kmacro-start-macro) "C-x )" --> (kmacro-end-macro) (name-last-kbd-macro) (insert-kbd-macro)在emacs中定义新的键绑定但是它生成的代码看起来与我在各种主要/次要模式和其他emacs实用程序中读取和修改的代码不同。
是否有简化按键表示的emacs工具? 理想情况下,从ahk keystroke notation转换为任何理智的emacs击键表示法。
编辑:其他一些阅读清除我的困惑: Jari Aalto keybinding guide。
答案 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开始定义一个宏了,
(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))