Spec-Zone.ru › Elisp

Перекомбинация окон

При удалении последнего элемента-потомка окна W, его родительское окно также удаляется, а W заменяет его в дереве окон. Это означает, что W необходимо перекомбинировать со своими соседями в родительском окне, чтобы сформировать новую комбинацию окон (см. Окна и фреймы). В некоторых случаях удаление активного окна может даже привести к удалению двух внутренних окон.

     ______________________________________
    | ______  ____________________________ |
    ||      || __________________________ ||
    ||      ||| ___________  ___________ |||
    ||      ||||           ||           ||||
    ||      ||||____W6_____||_____W7____||||
    ||      |||____________W4____________|||
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W5____________|||
    ||__W2__||_____________W3_____________ |
    |__________________W1__________________|

Удаление W5 в этой конфигурации обычно приводит к удалению W3 и W4. Остальные активные окна W2, W6 и W7 перекомбинируются, образуя новую горизонтальную комбинацию с родителем W1.

Однако иногда имеет смысл не удалять родительское окно, например, W4. В частности, родительское окно не должно удаляться, когда оно использовалось для сохранения вложенной комбинации того же типа. Такие вложения необходимы для обеспечения того, что при разделении окна и последующем удалении нового окна Emacs восстанавливает макет связанного фрейма таким, каким он был до разделения.

Рассмотрим сценарий, начинающийся с двух активных окон W2 и W3 и их родителя W1.

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

Разделите W2, чтобы создать новое окно W4, как показано ниже.

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

Теперь, при вертикальном увеличении окна Emacs пытается получить соответствующее пространство от своего нижнего соседа, если такое окно существует. В нашем сценарии увеличение W4 займёт пространство у W3.

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    | ____________________________________ |
    ||_________________W3_________________||
    |__________________W1__________________|

Удаление W4 теперь передаёт всё его пространство окну W2, включая пространство, ранее взятое у W3.

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||_________________W3_________________||
    |__________________W1__________________|

Это может быть неинтуитивно, особенно если W4 использовалось для отображения буфера только временно (см. Временные отображения), и вы хотите продолжить работу с исходным макетом.

Поведение можно исправить, создав новое родительское окно при разделении W2. Следующая переменная позволяет это сделать.

Пользовательская опция: window-combination-limit

Эта переменная управляет тем, будет ли при разделении окна создаваться новое родительское окно. Признаются следующие значения:

nil

Это означает, что новому активному окну разрешается совместно использовать существующее родительское окно, если оно есть, при условии, что разделение происходит в том же направлении, что и существующая комбинация окон (в противном случае, всё равно создаётся новое внутреннее окно).

window-size

Это означает, что display-buffer создаёт новое родительское окно при разделении окна и получает window-height или window-width запись в аргументе alist (см. Функции действий отображения буфера). В противном случае, разделение окон происходит так же, как и для значения nil.

temp-buffer-resize

В этом случае with-temp-buffer-window создаёт новое родительское окно при разделении окна и temp-buffer-resize-mode включено (см. Временные отображения). В противном случае, разделение окон происходит так же, как и для nil.

temp-buffer

В этом случае with-temp-buffer-window всегда создаёт новое родительское окно при разделении существующего окна (см. Временные отображения). В противном случае, разделение окон происходит так же, как и для nil.

display-buffer

Это означает, что когда display-buffer (см. Выбор окна) разделяет окно, оно всегда создаёт новое родительское окно. В противном случае, разделение окон происходит так же, как и для nil.

t

Это означает, что разделение окна всегда создаёт новое родительское окно. Таким образом, если значение этой переменной всегда t, то всегда каждое дерево окон является бинарным деревом (дерево, в котором каждое окно, кроме корневого окна, имеет ровно одного соседа).

Значение по умолчанию — window-size. Другие значения зарезервированы для будущего использования.

Если в результате настройки этой переменной split-window создаёт новое родительское окно, оно также вызывает set-window-combination-limit (см. ниже) для вновь созданного внутреннего окна. Это влияет на то, как перестраивается дерево окон при удалении дочерних окон (см. ниже).

Если window-combination-limit равно t, разделение W2 в начальной конфигурации нашего сценария привело бы к следующему:

     ______________________________________
    | ____________________________________ |
    || __________________________________ ||
    |||                                  |||
    |||________________W2________________|||
    || __________________________________ ||
    |||                                  |||
    |||________________W4________________|||
    ||_________________W5_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

Было создано новое внутреннее окно W5; его дочерними элементами являются W2 и новое активное окно W4. Теперь W2 является единственным соседом W4, поэтому увеличение W4 попытается уменьшить W2, оставив W3 без изменений. Обратите внимание, что W5 представляет собой вертикальную комбинацию двух окон, вложенных в вертикальную комбинацию W1.

Функция: set-window-combination-limit предел комбинации

Эта функция устанавливает предел комбинации окна window на значение limit. Это значение можно получить с помощью функции window-combination-limit. См. ниже эффекты; обратите внимание, что оно имеет смысл только для внутренних окон. Функция split-window автоматически вызывает эту функцию, передавая ей t в качестве limit, при условии, что значение переменной window-combination-limit равно t при её вызове.

Функция: window-combination-limit окно

Эта функция возвращает предел комбинации для окна window.

Предел комбинации имеет смысл только для внутреннего окна. Если он равен nil, Emacs может автоматически удалить window в ответ на удаление окна, чтобы сгруппировать дочерние окна window со своими соседями и сформировать новую комбинацию окон. Если предел комбинации равен t, дочерние окна window никогда не перекомбинируются автоматически со своими соседями.

Если в конфигурации, показанной в начале этого раздела, предел комбинации для W4 (родительского окна W6 и W7) равен t, удаление W5 не приведёт к неявной замене W4 тоже.

В качестве альтернативы, описанные выше проблемы можно избежать, всегда изменяя размер всех окон в одной комбинации, когда одно из её окон делится или удаляется. Это также позволяет разделять окна, которые в противном случае были бы слишком малы для такой операции.

Пользовательская опция: window-combination-resize

Если эта переменная равна nil, split-window может разделить окно (обозначенное как window) только если площадь экрана window достаточно велика, чтобы вместить как себя, так и новое окно.

Если эта переменная равна t, split-window пытается изменить размер всех окон, которые являются частью той же комбинации, что и window, для того, чтобы вместить новое окно. В частности, это может позволить split-window преуспеть даже если window — окно с фиксированным размером или слишком мало, чтобы обычно разделиться. Кроме того, последующее изменение размера или удаление window может изменить размер всех остальных окон в его комбинации.

Значение по умолчанию — nil. Другие значения зарезервированы для будущего использования. Конкретная операция разделения может игнорировать значение этой переменной, если она затронута не-nil значением window-combination-limit.

Для иллюстрации эффекта window-combination-resize рассмотрим следующий макет фрейма.

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

Если window-combination-resize равно nil, разделение окна W3 оставляет размер W2 неизменным:

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||_________________W3_________________||
    | ____________________________________ |
    ||                                    ||
    ||_________________W4_________________||
    |__________________W1__________________|

Если window-combination-resize равно t, разделение W3 вместо этого оставит все три активных окна с примерно одинаковой высотой:

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    |__________________W1__________________|

Удаление любого из активных окон W2, W3 или W4 распределяет его пространство пропорционально между оставшимися двумя активными окнами.

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/Recombining-Windows.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API