Vantaggi dell'impostazione delle variabili con setq anziché custom.el?


69

Vedo molte persone (autori di estensioni e altri) fornire esempi di configurazione con setq:

(setq foo 'bar)

Questi parametri sono spesso definiti con defcustom, rendendoli disponibili per la personalizzazione custom.el.

Di solito lo uso custom.elper impostarli. Ci sarebbe qualche vantaggio nell'usare setqinvece o i due metodi sono approssimativamente equivalenti?

Risposte:


86

Alcune persone potrebbero pensare che sia più semplice da usare setq. Alcune persone potrebbero pensare che sia più nitido. In realtà, è ingenuo nel caso generale.

È vero che per alcune opzioni utente non importa. Ma per altri è importante ed setqè l'approccio sbagliato per quelle opzioni. Quindi, come regola generale, setqè l'approccio sbagliato.

Se si utilizza custom-set-variableso customize-set-variableinvece di setq, o se si utilizza l'interfaccia utente personalizzata (ad es. M-x customize-option), Si è certi che qualsiasi codice di inizializzazione o aggiornamento previsto per il valore dell'opzione verrà automaticamente attivato ed eseguito secondo necessità. Se lo usi setq, questo non sarà fatto.

Ora, è anche vero che la maggior parte delle opzioni utente, in particolare molte delle quali scritte per le librerie terze parti, non fanno uso delle defcustomparole chiave :sete :initialize, e l'utilizzo setqnon ha importanza per loro. Ma molte opzioni Emacs alla vaniglia usano tali parole chiave e, per quelle che lo fanno, setqnon è la cosa giusta. Quindi, se si desidera utilizzare il codice Lisp e non l'interfaccia utente personalizzata per impostare le opzioni, è meglio usare custom-set-variableso customize-set-variableinvece di setq. Non fa mai male e talvolta aiuta (molto).

Ma ciò che consiglio è di fare entrambe queste cose:

  • Utilizzare l'interfaccia utente personalizzata invece di scrivere il codice Lisp per questo.

  • Definire la variabilecustom-file , in modo che Personalizza scriva le personalizzazioni nel file e non nel file init ( ~/.emacs). IOW, mantieni il tuo codice di inizializzazione scritto a mano separato dal codice automatico scritto da Personalizza.


5
Penso che valga la pena ricordare che anche con i parametri: set e: initialize, setq funziona ancora se viene letto prima che il pacchetto venga caricato.
Malabarba,

2
@Willyfrog Puoi votarlo!
Zane Shelby,

17
non sono sicuro di questo Drew. L'intera cosa di personalizzazione è piuttosto complessa. Senza di esso, il sistema emacs è molto più semplice. La personalizzazione è un livello che non si combina esattamente bene con elisp. Per prima cosa, ordina tutti gli varati in ordine alfabetico. Inoltre, molte personalizzazioni non riguardano variabili (ad es. Hook, chiavi), quindi non è possibile utilizzare personalizza. Quindi hai comunque una situazione di codice elisp manuale.
Xah Lee,

4
@XahLee. Bene, ne sono sicuro. ;-) Ma sì, personalizzare è quello che è. Non è la cosa migliore per chiavi, ganci, parole chiave di blocco dei caratteri, tabelle di visualizzazione, ecc. Ma per quello che fa (opzioni e facce), funziona abbastanza bene. Non che l' interfaccia utente sia meravigliosa, ma la gestione dei trigger, il controllo del tipo, ecc. Sono utili. Vorrei anche che i programmatori potessero (facoltativamente) usare cose come :typecon defvar- Non penso che dovrebbe essere limitato alle opzioni dell'utente. Sfortunatamente, molti programmatori sono pigri nel loro uso :typee il risultato non è molto utile (non è colpa di Personalizza).
Drew

2
Punto dati: Nelle mie 3.300 righe di codice di inizializzazione di Emacs sviluppate nella parte migliore di un anno, sono stato morso usando setqanziché customize-set-variableesattamente una volta. (Una volta era per auto-revert-interval, e in seguito mi sono reso conto che l'utilizzo setq prima del caricamento autorevertera in realtà molto più veloce dell'uso customize-set-variable.)
Radon Rosborough,

38

Preferisco setqpiù customizeper diversi motivi:

  1. Innanzitutto, consente di impostare programmaticamente le variabili (come in, (setq foo (calculate-foo))). Uso questo potere continuamente nella mia configurazione per mantenere le cose ASCIUTTE. Per me, il punto centrale dell'utilizzo di Emacs è la programmabilità e l' customizeinterfaccia non fa altro che ostacolare.
  2. setqsi presta meglio al controllo della versione e all'organizzazione del codice. Ho diviso la mia inizializzazione tra dozzine di file; se tutto fosse in un unico enorme custom.elfile, sarebbe molto più difficile trovare e modificare rapidamente le impostazioni.
  3. Questo è soggettivo, ma per me l'intera customizeinterfaccia sembra un'orribile reliquia delle peggiori interfacce utente degli anni '90. Preferirei modificare il testo con il potere di Emacs ogni giorno.

