Qu'est-ce qu'un crochet?

8

Juste pour clarifier ... Par exemple, dans ce document :

Un hook est une variable Lisp qui contient une liste de fonctions, à appeler à une occasion bien définie. (Cela s'appelle exécuter le hook.) Les fonctions individuelles de la liste sont appelées les fonctions de hook du hook. Par exemple, le hook kill-emacs-hooks'exécute juste avant de quitter Emacs ...

Je pense que cela veut dire qu'il y a une variable (symbole) nommée kill-emacs-hookqui représente une liste d'un ensemble de "fonctions de crochet" qui s'exécutera lorsque le kill-emacs-hookest évalué, réalisant ainsi ces fonctions. Correct? alors

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

ajoute auto-fill-modeà cette liste identifiée par text-mode-hooken plus de ce qui existe déjà. Bien. maintenant , ce

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

où il semble que nous créons ou modifions le text-mode-hook. Je suis maintenant confus quant à la nature des crochets et à leur relation avec defcustom. Mon choix logique est que ce code crée une variable text-mode-hookqui est de "type" (je ne sais pas ce que l'on entend par types dans elisp) hook. Est-ce, en effet, censé être la création initiale du crochet text-mode-hook? Si oui, que se passe-t-il avec les "options"? S'agit-il des fonctions de crochet supposées, ou autre chose?

147pm
la source
1
A partir de votre lien: «Le mot clé: options spécifie une liste de valeurs suggérées pour la variable. Habituellement,: les options s'appliquent à un crochet. La liste n'est qu'une suggestion; ce n'est pas exclusif; une personne qui définit la variable peut la définir sur d'autres valeurs; la liste affichée à la suite du mot-clé: options est destinée à offrir des choix pratiques à un utilisateur. »
The Sidhekin

Réponses:

6

Votre compréhension de la notion de crochet Emacs Lisp est absolument correcte. En effet, les hooks «normaux» ne sont que des listes de fonctions (chaque fonction ne prend pas d'arguments, sinon elle n'est généralement pas appelée «hook» ou «hook normal» dans Emacs Lisp).

La plupart de ces variables ont des noms se terminant par -hook. Ce sont des crochets normaux, exécutés au moyen de run-hooks. La valeur d'un tel crochet est une liste de fonctions; les fonctions sont appelées sans argument et leurs valeurs sont complètement ignorées. La façon recommandée de mettre une nouvelle fonction sur un tel crochet est d'appeler add-hook.

Les variables dont les noms se terminent par -functionssont généralement des hooks anormaux (certains anciens codes peuvent également utiliser le -hookssuffixe obsolète ); leurs valeurs sont des listes de fonctions, mais ces fonctions sont appelées d'une manière spéciale (ce sont des arguments passés ou leurs valeurs de retour sont utilisées). Les variables dont les noms se terminent par -functionont des fonctions uniques comme valeurs.

L'interface de personnalisation est une chose différente. Toute la différence entre defvaret defcustomest que ce dernier permet à l'utilisateur d'éditer la variable via l'interface «personnaliser». Cette interface peut faciliter l' édition de certains types de données, donc par exemple si vous dites que :typede text-mode-hookest hook, alors l' interface de personnalisation fait en sorte que text-mode-hooktoujours une liste de fonctions. De plus, vous pouvez spécifier quelles options sont recommandées avec :optionsargument.

Ainsi, votre compréhension est correcte et defcustomses options ne sont qu'un moyen d'instruire Emacs, afin qu'il puisse mieux aider l'utilisateur lorsqu'il utilise l'interface de «personnalisation».

Mark Karpov
la source
Mais cet exemple de a defcustomn'est pas grand car text-mode-hookexiste déjà; c'est déjà inclus. Droite? Maintenant, si j'écrivais mon propre mode et que je voulais une personnalisation, je le ferais. Ma confusion est que cet exemple crée vraiment text-mode-hook, ne le modifie pas. Est-ce une bonne compréhension? Et si cela crée effectivement un nouveau text-mode-hook, le :optionspropose ces deux fonctions comme options pour faire un add-hookà la liste, non?
147pm
@ 147pm, cet exemple vous montre simplement comment une partie du code existant d'Emacs définit une variable personnalisable qui représente le hook. En bref, defcustomdéfinit simplement de nouvelles variables. Dans cet exemple particulier text-mode-hookest créé et sa valeur initiale est nil. L'interface de personnalisation est également informée que les valeurs recommandées à avoir dans cette liste sont turn-on-auto-fillet flyspell-mode. Vous pouvez cependant définir text-mode-hookce que vous voulez par programme, c'est une variable normale. Vous pouvez également l'utiliser add-hookavec d'autres fonctions.
Mark Karpov
@ 147, en d'autres termes, tous les arguments de mots clés ne sont que des conseils pour le système de personnalisation, ils ne font aucune différence en dehors de celui-ci. Sans les indices que le code équivaut à (defvar text-mode-hook nil).
Mark Karpov
Mais est-ce defcustomainsi que le crochet est initialement créé? Voilà à quoi ça ressemble. En d'autres termes, cet exemple est pris quelque part dans les entrailles du code Emacs.
147 pm
@ 147pm, oui, correct.
Mark Karpov