Атомные окна
Атомные окна представляют собой прямоугольные композиции, состоящие как минимум из двух активных окон. Они обладают следующими отличительными характеристиками:
- Функция
split-window, при применении к составной части атомного окна, попытается создать новое окно за пределами атомного окна. (см. Разделение окон) - Функция
delete-window, при применении к составной части атомного окна, попытается удалить всё атомное окно. (см. Удаление окон) - Функция
delete-other-windows, при применении к составной части атомного окна, попытается занять атомному окну весь его фрейм или главное окно (см. Боковые окна).
Это означает, что основные группы функций, изменяющие структуру окна, рассматривают атомное окно как активное, сохраняя при этом внутреннюю структуру атомного окна.
Атомные окна полезны для построения и сохранения макетов окон, имеющих смысл только при одновременном отображении всех участвующих буферов определенным образом, например, при отображении различий между версиями файла или одного текста на разных языках или с разметкой. Они также могут использоваться для постоянного отображения информации, относящейся к конкретному окну, в полосах по бокам этого окна.
Атомные окна реализованы с помощью зарезервированного параметра окна window-atom (см. Параметры окон) и внутреннего окна (см. Базовые окна), называемого корневым окном атомного окна. Все окна, входящие в состав одного атомного окна, имеют это корневое окно в качестве общего предка и им назначен параметр, не являющийся nil window-atom.
Следующая функция возвращает корень атомного окна, частью которого является указанное окно:
- Функция: window-atom-root &optional window
Эта функция возвращает корень атомного окна, частью которого является окно window. Указанное окно window должно быть действительным окном и по умолчанию соответствует выделенному окну. Возвращает
nil, если окно window не является частью атомного окна.
Самый простой способ создать новое атомное окно — взять существующее внутреннее окно и применить следующую функцию:
- Функция: window-make-atom window
Эта функция преобразует окно window в атомное окно. Указанное окно window должно быть внутренним окном. Всё, что делает эта функция, это устанавливает параметр
window-atomкаждого потомка окна window в значениеt.
Для создания нового атомного окна из существующего активного окна или для добавления нового окна к существующему атомному окну можно использовать следующую функцию действия отображения буфера (см. Функции действий отображения буфера):
- Функция: display-buffer-in-atom-window buffer alist
-
Эта функция пытается отобразить буфер buffer в новом окне, которое будет объединено с существующим окном для образования атомного окна. Если существующее окно уже является частью атомного окна, оно добавляет новое окно к этому атомному окну.
Указанный alist — это список ассоциаций символов и значений. Следующие символы имеют специальное значение:
window-
Значение такого элемента определяет существующее окно, с которым должно быть объединено новое окно. Если это внутреннее окно, то все дочерние элементы этого окна также станут частью атомного окна. Если окно не указано, то новое окно становится братом выделенного окна. Параметр
window-atomсуществующего окна устанавливается в значениеmain, при условии, что окно является активным и параметрwindow-atomеще не был установлен. sideЗначение такого элемента обозначает сторону существующего окна, где будет расположено новое окно. Допустимые значения —
below,right,aboveиleft. По умолчанию используетсяbelow. Параметрwindow-atomнового окна устанавливается в это значение.
Возвращаемое значение — новое окно,
nil, при неудачном создании окна.
Обратите внимание, что значение параметра window-atom не имеет особого значения, пока оно не равно nil. Значения, присваиваемые display-buffer-in-atom-window, просто позволяют легко извлечь исходное и новое окно после применения этой функции. Также обратите внимание, что параметр window-atom — единственный параметр окна, присваиваемый display-buffer-in-atom-window. Другие параметры должны быть установлены приложением явно через запись window-parameters в alist.
Атомные окна автоматически прекращают свое существование, когда одно из их составных частей удаляется. Чтобы вручную распустить атомное окно, сбросьте параметр window-atom его составных частей — корня атомного окна и всех его потомков.
Следующий фрагмент кода, применённый к фрейму с одним окном, сначала разделяет выделенное окно и делает выделенное и новое окно составными частями атомного окна с их родителем в качестве корня. Затем он отображает буфер *Messages* в новом окне в нижней части фрейма и делает это новое окно частью только что созданного атомного окна.
(let ((window (split-window-right))) (window-make-atom (window-parent window)) (display-buffer-in-atom-window (get-buffer-create "*Messages*") `((window . ,(window-parent window)) (window-height . 5))))
В этот момент ввод C-x 2 в любом окне этого фрейма создаёт новое окно в нижней части фрейма. Ввод C-x 3 вместо этого разместит новое окно справа в фрейме. В любом случае, ввод C-x 1 в любом окне атомного окна удалит только новое окно. Ввод C-x 0 в любом окне атомного окна заставит это новое окно заполнить фрейм.
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/Atomic-Windows.html