Che cos'è un gancio?


8

Giusto per chiarire ... Ad esempio, in questo documento :

Un hook è una variabile Lisp che contiene un elenco di funzioni, da chiamare in alcune occasioni ben definite. (Questo si chiama eseguendo il hook.) Le singole funzioni nell'elenco sono chiamate funzioni del hook del hook. Ad esempio, l'hook kill-emacs-hookviene eseguito appena prima di uscire da Emacs ...

Penso che stia dicendo che esiste una variabile (simbolo) kill-emacs-hookche rappresenta un elenco di un insieme di "funzioni hook" che verranno eseguite al momento della kill-emacs-hookvalutazione, eseguendo quindi tali funzioni. Corretta? Poi

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

sta aggiungendo auto-fill-modea quell'elenco identificato da text-mode-hookoltre a ciò che è già lì. Buona. Adesso questo

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

dove sembra che stiamo creando o alterando il file text-mode-hook. Ora sono confuso sulla natura dei ganci e sul loro rapporto con defcustom. La mia scelta logica è che questo codice stia creando una variabile text-mode-hookche è di "tipo" (non so cosa si intende per tipi in elisp) hook. Questa, in effetti, dovrebbe essere la creazione iniziale dell'amo text-mode-hook? In tal caso, cosa succede con le "opzioni?" Quelle sono le presunte funzioni hook o qualcos'altro?


1
Dal tuo link: «La parola chiave: options specifica un elenco suggerito di valori per la variabile. Di solito,: le opzioni si applicano a un hook. L'elenco è solo un suggerimento; non è esclusivo; una persona che imposta la variabile può impostarla su altri valori; l'elenco mostrato di seguito: la parola chiave options ha lo scopo di offrire una scelta conveniente a un utente. »
Il Sidhekin il

Risposte:


6

La tua comprensione della nozione di hook di Emacs Lisp è assolutamente corretta. In effetti, gli hook "normali" sono solo elenchi di funzioni (ogni funzione non accetta argomenti, altrimenti di solito non viene chiamata "hook" o "hook normale" in Emacs Lisp).

La maggior parte di queste variabili hanno nomi che terminano con -hook. Sono ganci normali, gestiti per mezzo di run-hooks. Il valore di tale hook è un elenco di funzioni; le funzioni vengono chiamate senza argomenti e i loro valori vengono completamente ignorati. Il modo consigliato di mettere una nuova funzione su un tale hook è chiamare add-hook.

Le variabili i cui nomi finiscono -functionssono in genere hook anormali (alcuni vecchi codici possono anche usare il -hookssuffisso deprecato ); i loro valori sono elenchi di funzioni, ma queste funzioni vengono chiamate in un modo speciale (vengono passati argomenti o vengono utilizzati i loro valori di ritorno). Le variabili i cui nomi finiscono -functionhanno singole funzioni come valori.

L'interfaccia di personalizzazione è una cosa diversa. Tutta la differenza tra defvare defcustomè che quest'ultima consente all'utente di modificare la variabile tramite l'interfaccia "personalizza". Questa interfaccia può facilitare la modifica di alcuni tipi di dati, così per esempio, se stai dicendo che :typedi text-mode-hookè hook, quindi l'interfaccia di personalizzazione fa in modo che text-mode-hooksia sempre un elenco di funzioni. Inoltre, è possibile specificare quali opzioni sono consigliate con :optionsargomento.

Quindi, la tua comprensione è corretta e le defcustomsue opzioni sono solo un modo per istruire Emacs, in modo che possa aiutare meglio l'utente quando usa l'interfaccia "personalizza".


Ma questo esempio di a defcustomnon è eccezionale perché text-mode-hookesiste già; è già incluso. Giusto? Ora, se avessi scritto la mia modalità e avessi voluto la personalizzazione, l'avrei fatto. La mia confusione è che questo esempio sta davvero creando text-mode-hook, non alterandolo. È una comprensione corretta? E se questo sta davvero creando un nuovo text-mode-hook, :optionssta offrendo quelle due funzioni come opzioni per fare una add-hooklista, giusto?
147pm,

@ 147pm, questo esempio mostra solo come una parte del codice esistente di Emacs definisce una variabile personalizzabile che rappresenta l'hook. In poche parole defcustomdefinisce solo nuove variabili. In questo esempio particolare text-mode-hookviene creato e il suo valore iniziale è nil. L'interfaccia di personalizzazione inoltre dice che i valori raccomandati da avere in questo elenco sono turn-on-auto-fille flyspell-mode. Tuttavia, puoi impostare text-mode-hookqualsiasi cosa ti piaccia a livello di programmazione, è una variabile normale. Puoi usarlo anche add-hookcon qualsiasi altra funzione.
Mark Karpov,

@ 147, in altre parole, tutti gli argomenti delle parole chiave sono solo suggerimenti per il sistema di personalizzazione, non fanno alcuna differenza al di fuori di esso. Senza i suggerimenti che il codice equivale a (defvar text-mode-hook nil).
Mark Karpov,

Ma è così defcustomche l'hook è stato inizialmente creato? Questo è quello che sembra. In altre parole, questo esempio è preso da qualche parte nelle viscere del codice Emacs.
147pm,

@ 147pm, sì, corretto.
Mark Karpov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.