Setel ulang variabel ubahsuaian ke nilai default secara terprogram

25

T: Menggunakan Elisp, bagaimana saya bisa mereset variabel ke nilai defaultnya tanpa mengetahui nilai itu?

Saya mencoba mencari cara untuk melakukan ini dengan memunculkan antarmuka Customize untuk variabel yang saya atur ke nilai non-default dalam file init saya dan menekan C-h kdiikuti dengan klik pada tombol "Kembalikan ...". Itu memunculkan dokumentasi untuk widget-button-click, yang jelas tidak banyak membantu. (Demikian pula, C-h k RETdengan titik pada tombol menunjukkan bantuan Custom-newline, yang juga bukan yang saya cari.)

itu hanya
sumber
3
Terkait, untuk vars non-kustom: emacs.stackexchange.com/q/10800/50
Malabarba

Jawaban:

23

C-hig (elisp) Variable Definitions

Secara internal, defcustommenggunakan properti simbol standard-valueuntuk merekam ekspresi untuk nilai standar, saved-valueuntuk merekam nilai yang disimpan oleh pengguna dengan buffer kustomisasi, dan customized-valueuntuk merekam nilai yang ditetapkan oleh pengguna dengan buffer kustomisasi, tetapi tidak disimpan. Lihat Properti Simbol . Properti ini adalah daftar, caryang merupakan ekspresi yang mengevaluasi nilai.

Karenanya:

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

Perhatikan bahwa ini hanya berlaku untuk defcustomvariabel (yaitu "opsi pengguna"). Emacs tidak menyimpan nilai awal defvarvariabel di mana pun.

phils
sumber
3
Sebenarnya, Anda perlu mengevaluasi lembah dalam daftar. Contoh Anda harus diubah menjadi: (setq foo (eval (car (get 'foo 'standard-value))))Bentuk nilai default yang dihasilkan oleh defcustomadalah bentuk dengan fungsi dan penutupan (ini mungkin terjadi hanya ketika pengikatan leksikal diaktifkan)
Elias Mårtenson
Anda mungkin ingin menggunakan setq-defaultdaripada setqdalam kasus ini.
sanityinc
11

Cara lain yang mungkin lebih bersih untuk mereset nilai variabel:

custom-reevaluate-settingadalah fungsi Lisp yang dikompilasi di custom.el.

(custom-reevaluate-setting SYMBOL)

Atur ulang nilai SYMBOLdengan mengevaluasi kembali nilai yang disimpan atau standarnya. Gunakan :setfungsi untuk melakukannya. Ini berguna untuk opsi yang dapat disesuaikan yang ditentukan sebelum nilai standarnya dapat benar-benar dihitung. Misalnya, variabel yang dibuang yang standarnya bergantung pada informasi run-time.

Jadi misalnya:

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

akan mengganti nilai sebelumnya dengan simbol itu standard-value.

EDIT

Baca komentar @phils di bawah ini untuk detail yang sangat penting mengenai fungsi ini.

undostres
sumber
5
Catatan " disimpan atau nilai standar". Dalam urutan yang diutamakan. Jika pengguna telah disesuaikan dan disimpan nilai untuk variabel, fungsi ini me-reset ke nya saved-value, tidak nya standard-value.
phils