24.1 Хуки

Хук (hook) — это переменная, в которой можно сохранить одну или несколько функций (см. Что такое функция?) для вызова в определенный момент существующей программой. Emacs предоставляет хуки для целей кастомизации. Чаще всего хуки настраиваются в файле инициализации (см. Файл инициализации), но Lisp-программы также могут их настраивать. См. Стандартные хуки для списка некоторых стандартных переменных хуков.

Большинство хуков в Emacs являются обычными хуками (normal hooks). Эти переменные содержат списки функций, которые вызываются без аргументов. По соглашению, когда имя хука оканчивается на «-hook», это указывает на то, что он обычный. Мы стараемся сделать все хуки обычными, насколько это возможно, чтобы вы могли использовать их единообразно.

Каждая команда основного режима должна вызывать обычный хук, называемый хуком режима (mode hook), одним из последних шагов инициализации. Это позволяет пользователю легко настраивать поведение режима, переопределяя присваивания переменных, специфичных для буфера, которые уже были сделаны режимом. Большинство функций второстепенных режимов также вызывают хук режима в конце. Но хуки используются и в других контекстах. Например, хук suspend-hook вызывается непосредственно перед тем, как Emacs приостанавливает свою работу (см. Приостановка Emacs).

Если имя переменной хука не оканчивается на «-hook», это указывает на то, что это, вероятно, аномальный хук (abnormal hook). Они отличаются от обычных хуков двумя способами: их можно вызывать с одним или несколькими аргументами, и их возвращаемые значения могут использоваться. В документации к хуку указано, как вызываются функции и как используются их возвращаемые значения. Любые функции, добавленные в аномальный хук, должны следовать соглашению о вызове этого хука. По соглашению, имена аномальных хуков оканчиваются на «-functions».

Если имя переменной оканчивается на «-predicate» или «-function» (единственное число), то ее значение должно быть функцией, а не списком функций. Как и в случае с аномальными хуками, ожидаемые аргументы и значение возвращаемого значения различаются в таких хуках с одной функцией (single function hooks). Подробности объясняются в строке документации каждой переменной.

Поскольку хуки (как многофункциональные, так и однофункциональные) являются переменными, их значения можно изменять с помощью setq или временно с помощью let. Однако часто полезно добавлять или удалять определенную функцию из хука, сохраняя при этом любые другие функции, которые в нем могут быть. Для многофункциональных хуков рекомендуемый способ — это использование add-hook и remove-hook (см. Настройка хуков). Большинство переменных обычных хуков изначально пустые; add-hook знает, как с этим справиться. Вы можете добавлять хуки либо глобально, либо локально для буфера с помощью add-hook. Для хуков, которые содержат только одну функцию, add-hook не подходит, но вы можете использовать add-function (см. Настройка функций Emacs Lisp) для объединения новых функций с хуком. Обратите внимание, что некоторые однофункциональные хуки могут быть nil, с чем add-function не может справиться, поэтому перед вызовом add-function вы должны проверить это.