Spec-Zone.ru › Elisp

Конфигурации окон

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

Восстановив ранее сохранённую конфигурацию окна, можно вернуть всю компоновку фрейма. Если нужно сохранить компоновку всех фреймов, а не только одного, используйте конфигурацию фреймов вместо конфигурации окна. См. Конфигурации фреймов.

Функция: current-window-configuration &optional frame

Эта функция возвращает новый объект, представляющий текущую конфигурацию окон frame. По умолчанию frame — выбранный фрейм. Переменная window-persistent-parameters задаёт, какие параметры окон (если таковые имеются) сохраняются этой функцией. См. Параметры окон.

Функция: set-window-configuration configuration &optional dont-set-frame dont-set-miniwindow

Эта функция восстанавливает конфигурацию окон и буферов, заданную в configuration, для фрейма, для которого была создана configuration, независимо от того, выбран этот фрейм или нет. Аргумент configuration должен быть значением, ранее возвращённым функцией current-window-configuration для этого фрейма. Обычно функция также выбирает фрейм, сохранённый в конфигурации, но если dont-set-frame не равен nil, выбранным останется фрейм, который был выбран в начале выполнения функции.

Обычно функция восстанавливает сохранённый минибуфер (если он есть), но если dont-set-miniwindow не равен nil, в мини-окне останется минибуфер, который был активен в начале выполнения функции (если он есть).

Если фрейм, из которого была сохранена configuration, уже не существует, функция лишь восстанавливает значение переменной minibuffer-scroll-window и корректирует значение, возвращаемое функцией minibuffer-selected-window. В этом случае функция возвращает nil. В противном случае она возвращает t.

При попытке восстановить окно, буфер которого был уничтожен после записи configuration, эта функция обращается к переменной window-restore-killed-buffer-windows (см. ниже).

Вот способ использования этой функции для достижения того же эффекта, что и save-window-excursion:

(let ((config (current-window-configuration)))
  (unwind-protect
      (progn (split-window-below nil)
             ...)
    (set-window-configuration config)))
Макрос: save-window-excursion forms…

Этот макрос записывает конфигурацию окон выбранного фрейма, последовательно выполняет forms, а затем восстанавливает прежнюю конфигурацию окон. Возвращаемое значение — значение последней формы в forms.

Большинству программ на Lisp не следует использовать этот макрос; обычно достаточно save-selected-window. В частности, этот макрос не может надёжно предотвратить открытие новых окон кодом в forms, поскольку новые окна могут открываться в других фреймах (см. Выбор окна для отображения буфера), а save-window-excursion сохраняет и восстанавливает конфигурацию окон только текущего фрейма.

Функция: window-configuration-p object

Эта функция возвращает t, если object является конфигурацией окна.

Функция: window-configuration-equal-p config1 config2

Эта функция проверяет, совпадают ли компоновки окон в двух конфигурациях, но игнорирует значения point и сохранённые позиции прокрутки — она может вернуть t, даже если эти параметры различаются.

Функция: window-configuration-frame config

Эта функция возвращает фрейм, для которого была создана конфигурация окна config.

Было бы полезно иметь другие примитивы для просмотра содержимого конфигураций окон, но они не реализованы, поскольку в них не было необходимости. Некоторые другие операции с конфигурациями окон описаны в файле winner.el.

Объекты, возвращаемые функцией current-window-configuration, перестают существовать вместе с процессом Emacs. Чтобы сохранить конфигурацию окна на диске и прочитать её в другом сеансе Emacs, можно использовать функции, описанные далее. Эти функции также полезны для клонирования состояния фрейма в произвольное действующее окно (set-window-configuration фактически клонирует окна фрейма только в корневое окно этого же фрейма).

Функция: window-state-get &optional window writable

Эта функция возвращает состояние window в виде объекта Lisp. Аргумент window должен задавать допустимое окно; по умолчанию используется корневое окно выбранного фрейма.

Если необязательный аргумент writable не равен nil, это означает, что для выборки позиций, таких как window-point или window-start, не следует использовать маркеры. Этот аргумент должен быть не равен nil, если состояние будет записано на диск и прочитано в другом сеансе.

Вместе аргумент writable и переменная window-persistent-parameters задают, какие параметры окон сохраняются этой функцией. По умолчанию параметр clone-of сохраняется, если writable равен nil. См. Параметры окон.

Чтобы нормализовать имена буферов, управляемые uniquify, удалив их префиксы и суффиксы, привяжите window-state-normalize-buffer-name к значению, не равному nil. Это помогает восстанавливать буферы окон между сеансами Emacs. См. Uniquify в Руководстве GNU Emacs.

Значение, возвращаемое функцией window-state-get, можно использовать в том же сеансе для клонирования окна (см. ниже). Его также можно записать на диск и прочитать в другом сеансе. В обоих случаях для восстановления состояния окна используйте следующую функцию.

Функция: window-state-put state &optional window ignore

