Список буферов — это список всех живых буферов. Порядок буферов в этом списке основан главным образом на том, как недавно каждый буфер отображался в окне. Несколько функций, в частности other-buffer, используют этот порядок. Список буферов, отображаемый для пользователя, также следует этому порядку.
Создание буфера добавляет его в конец списка буферов, а убийство буфера удаляет его из этого списка. Буфер перемещается в начало этого списка всякий раз, когда он выбирается для отображения в окне (см. Переключение на буфер в окне) или когда выбирается окно, отображающее его (см. Выбор окон). Буфер перемещается в конец списка, когда его «закапывают» (см. bury-buffer ниже). Для программиста на Lisp не существует функций, которые бы непосредственно манипулировали списком буферов.
В дополнение к описанному выше основному списку буферов Emacs поддерживает локальный список буферов для каждого кадра, в котором сначала идут буферы, отображавшиеся (или чьи окна выбирались) в этом кадре. (Этот порядок записывается в параметре кадра buffer-list; см. Параметры буферов.) Буферы, никогда не отображавшиеся в этом кадре, следуют дальше, упорядоченные согласно основному списку буферов.
Эта функция возвращает список буферов, включая все буферы, даже те, чьи имена начинаются с пробела. Элементами являются сами буферы, а не их имена.
Если 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 (см. Доступ к параметрам кадра).
Эта функция возвращает первый буфер в списке буферов, отличный от buffer. Обычно это буфер, отображаемый в самом недавно выбранном окне (в кадре frame или, в противном случае, в выбранном кадре, см. Фокус ввода), за исключением buffer. Буферы, имена которых начинаются с пробела, вообще не рассматриваются.
Если buffer не указан (или если это не живой буфер), то other-buffer возвращает первый буфер в локальном списке буферов выбранного кадра. (Если frame не равен nil, то вместо этого возвращается первый буфер в локальном списке буферов frame.)
Если frame имеет ненулевой параметр buffer-predicate, то other-buffer использует этот предикат для определения того, какие буферы рассматривать. Он вызывает предикат один раз для каждого буфера, и если значение равно nil, этот буфер игнорируется. См. Параметры буферов.
Если visible-ok равен nil, other-buffer избегает возврата буфера, видимого в каком-либо окне на каком-либо видимом кадре, кроме как в крайнем случае. Если visible-ok не равен nil, то не имеет значения, отображается ли буфер где-либо или нет.
Если подходящего буфера не существует, возвращается (и при необходимости создаётся) буфер *scratch*.
Эта функция возвращает последний буфер в списке буферов frame, отличный от buffer. Если frame опущен или равен nil, используется список буферов выбранного кадра.
Аргумент visible-ok обрабатывается так же, как и для other-buffer, см. выше. Если подходящий буфер не найден, возвращается буфер *scratch*.
Эта команда помещает 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, см. Буферы и окна.
Эта команда переключается на последний буфер в локальном списке буферов выбранного кадра. Более точно, она вызывает функцию switch-to-buffer (см. Переключение на буфер в окне), чтобы отобразить буфер, возвращённый last-buffer (см. выше), в выбранном окне.
Это обычный хук, выполняемый при каждом изменении списка буферов. Функции (неявно) запускающие этот хук: 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-or-name, указанному condition. Необязательные аргументы args передаются функции-предикату в condition. Допустимым condition может быть одно из следующих:
nil, если буфер соответствует. Она вызывается с buffer-or-name в качестве первого аргумента, за которым следуют args.
(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. См. Ассоциативные списки действий для отображения буферов.
"" (пустая строка) или (and) (пустая конъюнкция).
Эта функция возвращает список всех буферов, удовлетворяющих condition. Если ни один буфер не соответствует, функция возвращает nil. Аргумент condition определён как в buffer-match-p выше. По умолчанию рассматриваются все буферы, но это можно ограничить с помощью необязательного аргумента buffer-list, который должен быть списком буферов для рассмотрения. Остальные аргументы args будут переданы в condition так же, как это делает buffer-match-p.