Spec-Zone.ru › Elisp

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

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

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

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

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

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

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

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

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

Как правило, если window уже входит в комбинацию (см. Окна и кадры), соответствующую side (горизонтальная комбинация соответствует side, если он равен left или right; вертикальная комбинация соответствует side, если он равен above или below), и window-combination-limit (см. Повторное объединение окон) равно nil, эта функция повторно использует родительское окно window в дереве окон в качестве родительского для нового окна.

Однако, если window входит в комбинацию, не соответствующую side, или если window-combination-limit не равно nil, эта функция создаёт новое родительское окно, которое заменяет window в дереве окон, и делает window и новое окно его единственными дочерними окнами. Это стандартное поведение можно переопределить с помощью аргумента refer.

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

Если необязательный пятый аргумент refer не равен nil, он задаёт опорное окно, используемое для настройки свойств нового окна. Если refer не равен nil, в качестве него можно указать окно или cons-ячейку из двух окон.

Если refer — cons-ячейка, её CAR должна указывать на удалённое бывшее активное окно — окно, в котором ранее отображался буфер, — на том же кадре, что и window. Этот буфер должен оставаться активным. CDR должна указывать на удалённое окно, которое до удаления было родительским окном на том же кадре, что и window. В этом случае функция не создаёт новые окна, а заменяет window на CDR аргумента refer в дереве окон и делает window и CAR аргумента refer его новыми дочерними окнами. Буфер, позиции начала и точки для CAR аргумента refer устанавливаются в значения, которые они имели непосредственно перед последним удалением этого CAR. Оформление и параметры сохраняются такими, какими они были до удаления CAR и CDR аргумента refer.

Кроме того, refer может указывать на удалённое бывшее активное окно — окно, в котором ранее отображался буфер, — на том же кадре, что и window. Этот буфер должен оставаться активным. В этом случае функция не создаёт новое окно, а вновь активирует refer и вставляет его в дерево окон в позиции и с размерами, которые были бы назначены новому окну. Буфер, позиции начала и точки для refer устанавливаются в значения, которые они имели непосредственно перед последним удалением refer. Оформление и параметры сохраняются такими, какими они были до удаления refer. Затем родительское окно для refer определяется так, как если бы это окно создавалось заново.

Во всех остальных случаях refer должен указывать на активное окно. Тогда новое окно унаследует от refer такие свойства, как буфер, позиции начала и точки, а также некоторые элементы оформления. Если refer равен nil или не указан, и window является активным окном, новое окно унаследует эти свойства от window. Однако если window — внутреннее окно, новое окно унаследует эти свойства от окна, выбранного на кадре window.

Поведение этой функции может изменяться параметрами окна 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__________________|

Слева от внутреннего окна W3 создаётся новое активное окно W2. Создаётся новое внутреннее окно 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.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Splitting-Windows.html

Spec-Zone.ru

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