Emacs我想从lisp函数调用execute-kbd-macro

时间:2015-11-04 14:43:01

标签: emacs macros keyboard elisp

我想从Lisp函数调用键盘宏。我希望在一些自定义错误处理中进行分层。

convertPoint:toView是以mykey格式存储在文本文件中的键盘宏。 我使用(fset ...)加载它,并且在使用load-file调用时工作正常。

当我执行此函数并插入M-x mykey时,我只获得当前缓冲区中显示的键的名称,而不是它的执行。我缺少一步吗?

mykey

1 个答案:

答案 0 :(得分:4)

尝试

(defun gn-batch-search (key-name)
  "Execute a keyboard macro that has already been loaded."
  (interactive "sName of macro key:")
  (execute-kbd-macro (intern key-name)))

您遇到的问题是"sName of macro key:"交互式规范会提示用户并返回字符串,并且您希望运行名称为的命令由这个字符串描述。这就解释了为什么它没有做你想要的以及为什么你需要intern

至于它为什么会这样做:键盘宏被表示为事件的向量,其中事件可以是鼠标点击或按键操作。事实证明,字符串被视为一种向量(向量字符),字符也是一个事件(它表示当您在键盘上按下该字符时发送的事件),因此字符串{{ 1}}是一个有效的键盘宏,表示按下 h 然后按 i 的行为,所以当你运行这个宏时,它(通常)会最终插入“本身“在当前缓冲区中(除了特殊缓冲区,如dired,"hi",...其中 h i 绑定到其他命令)。

此外,您可以使用*Help*而不是execute-kbd-macro,它可以使用“任何”命令,无论是定义为键盘宏还是普通函数。