Настройка хуков
Вот пример, который добавляет функцию в хук режима для включения режима Автозаполнения, когда активен режим взаимодействия с Lisp:
(add-hook 'lisp-interaction-mode-hook 'auto-fill-mode)
Значение переменной хука должно быть списком функций. Вы можете манипулировать этим списком с помощью обычных средств Lisp, но более модульный подход — использовать функции add-hook и remove-hook, определённые ниже. Они заботятся о некоторых необычных ситуациях и предотвращают проблемы.
Можно разместить функцию с lambda -выражением в хуке, но мы рекомендуем этого избегать, поскольку это может привести к путанице. Если вы добавите то же lambda -выражение во второй раз, но немного измените его запись, вы получите две эквивалентные, но разные функции в хуке. Если вы затем удалите одну из них, другая всё ещё будет присутствовать.
- Функция: add-hook hook function &optional depth local
-
Эта функция — удобный способ добавить функцию function к переменной хука hook. Она может использоваться как для обычных, так и для необычных хуков. function может быть любой функцией Lisp, которая может принимать правильное количество аргументов для hook. Например,
(add-hook 'text-mode-hook 'my-text-hook-function)
добавляет
my-text-hook-functionв хук, называемыйtext-mode-hook.Если function уже присутствует в hook (сравнение с использованием
equal), тоadd-hookне добавит её во второй раз.Если у function есть свойство, отличное от
nil, а именноpermanent-local-hook, тоkill-all-local-variables(или изменение основных режимов) не удалит её из локального значения переменной хука.Для обычного хука функции хука должны быть спроектированы так, чтобы порядок их выполнения не имел значения. Любая зависимость от порядка — это потенциальная проблема. Однако порядок предсказуем: обычно function помещается в начало списка хука, поэтому она выполняется первой (кроме случаев вызова другого
add-hook).В некоторых случаях важно управлять относительным порядком функций в хуке. Необязательный аргумент depth позволяет указать, где следует вставить функцию в список: это должно быть число от -100 до 100, где более высокое значение означает, что функция должна быть ближе к концу списка. depth по умолчанию равен 0, а для обратной совместимости, когда depth — ненулевой символ, он интерпретируется как глубина 90. Кроме того, когда depth строго больше 0, функция добавляется *после* , а не *перед* функциями с той же глубиной. Не следует использовать глубину 100 (или -100), так как нельзя быть уверенным, что никакая другая функция никогда не потребует оказаться перед (или после) нашей функции.
add-hookобрабатывает случаи, когда hook пустой или его значение — это единственная функция; он устанавливает или изменяет значение на список функций.Если local ненулевой, это означает, что function добавится в список буферных хуков, а не в глобальный список хуков. Это делает хук локальным для буфера и добавляет
tк локальному значению буфера. Последнее действует как флаг для выполнения функций хука как в стандартном значении, так и в локальном значении.
- Функция: remove-hook hook function &optional local
-
Эта функция удаляет function из переменной хука hook. Она сравнивает function с элементами hook с помощью
equal, поэтому работает как для символов, так и для лямбда-выражений.Если local ненулевой, это означает, что function удаляется из списка буферных хуков, а не из глобального списка хуков.
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/Setting-Hooks.html