考虑以下示例:我想使用迷你缓冲区中的 ido 读取一个文件,但合并我经常使用的所有目录。我不能只执行
(ido-find-file)
(ido-merge-work-directories)
因为第二个sexp只有在用户选择完文件后才会执行。接下来的问题是:在迷你缓冲区的命令循环中执行命令的最佳/最干净的方法是什么?
我知道的唯一方法是将我想要的命令绑定(bind)到一个键序列,并将该序列添加到 unread-command-events,这样一旦我们进入迷你缓冲区命令循环,键就会运行:
(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 无关。让我解释。当您调用诸如查找文件、切换到缓冲区或任何需要迷你缓冲区交互的功能时,将创建“递归编辑”——即命令循环内的命令循环。
所以,代码:
(message "A")
(recursive-edit)
(message "B")
打印 A,然后暂停函数的执行并重新进入命令循环。您可以四处移动、打开文件等,直到您离开递归编辑,然后打印“B”。
那么,让我重新表述一下我的问题:如果您创建递归编辑,那么您如何在创建的新命令循环中执行命令(在同一函数中)?如果我必须输入额外的键,这不算数。对于 ido 示例,要合并目录,ido 必须正在运行:在调用 ido 之前执行合并目录不在 ido 的命令循环内。如果您之后执行它,则 ido 会破坏其命令循环。
最佳答案
所以我认为您的问题有三个答案:
您可以在迷你缓冲区映射中绑定(bind)键,就像其他键一样。有several keymaps可能相关。
ido
有许多 Hook 可用于更改各种函数的行为,特别是ido-make-*-hook
变量似乎相关。 (如果您从未使用过它,M-x describe-variable
,又名\C-h v
,是您的 friend 。)如果您想要普遍更改函数的行为并且没有可用的 Hook ,您应该考虑
defadvice
。就您而言,我认为您可以使用(未经测试!):(defadvice ido-find-file (before) (ido-merge-work-directories)) (ad-activate ido-find-file)
您可以将这些行添加到您的
.emacs
:(when (require 'ido) (defadvice ido-find-file (before) (ido-merge-work-directories)) (ad-activate ido-find-file))
关于emacs - 在 Emacs 迷你缓冲区中执行命令的简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11380918/