我已经使用 ido-mode 几个月了,并且 ido-everywhere 已打开,而且总体上对它非常满意。不过,有一件事我希望我能改变。当我键入C-u M-x shell以创建具有特定名称的新 shell 缓冲区时,ido 为我提供了所有打开缓冲区的完成列表。如果我选择一个,则在该缓冲区中启动一个新的 shell 并进入 shell 模式,无论它包含什么。很难想象一个有用的用例。
有没有办法只为 shell 命令停用 ido 模式?(当然,还有我将来可能会偶然发现的任何其他类似命令。)
嘿,事实证明,无论您是否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)