Список буферов
Список буферов — это список всех активных буферов. Порядок буферов в этом списке в первую очередь определяется тем, как недавно каждый буфер отображался в окне. Несколько функций, в частности 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>);; 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 есть параметр, отличный от
nilbuffer-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, отличным отnil.Функции, выполняемые этим хуком, должны избегать вызова
select-windowс аргументом norecord, равнымnil, так как это может привести к бесконечной рекурсии.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Buffer-List.html