Zresetuj programowo zmienną niestandardową do wartości domyślnej

25

P: W jaki sposób przy pomocy Elisp mogę zresetować zmienną do wartości domyślnej, nie wiedząc, co to jest?

Próbowałem wymyślić, jak to zrobić, uruchamiając interfejs Dostosuj dla zmiennej, którą ustawiłem na wartość inną niż domyślna w moim pliku inicjującym, i naciskając, C-h ka następnie klikając przycisk „Przywróć ...”. To przywołało dokumentację widget-button-click, która oczywiście niewiele pomogła. (Podobnie, C-h k RETz punktem na przycisku pokazuje pomoc Custom-newline, której też nie szukam.)

itsjeyd
źródło
3
Powiązane, w przypadku niestandardowych zmiennych: emacs.stackexchange.com/q/10800/50
Malabarba

Odpowiedzi:

23

C-hig (elisp) Variable Definitions

Wewnętrznie defcustomużywa właściwości symbol standard-valuedo rejestrowania wyrażenia wartości standardowej, saved-valuedo rejestrowania wartości zapisanej przez użytkownika w buforze dostosowywania oraz customized-valuedo rejestrowania wartości ustawionej przez użytkownika w buforze dostosowywania, ale nie zapisanej. Zobacz Właściwości symbolu . Te właściwości są listami, carktórych wyrażenie jest wartościowane.

Stąd:

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

Zauważ, że dotyczy to tylko defcustomzmiennych (tj. „Opcji użytkownika”). Emacs nigdzie nie zapisuje wartości początkowej defvarzmiennej.

phils
źródło
3
W rzeczywistości musisz ocenić dolinę w plist. Twój przykład powinien zostać zmieniony na: (setq foo (eval (car (get 'foo 'standard-value))))Domyślny formularz wartości generowany przez defcustomto formularz z funcall i zamknięciem (możliwe, że dzieje się tak tylko wtedy, gdy włączone jest wiązanie leksykalne)
Elias Mårtenson
Prawdopodobnie chcesz użyć setq-defaultzamiast setqw tym przypadku.
sanityinc
11

Kolejny, prawdopodobnie czystszy sposób resetowania wartości zmiennej:

custom-reevaluate-settingjest skompilowaną funkcją Lisp w custom.el.

(custom-reevaluate-setting SYMBOL)

Zresetuj wartość SYMBOL, ponownie oceniając jej zapisaną lub standardową wartość. :setAby to zrobić, użyj funkcji. Jest to przydatne w przypadku konfigurowalnych opcji, które są zdefiniowane, zanim ich standardowa wartość będzie mogła zostać obliczona. Np. Zmienne po cenach dumpingowych, których domyślna wartość zależy od informacji o czasie wykonywania.

Na przykład:

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

zastąpi poprzednią wartość tym symbolem standard-value.

EDYTOWAĆ

Przeczytaj komentarz @phils poniżej, aby uzyskać bardzo ważny szczegół dotyczący tej funkcji.

cofnie się
źródło
5
Uwaga „ wartość zapisana lub standardowa”. W tej kolejności. Jeśli użytkownik dostosował i zapisał wartość zmiennej, ta funkcja resetuje ją do jej saved-value, a nie do niej standard-value.
phils