Nur zur Verdeutlichung ... Zum Beispiel in diesem Dokument :
Ein Hook ist eine Lisp-Variable, die eine Liste von Funktionen enthält, die bei einer genau definierten Gelegenheit aufgerufen werden können. (Dies wird als Ausführen des Hooks bezeichnet.) Die einzelnen Funktionen in der Liste werden als Hook-Funktionen des Hooks bezeichnet. Zum Beispiel
kill-emacs-hook
läuft der Hook kurz vor dem Verlassen von Emacs ...
Ich denke, es heißt, es gibt eine Variable (Symbol) mit dem Namen kill-emacs-hook
, die eine Liste einer Reihe von "Hook-Funktionen" darstellt, die ausgeführt werden, wenn die kill-emacs-hook
ausgewertet wird, wodurch diese Funktionen ausgeführt werden. Richtig? Dann
(add-hook 'text-mode-hook 'auto-fill-mode)
fügt auto-fill-mode
dieser Liste hinzu , die text-mode-hook
zusätzlich zu dem, was bereits vorhanden ist, gekennzeichnet ist. Gut. Nun das
(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)
wo es scheint, schaffen oder verändern wir das text-mode-hook
. Ich bin jetzt verwirrt über die Art der Haken und ihre Beziehung zu defcustom
. Meine logische Wahl ist, dass dieser Code eine Variable text-mode-hook
vom Typ "Typ" erstellt (ich weiß nicht, was unter Typen in elisp zu verstehen ist) hook
. Soll dies tatsächlich die anfängliche Schaffung des Hakens sein text-mode-hook
? Wenn ja, was ist mit den "Optionen" los? Sind das die vermeintlichen Hook-Funktionen oder etwas anderes?
Antworten:
Ihr Verständnis von Emacs Lisp Begriff des Hakens ist absolut richtig. In der Tat sind „normale“ Hooks nur Listen von Funktionen (jede Funktion akzeptiert keine Argumente, andernfalls wird sie in Emacs Lisp normalerweise nicht als „Hook“ oder „normaler Hook“ bezeichnet).
Anpassungsoberfläche ist eine andere Sache. Der Unterschied zwischen
defvar
unddefcustom
besteht darin, dass der Benutzer die Variable über die Benutzeroberfläche "Anpassen" bearbeiten kann. Diese Schnittstelle kann das Bearbeiten bestimmter Datentypen erleichtern. Wenn Sie beispielsweise sagen, dass dies:type
der Falltext-mode-hook
isthook
, stellt die Anpassungsschnittstelle sicher, dasstext-mode-hook
es sich immer um eine Liste von Funktionen handelt. Darüber hinaus können Sie angeben, welche Optionen mit Argument empfohlen werden:options
.Ihr Verständnis ist also korrekt und
defcustom
seine Optionen sind nur eine Möglichkeit, Emacs anzuweisen, damit der Benutzer besser unterstützt werden kann, wenn er die Benutzeroberfläche zum Anpassen verwendet.quelle
defcustom
ist nicht großartig, weil estext-mode-hook
bereits existiert; es ist bereits enthalten. Richtig? Wenn ich nun meinen eigenen Modus schreiben und dann eine Anpassung wünschen würde, würde ich dies tun. Meine Verwirrung ist, dass dieses Beispiel wirklich etwas schaffttext-mode-hook
, nicht verändert. Ist das ein korrektes Verständnis? Und wenn dies tatsächlich eine neue schaffttext-mode-hook
,:options
bietet das diese beiden Funktionen als Optionen an, um eineadd-hook
Liste zu erstellen , oder?defcustom
Kurz gesagt, definiert nur neue Variablen. In diesem speziellen Beispieltext-mode-hook
wird erstellt und sein Anfangswert istnil
. Der Anpassungsoberfläche wird auch mitgeteilt, dass die empfohlenen Werte in dieser Listeturn-on-auto-fill
und sindflyspell-mode
. Sie können jedochtext-mode-hook
programmgesteuert alles einstellen , was Sie möchten. Dies ist eine normale Variable. Sie können es auchadd-hook
mit anderen Funktionen verwenden.(defvar text-mode-hook nil)
.defcustom
Weise der Haken ursprünglich erstellt? So sieht es aus. Mit anderen Worten, dieses Beispiel stammt aus der Tiefe des Emacs-Codes.