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

itsjeyd
la source
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.

phils
la source
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.

undostres
la source
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