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

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

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

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

Мой вопрос:

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


person elemakil    schedule 10.12.2013    source источник
comment
Возможно, вы можете построить регулярное выражение, чтобы не игнорировать *ielm* для ido-ignore-buffers.   -  person aartist    schedule 10.12.2013


Ответы (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)))

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

person shakurov    schedule 10.12.2013
comment
Идеально! Именно то, что я хотел! - person elemakil; 10.12.2013
comment
Не могли бы вы добавить пример со списком исключений? - person Arch Stanton; 17.05.2017
comment
Я обновил свой ответ. Это то, что вы имели в виду? - person shakurov; 17.05.2017
comment
Точно! Большое тебе спасибо! - person Arch Stanton; 17.05.2017