Окна и фреймы
Каждое окно принадлежит ровно одному фрейму (см. Фреймы). Для всех окон, принадлежащих определённому фрейму, мы иногда также говорим, что эти окна принадлежат этому фрейму или просто что они находятся в этом фрейме.
- Функция: window-frame &optional window
Эта функция возвращает фрейм указанного окна window — фрейм, которому принадлежит window. Если window опущено или
nil, по умолчанию используется выбранное окно (см. Выбор окон).
- Функция: window-list &optional frame minibuffer window
-
Эта функция возвращает список всех активных окон, принадлежащих указанному фрейму frame. Если frame опущено или
nil, по умолчанию используется выбранный фрейм (см. Фокус ввода).Необязательный аргумент minibuffer указывает, следует ли включать окно минибуфера (см. Окна минибуфера) в этот список. Если minibuffer
t, окно минибуфера включается. Еслиnilили опущено, окно минибуфера включается только в том случае, если оно активно. Если minibuffer ниnilниt, окно минибуфера никогда не включается.Необязательный аргумент window, если он не
nil, должен быть активным окном в указанном фрейме; тогда window будет первым элементом в возвращаемом списке. Если window опущено илиnil, выбранное окно внутри frame (см. Выбор окон) является первым элементом.
Окна в одном фрейме организованы в дерево окон, листья которого — активные окна. Внутренние узлы дерева окон не активны; они существуют для организации отношений между активными окнами. Корневой узел дерева окон называется корневым окном. Оно является либо активным окном, либо внутренним окном. Если это активное окно, то фрейм содержит только одно окно помимо окна минибуфера, или фрейм — это фрейм только для минибуфера, см. Макет фрейма.
Окно минибуфера (см. Окна минибуфера), которое не одиноко в своём фрейме, не имеет родительского окна, поэтому строго говоря, оно не является частью дерева окон фрейма. Тем не менее, это окно-брат корневого окна фрейма и, следовательно, может быть достигнуто из корневого окна с помощью window-next-sibling, см. ниже. Кроме того, функция window-tree (описанная в конце этого раздела) перечисляет окно минибуфера наряду с фактическим деревом окон.
- Функция: frame-root-window &optional frame-or-window
Эта функция возвращает корневое окно для frame-or-window. Аргумент frame-or-window должен быть либо окном, либо фреймом; если опущено или
nil, по умолчанию используется выбранный фрейм. Если frame-or-window является окном, возвращаемым значением является корневое окно фрейма этого окна.
Когда активное окно разделяется (см. Разделение окон), появляются два активных окна вместо одного. Одно из них представлено тем же объектом окна Lisp, что и исходное окно, а другое представлено новым созданным объектом окна Lisp. Оба эти активных окна становятся листовыми узлами дерева окон, как дочерние окна одного внутреннего окна. При необходимости Emacs автоматически создаёт это внутреннее окно, которое также называется родительским окном, и назначает его в соответствующее положение в дереве окон. Набор окон, которые имеют одного родителя, называются братьями.
- Функция: window-parent &optional window
Эта функция возвращает родительское окно window. Если window опущено или
nil, по умолчанию используется выбранное окно. Возвращаемое значение —nil, если у window нет родителя (т. е. это окно минибуфера или корневое окно своего фрейма).
Родительское окно всегда имеет как минимум два дочерних окна. Если это число уменьшится до одного в результате удаления окна (см. Удаление окон), Emacs автоматически удалит и родительское окно, а единственное оставшееся дочернее окно займёт его место в дереве окон.
Дочернее окно может быть либо активным окном, либо внутренним окном (которое, в свою очередь, может иметь свои дочерние окна). Поэтому каждое внутреннее окно можно рассматривать как занимающее определённую прямоугольную область экрана — объединение областей, занимаемых активными окнами, которые в конечном итоге произошли от него.
Для каждого внутреннего окна области экрана непосредственных дочерних окон расположены либо вертикально, либо горизонтально (никогда не оба). Если дочерние окна расположены друг над другом, они образуют вертикальную комбинацию; если они расположены бок о бок, они образуют горизонтальную комбинацию. Рассмотрим следующий пример:
______________________________________
| ______ ____________________________ |
|| || __________________________ ||
|| ||| |||
|| ||| |||
|| ||| |||
|| |||____________W4____________|||
|| || __________________________ ||
|| ||| |||
|| ||| |||
|| |||____________W5____________|||
||__W2__||_____________W3_____________ |
|__________________W1__________________|
Корневое окно этого фрейма — внутреннее окно W1. Его дочерние окна образуют горизонтальную комбинацию, состоящую из активного окна W2 и внутреннего окна W3. Дочерние окна W3 образуют вертикальную комбинацию, состоящую из активных окон W4 и W5. Следовательно, активные окна в этом дереве окон — W2, W4 и W5.
Следующие функции могут быть использованы для извлечения дочернего окна внутреннего окна и братьев дочернего окна. Их аргумент window всегда по умолчанию равен выбранному окну (см. Выбор окон).
- Функция: window-top-child &optional window
Эта функция возвращает самое верхнее дочернее окно window, если window — внутреннее окно, чьи дочерние окна образуют вертикальную комбинацию. Для любого другого типа окна возвращаемое значение —
nil.
- Функция: window-left-child &optional window
Эта функция возвращает самое левое дочернее окно window, если window — внутреннее окно, чьи дочерние окна образуют горизонтальную комбинацию. Для любого другого типа окна возвращаемое значение —
nil.
- Функция: window-child window
Эта функция возвращает первое дочернее окно внутреннего окна window — самое верхнее дочернее окно для вертикальной комбинации или самое левое дочернее окно для горизонтальной комбинации. Если window — активное окно, возвращаемое значение —
nil.
- Функция: window-combined-p &optional window horizontal
-
Эта функция возвращает значение, отличное от
nil, тогда и только тогда, когда window является частью вертикальной комбинации.Если необязательный аргумент horizontal не
nil, это означает, что необходимо вернуть значение, отличное отnil, тогда и только тогда, когда window является частью горизонтальной комбинации.
- Функция: window-next-sibling &optional window
Эта функция возвращает следующего брата указанного window. Возвращаемое значение —
nil, если window является последним ребёнком своего родителя.
- Функция: window-prev-sibling &optional window
Эта функция возвращает предыдущего брата указанного window. Возвращаемое значение —
nil, если window является первым ребёнком своего родителя.
Функции window-next-sibling и window-prev-sibling не следует путать с функциями next-window и previous-window, которые возвращают следующее и предыдущее окно в циклическом порядке окон (см. Циклический порядок окон).
Следующие функции могут быть полезны для поиска окна в его фрейме.
- Функция: frame-first-window &optional frame-or-window
Эта функция возвращает активное окно в верхнем левом углу фрейма, указанного frame-or-window. Аргумент frame-or-window должен обозначать окно или активный фрейм и по умолчанию равен выбранному фрейму. Если frame-or-window указывает окно, эта функция возвращает первое окно в фрейме этого окна. При предположении, что выбран фрейм из нашего канонического примера,
(frame-first-window)возвращает W2.
- Функция: window-at-side-p &optional window side
-
Эта функция возвращает
t, если window находится в side своего фрейма. Аргумент window должен быть допустимым окном и по умолчанию равен выбранному. Аргумент side может быть любым из символовleft,top,rightилиbottom. Значение по умолчаниюnilобрабатывается какbottom.Обратите внимание, что эта функция игнорирует окно минибуфера (см. Окна минибуфера). Таким образом, при side, равном
bottom, она может вернутьtдаже тогда, когда окно минибуфера появляется прямо под window.
- Функция: window-in-direction direction &optional window ignore sign wrap minibuf
-
Эта функция возвращает ближайшее активное окно в направлении direction, как видно из позиции
window-pointв окне window. Аргумент direction должен быть одним изabove,below,leftилиright. Необязательный аргумент window должен обозначать активное окно и по умолчанию равен выбранному.Эта функция не возвращает окно, у которого параметр
no-other-windowимеет значение, отличное отnil(см. Параметры окна). Если у ближайшего окна параметрno-other-windowимеет значение, отличное отnil, эта функция пытается найти другое окно в указанном направлении, у которого параметрno-other-windowимеет значениеnil. Если необязательный аргумент ignore имеет значение, отличное отnil, окно может быть возвращено, даже если его параметрno-other-windowимеет значение, отличное отnil.Если необязательный аргумент sign является отрицательным числом, это означает использование правой или нижней границы window в качестве опорной точки вместо
window-point. Если sign является положительным числом, это означает использование левой или верхней границы window в качестве опорной точки.Если необязательный аргумент wrap имеет значение, отличное от
nil, это означает обход границ фрейма по направлению direction. Например, если window находится вверху фрейма, а direction равенabove, эта функция обычно возвращает окно минибуфера фрейма, если оно активно, и окно внизу фрейма в противном случае.Если необязательный аргумент minibuf равен
t, эта функция может возвратить окно минибуфера, даже если оно не активно. Если необязательный аргумент minibuf равенnil, это означает возврат окна минибуфера только в том случае, если оно в данный момент активно. Если minibuf не равно ниnil, ниt, эта функция никогда не возвращает окно минибуфера. Однако, если wrap имеет значение, отличное отnil, функция всегда действует так, как будто minibuf равноnil.Если подходящего окна не найдено, функция возвращает
nil.Не используйте эту функцию для проверки отсутствия окна в направлении direction. Вызов функции
window-at-side-p(описанной выше) является гораздо более эффективным способом для этого.
Следующая функция извлекает всю древовидную структуру окон фрейма:
- Функция: window-tree &optional frame
-
Эта функция возвращает список, представляющий древовидную структуру окон для фрейма frame. Если frame опущен или равен
nil, он по умолчанию равен выбранному фрейму.Результат — список вида
(root mini), где root представляет древовидную структуру окон корневого окна фрейма, а mini — окно минибуфера фрейма.Если корневое окно активно, root является самим окном. В противном случае, root представляет собой список
(dir edges w1 w2 ...), где dir имеет значениеnilдля горизонтального объединения иtдля вертикального объединения, edges задаёт размеры и расположение объединения, а остальные элементы — дочерние окна. Каждое дочернее окно может быть объектом окна (для активного окна) или списком с тем же форматом, что и выше (для внутреннего окна). Элемент edges — список(left top right bottom), аналогичный значению, возвращаемому функциейwindow-edges(см. Координаты и окна).
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/Windows-and-Frames.html