28.8 Список буферов

Список буферов — это список всех живых буферов. Порядок буферов в этом списке основан главным образом на том, как недавно каждый буфер отображался в окне. Несколько функций, в частности other-buffer, используют этот порядок. Список буферов, отображаемый для пользователя, также следует этому порядку.

Создание буфера добавляет его в конец списка буферов, а убийство буфера удаляет его из этого списка. Буфер перемещается в начало этого списка всякий раз, когда он выбирается для отображения в окне (см. Переключение на буфер в окне) или когда выбирается окно, отображающее его (см. Выбор окон). Буфер перемещается в конец списка, когда его «закапывают» (см. bury-buffer ниже). Для программиста на Lisp не существует функций, которые бы непосредственно манипулировали списком буферов.

В дополнение к описанному выше основному списку буферов Emacs поддерживает локальный список буферов для каждого кадра, в котором сначала идут буферы, отображавшиеся (или чьи окна выбирались) в этом кадре. (Этот порядок записывается в параметре кадра buffer-list; см. Параметры буферов.) Буферы, никогда не отображавшиеся в этом кадре, следуют дальше, упорядоченные согласно основному списку буферов.

Функция: buffer-list &optional frame

Эта функция возвращает список буферов, включая все буферы, даже те, чьи имена начинаются с пробела. Элементами являются сами буферы, а не их имена.

Если frame — это кадр, возвращается локальный список буферов этого frame. Если frame равен nil или опущен, используется основной список буферов: буферы отображаются в порядке самого недавнего отображения или выбора, независимо от того, в каких кадрах они отображались.

