Emacs我想从lisp函数调用execute kbd宏

Emacs我想从lisp函数调用execute kbd宏,emacs,macros,keyboard,elisp,Emacs,Macros,Keyboard,Elisp,我想从Lisp函数调用键盘宏。我希望在一些自定义错误处理层 mykey是以(fset…)格式存储在文本文件中的键盘宏。 我用load file加载了它,当用M-x mykey调用它时,它工作正常 当我执行这个函数并插入mykey时,我只得到当前缓冲区中显示的密钥的名称,而不是它的执行。有我错过的一步吗 (defun gn-batch-search (key-name) "Execute a keyboard macro that has already been loaded." (in

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

mykey
是以
(fset…)
格式存储在文本文件中的键盘宏。 我用
load file
加载了它,当用
M-x mykey
调用它时,它工作正常

当我执行这个函数并插入
mykey
时,我只得到当前缓冲区中显示的密钥的名称,而不是它的执行。有我错过的一步吗

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

您遇到的问题是,
“sName of macro key:”
interactive spec提示用户并返回一个字符串,您希望运行该字符串描述的命令。这就解释了为什么它不能满足您的需求,以及为什么您需要
intern

至于它为什么这样做:键盘宏被表示为事件向量,其中事件可以是鼠标单击或按键之类的事情。事实证明,字符串被视为一种向量(向量字符),字符也是一个事件(它表示在键盘上按该字符时发送的事件),因此字符串
“hi”
是一个有效的键盘宏,表示先按h,然后按i的动作,因此,当您运行此宏时,它(通常)会在当前缓冲区中插入“自身”(在特殊缓冲区中除外,如dired、
*Help*
,…其中h和i绑定到其他命令)


另外,您可以使用
command execute
,而不是
execute kbd macro
,它将与“any”命令一起工作,无论它是定义为键盘宏还是普通函数。

非常感谢!(实习生的关键名字)成功了。正如您所建议的,它还可以与命令execute一起使用。想知道为什么我在文档中看到的例子都没有提到必须对符号进行实习?可能之前在键盘宏上按顺序执行的其他命令都有内置的?c方法:只需在字符串中插入符号,这反过来只有在您试图将符号作为
参数传递给
执行kbd宏
时才相关。想必你看到的所有例子都没有使用这种组合。谢谢你们,菲尔。这是有道理的。宏是非常不寻常的动物。c meade:注意,如果答案解决了您的问题,您应该“接受”答案。旁注:
load file
是一个交互式命令。在编写Elisp代码时,您也可以使用较短的
load
,否则也可以使用相同的方法。
(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)))