emacs - 如何在 Elisp 中获取变量的初始值?

标签 emacs elisp

在 Emacs Lisp 中,是否有一个函数可以获取由 defvar 初始化的符号的初始值? ?喜欢 some-function如下图:

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

最佳答案

这通常是不可能的(Emacs 不记得原始值),但也有一些异常(exception)。
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

Defining Customization Variables elisp 手册中的部分,特别是 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

Introduction to Buffer-Local Variables有关详细信息,请参阅elisp 手册中的部分。

关于emacs - 如何在 Elisp 中获取变量的初始值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3806423/

相关文章:

emacs - 将完整的文件路径复制到复制粘贴剪贴板中

emacs - 在define-generic-mode中匹配正则表达式作为关键字

emacs - 为什么我在 native 使用 Google Drive API 时收到 "The authenticated user has not installed the app with client id"错误?

emacs - 使用(填充段落)防止 Auctex 缩进

c++ 代码折叠与 emacs/cedet

android - Ensime 不适用于 sbt + android-plugin

emacs - 重新定义 C-x C-e 以评估自定义语言表达式

python - Emacs Python : Echoing, 钩子(Hook)和组织模式

emacs - 没有 INITVALUE 的 defvar

emacs - 如何仅对 *.el 文件启用 Show-Paren 模式