29.6 Сохранение размеров окон

Окно может быть явно изменено в размере с помощью одной из функций из предыдущего раздела или неявно, например, при изменении размера соседнего окна, при разделении или удалении окна (см. Разделение окон, см. Удаление окон) или при изменении размера рамки окна (см. Размер рамки).

Возможно избежать неявного изменения размера определенного окна, если на той же рамке есть одно или несколько других окон, которые можно изменить в размере. Для этой цели Emacs должен быть проинформирован о необходимости сохранять размер этого окна. Существует два основных способа это сделать.

Переменная: window-size-fixed

Если эта буфер-локальная переменная не равна nil, размер любого окна, отображающего буфер, по умолчанию не может быть изменен. Удаление окна или изменение размера рамки может все же изменить размер окна, если нет другого выбора.

Если значение равно height, фиксируется только высота окна; если значение равно width, фиксируется только ширина окна. Любое другое значение, не равное nil, фиксирует как ширину, так и высоту.

Если эта переменная равна nil, это не обязательно означает, что любое окно, отображающее буфер, может быть изменено в размере в желаемом направлении. Чтобы это определить, используйте функцию window-resizable. См. Изменение размера окон.

Часто window-size-fixed является слишком агрессивным, поскольку он препятствует любой попытке явно изменить размер или разделить затронутое окно. Это может произойти даже после того, как окно было изменено в размере неявно, например, при удалении соседнего окна или изменении размера рамки окна. Следующая функция старается никогда не запрещать явное изменение размера такого окна:

Функция: window-preserve-size &optional window horizontal preserve

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

Если необязательный аргумент preserve равен t, это означает сохранение текущей высоты/ширины тела window. Высота/ширина window изменится только в том случае, если Emacs не имеет лучшего выбора. Изменение размера окна, высота/ширина которого сохранена этой функцией, никогда не вызовет ошибку.

Если preserve равен nil, это означает прекращение сохранения высоты/ширины window, снимая любое соответствующее ограничение, наложенное предыдущим вызовом этой функции для window. Вызов enlarge-window, shrink-window или fit-window-to-buffer с window в качестве аргумента также может снять соответствующее ограничение.

window-preserve-size в настоящее время вызывается следующими функциями:

fit-window-to-buffer

Если необязательный аргумент preserve-size этой функции (см. Изменение размера окон) не равен nil, размер, установленный этой функцией, сохраняется.

display-buffer

Если аргумент alist этой функции (см. Выбор окна для отображения буфера) содержит запись preserve-size, размер окна, созданного этой функцией, сохраняется.

window-preserve-size устанавливает параметр окна (см. Параметры окна) под названием window-preserved-size, который используется функциями изменения размера окна. Этот параметр не будет препятствовать изменению размера окна, когда окно отображает другой буфер, чем тот, когда window-preserve-size был вызван, или если его размер изменился с тех пор.

Следующая функция может быть использована для проверки, сохранена ли высота определенного окна:

Функция: window-preserved-size &optional window horizontal

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