Benutzerdefinierte Variable programmgesteuert auf Standardwert zurücksetzen

25

F: Wie kann ich mit Elisp eine Variable auf ihren Standardwert zurücksetzen, ohne zu wissen, um welchen Wert es sich handelt?

Ich habe versucht, herauszufinden, wie das geht, indem ich die Customize-Oberfläche für eine Variable aufgerufen habe , die ich in meiner Init-Datei auf einen anderen Wert als den Standardwert gesetzt habe, und C-h kdann auf "Zurücksetzen ..." geklickt habe. Das brachte die Dokumentation für widget-button-click, was offensichtlich nicht viel half. (Ebenso wird C-h k RETmit Punkt auf dem Button Hilfe angezeigt Custom-newline, was auch nicht das ist, wonach ich suche.)

itsjeyd
quelle
3
In Verbindung
stehend

Antworten:

23

C-hig (elisp) Variable Definitions

defcustomVerwendet intern die symbol -Eigenschaft standard-value, um den Ausdruck für den Standardwert saved-valueaufzuzeichnen, den vom Benutzer mit dem Anpassungspuffer gespeicherten Wert customized-valueaufzuzeichnen und den vom Benutzer mit dem Anpassungspuffer festgelegten, aber nicht gespeicherten Wert aufzuzeichnen. Siehe Symboleigenschaften . Diese Eigenschaften sind Listen, deren carAusdruck den Wert ergibt.

Daher:

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

Beachten Sie, dass dies nur für defcustomVariablen gilt (dh "Benutzeroptionen"). Emacs speichert den Anfangswert einer defvarVariablen nirgendwo.

Phils
quelle
3
Eigentlich müssen Sie das Tal in der Liste auswerten. Ihr Beispiel sollte geändert werden in: (setq foo (eval (car (get 'foo 'standard-value))))Das von generierte Standardwertformular defcustomist ein Formular mit einem Funktionsaufruf und einem Abschluss (dies geschieht möglicherweise nur, wenn die lexikalische Bindung aktiviert ist)
Elias Mårtenson,
Sie möchten wahrscheinlich setq-defaulteher als setqin diesem Fall verwenden.
Sanityinc
11

Eine andere, wahrscheinlich sauberere Möglichkeit, den Wert einer Variablen zurückzusetzen:

custom-reevaluate-settingist eine kompilierte Lisp-Funktion in custom.el.

(custom-reevaluate-setting SYMBOL)

Setzen Sie den Wert von zurück, SYMBOLindem Sie den gespeicherten Wert oder den Standardwert erneut auswerten. Verwenden Sie dazu die :setFunktion. Dies ist nützlich für anpassbare Optionen, die definiert werden, bevor der Standardwert tatsächlich berechnet werden kann. ZB gedumpte Variablen, deren Standard von den Laufzeitinformationen abhängt.

Also zum Beispiel:

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

ersetzt den vorherigen Wert durch das Symbol standard-value.

BEARBEITEN

Lesen Sie den @phils-Kommentar unten, um ein sehr wichtiges Detail zu dieser Funktion zu erfahren.

undostres
quelle
5
Hinweis " gespeichert oder Standardwert". In dieser Rangfolge. Wenn der Benutzer einen Wert für die Variable angepasst und gespeichert hat, setzt diese Funktion ihn auf seinen zurück saved-value, nicht auf seinen standard-value.
Phils