.
Конфигурация окон записывает полную раскладку одного
кадра—все окна, их размеры, их оформление, какие буферы они
содержат, как эти буферы прокручены, а также значение точки в них.
Она также включает значение minibuffer-scroll-window. В виде
особого исключения конфигурация окон не записывает значение точки в
выбранном окне для текущего буфера.
Вы можете восстановить полную раскладку кадра, восстановив ранее сохранённую конфигурацию окон. Если вы хотите записать раскладку всех кадров, а не только одного, используйте конфигурацию кадров вместо конфигурации окон. См. Конфигурации кадров.
Эта функция возвращает новый объект, представляющий текущую
конфигурацию окон frame. По умолчанию для frame используется
выбранный кадр. Переменная window-persistent-parameters определяет,
какие параметры окон (если таковые имеются) сохраняются этой функцией.
См. Параметры окон.
Эта функция восстанавливает конфигурацию окон и буферов в соответствии с
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)))
Этот макрос записывает конфигурацию окон выбранного кадра, выполняет forms последовательно, а затем восстанавливает предыдущую конфигурацию окон. Возвращаемое значение — это значение последней формы из forms.
В большинстве Lisp-кода не следует использовать этот макрос; обычно
достаточно save-selected-window. В частности, этот макрос не может
надёжно предотвратить открытие новых окон кодом в forms, поскольку
новые окна могут открываться в других кадрах (см. Выбор окна для отображения буфера), а
save-window-excursion сохраняет и восстанавливает конфигурацию окон
только на текущем кадре.
Эта функция возвращает t, если object является конфигурацией окон.
Эта функция определяет, имеют ли две конфигурации окон одинаковую
раскладку окон, но игнорирует значения точки и сохранённые позиции
прокрутки — она может вернуть t, даже если эти аспекты различаются.
Эта функция возвращает кадр, для которого была создана конфигурация окон config.
Другие примитивы для просмотра внутреннего устройства конфигураций окон были бы полезны, но не реализованы, поскольку в них не было необходимости. Смотрите файл winner.el для получения дополнительных операций над конфигурациями окон.
Объекты, возвращаемые current-window-configuration, уничтожаются
вместе с процессом Emacs. Чтобы сохранить конфигурацию окон на диске и
прочитать её в другом сеансе Emacs, вы можете использовать функции,
описанные далее. Эти функции также полезны для клонирования состояния
кадра в произвольное живое окно (set-window-configuration
фактически клонирует окна кадра только в корневое окно этого же кадра).
Эта функция возвращает состояние window в виде Lisp-объекта. Аргумент window должен быть допустимым окном и по умолчанию равен корневому окну выбранного кадра.
Если необязательный аргумент writable отличен от nil, это
означает не использовать маркеры для выборки позиций, таких как
window-point или window-start. Этот аргумент должен быть
отличен от nil, когда состояние будет записываться на диск и
считываться в другом сеансе.
Вместе аргумент writable и переменная
window-persistent-parameters определяют, какие параметры окон
сохраняются этой функцией. См. Параметры окон.
Значение, возвращаемое window-state-get, может быть использовано в
том же сеансе для создания клона окна в другом окне. Его также можно
записать на диск и прочитать в другом сеансе. В любом случае используйте
следующую функцию для восстановления состояния окна.
Эта функция помещает состояние окна 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
могут удалять окно из восстанавливаемой конфигурации, если обнаруживают,
что его буфер был уничтожен с момента записи соответствующей конфигурации
или состояния. Переменная, описанная ниже, может использоваться для
точной настройки этого поведения.
Эта переменная определяет, как 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-1 и window-2. window-1 должно быть живым окном и по умолчанию равно выбранному. window-2 должно быть живым окном и по умолчанию равно окну, следующему за window-1 в циклическом порядке окон, исключая окна минибуфера и включая живые окна на всех видимых кадрах.
Необязательный аргумент size, отличный от nil, означает
попытку также обменяться размерами window-1 и window-2.
Значение height означает обмен только высотами, значение
width — обмен только ширинами, тогда как t означает
обмен как ширинами, так и высотами, если это возможно. Размеры кадров
эта функция не изменяет.