24.1.2 Настройка хуков

Вот пример, который добавляет функцию в хук режима, чтобы включить режим автозаполнения при работе в режиме взаимодействия 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 имеет свойство permanent-local-hook, отличное от nil, то kill-all-local-variables (или смена основных режимов) не удалит ее из локального значения переменной хука.

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

В некоторых случаях важно контролировать относительный порядок функций в хуке. Необязательный аргумент depth позволяет указать, куда должна быть вставлена функция в списке: это должно быть число от -100 до 100, где чем выше значение, тем ближе к концу списка должна располагаться функция. depth по умолчанию равен 0, а для обратной совместимости, когда depth является символом, отличным от nil, он интерпретируется как глубина 90. Кроме того, когда depth строго больше 0, функция добавляется после, а не перед функциями той же глубины. Никогда не следует использовать глубину 100 (или -100), потому что нельзя быть уверенным, что никакая другая функция никогда не понадобится перед (или после) нас.

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

Если local не равен nil, это означает, что function добавляется в локальный список хука буфера, а не в глобальный список хука. Это делает хук локальным для буфера и добавляет t к локальному значению. Последнее действует как флаг для выполнения функций хука как в значении по умолчанию, так и в локальном значении.

Функция: remove-hook hook function &optional local

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

Если local не равен nil, это означает, что function удаляется из локального списка хука буфера, а не из глобального списка хука.