Ripristina la variabile personalizzata al valore predefinito a livello di codice


25

D: Utilizzando Elisp, come posso ripristinare una variabile al suo valore predefinito senza sapere quale sia quel valore?

Ho provato a capire come farlo aprendo l' interfaccia Personalizza per una variabile che ho impostato su un valore non predefinito nel mio file init e premendo C-h kseguito da un clic sul pulsante "Ripristina ...". Ciò ha portato alla documentazione per widget-button-click, che ovviamente non ha aiutato molto. (Allo stesso modo, C-h k RETcon il punto sul pulsante mostra aiuto per Custom-newline, che non è anche quello che sto cercando.)


3
Correlato, per i var
Malabarba

Risposte:


23

C-hig (elisp) Variable Definitions

Internamente, defcustomutilizza la proprietà symbol standard-valueper registrare l'espressione per il valore standard, saved-valueper registrare il valore salvato dall'utente con il buffer di personalizzazione e customized-valueper registrare il valore impostato dall'utente con il buffer di personalizzazione, ma non salvato. Vedi Proprietà dei simboli . Queste proprietà sono elenchi, il carcui è un'espressione che valuta il valore.

Quindi:

(setq foo (eval (car (get 'foo 'standard-value))))

Si noti che ciò si applica solo alle defcustomvariabili (ad esempio "opzioni utente"). Emacs non salva il valore iniziale di una defvarvariabile da nessuna parte.


3
In realtà, è necessario valutare il valore nel plist. Il tuo esempio dovrebbe essere modificato in: (setq foo (eval (car (get 'foo 'standard-value))))Il modulo di valore predefinito generato da defcustomè un modulo con un funcall e una chiusura (ciò può avvenire solo quando è abilitata l'associazione lessicale)
Elias Mårtenson,

Probabilmente vuoi usare setq-defaultpiuttosto che setqin questo caso.
sanityinc

11

Un altro modo, probabilmente più pulito, per ripristinare il valore di una variabile:

custom-reevaluate-settingè una funzione Lisp compilata in custom.el.

(custom-reevaluate-setting SYMBOL)

Reimpostare il valore di SYMBOLrivalutando il valore salvato o standard. Utilizzare la :setfunzione per farlo. Ciò è utile per le opzioni personalizzabili definite prima che il loro valore standard possa essere realmente calcolato. Ad esempio variabili di cui il dump dipende dalle informazioni di runtime.

Quindi per esempio:

(custom-reevaluate-setting 'emms-player-next-function)

sostituirà il valore precedente con quello di quel simbolo standard-value.

MODIFICARE

Leggi il commento @phils di seguito per un dettaglio molto importante riguardo a questa funzione.


5
Nota " valore salvato o standard". In quell'ordine di precedenza. Se l'utente ha personalizzato e salvato un valore per la variabile, questa funzione lo reimposta sulla sua saved-value, non sulla sua standard-value.
phils,
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.