考虑以下示例:我想使用 ido 从 minibuffer 中读取文件,但要合并到我经常使用的所有目录中。我不能只是执行
(ido-find-file)
(ido-merge-work-directories)
因为第二个 sexp 只会在用户完成选择文件后执行。那么问题是:在迷你缓冲区的命令循环中执行命令的最佳/最干净的方法是什么?
我知道这样做的唯一方法是将我想要的命令绑定到一个键序列,并将该序列添加到 unread-command-events 以便在我们进入 minibuffer 命令循环后该键运行:
(setq unread-command-events (append (listify-key-sequence (kbd "M-s")) unread-command-events)) ; std key-binding for ido-merge-work-directories
(ido-find-file)
但这很hacky,我想知道是否有更好的解决方案。
谢谢!
编辑:澄清一下,这个问题与 ido 无关。让我解释。当您调用诸如 find-file、switch-to-buffer 或任何需要 minibuffer 交互的函数时,会创建“递归编辑”——即命令循环内的命令循环。
所以,代码:
(message "A")
(recursive-edit)
(message "B")
打印 A,然后暂停函数的执行并重新进入命令循环。您可以四处移动、打开文件等,直到您离开递归编辑,然后打印“B”。
所以,让我重新表述我的问题:如果您创建一个递归编辑,那么您如何在创建的新命令循环中执行一个命令(在同一函数中)?如果我必须输入额外的键,这不算数。对于 ido 示例,要合并目录,必须运行 ido:在调用 ido 之前执行合并目录不在 ido 的命令循环内。如果你之后执行它,那么 ido 会破坏它的命令循环。