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-hook
działa tuż przed wyjściem z Emacsa ...
Wydaje mi się, że mówi o nazwie zmiennej (symbol), kill-emacs-hook
która reprezentuje listę zestawu „funkcji przechwytujących”, które będą działały podczas kill-emacs-hook
oceny, wykonując w ten sposób te funkcje. Poprawny? Następnie
(add-hook 'text-mode-hook 'auto-fill-mode)
dodaje auto-fill-mode
do tej listy zidentyfikowanej przez text-mode-hook
opró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-hook
któ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?
Odpowiedzi:
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).
Interfejs dostosowywania to inna sprawa. Cała różnica pomiędzy
defvar
idefcustom
jest 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:type
otext-mode-hook
tohook
, to interfejs personalizacja sprawia pewien , żetext-mode-hook
zawsze jest lista funkcji. Ponadto można określić, które opcje są zalecane za pomocą:options
argumentu.Tak więc twoje zrozumienie jest prawidłowe, a
defcustom
jego opcje to tylko sposób na instruowanie Emacsa, aby mógł lepiej pomagać użytkownikowi, gdy używa on / ona interfejsu „dostosowywania”.źródło
defcustom
nie jest świetny, ponieważtext-mode-hook
już 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ę tworzytext-mode-hook
, a nie zmienia. Czy to prawidłowe zrozumienie? A jeśli to rzeczywiście tworzy nowytext-mode-hook
,:options
to oferuje te dwie funkcje jako opcje do zrobieniaadd-hook
na liście, prawda?defcustom
definiuje tylko nowe zmienne. W tym konkretnym przykładzietext-mode-hook
tworzona jest wartość początkowanil
. Interfejs dostosowywania jest również informowany, że zalecane wartości na tej liście toturn-on-auto-fill
iflyspell-mode
. Możesz jednak ustawić dowolnietext-mode-hook
programowo, jest to normalna zmienna. Możesz używać takżeadd-hook
z innymi funkcjami.(defvar text-mode-hook nil)
.defcustom
tak właśnie powstaje hak? Tak to wygląda. Innymi słowy, ten przykład pochodzi z głębi trzewi kodu Emacsa.