29.7 Разделение окон

В этом разделе описаны функции для создания нового окна путём разделения существующего. Обратите внимание, что некоторые окна являются особыми в том смысле, что эти функции могут не суметь разделить их так, как описано здесь. Примерами таких окон являются боковые окна (см. Боковые окна) и атомарные окна (см. Атомарные окна).

Функция: split-window &optional window size side pixelwise

Эта функция создаёт новое живое окно рядом с окном window. Если window опущен или равен nil, по умолчанию используется выбранное окно. Это окно разделяется и уменьшается в размере. Освободившееся пространство занимает новое окно, которое и возвращается.

Необязательный второй аргумент size определяет размеры window и/или нового окна. Если он опущен или равен nil, обоим окнам назначаются равные размеры; если остаётся нечётная строка, она отдаётся новому окну. Если size — положительное число, window получает size строк (или столбцов, в зависимости от значения side). Если size — отрицательное число, новое окно получает −size строк (или столбцов).

Если size равен nil, эта функция подчиняется переменным window-min-height и window-min-width (см. Размеры окон). Таким образом, она вызывает ошибку, если разделение привело бы к уменьшению окна меньше, чем задано этими переменными. Однако ненулевое значение size заставляет игнорировать эти переменные; в этом случае минимально допустимым считается окно, в котором помещается текст высотой в одну строку и/или шириной в два столбца.

Следовательно, если size указан, вызывающая сторона несёт ответственность за проверку того, что получившиеся окна достаточно велики, чтобы вместить все свои элементы оформления, такие как строка режима или полоса прокрутки. Функция window-min-size (см. Размеры окон) может использоваться для определения минимальных требований window в этом отношении. Поскольку новое окно обычно наследует такие области, как строка режима или полоса прокрутки, от window, эта функция также является хорошей оценкой минимального размера нового окна. Вызывающая сторона должна указывать меньший размер только в том случае, если она соответствующим образом удаляет унаследованную область перед следующей перерисовкой.

Необязательный третий аргумент side определяет положение нового окна относительно window. Если он равен nil или below, новое окно размещается под window. Если он равен above, новое окно размещается над window. В обоих этих случаях size задаёт общую высоту окна в строках.

Если side равен t или right, новое окно размещается справа от window. Если side равен left, новое окно размещается слева от window. В обоих этих случаях size задаёт общую ширину окна в столбцах.

Необязательный четвёртый аргумент pixelwise, если он не равен nil, означает, что size следует интерпретировать в пикселях, а не в строках и столбцах.

Если window — живое окно, новое окно наследует различные свойства от него, включая поля и полосы прокрутки. Если window — внутреннее окно, новое окно наследует свойства окна, выбранного внутри window’s фрейма.

Поведение этой функции может быть изменено параметрами окна window, пока переменная ignore-window-parameters равна nil. Если значение параметра окна split-window равно t, эта функция игнорирует все остальные параметры окна. В противном случае, если значение параметра окна split-window является функцией, эта функция вызывается с аргументами window, size и side, вместо обычного действия split-window. В противном случае эта функция подчиняется параметрам окна window-atom или window-side, если таковые имеются. См. Параметры окон.

В качестве примера приведена последовательность вызовов split-window, которая даёт конфигурацию окон, обсуждаемую в Окна и фреймы. Этот пример демонстрирует разделение живого окна, а также разделение внутреннего окна. Мы начинаем с фрейма, содержащего одно окно (живое корневое окно), которое мы обозначим W4. Вызов (split-window W4) даёт следующую конфигурацию окон:

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W5_________________||
    |__________________W3__________________|

Вызов split-window создал новое живое окно, обозначенное W5. Он также создал новое внутреннее окно, обозначенное W3, которое становится корневым окном и родителем как W4, так и W5.

Затем мы вызываем (split-window W3 nil 'left), передавая внутреннее окно W3 в качестве аргумента. Результат:

     ______________________________________
    | ______  ____________________________ |
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W4____________|||
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W5____________|||
    ||__W2__||_____________W3_____________ |
    |__________________W1__________________|

Создаётся новое живое окно W2 слева от внутреннего окна W3. Создаётся новое внутреннее окно W1, становящееся новым корневым окном.

Для интерактивного использования Emacs предоставляет две команды, которые всегда разделяют выбранное окно. Они внутренне вызывают split-window.

Команда: split-window-right &optional size window-to-split

Эта функция разделяет окно window-to-split на два рядом стоящих окна, помещая window-to-split слева. window-to-split по умолчанию равен выбранному окну. Если size положителен, левое окно получает size столбцов; если size отрицателен, правое окно получает −size столбцов.

Команда: split-window-below &optional size window-to-split

Эта функция разделяет окно window-to-split на два окна, одно над другим, оставляя выбранным верхнее окно. window-to-split по умолчанию равен выбранному окну. Если size положителен, верхнее окно получает size строк; если size отрицателен, нижнее окно получает −size строк.

Команда: split-root-window-below &optional size

Эта функция разделяет весь фрейм на две части. Текущая конфигурация окон сохраняется сверху, а новое окно создаётся внизу, занимая всю ширину фрейма. size обрабатывается так же, как и в split-window-below.

Команда: split-root-window-right &optional size

Эта функция разделяет весь фрейм на две части. Текущая конфигурация окон сохраняется слева, а новое окно создаётся справа, занимая всю высоту фрейма. size обрабатывается так же, как и в split-window-right.

Пользовательская опция: split-window-keep-point

Если значение этой переменной не равно nil (значение по умолчанию), split-window-below ведёт себя так, как описано выше.

Если оно равно nil, split-window-below корректирует точку в каждом из двух окон, чтобы минимизировать перерисовку. (Это полезно на медленных терминалах.) Он выбирает то окно, которое содержит строку экрана, на которой ранее находилась точка. Обратите внимание, что это влияет только на split-window-below, а не на низкоуровневую функцию split-window.