Spec-Zone.ru › Elisp

Обработка прокрутки и изменений окна

В этом разделе описано, как программы Lisp могут реагировать на прокрутку окна или другие изменения. Сначала рассмотрим случай, когда окно показывает другую часть буфера.

Переменная: window-scroll-functions

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

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

Эти функции должны быть осторожны при использовании window-end (см. Начало и конец окна); если вам нужно актуальное значение, вы должны использовать аргумент update, чтобы убедиться, что вы получите его.

Предупреждение: не используйте эту функцию для изменения способа прокрутки окна. Она не предназначена для этого, и такое использование, вероятно, не сработает.

Кроме того, вы можете использовать jit-lock-register для регистрации функции форматирования шрифтов Font Lock, которая будет вызываться всякий раз, когда части буфера (пере)форматируются из-за прокрутки окна или изменения его размера. См. Другие переменные Font Lock.

Остальная часть этого раздела описывает шесть хуков, которые вызываются во время повторной отрисовки при обнаружении значительного изменения окна, не связанного с прокруткой. Для простоты эти хуки и вызываемые ими функции будут обобщенно называться функциями изменения окна. Как и любой хук, эти хуки можно установить как глобально, так и локально для буфера с помощью аргумента local в add-hook (см. Установка хуков) при их установке.

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

Переменная: window-buffer-change-functions

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

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

Функции, установленные по умолчанию, вызываются для фрейма, если хотя бы одно окно на этом фрейме было добавлено, удалено или назначено другому буферу с момента последнего выполнения функций изменения окна. В этом случае в качестве аргумента передается фрейм.

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

Переменная: window-size-change-functions

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

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

Функции, установленные по умолчанию, вызываются для фрейма, если хотя бы одно окно на этом фрейме было добавлено, назначено другому буферу или изменило свой общий или текстовый размер с момента последнего выполнения функций изменения окна. В этом случае в качестве аргумента передается фрейм.

Третий из этих хуков выполняется при обнаружении изменения выделенного окна, т. е. когда выделено другое окно с момента последней отрисовки.

Переменная: window-selection-change-functions

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

Функции, установленные локально для буфера, вызываются для любого окна, отображающего соответствующий буфер, если это окно было выделено или снято с выделения (среди всех окон или среди всех окон на его фрейме) с момента последнего выполнения функций изменения окна. В этом случае в качестве аргумента передается окно.

Функции, установленные по умолчанию, вызываются для фрейма, если этот фрейм был выделен или снят с выделения, или окно-выбор фрейма изменилось с момента последнего выполнения функций изменения окна. В этом случае в качестве аргумента передается фрейм.

Четвертый из этих хуков выполняется при обнаружении изменения состояния окна, что означает, что произошло хотя бы одно из трех предыдущих изменений окна.

Переменная: window-state-change-functions

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

Функции, установленные локально для буфера, вызываются для любого окна, отображающего соответствующий буфер, если это окно было добавлено или назначено другому буферу, изменило свой общий или текстовый размер или было выделено или снято с выделения (среди всех окон или среди всех окон на его фрейме) с момента последнего выполнения функций изменения окна. В этом случае в качестве аргумента передается окно.

Функции, установленные по умолчанию, вызываются для фрейма, если хотя бы одно окно на этом фрейме было добавлено, удалено или назначено другому буферу, изменило свой общий или текстовый размер, или этот фрейм был выделен или снят с выделения, или окно-выбор фрейма изменилось с момента последнего выполнения функций изменения окна. В этом случае в качестве аргумента передается фрейм.

Функции, установленные по умолчанию, также выполняются для фрейма, если флаг изменения состояния окна этого фрейма (см. ниже) был установлен с момента последней отрисовки.

Пятый из этих хуков выполняется при обнаружении изменения конфигурации окна, что означает изменение буфера или размера окна. Отличается от четырех предыдущих хуков способом выполнения.

Переменная: window-configuration-change-hook

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

Функции, установленные локально для буфера, вызываются для любого окна, отображающего соответствующий буфер, если хотя бы одно окно на этом фрейме было добавлено, удалено или назначено другому буферу или изменило свой общий или текстовый размер с момента последнего выполнения функций изменения окна. Каждый вызов выполняется с окном, отображающим буфер, временно выбранный и с его буфером, установленным текущим.

