Réinitialiser par programmation la variable personnalisée à sa valeur par défaut


25

Q: En utilisant Elisp, comment puis-je réinitialiser une variable à sa valeur par défaut sans savoir quelle est cette valeur?

J'ai essayé de comprendre comment faire cela en ouvrant l' interface de personnalisation pour une variable que j'ai définie à une valeur non par défaut dans mon fichier init et en appuyant sur, C-h kpuis en cliquant sur le bouton "Revert ...". Cela a amené la documentation pour widget-button-click, ce qui n'a évidemment pas beaucoup aidé. (De même, C-h k RETavec un point sur le bouton, l'aide s'affiche Custom-newline, ce qui n'est pas non plus ce que je recherche.)


3
Connexes, pour les vars non personnalisés: emacs.stackexchange.com/q/10800/50
Malabarba

Réponses:


23

C-hig (elisp) Variable Definitions

En interne, defcustomutilise la propriété symbol standard-valuepour enregistrer l'expression de la valeur standard, saved-valuepour enregistrer la valeur enregistrée par l'utilisateur avec le tampon de personnalisation et customized-valuepour enregistrer la valeur définie par l'utilisateur avec le tampon de personnalisation, mais pas enregistrée. Voir Propriétés des symboles . Ces propriétés sont des listes, cardont une expression qui évalue la valeur.

Par conséquent:

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

Notez que cela ne s'applique qu'aux defcustomvariables (c'est-à-dire "options utilisateur"). Emacs n'enregistre defvarnulle part la valeur initiale d'une variable.


3
En fait, vous devez évaluer le val dans le plist. Votre exemple devrait être changé en: (setq foo (eval (car (get 'foo 'standard-value))))Le formulaire de valeur par défaut généré par defcustomest un formulaire avec un appel et une fermeture (cela ne se produit probablement que lorsque la liaison lexicale est activée)
Elias Mårtenson

Vous voudrez probablement utiliser setq-defaultplutôt que setqdans ce cas.
sanityinc

11

Une autre façon, probablement plus propre, de réinitialiser la valeur d'une variable:

custom-reevaluate-settingest une fonction Lisp compilée dans custom.el.

(custom-reevaluate-setting SYMBOL)

Réinitialisez la valeur de SYMBOLen réévaluant sa valeur enregistrée ou standard. Utilisez la :setfonction pour le faire. Ceci est utile pour les options personnalisables qui sont définies avant que leur valeur standard puisse vraiment être calculée. Par exemple, les variables vidées dont la valeur par défaut dépend des informations d'exécution.

Ainsi, par exemple:

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

remplacera la valeur précédente par celle de ce symbole standard-value.

MODIFIER

Lisez le commentaire @phils ci-dessous pour un détail très important concernant cette fonction.


5
Notez " valeur enregistrée ou standard". Dans cet ordre de priorité. Si l'utilisateur a personnalisé et enregistré une valeur pour la variable, cette fonction la réinitialise à la sienne saved-value, pas à la sienne standard-value.
phils
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.