Що таке гачок?


8

Просто для уточнення ... Наприклад, у цьому документі :

Гак - це змінна Lisp, яка містить список функцій, які потрібно викликати з певного чітко визначеного випадку. (Це називається запуском гака.) Окремі функції у списку називаються функціями гака гака. Наприклад, гачок 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типу "type" (не знаю, що розуміється під типами в elisp) hook. Чи справді це повинно бути початковим створенням гака text-mode-hook? Якщо так, що з "параметрами"? Це ті гадані функції гака чи щось інше?


1
За вашим посиланням: «Ключове слово: 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, тому він може краще допомогти користувачеві, коли він / вона використовує інтерфейс "налаштувати".


Але цей приклад a 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.
147 вечора

@ 147pm, так, правильно.
Марк Карпов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.