时间:2010-09-27 17:48:54

标签: emacs elisp

在Emacs Lisp中,是否有一个函数来获取由defvar启动的符号的初始值?与下面显示的some-function一样:

(defvar var "initial value")
(setq var "changed value")
(some-function 'var)
=> "inital value"

5 个答案:

答案 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 valuesframe local values,请尝试:

(default-value 'var)

但是,如果有人使用setq-default更改默认设置,您将获得新的默认设置,而不是通过defvar设置的原始设置。来自documentation

  

此函数返回符号的默认值   值。这是看到的价值   在缓冲区和没有的框架中   他们自己的变量值。如果   符号不是缓冲本地的,这是   相当于符号值(见Accessing Variables)。

答案 3 :(得分:3)

看起来@ tao-peng在这里找到了答案,但完整的故事就是这样:

使用defvar创建的符号通常只具有设置的值,以及可选的最多通常设置为variable-documentationrisky-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)))))