Список буферов
Список буферов — это список всех существующих буферов. Порядок буферов в этом списке определяется главным образом тем, насколько недавно каждый буфер отображался в окне. Этот порядок используют несколько функций, в частности other-buffer. Список буферов, отображаемый для пользователя, также следует этому порядку.
При создании буфера он добавляется в конец списка буферов, а при уничтожении — удаляется из списка. Буфер перемещается в начало списка каждый раз, когда выбирается для отображения в окне (см. Переключение на буфер в окне) или выбирается окно, в котором он отображается (см. Выбор окон). Буфер перемещается в конец списка, когда он откладывается (см. bury-buffer ниже). Для программистов на Lisp нет функций, напрямую изменяющих список буферов.
Помимо описанного выше основного списка буферов, Emacs поддерживает локальный список буферов для каждого фрейма, в котором буферы, отображавшиеся в этом фрейме (или окна которых выбирались), располагаются в начале. (Этот порядок записывается в параметре фрейма buffer-list; см. Параметры буферов.) Буферы, никогда не отображавшиеся в этом фрейме, располагаются после них в порядке основного списка буферов.
- Функция: buffer-list &optional frame
-
Эта функция возвращает список буферов, включая все буферы, даже те, имена которых начинаются с пробела. Элементами списка являются сами буферы, а не их имена.
Если frame — фрейм, функция возвращает локальный список буферов этого фрейма. Если frame равен
nilили не указан, используется основной список буферов: буферы расположены в порядке времени последнего отображения или выбора, независимо от того, в каких фреймах они отображались.(buffer-list) ⇒ (#<buffer buffers.texi> #<buffer *Minibuf-1*> #<buffer buffer.c> #<buffer *Help*> #<buffer TAGS>);; Note that the name of the minibuffer ;; begins with a space! (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, отличный отnil, то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, отличным отnil.Функциям, запускаемым этим хуком, следует избегать вызова
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…)Условие выполнено, если
buffer-match-pудовлетворяет хотя бы одно условие из conds для того же буфера иargs.(and conds…)Условие выполнено, если
buffer-match-pудовлетворяют все условия из conds для того же буфера иargs.derived-modeУсловие выполнено, если родительский режим буфера является производным от expr. Значением expr может быть как один символ режима, так и список символов режимов, допустимый для функции
provided-mode-derived-p(см. Определение производных режимов). Обратите внимание: это условие может не обнаружить соответствие, еслиbuffer-match-pвызвана до того, как для буфера был установлен основной режим.major-modeУсловие выполнено, если основной режим буфера равен expr. Если подходит любой из вариантов, предпочтительно использовать
derived-mode. Обратите внимание: это условие может не обнаружить соответствие, еслиbuffer-match-pвызвана до того, как для буфера был установлен основной режим.categoryЭто условие имеет значение только тогда, когда данная функция вызывается функцией
display-buffer(см. Списки действий для отображения буфера); оно выполнено, если список действий, с которым была вызванаdisplay-buffer, содержит(category . expr)в значении аргумента action. См. Списки действий для отображения буфера.-
this-command Это условие также имеет значение только тогда, когда данная функция вызывается функцией
display-buffer(см. Списки действий для отображения буфера); оно выполнено, если выполняемая в данный момент команда равна expr или, если expr — список, выполняемая команда входит в этот список.
- t Условие выполняется для любого буфера. Удобная альтернатива
""(пустая строка) или(and)(пустая конъюнкция).
- Функция: match-buffers condition &optional buffer-list &rest args
Эта функция возвращает список всех буферов, удовлетворяющих условию condition. Если ни один буфер не соответствует условию, функция возвращает
nil. Аргумент condition определён так же, как вbuffer-match-pвыше. По умолчанию рассматриваются все буферы, но их набор можно ограничить необязательным аргументомbuffer-list, который должен быть списком рассматриваемых буферов. Оставшиеся аргументы args передаются в condition так же, как это делаетbuffer-match-p.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Buffer-List.html