¿Qué es un gancho?

8

Solo para aclarar ... Por ejemplo, en este documento :

Un gancho es una variable de Lisp que contiene una lista de funciones, que se llamará en alguna ocasión bien definida. (Esto se llama ejecutar el gancho). Las funciones individuales de la lista se denominan funciones de gancho del gancho. Por ejemplo, el gancho se kill-emacs-hookejecuta justo antes de salir de Emacs ...

Creo que está diciendo que hay una variable (símbolo) nombrada kill-emacs-hookque representa una lista de un conjunto de "funciones de enlace" que se ejecutarán cuando kill-emacs-hookse evalúe, realizando así esas funciones. ¿Correcto? Entonces

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

está agregando auto-fill-modea esa lista identificada text-mode-hookademás de lo que ya está allí. Bueno. Ahora esto

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

donde parece que estamos creando o alterando el text-mode-hook. Ahora estoy confundido sobre la naturaleza de los ganchos y su relación con ellos defcustom. Mi elección lógica es que este código está creando una variable text-mode-hookque es de "tipo" (no sé qué se entiende por tipos en elisp) hook. ¿Se supone que esta es la creación inicial del gancho text-mode-hook? Si es así, ¿qué pasa con las "opciones"? ¿Son esas las supuestas funciones de gancho, o algo más?

147pm
fuente
1
Desde su enlace: «La palabra clave: options especifica una lista sugerida de valores para la variable. Por lo general, las opciones se aplican a un gancho. La lista es solo una sugerencia; no es exclusivo; una persona que establece la variable puede establecerla en otros valores; la lista que se muestra a continuación de la palabra clave: options está destinada a ofrecer opciones convenientes a un usuario ».
El Sidhekin

Respuestas:

6

Su comprensión de la noción de gancho de Emacs Lisp es absolutamente correcta. De hecho, los ganchos "normales" son solo listas de funciones (cada función no toma argumentos, de lo contrario no suele llamarse "gancho" o "gancho normal" en Emacs Lisp).

La mayoría de estas variables tienen nombres que terminan en -hook. Son ganchos normales, ejecutados por medio de run-hooks. El valor de dicho gancho es una lista de funciones; las funciones se llaman sin argumentos y sus valores se ignoran por completo. La forma recomendada de poner una nueva función en dicho enlace es llamar add-hook.

Las variables cuyos nombres terminan -functionsgeneralmente son ganchos anormales (algunos códigos antiguos también pueden usar el -hookssufijo en desuso ); sus valores son listas de funciones, pero estas funciones se llaman de forma especial (se pasan argumentos o se usan sus valores de retorno). Las variables cuyos nombres terminan en -functiontienen funciones individuales como sus valores.

La interfaz de personalización es una cosa diferente. Toda la diferencia entre defvary defcustomes que este último permite al usuario editar la variable a través de la interfaz "personalizar". Esta interfaz puede facilitar la edición de ciertos tipos de datos, por lo que por ejemplo, si usted está diciendo que :typede text-mode-hookes hook, entonces interfaz de personalización se asegura de que text-mode-hooksiempre es una lista de funciones. Además, puede especificar qué opciones se recomiendan con :optionsargumento.

Por lo tanto, su comprensión es correcta y defcustomsus opciones son solo una forma de instruir a Emacs, por lo que puede ayudar mejor al usuario cuando usa la interfaz "personalizar".

Mark Karpov
fuente
Pero este ejemplo de a defcustomno es genial porque text-mode-hookya existe; Ya está incluido. ¿Derecha? Ahora, si escribiera mi propio modo y luego quisiera personalizarlo, lo haría. Mi confusión es que este ejemplo realmente está creando text-mode-hook, no alterando. ¿Es eso un entendimiento correcto? Y si esto realmente está creando un nuevo text-mode-hook, :optionsestá ofreciendo esas dos funciones como opciones para hacer un add-hooka la lista, ¿verdad?
147pm
@ 147pm, este ejemplo solo muestra cómo alguna parte del código existente de Emacs define una variable personalizable que representa el gancho. En pocas palabras defcustomsolo define nuevas variables. En este ejemplo particular text-mode-hookse crea y su valor inicial es nil. La interfaz de personalización también dice que los valores recomendados para tener en esta lista son turn-on-auto-filly flyspell-mode. Sin embargo, puede configurar text-mode-hooklo que desee mediante programación, es una variable normal. Puede usar add-hookcon cualquier otra función también.
Mark Karpov
@ 147, en otras palabras, todos los argumentos de palabras clave son solo sugerencias para el sistema de personalización, no hacen ninguna diferencia fuera de él. Sin las pistas a las que equivale el código (defvar text-mode-hook nil).
Mark Karpov
¿Pero es así defcustomcomo se está creando inicialmente el gancho? Eso es lo que parece. En otras palabras, este ejemplo está tomado de las profundidades de las entrañas del código de Emacs en alguna parte.
147pm
@ 147pm, sí, correcto.
Mark Karpov