【问题标题】:How to execute keyboard macros exactly?如何准确执行键盘宏?
【发布时间】:2015-02-08 02:49:43
【问题描述】:

在许多情况下,emacs 不会完全按照应有的方式执行 kbd 宏。例如

(execute-kbd-macro (read-kbd-macro "C-x C-f"))

而不是使用打开的 minibuffer Find file: ... emacs 结束此宏的执行,而是打开第一个可用文件或 dired 缓冲区(取决于具体情况)。如何执行这样的 kbd 宏而不产生这样的误解?

Upd 2. 这只是这种键盘宏的示例,其行为与原始行为不同(即按下 C-x C-f)。下面是grep 的另一个示例。

更新。正如@lawlist 提到的,我可以使用

(key-binding (kbd "C-x C-f"))

用于将键序列转换为命令名称。但它只有在有命令时才有效。在更复杂的情况下,例如

(execute-kbd-macro (read-kbd-macro "C-u M-x grep RET"))

这种“蛮力”方法不起作用(我想继续编辑 grep 的模式,但 emacs 强制完成交互)。

【问题讨论】:

  • 我认为这个相关的帖子可能会回答你的问题?:emacs.stackexchange.com/a/7495/2287
  • 谢谢,但仅限于最简单的情况。在每种特定情况下,我似乎必须手动将键序列转换为等效命令。
  • 我看不出宏和这个有什么关系?你不是只是在这里运行函数吗? C-x C-f 不是宏,它默认调用函数find-file
  • 但是(execute-kbd-macro (read-kbd-macro "C-x C-f")) 是一个宏,它的行为与函数find-file 调用不完全相同。见更新 2。

标签: emacs macros keyboard


【解决方案1】:

函数kbd-macro-query可以在这种情况下提供帮助

(execute-kbd-macro (read-kbd-macro "C-x C-f C-u C-x q"))

但是有一个问题:命令循环级别增加(可以看到 方括号在模式行中的外观)。在find-file的情况下 例子没关系,但是

(execute-kbd-macro (read-kbd-macro "M-x helm-do-grep RET C-u C-x q"))

给出错误的行为。我设计了有趣的解决方法

(defun eab/kbd-macro-query ()
  (interactive)
  (let ((executing-kbd-macro defining-kbd-macro))
    (run-with-timer 0.1 nil 'abort-recursive-edit)
    (recursive-edit)))

(global-set-key (kbd "C-x Q") 'eab/kbd-macro-query)

(let ((minibuffer-message-timeout 0))
  (execute-kbd-macro (read-kbd-macro "M-x helm-do-grep RET C-x Q")))

而且效果很好。

(let ((minibuffer-message-timeout 0))
  (execute-kbd-macro (read-kbd-macro "C-u M-x grep RET C-x Q")))

也可以正常工作。

但是现在还有另一个问题 ido-find-file (C-x C-f in ido-mode)

(let ((minibuffer-message-timeout 0))
  (execute-kbd-macro (read-kbd-macro "C-x C-f C-x Q")))

ido-text 和 [No match] 有问题。

总和。该方法的主要思想是截取kbd宏 使用recursive-edit 执行。 (kbd-macro-query 与 非零 arg 使用它)。 ido-mode 有一些问题,但在 一般来说,即使是复杂的 kbd 序列,它也能很好地工作,比如

(let ((minibuffer-message-timeout 0))
  (execute-kbd-macro (read-kbd-macro "C-u M-x helm-do-grep RET C-x Q")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    相关资源
    最近更新 更多