Что такое крюк?

8

Просто чтобы уточнить ... Например, в этом документе :

Хук - это переменная Лиспа, которая содержит список функций, которые должны вызываться по какому-то определенному случаю. (Это называется выполнением ловушки.) Отдельные функции в списке называются функциями ловушки. Например, ловушка kill-emacs-hookзапускается непосредственно перед выходом из Emacs ...

Я думаю, что это говорит, что есть именованная переменная (символ), kill-emacs-hookкоторая представляет список набора «функций-ловушек», которые будут выполняться при kill-emacs-hookоценке, выполняя, таким образом, эти функции. Правильный? затем

(add-hook 'text-mode-hook 'auto-fill-mode)

добавляет auto-fill-modeв этот список, идентифицированный text-mode-hookв дополнение к тому, что уже там. Хорошо. Теперь это

(defcustom text-mode-hook nil
  "Normal hook run when entering Text mode and many related modes."
  :type 'hook
  :options '(turn-on-auto-fill flyspell-mode)
  :group 'wp)

где, кажется, мы либо создаем, либо изменяем text-mode-hook. Теперь я смущен относительно природы крючков и их отношений с defcustom. Мой логический выбор заключается в том, что этот код создает переменную, text-mode-hookкоторая имеет «тип» (не знаю, что подразумевается под типами в elisp) hook. Это, действительно, должно быть начальным созданием крючка text-mode-hook? Если так, что случилось с "вариантами"? Это предполагаемые функции хуков или что-то еще?

147pm
источник
1
По вашей ссылке: «Ключевое слово: options указывает предлагаемый список значений для переменной. Обычно: параметры применяются к крючку. Список - только предложение; это не эксклюзив; человек, который устанавливает переменную, может установить для нее другие значения; список, показанный после ключевого слова: options, предназначен для того, чтобы предложить пользователю удобный выбор ».
Сидхекин

Ответы:

6

Ваше понимание понятия крючка в Emacs Lisp абсолютно правильно. Действительно, «нормальные» хуки - это просто списки функций (каждая функция не принимает аргументов, в противном случае в Emacs Lisp ее обычно не называют «хук» или «нормальный хук»).

Большинство этих переменных имеют имена, заканчивающиеся на -hook. Это обычные крючки, запускаемые с помощью run-hooks. Значение такого хука - это список функций; функции вызываются без аргументов, а их значения полностью игнорируются. Рекомендуемый способ поставить новую функцию на такой хук - это вызвать add-hook.

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

Настройка интерфейса - это совсем другое. Вся разница между defvarи defcustomзаключается в том, что последний позволяет пользователю редактировать переменную через интерфейс «настройки». Этот интерфейс может облегчить редактирование определенных типов данных, например , если вы говорите , что :typeв text-mode-hookэто hook, то настройке интерфейс гарантирует , что text-mode-hookвсегда есть список функций. Кроме того, вы можете указать, какие параметры рекомендуются с :optionsаргументом.

Итак, ваше понимание правильное, а defcustomего опции - всего лишь способ проинструктировать Emacs, так что он может лучше помочь пользователю, когда он / она использует интерфейс «настройки».

Марк Карпов
источник
Но этот пример defcustomне велик, потому что text-mode-hookуже существует; это уже включено. Правильно? Теперь, если бы я написал свой собственный режим, а затем хотел настроить, я бы сделал это. Моя путаница в том, что этот пример действительно создает text-mode-hook, а не изменяет его. Это правильное понимание? И если это действительно создает новое text-mode-hook, то :optionsпредлагает эти две функции в качестве опций для внесения add-hookв список, верно?
147 часов
@ 147pm, этот пример просто показывает вам, как какая-то часть существующего кода Emacs определяет настраиваемую переменную, представляющую ловушку. В двух словах defcustomпросто определяет новые переменные. В этом конкретном примере text-mode-hookсоздается и его начальное значение nil. В интерфейсе настройки также сказано, что рекомендуемые значения в этом списке: turn-on-auto-fillи flyspell-mode. Однако вы можете программно установить text-mode-hookвсе, что вам нравится, это обычная переменная. Вы также можете использовать add-hookлюбые другие функции.
Марк Карпов
@ 147, другими словами, все ключевые аргументы являются просто подсказками для системы настройки, они не имеют никакого значения вне ее. Без подсказок этот код составляет (defvar text-mode-hook nil).
Марк Карпов
Но так defcustomли изначально создается крючок? Вот как это выглядит. Другими словами, этот пример взят где-то глубоко из недр кода Emacs.
14:00
@ 147 вечера, да, правильно.
Марк Карпов