(buffer-list)
     ⇒ (#<buffer buffers.texi>
         #<buffer  *Minibuf-1*> #<buffer buffer.c>
         #<buffer *Help*> #<buffer TAGS>)

;; Обратите внимание, что имя минибуфера
;;   начинается с пробела!
(mapcar #'buffer-name (buffer-list))
    ⇒ ("buffers.texi" " *Minibuf-1*"
        "buffer.c" "*Help*" "TAGS")

Список, возвращаемый buffer-list, создаётся специально для этого вызова; это не внутренняя структура данных Emacs, и его изменение не влияет на порядок буферов. Если вы хотите изменить порядок буферов в основном списке буферов, вот простой способ:

(defun reorder-buffer-list (new-list)
  (while new-list
    (bury-buffer (car new-list))
    (setq new-list (cdr new-list))))

С помощью этого метода можно задать любой порядок списка, но при этом нет опасности потерять буфер или добавить что-то, что не является допустимым живым буфером.

Чтобы изменить порядок или значение локального списка буферов конкретного кадра, установите параметр buffer-list этого кадра с помощью modify-frame-parameters (см. Доступ к параметрам кадра).

Функция: other-buffer &optional buffer visible-ok frame

Эта функция возвращает первый буфер в списке буферов, отличный от buffer. Обычно это буфер, отображаемый в самом недавно выбранном окне (в кадре frame или, в противном случае, в выбранном кадре, см. Фокус ввода), за исключением buffer. Буферы, имена которых начинаются с пробела, вообще не рассматриваются.

Если buffer не указан (или если это не живой буфер), то other-buffer возвращает первый буфер в локальном списке буферов выбранного кадра. (Если frame не равен nil, то вместо этого возвращается первый буфер в локальном списке буферов frame.)

Если frame имеет ненулевой параметр buffer-predicate, то other-buffer использует этот предикат для определения того, какие буферы рассматривать. Он вызывает предикат один раз для каждого буфера, и если значение равно nil, этот буфер игнорируется. См. Параметры буферов.

Если visible-ok равен nil, other-buffer избегает возврата буфера, видимого в каком-либо окне на каком-либо видимом кадре, кроме как в крайнем случае. Если visible-ok не равен nil, то не имеет значения, отображается ли буфер где-либо или нет.

Если подходящего буфера не существует, возвращается (и при необходимости создаётся) буфер *scratch*.

Функция: last-buffer &optional buffer visible-ok frame

Эта функция возвращает последний буфер в списке буферов frame, отличный от buffer. Если frame опущен или равен nil, используется список буферов выбранного кадра.

Аргумент visible-ok обрабатывается так же, как и для other-buffer, см. выше. Если подходящий буфер не найден, возвращается буфер *scratch*.

Команда: bury-buffer &optional buffer-or-name

Эта команда помещает buffer-or-name в конец списка буферов, не изменяя порядок остальных буферов в списке. Таким образом, этот буфер становится наименее желательным кандидатом для возврата other-buffer. Аргумент может быть как самим буфером, так и его именем.

Эта функция воздействует как на параметр buffer-list каждого кадра, так и на основной список буферов; следовательно, буфер, который вы «закапываете», будет последним в значении (buffer-list frame) и в значении (buffer-list). Кроме того, она также помещает буфер в конец списка буферов выбранного окна (см. История окон) при условии, что он отображается в этом окне.

Если buffer-or-name равен nil или опущен, это означает, что нужно «закопать» текущий буфер. Кроме того, если текущий буфер отображается в выбранном окне (см. Выбор окон), это гарантирует, что окно либо будет удалено, либо в нём будет показан другой буфер. Более точно, если выбранное окно является выделенным (см. Выделенные окна) и в его кадре есть другие окна, окно удаляется. Если это единственное окно в своём кадре, и этот кадр не является единственным кадром на своём терминале, кадр закрывается вызовом функции, заданной параметром frame-auto-hide-function (см. Закрытие окон). В противном случае вызывается switch-to-prev-buffer (см. История окон) для показа другого буфера в этом окне. Если buffer-or-name отображается в каком-либо другом окне, он остаётся там отображаться.

Чтобы заменить буфер во всех окнах, где он отображается, используйте replace-buffer-in-windows, см. Буферы и окна.

Команда: unbury-buffer

Эта команда переключается на последний буфер в локальном списке буферов выбранного кадра. Более точно, она вызывает функцию switch-to-buffer (см. Переключение на буфер в окне), чтобы отобразить буфер, возвращённый last-buffer (см. выше), в выбранном окне.

Переменная: buffer-list-update-hook

Это обычный хук, выполняемый при каждом изменении списка буферов. Функции (неявно) запускающие этот хук: get-buffer-create (см. Создание буферов), rename-buffer (см. Имена буферов), kill-buffer (см. Убийство буферов), bury-buffer (см. выше) и select-window (см. Выбор окон). Этот хук не выполняется для внутренних или временных буферов, создаваемых get-buffer-create или generate-new-buffer с ненулевым аргументом inhibit-buffer-hooks.

Функции, запускаемые этим хуком, должны избегать вызова select-window с аргументом norecord, равным nil, поскольку это может привести к бесконечной рекурсии.

Функция: buffer-match-p condition buffer-or-name &rest args

Эта функция проверяет, удовлетворяет ли буфер, обозначенный buffer-or-name, указанному condition. Необязательные аргументы args передаются функции-предикату в condition. Допустимым condition может быть одно из следующих:

  • Строка, интерпретируемая как регулярное выражение. Буфер удовлетворяет условию, если регулярное выражение соответствует имени буфера.
  • Функция-предикат, которая должна возвращать не nil, если буфер соответствует. Она вызывается с buffer-or-name в качестве первого аргумента, за которым следуют args.
  • Ячейка cons (oper . expr), где oper — одно из:
    (not cond)

    Удовлетворяется, если cond не удовлетворяет buffer-match-p с тем же буфером и args.

    (or conds…)

    Удовлетворяется, если любое условие из conds удовлетворяет buffer-match-p с тем же буфером и args.

    (and conds…)

    Удовлетворяется, если все условия из conds удовлетворяют buffer-match-p с тем же буфером и args.

    derived-mode

    Удовлетворяется, если основной режим буфера является производным от expr. Обратите внимание, что это условие может не сообщить о совпадении, если buffer-match-p вызывается до того, как основной режим буфера был установлен.

    major-mode

    Удовлетворяется, если основной режим буфера равен expr. Предпочтительнее использовать derived-mode, когда это возможно. Обратите внимание, что это условие может не сообщить о совпадении, если buffer-match-p вызывается до того, как основной режим буфера был установлен.

    category

    Это актуально только тогда, когда эта функция вызывается display-buffer (см. Ассоциативные списки действий для отображения буферов) и удовлетворяется, если ассоциативный список действий, с которым была вызвана display-buffer, включает (category . expr) в значении своего аргумента action. См. Ассоциативные списки действий для отображения буферов.

  • t Удовлетворяется любым буфером. Удобная альтернатива "" (пустая строка) или (and) (пустая конъюнкция).
Функция: match-buffers condition &optional buffer-list &rest args

Эта функция возвращает список всех буферов, удовлетворяющих condition. Если ни один буфер не соответствует, функция возвращает nil. Аргумент condition определён как в buffer-match-p выше. По умолчанию рассматриваются все буферы, но это можно ограничить с помощью необязательного аргумента buffer-list, который должен быть списком буферов для рассмотрения. Остальные аргументы args будут переданы в condition так же, как это делает buffer-match-p.