Просто чтобы уточнить ... Например, в этом документе :
Хук - это переменная Лиспа, которая содержит список функций, которые должны вызываться по какому-то определенному случаю. (Это называется выполнением ловушки.) Отдельные функции в списке называются функциями ловушки. Например, ловушка
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
? Если так, что случилось с "вариантами"? Это предполагаемые функции хуков или что-то еще?
Ответы:
Ваше понимание понятия крючка в Emacs Lisp абсолютно правильно. Действительно, «нормальные» хуки - это просто списки функций (каждая функция не принимает аргументов, в противном случае в Emacs Lisp ее обычно не называют «хук» или «нормальный хук»).
Настройка интерфейса - это совсем другое. Вся разница между
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
в список, верно?defcustom
просто определяет новые переменные. В этом конкретном примереtext-mode-hook
создается и его начальное значениеnil
. В интерфейсе настройки также сказано, что рекомендуемые значения в этом списке:turn-on-auto-fill
иflyspell-mode
. Однако вы можете программно установитьtext-mode-hook
все, что вам нравится, это обычная переменная. Вы также можете использоватьadd-hook
любые другие функции.(defvar text-mode-hook nil)
.defcustom
ли изначально создается крючок? Вот как это выглядит. Другими словами, этот пример взят где-то глубоко из недр кода Emacs.