【问题标题】:Emacs I want to call execute-kbd-macro from a lisp functionEmacs 我想从 lisp 函数中调用 execute-kbd-macro
【发布时间】:2015-11-04 14:43:01
【问题描述】:

我想从 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))

【问题讨论】:

  • 旁注:load-file 是一个交互式命令。在编写 Elisp 代码时,您不妨使用更短的 load,否则效果相同。

标签: emacs macros keyboard elisp


【解决方案1】:

试试

(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。

至于它为什么这样做:键盘宏表示为事件的向量,其中事件可以是鼠标点击或按键等事件。事实证明,一个字符串被认为是一种向量(一个向量字符),一个字符也是一个事件(它表示当你在键盘上按下那个字符时发送的事件),所以字符串@987654324 @ 是一个有效的键盘宏,它代表按 h 然后按 i 的动作,所以当你运行这个宏时,它(通常)最终会插入“自身”在当前缓冲区中(除了像 dired、*Help*、...这样的特殊缓冲区,其中 h 和 i 绑定到其他命令)。

此外,除了execute-kbd-macro,您还可以使用command-execute,它可以与“任何”命令一起使用,无论它是定义为键盘宏还是普通功能。

【讨论】:

  • 非常感谢! (intern key-name) 成功了。正如您所建议的,它也适用于命令执行。想知道为什么我在文档中看到的示例都没有提到必须实习符号?也许之前在键盘宏上按顺序执行的其他命令具有内置功能?
  • c meade: 实习只需要从 string 中制作一个 symbol,而这又只有在你试图通过时才相关作为MACRO 参数的符号execute-kbd-macro。大概你看到的例子都没有使用这种组合。
  • 谢谢菲尔斯。这就说得通了。宏是非常不寻常的动物。
  • c meade:请注意,如果答案已经解决了您的问题,您应该“接受”。
猜你喜欢
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
相关资源
最近更新 更多