2011-07-21 40 views
6

我一直在使用ido模式几个月,随着哆哆嗦嗦打开,我通常很满意。不过,我希望有一件事可以改变。当我输入C-u M-x shell以创建一个具有特定名称的新shell缓冲区时,ido向我提供了所有打开的缓冲区的完成列表。如果我选择了一个,那么在该缓冲区中启动一个新的shell,并将其置于shell模式,无论它包含什么。很难想象这是一个有用的用例。禁用特定命令的ido模式?

是否有一种方法可以仅禁用shell命令的ido-mode? (以及当然我可能会遇到的其他类似命令)

+0

我知道,对于某些命令,使用最后两次快捷方式暂时禁用IDO(例如,打开文件,'CX比照Cf'使用在迷你传统的文件打开的界面),但我不不知道'Mx'命令。 – Seki

回答

5

嘿,事实证明,无论您是否启用ido-everywhere,您都会得到相同的完成选项。

有没有内置的方式来做你想做的。 ido-mode只为您提供挂钩,以便能否覆盖find-file行为是否被ido接管。 read-buffer目前是总是ido-everywhere覆盖。

幸运的是,一个小的Emacs Lisp可以得到你想要的东西:

(put 'shell 'ido 'ignore) 
(defadvice ido-read-buffer (around ido-read-buffer-possibly-ignore activate) 
    "Check to see if use wanted to avoid using ido" 
    (if (eq (get this-command 'ido) 'ignore) 
     (let ((read-buffer-function nil)) 
     (run-hook-with-args 'ido-before-fallback-functions 'read-buffer) 
     (setq ad-return-value (apply 'read-buffer (ad-get-args 0)))) 
    ad-do-it)) 

而对于任何其他命令你不想缓冲区选择以下ido-everywhere可以通过简单地增加一个新的表达你的定制。 emacs的:

(put 'other-command-i-want-untouched 'ido 'ignore) 
+1

太棒了,谢谢! – Sean

+2

...虽然这并不像书面形式,但我后来才发现。你必须说'(setq ad-return-value(apply'read-buffer(ad-get-args 0)))'而不是'(apply'read-buffer(ad-get-args 0))''。 – Sean

+0

@Sean duh,我只查看是否完成改变,我忘了实际使用它。谢谢,我已经更新了答案。 –