Come usare correttamente defcustom?


15

Come la maggior parte degli utenti di Emacs, ho personalizzato una modalità modificando le variabili. Ciò che non mi è mai venuto in mente è l'intera mentalità di programmazione che sta dietro la possibilità di personalizzare questo e quello. Me ne sono reso conto quando ho iniziato a cercare un po 'del codice sorgente di eshell. Non sono un programmatore elisp, ma in particolare em-ls.elsembra usare defcustom, defgroupecc. Questo sembrerebbe essere un mondo ombra di variabili definite a livello globale che utilizza il codice elisp. Quindi una domanda sarebbe: l'uso di defcustomun altro modo di fare variabili globali (personalizzabili)?

Qualcuno può indicarmi come usare correttamente (prima capire) l'idea alla base defcustom, quando usare, perché, quando no? Forse un esempio per principianti per un principiante elisp.


Potresti chiarire cosa stai chiedendo? Vuoi sapere quando utilizzare le customizestrutture rispetto a quando personalizzare a mano? Oppure sei interessato a scrivere una modalità? Quest'ultima è la situazione in cui potresti trovarti a usare cose simili defcustome simili.
Dan

Risposte:


20

Il sistema di personalizzazione è una funzionalità integrata di Emacs progettata per risolvere con precisione il problema che descrivi: la programmazione potrebbe non essere il modo ideale per l'utente medio di configurare il proprio editor.

Il punto di accesso principale alla funzionalità di personalizzazione è M-x customize RET(o Options > Customize Emacs > Top-level Customization Groupdal menu). Da lì vedrai un sistema di menu interattivo per regolare le impostazioni. Questa interfaccia impone che tutte le impostazioni siano del tipo corretto (numero, stringa, colore, ecc.), Evitando un'importante fonte di errore riscontrata quando gli utenti configurano Emacs a livello di codice. Se l'utente sceglie di mantenere le modifiche apportate tramite l'interfaccia utente, le impostazioni vengono archiviate in una sezione speciale nel file di inizializzazione dell'utente (leggi:) .emacs.

defcustomracchiude le funzionalità di Emacs Lisp di livello inferiore in modo defvarche entrambe dichiarino la variabile e la rendano visibile nell'interfaccia di personalizzazione. Inoltre, consente allo sviluppatore di fornire metadati extra necessari per visualizzare un controllo interattivo appropriato, ovvero quale tipo di valore è archiviato in questa variabile? Una stringa arbitraria? Un numero? Una scelta da un set fisso di opzioni? ecc. defgroupè un costrutto di raggruppamento per queste opzioni personalizzabili in modo che possano essere organizzate in una bella gerarchia.

Questa funzionalità deve essere utilizzata ogni volta che un dato deve essere considerato un'opzione configurabile per l'utente piuttosto che un dettaglio interno della libreria.

Ecco un semplice esempio paralizzato da una mia piccola biblioteca:

(defgroup checkbox nil
  "Quick manipulation of textual checkboxes."
  :group 'convenience)

(defcustom checkbox-states '("[ ]" "[x]")
  "Checkbox states to cycle between.
First item will be the state for new checkboxes."
  :group 'checkbox
  :type '(repeat string))

Il defgroupcrea un nuovo gruppo all'interno dell'interfaccia di personalizzazione sotto il livello superiore conveniencevoce. Avevo quindi bisogno di una variabile per memorizzare i possibili stati della casella di controllo. Avrei potuto usare defvar, ma poiché voglio che sia facilmente personalizzabile, ho scelto di usare defcustom. La :groupparte indica che appartiene al gruppo precedentemente definito e :typeindica che è una sequenza di stringhe. C'è anche un valore predefinito e una descrizione. Ci sono anche servizi aggiuntivi (non mostrati qui) per la trasformazione dei valori inseriti dall'utente.

Se ora corro M-x customize RETe navigo verso Convenience > Checkbox, vedo quanto segue:

interfaccia di personalizzazione

Non è l'interfaccia più bella del mondo, ma nota che ha strumenti interattivi per personalizzare il valore di "Stati checkbox" ( checkbox-statesinternamente). Mostra i valori di stringa correnti insieme ai pulsanti INS(inserisci) e DEL(elimina) e ci consente di modificare i valori di stringa nelle caselle di modifica. Al termine possiamo decidere se applicare le modifiche, ripristinarle o applicarle e salvarle per sessioni future.


2
Buon post! I vantaggi più significativi della personalizzazione (e defcustom) sono che si occupa automaticamente di : (1) controllo del tipo , per aiutarti a impedire di assegnare un valore errato a una variabile (a condizione che lo scrittore abbia defcustomfatto lo sforzo di fornire un tipo ragionevole check), (2) inizializzazione ( :initialize) e aggiornamento delle frasi (attivate) ( :set).
Estratto il

Grazie! Ho aggiornato il post per riflettere i tuoi suggerimenti.
Camdez,

7

L'uso di defcustom è un altro modo di fare variabili globali (personalizzabili)?

Sì. Soprattutto se desideri che gli utenti del tuo codice possano cambiare facilmente le variabili attraverso l' interfaccia di personalizzazione di Mx .

defcustom offre due importanti vantaggi ai tuoi utenti: documentazione e sicurezza dei tipi. È bello avere la documentazione lì. La sicurezza dei tipi consente di specificare quali tipi di valori validi possono assumere le variabili.

Naturalmente defvar va bene se tutto ciò che stai facendo è personalizzare per te stesso e non anticipare un uso più ampio. Tuttavia, alcuni direbbero che restare fedeli ai defc fino in fondo è una buona abitudine da inculcare.

Qualcuno può indicarmi come illuminato su come utilizzare correttamente ...

La pagina di manuale di defcustom contiene ulteriori chiarimenti. L'argomento delle personalizzazioni nel manuale contiene dettagli completi.

... quando usare, perché, quando no?

Personalmente trovo il defcustom meno ingombrante durante lo sviluppo in quanto non devo affrontare i problemi di ricarica con defvar e setq.

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.