在Emacs Lisp中,是否有一个函数来获取由defvar
启动的符号的初始值?与下面显示的some-function
一样:
(defvar var "initial value")
(setq var "changed value")
(some-function 'var)
=> "inital value"
答案 0 :(得分:10)
这通常是不可能的(Emacs不记得原始值),但有一些例外。
defcustom
变量使用defcustom
定义并使用自定义系统修改的变量将原始值,保存的值和自定义但尚未保存的值作为属性:
(defcustom foo 0 "testing")
(custom-set-variables '(foo 1))
(setq foo 2)
(customize-mark-as-set 'foo)
(setq foo 3)
(car (get 'foo 'standard-value)) ;; evaluates to 0
(car (get 'foo 'saved-value)) ;; evaluates to 1
(car (get 'foo 'customized-value)) ;; evaluates to 2
foo ;; evaluates to 3
请参阅elisp手册中的Defining Customization Variables部分,特别是上面custom-reevaluate-setting
函数文档的讨论。
缓冲区局部变量具有默认(全局)值和可能与全局值不同的缓冲区本地值。您可以使用default-value
函数获取默认值:
(setq indent-tabs-mode nil)
(default-value 'indent-tabs-mode) ;; evaluates to t
但是,可以更改默认值,并且Emacs将不会记住原始默认值:
(set-default 'indent-tabs-mode nil)
(default-value 'indent-tabs-mode) ;; evaluates to nil
有关详细信息,请参阅elisp手册中的Introduction to Buffer-Local Variables部分。
答案 1 :(得分:6)
Emacs不记得初始值。如果您评估
(defvar var "initial value")
(setq var "changed value")
在*scratch*
缓冲区中,"initial value"
不再可用,完全停止。
如果在加载的文件中执行了defvar
,则Emacs会记住它的加载位置; (symbol-file var 'defvar)
返回文件名,您可以获取变量初始化的原始表达式(但不是原始值),假设文件仍然存在。这也可以通过命令 M-x find-variable 。
答案 2 :(得分:4)
如果变量设置为buffer local values或frame local values,请尝试:
(default-value 'var)
但是,如果有人使用setq-default
更改默认设置,您将获得新的默认设置,而不是通过defvar
设置的原始设置。来自documentation:
此函数返回符号的默认值 值。这是看到的价值 在缓冲区和没有的框架中 他们自己的变量值。如果 符号不是缓冲本地的,这是 相当于符号值(见Accessing Variables)。
答案 3 :(得分:3)
看起来@ tao-peng在这里找到了答案,但完整的故事就是这样:
使用defvar
创建的符号通常只具有设置的值,以及可选的最多通常设置为variable-documentation
或risky-local-variable
的属性列表,例如:
> (symbol-plist 'load-path)
(risky-local-variable t variable-documentation -587478)
另一方面,使用defcustom
创建的符号有更长的symbol-plist
,包含standard-value
属性,您可以这样:
> (get 'package-archives 'standard-value)
((quote (("gnu" . "http://elpa.gnu.org/packages/"))))
正如@ trey-jackson所指出的那样,对于具有缓冲局部值或帧局部值的符号,您可以通过以下方式获得原始值:
> (setq foo "bar")
> (make-variable-buffer-local 'foo)
> (setq foo "baz")
> (default-value 'foo)
"bar"
> foo
"baz"
答案 4 :(得分:0)
我们的解决方案:
;;;###autoload
(defun xorns-get-original-value (symbol)
"Return SYMBOL's original value or nil if that is void."
(if (boundp symbol)
(eval (car (get symbol 'standard-value)))))