29.28 Хуки для прокрутки и изменений окон

В этом разделе описано, как программы на 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 в последний раз, когда функции изменений окон выполнялись для кадра этого окна. Если она возвращает 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

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

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

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