Co to jest hak?

8

Aby wyjaśnić ... Na przykład w tym dokumencie :

Hak to zmienna Lisp, która zawiera listę funkcji, które można wywołać przy dobrze określonej okazji. (Nazywa się to uruchamianiem haka.) Poszczególne funkcje na liście nazywane są funkcjami haka. Na przykład hak kill-emacs-hookdziała tuż przed wyjściem z Emacsa ...

Wydaje mi się, że mówi o nazwie zmiennej (symbol), kill-emacs-hookktóra reprezentuje listę zestawu „funkcji przechwytujących”, które będą działały podczas kill-emacs-hookoceny, wykonując w ten sposób te funkcje. Poprawny? Następnie

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

dodaje auto-fill-modedo tej listy zidentyfikowanej przez text-mode-hookoprócz tego, co już tam jest. Dobrze. Teraz to

(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)

gdzie wydaje się, że tworzymy lub zmieniamy text-mode-hook. Jestem teraz zdezorientowany co do natury haków i ich związku defcustom. Mój logiczny wybór polega na tym, że ten kod tworzy zmienną, text-mode-hookktóra jest „typowa” (nie wiem, co oznaczają typy w elisp) hook. Czy to rzeczywiście ma być początkowe stworzenie haka text-mode-hook? Jeśli tak, o co chodzi z „opcjami”? Czy to są rzekome funkcje haka, czy coś innego?

147pm
źródło
1
Z Twojego linku: «Słowo kluczowe: options określa sugerowaną listę wartości zmiennej. Zwykle: opcje dotyczą haka. Lista jest tylko sugestią; nie jest wyłączny; osoba, która ustawi zmienną, może ustawić ją na inne wartości; lista pokazana poniżej: słowo kluczowe options ma na celu zaoferowanie użytkownikowi wygodnych wyborów. »
Sidhekin,

Odpowiedzi:

6

Twoje rozumienie pojęcia haka Emacsa Lispa jest absolutnie prawidłowe. Rzeczywiście, „normalne” haki to tylko listy funkcji (każda funkcja nie przyjmuje argumentów, w przeciwnym razie zwykle nie jest nazywana „hookiem” lub „normalnym hakiem” w Emacs Lisp).

Większość tych zmiennych ma nazwy kończące się na -hook. Są to normalne haki, uruchamiane za pomocą run-hooks. Wartością takiego haka jest lista funkcji; funkcje są wywoływane bez argumentów, a ich wartości są całkowicie ignorowane. Zalecanym sposobem umieszczenia nowej funkcji na takim haczyku jest wywołanie add-hook.

Zmienne, których nazwy kończą się na, -functionssą zwykle nieprawidłowymi hakami (niektóre stare kody mogą również używać przestarzałego -hookssufiksu); ich wartości są listami funkcji, ale funkcje te są wywoływane w specjalny sposób (przekazywane są argumenty lub używane są ich wartości zwracane). Zmienne, których nazwy kończą się, -functionmają pojedyncze funkcje jako swoje wartości.

Interfejs dostosowywania to inna sprawa. Cała różnica pomiędzy defvari defcustomjest to, że ten ostatni pozwala użytkownikowi na edycję zmiennej poprzez interfejs „Dostosuj”. Interfejs ten może ułatwić edycję niektórych typów danych, więc na przykład, jeśli mówisz, że :typeo text-mode-hookto hook, to interfejs personalizacja sprawia pewien , że text-mode-hookzawsze jest lista funkcji. Ponadto można określić, które opcje są zalecane za pomocą :optionsargumentu.

Tak więc twoje zrozumienie jest prawidłowe, a defcustomjego opcje to tylko sposób na instruowanie Emacsa, aby mógł lepiej pomagać użytkownikowi, gdy używa on / ona interfejsu „dostosowywania”.

Mark Karpov
źródło
Ale ten przykład defcustomnie jest świetny, ponieważ text-mode-hookjuż istnieje; to już jest uwzględnione. Dobrze? Teraz, gdybym napisał własny tryb, a następnie chciałbym go dostosować, zrobiłbym to. Moje zamieszanie polega na tym, że ten przykład naprawdę tworzy text-mode-hook, a nie zmienia. Czy to prawidłowe zrozumienie? A jeśli to rzeczywiście tworzy nowy text-mode-hook, :optionsto oferuje te dwie funkcje jako opcje do zrobienia add-hookna liście, prawda?
147:
@ 147 po południu, ten przykład pokazuje, jak pewna część istniejącego kodu Emacsa definiuje konfigurowalną zmienną, która reprezentuje hook. W skrócie defcustomdefiniuje tylko nowe zmienne. W tym konkretnym przykładzie text-mode-hooktworzona jest wartość początkowa nil. Interfejs dostosowywania jest również informowany, że zalecane wartości na tej liście to turn-on-auto-filli flyspell-mode. Możesz jednak ustawić dowolnie text-mode-hookprogramowo, jest to normalna zmienna. Możesz używać także add-hookz innymi funkcjami.
Mark Karpov,
@ 147, innymi słowy, wszystkie argumenty słów kluczowych są jedynie wskazówkami dla systemu dostosowywania, nie robią żadnej różnicy poza nim. Bez wskazówek, które stanowi kod (defvar text-mode-hook nil).
Mark Karpov,
Ale czy defcustomtak właśnie powstaje hak? Tak to wygląda. Innymi słowy, ten przykład pochodzi z głębi trzewi kodu Emacsa.
147:
@ 147pm, tak, poprawne.
Mark Karpov