@Drew fa alcuni punti positivi su alcune sottigliezze con :sete :initialize. Uso Emacs da anni e raramente ho riscontrato problemi del genere. Quando lo faccio, è facile scambiare setqper custom-set-variablein casi specifici.


10
1. Puoi impostare le variabili personalizzate programmaticamente con customize-set-variable(s), ed è meglio a causa dei trigger che eseguono automaticamente. 2. È possibile utilizzare vari comandi di personalizzazione per visualizzare tutte le variabili impostate e / o salvate in gerarchie diverse, in modo da ottenere automaticamente l'organizzazione di gruppi diversi senza dover utilizzare file separati nel controllo della versione. 3. È migliorato molto. Se non ti piace l'interfaccia utente, puoi comunque utilizzare personalizza in modo programmatico e tramite i comandi interattivi che evitano la modalità di personalizzazione per ottenere tutti gli altri vantaggi dell'utilizzo di personalizza.
Nick McCurdy,

24

Un vantaggio dell'utilizzo setqanziché della customizeleggibilità. Uno è libero di annotare ogni personalizzazione a proprio piacimento quale IMO migliora la leggibilità. Si possono anche raggruppare le personalizzazioni correlate che migliorano la modularità. Infine, direi che navigare attraverso un buffer elisp è più "facile" che navigare nell'interfaccia utente e nei widget personalizzati.

D'altra parte, personalizzare consente di ripristinare facilmente i valori predefiniti che possono essere inestimabili quando le cose vanno in tilt.

EDIT: la risposta di Drew fornisce un ottimo motivo per utilizzare customize-set-variablesche può fornire tutti i vantaggi che ho sottolineato. Tuttavia, l'interfaccia utente personalizzata non si presta a configurazioni portatili tra piattaforme diverse con la stessa facilità di elisp raw. Se si richiede che una variabile abbia un'impostazione dipendente dal sistema operativo, in molti casi sarà necessario eseguire il fallback su elisp. Il mio punto sulla navigazione più semplice nei buffer elisp è ancora valido.


Puoi anche ripristinare il valore predefinito con setq, basta commentare la setqriga e riavviare emacs.
T. Verron,

3
Sì, ma la personalizzazione può tornare indietro senza fastidiosi riavvii. Molto utile per provare nuove impostazioni.
Vamsi,

2
Per quanto riguarda l'annotazione, l'interfaccia di personalizzazione consente di aggiungere un commento a ciascuna variabile modificata.
Andrew Swann,

custom-set-variables è "raw elisp", e lo uso ogni giorno su più macchine. Copialo dal punto in cui personalizza lo scrive (se non l'hai scritto tu stesso).
Croad Langshan,

L'interfaccia <kbd> Mx personalizza- * </kbd> ha un campo "commento" che consente di memorizzare un commento insieme a una variabile.
kdb,

-1

Un'altra alternativa è quella di utilizzare il pacchetto d' uso di John Wiegley . Questo fornisce un modo programmatico per configurare i pacchetti che funzionano bene con il processo di inizializzazione dei pacchetti di emacs 24+. Ecco un esempio di utilizzo dal readme:

(use-package color-moccur
  :commands (isearch-moccur isearch-all)
  :bind (("M-s O" . moccur)
         :map isearch-mode-map
         ("M-o" . isearch-moccur)
         ("M-O" . isearch-moccur-all))
  :custom (isearch-lazy-highlight t)
  :config (use-package moccur-edit))

Il punto è che use package è una macro e non valuta immediatamente i suoi argomenti. I parametri :inite :configvengono valutati in diverse fasi del processo di inizializzazione, rendendo possibile avere la configurazione di ciascun pacchetto in un posto, ma ogni parte deve essere eseguita nella fase appropriata di inizializzazione.

Senza qualcosa come use-packagealcuni pacchetti richiedono una parte del loro codice di inizializzazione prima (package-initialize)e un'altra parte da seguire. Se hai molti packegas del genere, le loro inizializzazioni dovrebbero essere intercalate.

Un altro vantaggio use-packageè che può installare automaticamente i pacchetti mancanti dall'uso di package.el se porti .emacs su un nuovo computer o se condividi la configurazione con un altro utente e tutta l'inizializzazione può essere rinviata fino a quando un pacchetto non deve essere effettivamente caricato.

Esistono inoltre argomenti per parole chiave aggiuntive che consentono un maggiore controllo sul processo di inizializzazione.

Detto questo, un grande vantaggio di personalizzare è che ti mostra cosa c'è da configurare in un determinato pacchetto. Questo è uno dei motivi per cui lo uso ancora per molti dei miei pacchetti.


2
Questo in realtà non risponde alla domanda. Nella tua stessa risposta, usi setq senza una spiegazione del perché.
J David Smith,

3
Penso che esso use-packagestesso offra vantaggi in termini di configurazione modulare e anche di importazione e configurazione di pacchetti in un unico posto. Ma sì, l'esempio sta usando setq. Potrebbe averlo usato anche customize-set-variablequi? Non ne sono sicuro. Potremmo / dovremmo scambiarlo (o customize-set-value) con setq?
Mike

4
Modifica l'esempio per utilizzarlo con la :customparola chiave.
Toon Claes,
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.