4

通常我想ido忽略所有非用户缓冲区,即所有以*. 我使用以下设置实现了这一点:

(setq ido-ignore-buffers '("\\` " "^\*"))

然而,当使用 shell 或解释器时,这会带来一个问题,例如ielm,交互缓冲区被命名为*ielm*。显然,手动添加所有要忽略的缓冲区并不是一个真正的选择,因为加载了许多不同的 emacs 包时列表可能会变得很长。我知道C-a哪个从内部禁用了忽略模式ido,但是,我不想C-a每次切换到ielm缓冲区时都点击。

我的问题是:

是否有一些变量允许指定 ido 不应忽略的缓冲区(尽管它们与正常的忽略列表匹配)?还是有其他方法可以解决这个问题?

4

1 回答 1

5

ido-ignore-buffers变量指向的列表可能不仅包含正则表达式,还包含函数(实际上是它们的任何组合)。提供一个过滤掉所有非用户缓冲区的函数很容易,除了*ielm*

(defun ido-ignore-non-user-except-ielm (name)
  "Ignore all non-user (a.k.a. *starred*) buffers except *ielm*."
  (and (string-match "^\*" name)
       (not (string= name "*ielm*"))))

(setq ido-ignore-buffers '("\\` " ido-ignore-non-user-except-ielm))

这是一个具有多个未忽略缓冲区名称的示例:

(setq my-unignored-buffers '("*ielm*" "*scratch*" "*foo*" "*bar*"))

(defun my-ido-ignore-func (name)
  "Ignore all non-user (a.k.a. *starred*) buffers except those listed in `my-unignored-buffers'."
  (and (string-match "^\*" name)
       (not (member name my-unignored-buffers))))

(setq ido-ignore-buffers '("\\` " my-ido-ignore-func))

在源代码的注释中可以找到一个使用忽略函数的有趣示例ido.el(我已;;在每一行的开头删除):

(defun ido-ignore-c-mode (name)
  "Ignore all c mode buffers -- example function for ido."
  (with-current-buffer name
    (derived-mode-p 'c-mode)))

基本上,一旦你有了缓冲区名称,你就可以做任何你想做的检查/忽略。

于 2013-12-10T13:35:07.507 回答