通常我希望ido
忽略所有非用户缓冲区,即所有以*
开头的缓冲区。我已使用以下设置实现此目的:
(setq ido-ignore-buffers '("\\` " "^\*"))
然而,这在使用shell或解释器时会产生问题,例如, ielm
,其中交互缓冲区名为*ielm*
。显然,手动添加要忽略的所有缓冲区实际上并不是一个选项,因为列表可能会很长,并且加载了很多不同的emacs包。我知道C-a
已禁用ido
内的忽略模式,但是,每次切换到C-a
缓冲区时,我都不想点ielm
。
我的问题是:
是否有一些变量允许指定ido 不忽略的缓冲区(尽管它们与普通忽略列表匹配)?或者还有其他解决方法吗?
答案 0 :(得分:4)
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)))
基本上,一旦你有了缓冲区名称,你可以做任何你想要的检查/忽略。