Буферы и окна
В этом разделе описаны низкоуровневые функции для изучения и задания содержимого окон. Функции более высокого уровня для отображения определённого буфера в окне см. в разделе Переключение на буфер в окне.
- Функция: window-buffer &optional window
Эта функция возвращает буфер, отображаемый в window. Если window не указан или равен
nil, по умолчанию используется выбранное окно. Если window — внутреннее окно, эта функция возвращаетnil.
- Функция: set-window-buffer window buffer-or-name &optional keep-margins
-
Эта функция отображает buffer-or-name в окне window. window должно быть действующим окном; если оно равно
nil, по умолчанию используется выбранное окно. buffer-or-name должен быть буфером или именем существующего буфера. Эта функция не меняет выбранное окно и напрямую не меняет текущий буфер (см. Текущий буфер). Она возвращаетnil.Если окно window жёстко закреплено за буфером, а buffer-or-name указывает другой буфер, эта функция выдаёт ошибку. См. Закреплённые окна.
По умолчанию эта функция сбрасывает положение окна window, поля отображения, ширину полей и настройки полосы прокрутки в соответствии с локальными переменными указанного буфера. Однако если необязательный аргумент keep-margins не равен
nil, настройки полей отображения, полей и полосы прокрутки окна window остаются без изменений.При написании приложения обычно следует использовать
display-buffer(см. Выбор окна для отображения буфера) или функции более высокого уровня, описанные в разделе Переключение на буфер в окне, вместо прямого вызоваset-window-buffer.Функция выполняет
window-scroll-functions, а затемwindow-configuration-change-hook. См. Хуки прокрутки и изменений окна.
- Переменная: buffer-display-count
Эта локальная для буфера переменная хранит количество раз, когда буфер отображался в окне. Она увеличивается каждый раз, когда для буфера вызывается
set-window-buffer.
- Переменная: buffer-display-time
Эта локальная для буфера переменная хранит время последнего отображения буфера в окне. Если буфер ещё ни разу не отображался, значение равно
nil. Оно обновляется при каждом вызовеset-window-bufferдля буфера и получает значение, возвращаемоеcurrent-time(см. Время суток).
- Функция: get-buffer-window &optional buffer-or-name all-frames
-
Эта функция возвращает первое окно, отображающее buffer-or-name, в циклическом порядке окон, начиная с выбранного окна (см. Циклический порядок окон). Если такого окна нет, возвращаемое значение —
nil.buffer-or-name должен быть буфером или именем буфера; если аргумент не указан или равен
nil, по умолчанию используется текущий буфер. Необязательный аргумент all-frames определяет, какие окна рассматривать:-
tозначает рассматривать окна во всех существующих кадрах. -
visibleозначает рассматривать окна во всех видимых кадрах. - 0 означает рассматривать окна во всех видимых или свёрнутых кадрах.
- Кадр означает рассматривать только окна в этом кадре.
- Любое другое значение означает рассматривать окна в выбранном кадре.
Обратите внимание, что эти значения несколько отличаются от значений аргумента all-frames функции
next-window(см. Циклический порядок окон). В будущей версии Emacs эта функция может быть изменена, чтобы устранить это несоответствие. -
Следующая функция позволяет определить, разделяет ли буфер определённого окна текст с каким-либо другим буфером (см. Косвенные буферы).
- Функция: window-indirect-buffer-p &optional window buffer-or-name
-
Эта функция возвращает значение, не равное
nil, если window косвенно связан с buffer-or-name. window должно быть действующим окном; по умолчанию используется выбранное окно. buffer-or-name может быть буфером или именем существующего буфера; по умолчанию используется текущий буфер.window косвенно связан с buffer-or-name, если выполняется одно из следующих условий:
- buffer-or-name указывает косвенный буфер, а буфер окна window является его базовым буфером.
- Буфер окна window является косвенным буфером, базовый буфер которого указан в buffer-or-name.
- И буфер окна window, и буфер, указанный в buffer-or-name, являются косвенными буферами, использующими один и тот же базовый буфер.
Если ни одно из перечисленных условий не выполняется, функция возвращает
nil.
- Функция: get-buffer-window-list &optional buffer-or-name minibuf all-frames indirect
-
Эта функция возвращает список всех окон, в которых сейчас отображается buffer-or-name. buffer-or-name должен быть буфером или именем существующего буфера. Если аргумент не указан или равен
nil, по умолчанию используется текущий буфер. Если выбранное окно отображает buffer-or-name, оно будет первым в списке, возвращаемом этой функцией.Аргументы minibuf и all-frames имеют те же значения, что и в функции
next-window(см. Циклический порядок окон). Обратите внимание, что аргумент all-frames ведёт себя не в точности так же, как вget-buffer-window.Если необязательный аргумент indirect не равен
nil, к списку окон, отображающих buffer-or-name, добавляется список всех окон, косвенно связанных с buffer-or-name; это окна, для которыхwindow-indirect-buffer-p(см. выше), вызванная с окном и буфером, указанным в buffer-or-name, в качестве аргументов, возвращает значение, не равноеnil.
- Команда: replace-buffer-in-windows &optional buffer-or-name
-
Эта команда заменяет buffer-or-name другим буфером во всех окнах, где он отображается. buffer-or-name должен быть буфером или именем существующего буфера; если аргумент не указан или равен
nil, по умолчанию используется текущий буфер.Буфер-замена в каждом окне обычно выбирается с помощью
switch-to-prev-buffer(см. История окон). За исключением боковых окон (см. Боковые окна), любое закреплённое окно, отображающее buffer-or-name, по возможности удаляется (см. Закреплённые окна). Если такое окно — единственное окно в своём кадре, а на том же терминале есть другие кадры, удаляется и этот кадр. Если закреплённое окно — единственное окно в единственном кадре на своём терминале, буфер всё равно заменяется.Главная цель этой функции — определить, что делать с окнами, буферы которых собираются уничтожить с помощью
kill-buffer(см. Уничтожение буферов). Однако эта функция также удаляет буфер, указанный в buffer-or-name, из списков предыдущих и следующих буферов всех окон (см. История окон), включая мёртвые окна, на которые ссылаются только конфигурации окон, а также удаляет все параметрыquit-restoreилиquit-restore-prev(см. Параметры окон), ссылающиеся на этот буфер.Эта функция не заменяет буфер, указанный в buffer-or-name, ни в одном окне минибуфера, в котором он отображается, и не удаляет окна минибуфера или кадры минибуфера. Однако она удаляет этот буфер из списков предыдущих и следующих буферов всех окон минибуфера.
По умолчанию replace-buffer-in-windows удаляет только окна, закреплённые за своими буферами, и игнорирует любые параметры quit-restore или quit-restore-prev окон, с которыми работает. Следующая настройка позволяет обойти эти ограничения.
- Пользовательская настройка: kill-buffer-quit-windows
Если эта настройка равна
nil,kill-buffer(и, следовательно,replace-buffer-in-windows) может удалять только окна, закреплённые за буфером, который собираются уничтожить. Если значение не равноnil,replace-buffer-in-windowsпоручает функцииquit-restore-window(см. Закрытие окон) обработать такие окна. Эта функция может удалить такое окно, даже если оно не закреплено за своим буфером. Кроме того, если окно нельзя удалить и в нём необходимо показать другой буфер,delete-windows-onиспользуетquit-restore-windowв качестве запасного варианта.
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/Buffers-and-Windows.html