. Конфигурации окон (Руководство по GNU Emacs Lisp)

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

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

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

Функция: 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.

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

Вот способ использования этой функции для достижения того же эффекта, что и 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

Эта функция определяет, имеют ли две конфигурации окон одинаковую раскладку окон, но игнорирует значения точки и сохранённые позиции прокрутки — она может вернуть 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 определяют, какие параметры окон сохраняются этой функцией. См. Параметры окон.

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

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

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

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

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

По умолчанию 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.

Каждая запись в списке, передаваемом в качестве второго аргумента функции, сама является списком из шести значений: окно, буфер которого был найден уничтоженным, уничтоженный буфер или его имя, позиции window-start (см. Позиции начала и конца окна) и window-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 означает обмен как ширинами, так и высотами, если это возможно. Размеры кадров эта функция не изменяет.