Was ist ein Haken?

8

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-hooklä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-hookausgewertet wird, wodurch diese Funktionen ausgeführt werden. Richtig? Dann

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

fügt auto-fill-modedieser Liste hinzu , die text-mode-hookzusä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-hookvom 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?

147 Uhr
quelle
1
Über Ihren Link: «Das Schlüsselwort: options gibt eine vorgeschlagene Liste von Werten für die Variable an. Normalerweise gilt: Optionen gelten für einen Haken. Die Liste ist nur ein Vorschlag; es ist nicht exklusiv; Eine Person, die die Variable setzt, kann sie auf andere Werte setzen. Die Liste, die nach dem Schlüsselwort: options angezeigt wird, soll einem Benutzer eine bequeme Auswahl bieten. »
Die Sidhekin

Antworten:

6

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

Die meisten dieser Variablen haben Namen, die mit enden -hook. Es sind normale Haken, die mittels run-hooks. Der Wert eines solchen Hooks ist eine Liste von Funktionen; Die Funktionen werden ohne Argumente aufgerufen und ihre Werte werden vollständig ignoriert. Der empfohlene Weg, eine neue Funktion an einen solchen Hook zu setzen, ist das Aufrufen add-hook.

Die Variablen, deren Namen auf enden, -functionssind normalerweise abnormale Hooks (einige alte Codes verwenden möglicherweise auch das veraltete -hooksSuffix). Ihre Werte sind Listen von Funktionen, aber diese Funktionen werden auf besondere Weise aufgerufen (sie sind übergebene Argumente oder ihre Rückgabewerte werden verwendet). Die Variablen, deren Namen auf enden, -functionhaben einzelne Funktionen als Werte.

Anpassungsoberfläche ist eine andere Sache. Der Unterschied zwischen defvarund defcustombesteht 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 :typeder Fall text-mode-hookist hook, stellt die Anpassungsschnittstelle sicher, dass text-mode-hookes 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 defcustomseine Optionen sind nur eine Möglichkeit, Emacs anzuweisen, damit der Benutzer besser unterstützt werden kann, wenn er die Benutzeroberfläche zum Anpassen verwendet.

Mark Karpov
quelle
Aber dieses Beispiel von a defcustomist nicht großartig, weil es text-mode-hookbereits 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 schafft text-mode-hook, nicht verändert. Ist das ein korrektes Verständnis? Und wenn dies tatsächlich eine neue schafft text-mode-hook, :optionsbietet das diese beiden Funktionen als Optionen an, um eine add-hookListe zu erstellen , oder?
147 Uhr
Um 147 Uhr zeigt dieses Beispiel nur, wie ein Teil des vorhandenen Emacs-Codes anpassbare Variablen definiert, die Hook darstellen. defcustomKurz gesagt, definiert nur neue Variablen. In diesem speziellen Beispiel text-mode-hookwird erstellt und sein Anfangswert ist nil. Der Anpassungsoberfläche wird auch mitgeteilt, dass die empfohlenen Werte in dieser Liste turn-on-auto-fillund sind flyspell-mode. Sie können jedoch text-mode-hookprogrammgesteuert alles einstellen , was Sie möchten. Dies ist eine normale Variable. Sie können es auch add-hookmit anderen Funktionen verwenden.
Mark Karpov
@ 147, mit anderen Worten, alle Schlüsselwortargumente sind nur Hinweise für das Anpassungssystem, sie machen außerhalb keinen Unterschied. Ohne die Hinweise, die der Code beträgt (defvar text-mode-hook nil).
Mark Karpov
Aber wird auf diese defcustomWeise der Haken ursprünglich erstellt? So sieht es aus. Mit anderen Worten, dieses Beispiel stammt aus der Tiefe des Emacs-Codes.
147 Uhr
@ 147pm, ja, richtig.
Mark Karpov