干净的方式在Emacs迷你缓冲区中执行命令

时间:2012-07-08 05:35:05

标签: emacs elisp

请考虑以下示例:我想从迷你缓冲区使用ido读取文件,但要合并我经常使用的所有目录。我不能只执行

(ido-find-file)
(ido-merge-work-directories)

因为第二个性别只会在用户选择完文件后执行。那么问题是:在迷你缓冲区的命令循环中执行命令的最佳/最干净的方法是什么?

我知道这样做的唯一方法是将我想要的命令绑定到一个键序列,并将该序列添加到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无关。让我解释。当您调用诸如find-file,switch-to-buffer或任何需要与miniuffer交互的内容之类的函数时,会创建一个“递归编辑” - 即命令循环内的命令循环。

所以,代码:

(message "A")
(recursive-edit) 
(message "B")

打印A,然后暂停执行该函数并重新进入命令循环。您可以四处移动,打开文件等,直到您离开递归编辑,然后打印“B”。

所以,让我重新解释一下我的问题:如果你创建一个递归编辑,那么你如何在创建的新命令循环中执行命令(在同一个函数中)?如果我必须键入额外的键,它不计算在内。对于ido示例,要合并目录,ido必须运行:在调用ido之前执行合并目录不在ido的命令循环内。如果你之后执行它,那么ido会破坏它的命令循环。

3 个答案:

答案 0 :(得分:1)

所以我认为你的问题有三个答案:

  • 您可以在迷你缓冲区地图中绑定密钥,与其他任何密钥相同。 several keymaps可能具有相关性。

  • ido有许多钩子可用于更改各种函数的行为,特别是ido-make-*-hook变量似乎相关。 (如果您从未使用过它,M-x describe-variable,又名\C-h v,则是您的朋友。)

  • 如果你想普遍改变一个函数的行为并且没有可用的钩子,你应该考虑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))
    

答案 1 :(得分:1)

引用手册:

  

通常,我们尝试最小化递归编辑级别的使用   GNU Emacs。这是因为他们限制你回去"在一个   特定的顺序 - 从最里层到顶层。什么时候   可能,我们在不同的缓冲区中提供不同的活动   您可以随意切换它们。有些命令会切换到   新的主要模式,提供切换命令。这些   方法可以让您更灵活地回到未完成的任务中   你选择的顺序。

那么你能描述一下你真正需要这样做的场景吗?我非常 在这种情况下,它的工作方式很奇怪。

答案 2 :(得分:1)

我不清楚你在问什么,但听起来有点像你在询问如何以交互方式调用命令,当你不在顶级时从迷你缓冲区读取命令。

如果这是问题,那么答案很简单:在命令调用周围将enable-recursive-minibuffers绑定到非nil