2012-07-08 45 views
3

考虑下面的例子:我想从迷你缓冲区使用ido读取文件,但合并在我经常使用的所有目录中。我不能只执行干净的方式来执行Emacs迷你缓冲区中的命令

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

因为第二个sexp将只在用户完成选择文件后执行。那么问题是:在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。让我解释。当你调用一个函数,如发现文件,或切换到缓冲,或任何需要小缓冲区的互动中,“递归编辑”创建 - 也就是说,一个命令循环的内部命令循环。

所以,代码:

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

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

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

+1

你总是* *要合并的其他目录? – 2012-07-08 08:06:36

+0

这只是一个例子,但对于我正在编写的应用程序(项目管理库),答案是肯定的。我主要对一般问题的答案感兴趣:如果我进入minibuffer命令循环,我该如何干净地执行该循环中的命令? – 2012-07-08 20:04:40

回答

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

这些都不起作用。当然,我可以在minibuffer映射中绑定键,但我不希望用户输入更多。 ido具有钩子,但是我没有见过这种钩子允许你在循环中执行任意代码,而且这个问题并不是专门关于ido的。建议也不行,如果你之前建议在ido创建它的命令循环之前先执行代码......如果你在之后执行它,那么命令在ido已经关闭它的命令循环时执行。 – 2012-07-09 02:34:27

1

引述手册:

一般情况下,我们尝试使用递归减少编辑级别 GNU Emacs。这是因为他们限制你以特定顺序“回去” - 从最内层到最高层。当 可能,我们在不同的缓冲区呈现不同的活动,让你 可以在它们之间请你切换。一些命令切换到 新的主要模式,该模式提供切换回的命令。这些 办法给你更多的灵活性回到未完成的任务 您选择的顺序。

所以,你可以描述你确实需要这样做的情形? Ido在这种情况下的工作方式很奇怪。

+1

我知道他们是“令人难以接受”,但每个迷你缓冲区操作调用递归编辑,所以它不完全是一个罕见的情况。在我的文章中的例子是促使我发布这个问题的例子,但我过去也需要它将minibuffer输入注入到提供蹩脚API的第三方库中。我对“用ATM解决实际问题的不同方式”感兴趣。我已经发现了一个工作黑客。我纯粹想知道在内部递归编辑命令循环中是否有干净的方法来执行命令,如果没有干净的方法,我只是在某个时候修补一个补丁。 – 2012-07-10 04:08:56

1

这不是我清楚你的要求正是,但它听起来有点像你问如何调用命令交互,从迷你缓冲区中读取的时候你是不是在顶层。

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

相关问题