Скажите ido игнорировать все звездные буферы, кроме некоторых

Обычно я хочу ido игнорировать все не пользовательские буферы, т.е. все буферы, которые начинаются с *, Я добился этого, используя следующие настройки:

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

Однако это создает проблему при работе с оболочкой или интерпретатором, например ielmгде буфер взаимодействия назван *ielm*, Очевидно, что добавление всех буферов, которые должны игнорироваться вручную, на самом деле не вариант, потому что список может быть довольно длинным с множеством загруженных пакетов emacs. Я знаю о C-a который отключил шаблон игнорирования изнутри idoОднако я не хочу бить C-a каждый раз, когда я переключаюсь на ielm буфер.

Мой вопрос:

Существует ли какая-либо переменная, которая позволяет указывать буферы, которые ido не должен игнорировать (хотя они соответствуют обычному списку игнорирования)? Или есть другой подход для решения этой проблемы?

1 ответ

Решение

Список, который 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)))

По сути, после того, как вы получили имя буфера, вы можете выполнять любую проверку / игнорирование по своему желанию.

Другие вопросы по тегам