Окно — это область экрана, которая может использоваться для отображения буфера (см. Буферы). Окна группируются во фреймы (см. Фреймы). Каждый фрейм содержит по крайней мере одно окно; пользователь может разделить фрейм на несколько неперекрывающихся окон, чтобы видеть одновременно несколько буферов. Lisp-программы могут использовать несколько окон для различных целей. Например, в Rmail вы можете просматривать сводку заголовков сообщений в одном окне, а содержимое выбранного сообщения — в другом окне.
Emacs использует термин «окно» в ином значении, чем в графических окружениях и оконных системах, например, в X Window System. Когда Emacs запущен на X, каждое графическое окно X, принадлежащее процессу Emacs, соответствует одному фрейму Emacs. Когда Emacs запущен на текстовом терминале, каждый фрейм Emacs занимает весь экран терминала. В любом случае фрейм может содержать одно или несколько окон Emacs. Во избежание неоднозначности мы используем термин окно оконной системы, когда имеем в виду окно оконной системы, соответствующее фрейму Emacs.
В отличие от окон X, окна Emacs являются мозаичными; они никогда не перекрываются в пределах области своего фрейма. Когда окно создаётся, изменяет размер или удаляется, изменение пространства окна забирается или передаётся другим окнам того же фрейма, так что общая площадь фрейма остаётся неизменной.
В Emacs Lisp окна представлены специальным типом Lisp-объектов (см. Тип окна).
Эта функция возвращает t, если объект является окном (независимо от того, отображает ли оно буфер). В противном случае возвращает nil.
Живое окно — это окно, которое в данный момент отображает буфер во фрейме.
Эта функция возвращает t, если объект является живым окном, и nil в противном случае. Живое окно — это окно, которое отображает буфер.
Окна в каждом фрейме организованы в дерево окон. См. Окна и фреймы. Листовые узлы каждого дерева окон являются живыми окнами — теми, которые фактически отображают буферы. Внутренние узлы дерева окон — это внутренние окна, которые не являются живыми.
Действительное окно — это окно, которое является либо живым, либо внутренним. Действительное окно может быть удалено, то есть удалено из своего фрейма (см. Удаление окон); тогда оно перестаёт быть действительным, но Lisp-объект, представляющий его, всё ещё может ссылаться из других Lisp-объектов. Удалённое окно может снова стать действительным путём восстановления сохранённой конфигурации окон (см. Конфигурации окон).
Вы можете отличить действительные окна от удалённых с помощью window-valid-p.
Эта функция возвращает t, если объект является живым окном или внутренним окном в дереве окон. В противном случае возвращает nil, включая случай, когда объект является удалённым окном.
Следующая схема показывает структуру живого окна:
____________________________________________
|________________ Tab Line _______________|RD| ^
|______________ Header Line ______________| | |
^ |LS|LM|LF| |RF|RM|RS| | |
| | | | | | | | | | |
Window | | | | | | | | | Window
Body | | | | | Window Body | | | | | Total
Height | | | | | | | | | Height
| | | | |<- Window Body Width ->| | | | | |
v |__|__|__|_______________________|__|__|__| | |
|_________ Horizontal Scroll Bar _________| | |
|_______________ Mode Line _______________|__| |
|_____________ Bottom Divider _______________| v
<---------- Window Total Width ------------>
В центре этого окна находится тело, где отображается текст буфера. Тело может быть окружено рядом необязательных областей, которые мы будем называть декорациями окна. Слева и справа, от внутренних к внешним, это левая и правая каймы, обозначаемые ЛС и ПС (см. Каймы); левое и правое поля, обозначаемые ЛП и ПП на схеме (см. Отображение в полях); левая или правая вертикальная полоса прокрутки, из которых в любой момент присутствует только одна, обозначаемые ЛВ и ПВ (см. Полосы прокрутки); и правый разделитель, обозначаемый ПР (см. Разделители окон). Вместе они представляют собой левые и правые декорации окна.
В верхней части окна находятся вкладка и заголовок (см. Строки заголовка окон). Текстовая область окна включает строку заголовка и вкладку, если они присутствуют в окне. В нижней части окна находятся горизонтальная полоса прокрутки (см. Полосы прокрутки); строка режима (см. Формат строки режима); и нижний разделитель (см. Разделители окон). Вместе они образуют верхние и нижние декорации окна.
Есть две специальные области, опущенные на схеме:
В любом случае полученный артефакт считается частью тела окна, хотя его пространство на экране не может использоваться для отображения текста буфера.
Заметим также, что номера строк (и окружающие их пробельные символы), отображаемые display-line-numbers-mode (см. Настройка отображения в Руководстве GNU Emacs), также не считаются декорациями; они тоже являются частью тела окна.
Внутренние окна не отображают никакого текста и не имеют декораций. Следовательно, понятие «тело» для них не имеет смысла. Фактически, большинство функций, работающих с телом окна, выдают ошибку при применении к внутреннему окну.
По умолчанию фрейм Emacs содержит одно специальное живое окно, которое используется для отображения сообщений и приёма пользовательского ввода — окно минибуфера (см. Окна минибуфера). Поскольку окно минибуфера используется для отображения текста, оно имеет тело, но не имеет вкладки, заголовка или каких-либо полей. Наконец, окно подсказки, которое используется для отображения всплывающей подсказки во фрейме подсказки (см. Подсказки), также имеет тело, но вообще не имеет декораций.