通过编程将自定义变量重置为默认值


25

问:使用Elisp,如何在不知道变量值的情况下将变量重置为其默认值?

我试图找出解决方案,方法是为我在初始化文件中设置为非默认值的变量调出Customize接口C-h k然后按一下,然后单击“还原...”按钮。这就带来了的文档widget-button-click,这显然并没有太大帮助。(类似地,C-h k RET按钮上的点显示的帮助Custom-newline,这也不是我想要的。)


3
相关的,非定制的增值经销商:emacs.stackexchange.com/q/10800/50
Malabarba

Answers:


23

C-hig (elisp) Variable Definitions

在内部,defcustom使用symbol属性standard-value记录标准值的表达式,saved-value记录用户使用定制缓冲区保存的值,以及customized-value记录用户使用定制缓冲区设置但未保存的值。请参见符号属性。这些属性是列表,列表car的值是一个求值的表达式。

因此:

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

注意,这仅适用于defcustom变量(即“用户选项”)。Emacs不会在defvar任何地方保存变量的初始值。


3
实际上,您需要评估plist中的vale。您的示例应更改为:(setq foo (eval (car (get 'foo 'standard-value))))由生成的默认值表单defcustom是带有funcall和闭包的表单(只有在启用了词法绑定的情况下才可能发生)
EliasMårtenson2014年

您可能要使用setq-default而不是setq这种情况。
sanityinc 2014年

11

重置变量值的另一种可能更简洁的方法:

custom-reevaluate-setting是在中编译的Lisp函数custom.el

(custom-reevaluate-setting SYMBOL)

SYMBOL通过重新评估其保存或标准值来重置其值。使用该:set功能可以做到这一点。这对于在真正计算其标准值之前定义的可自定义选项很有用。例如,转储变量的默认值取决于运行时信息。

因此,例如:

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

将用该符号的替换先前的值standard-value

编辑

有关此功能的非常重要的详细信息,请阅读下面的@phils注释。


5
注意“已保存或标准值”。以该优先顺序。如果用户自定义并保存了该变量的值,则此函数会将其重置为saved-value,而不是standard-value
phils 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.