Эта функция помещает состояние окна state в window. Аргумент state должен быть состоянием окна, возвращённым предыдущим вызовом window-state-get (см. выше). Необязательный аргумент window может быть как действующим окном, так и внутренним окном (см. Окна и фреймы). Если window не является действующим окном, перед помещением в него state оно заменяется новым действующим окном, созданным в том же фрейме. Если window равен nil, состояние окна помещается в новое окно.

Эта функция устанавливает все параметры окон, сохранённые в state. По умолчанию это параметр clone-of, если state получен вызовом window-state-get с аргументом writable, равным nil. См. Параметры окон.

При попытке восстановить окно, буфер которого был уничтожен после записи state, эта функция обращается к переменной window-restore-killed-buffer-windows (см. ниже).

Если необязательный аргумент ignore не равен nil, это означает, что следует игнорировать минимальные размеры окон и ограничения фиксированного размера. Если ignore равен safe, окна могут уменьшаться до одной строки и/или двух столбцов.

В контексте состояний окон клон окна — это окно с таким же оформлением и содержимым, как у окна, состояние которого использовалось для его создания, но представленное другим объектом окна. Поэтому оно не имеет той же идентичности, что и исходное окно. Действия с исходным окном или его клоном никак не влияют на другое окно.

Обратите внимание: хотя set-window-configuration всегда восстанавливает идентичность окон, которые возвращает во фрейм, window-state-put этого никогда не делает. Также обратите внимание: хотя window-state-get клонирует существующие окна, эти клоны ещё не являются допустимыми окнами. Они становятся допустимыми только после того, как window-state-put поместит их в действующий фрейм.

По умолчанию set-window-configuration и window-state-put могут удалить окно из восстановленной конфигурации или состояния, если обнаружат, что его буфер был уничтожен после записи соответствующей конфигурации или состояния. Переменную, описанную далее, можно использовать для точной настройки этого поведения.

Переменная: window-restore-killed-buffer-windows

Эта переменная задаёт, как set-window-configuration и window-state-put должны обрабатывать окна, буферы которых были уничтожены после записи соответствующей конфигурации или состояния. В момент вызова одной из этих функций такие окна могут быть действующими — и тогда в них отображается другой буфер — либо недействующими. Обычно set-window-configuration оставляет действующее окно без изменений, а window-state-put удаляет его.

Следующие значения позволяют переопределить поведение по умолчанию для недействующих окон в случае set-window-configuration и для действующих и недействующих окон в случае window-state-put.

t

Это значение означает безусловно восстановить окно и показать в нём другой буфер.

delete

Это означает безусловно попытаться удалить окно.

dedicated

Это означает попытаться удалить окно только в том случае, если оно закреплено за своим буфером.

nil

Это значение используется по умолчанию. Оно означает, что set-window-configuration попытается удалить окно, только если оно закреплено за своим буфером, а window-state-put безусловно попытается его удалить.

функция

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

Если окно нельзя удалить (обычно потому, что оно последнее в своём фрейме), set-window-configuration и window-state-put покажут в нём другой буфер.

Если значением этой переменной является функция, она должна принимать три аргумента. Первый аргумент задаёт фрейм, окна которого были восстановлены. Третий аргумент — это либо символ configuration, если окна восстановлены функцией set-window-configuration, либо символ state, если окна восстановлены функцией window-state-put.

Второй аргумент задаёт список записей обо всех окнах, предыдущие буферы которых были обнаружены уничтоженными в момент, когда set-window-configuration или window-state-put пыталась их восстановить (окна минибуфера исключаются). Это означает, что функция может также удалить окна, которые set-window-configuration обнаружила действующими.

Каждая запись в списке, передаваемом функции вторым аргументом, сама является списком из шести значений: окно, буфер которого был обнаружен уничтоженным, уничтоженный буфер или его имя, позиции начала окна (см. Позиции начала и конца окна) и point окна (см. Окна и point) для буфера в этом окне, состояние закрепления окна, ранее возвращённое функцией window-dedicated-p, и флаг, равный t, если функция set-window-configuration обнаружила окно действующим, и nil в противном случае.

Функции window-state-get и window-state-put также позволяют обменивать содержимое двух действующих окон. Следующая функция выполняет именно эту операцию:

Команда: window-swap-states &optional window-1 window-2 size

Эта команда меняет местами состояния двух действующих окон window-1 и window-2. window-1 должно задавать действующее окно; по умолчанию используется выбранное окно. window-2 должно задавать действующее окно; по умолчанию используется окно, следующее за window-1 в циклическом порядке окон, исключая окна минибуфера и включая действующие окна во всех видимых фреймах.

Необязательный аргумент size, не равный nil, означает, что следует также попытаться поменять местами размеры window-1 и window-2. Значение height означает поменять местами только высоту, значение width — только ширину, а t — поменять местами и ширину, и высоту, если это возможно. Эта функция не изменяет размеры фреймов.

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/Window-Configurations.html

Spec-Zone.ru

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