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