禁用特定命令的ido模式?

时间:2011-07-21 05:32:06

标签: emacs ido

我已经使用偶像模式几个月了,偶尔到处都是偶像,我一般都很满意。但是,我希望我能改变一件事。当我输入 C-u M-x shell 来创建一个具有特定名称的新shell缓冲区时,ido为我提供了所有打开缓冲区的完成列表。如果我选择一个,则在该缓冲区中启动一个新的shell,无论它包含什么,它都会被置于shell模式。很难想象一个有用的用例。

有没有办法只为shell命令停用ido-mode? (当然,除了我将来偶然发现的任何其他类似命令。)

1 个答案:

答案 0 :(得分: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)