Функции, установленные по умолчанию, вызываются для каждого фрейма, если хотя бы одно окно на этом фрейме было добавлено, удалено или назначено другому буферу или изменило свой общий или текстовый размер с момента последнего выполнения функций изменения окна. Каждый вызов выполняется с фреймом, временно выбранным, и буфером выделенного окна, установленным текущим.

Наконец, Emacs выполняет обычный хук, обобщающий поведение window-state-change-functions.

Переменная: window-state-change-hook

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

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

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

Функции изменения окна выполняются для конкретного фрейма только в том случае, если для этого фрейма ранее был зарегистрирован соответствующий сдвиг. Такие изменения включают создание или удаление окна, назначение другого буфера или размера окну. Обратите внимание, что даже когда такое изменение зарегистрировано, это не означает, что какой-либо из описанных выше хуков будет выполнен. Например, если изменение было зарегистрировано в рамках экскурсии по окнам (см. Конфигурации окон), это вызовет выполнение функций изменения окна только в том случае, если эта экскурсия все еще сохраняется в момент выполнения функций изменения. Если она завершается раньше, хуки будут выполнены только в том случае, если они были зарегистрированы изменением за пределами области действия этой экскурсии.

Флаг изменения состояния окна фрейма, если он установлен, заставит значения по умолчанию window-state-change-functions (для этого фрейма) и window-state-change-hook выполняться во время следующей повторной отрисовки независимо от того, произошло ли для этого фрейма фактическое изменение состояния окна или нет. После выполнения любых функций на этих хуках флаг сбрасывается для каждого фрейма. Приложения могут установить этот флаг и проверить его значение с помощью следующих функций.

Функция: set-frame-window-state-change &optional frame arg

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

Функция: frame-window-state-change &optional frame

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

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

Функция: window-old-buffer &optional window

Эта функция возвращает буфер, отображённый в окне window в последний момент, когда выполнялись функции изменения окна для кадра window. Если возвращается nil, окно window было создано после этого. Если возвращается t, окно window не отображалось в то время, но было восстановлено из ранее сохранённой конфигурации окна. В противном случае возвращаемое значение — буфер, отображённый window в то время.

Функция: window-old-pixel-width &optional window

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

Функция: window-old-pixel-height &optional window

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

Функция: window-old-body-pixel-width &optional window

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

Функция: window-old-body-pixel-height &optional window

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

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

Функция: frame-old-selected-window &optional frame

Эта функция возвращает выбранное окно кадра frame в последний момент выполнения функций изменения окна. Если опущен или nil, frame по умолчанию устанавливается в выбранный кадр.

Функция: old-selected-window

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

Функция: old-selected-frame

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

Обратите внимание, что функции изменения окна не предоставляют информацию о том, какие окна были удалены с момента их последнего выполнения. При необходимости приложения должны сохранять информацию о любом окне, отображающем определённый буфер, в локальной переменной этого буфера и обновлять её в функции, выполняемой по умолчанию любыми хуками, которые запускаются при обнаружении изменения буфера окна.

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

  • Некоторые операции не вызовут функции изменения окна. Сюда относится отображение другого буфера в минибуфере или любое изменение всплывающего окна.
  • Функции изменения окна не должны создавать или удалять окна, или изменять буфер, размер или статус выбора любого окна, поскольку нет гарантии, что информация об изменениях будет распространена на другие функции изменения окна. В случае необходимости, такие изменения должны выполняться только последней функцией, перечисленной по умолчанию в window-state-change-hook.
  • Макросы, такие как save-window-excursion, with-selected-window или with-current-buffer, могут быть использованы при выполнении функций изменения окна.
  • Выполнение функций изменения окна не сохраняет и не восстанавливает данные сопоставления. За исключением выполнения window-configuration-change-hook, оно не сохраняет и не восстанавливает выбранное окно, кадр или текущий буфер.
  • Любой повторный вывод, вызывающий запуск функций изменения окна, может быть прерван. Если прерывание произойдёт до завершения выполнения функций изменения окна, они будут повторно выполнены с предыдущими значениями, то есть так, как если бы повторный вывод не был выполнен. Если прерывание произойдёт позже, они будут выполнены с новыми значениями, то есть так, как если бы повторный вывод был выполнен.

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Window-Hooks.html

Spec-Zone.ru

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