2011-07-21 37 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,我只查看是否完成改變,我忘了實際使用它。謝謝,我已經更新了答案。 –