Gibt es in Emacs Lisp eine Funktion, um den Anfangswert eines Symbols zu erhalten, das durch defvar
? Wie die some-function
unten dargestellt:
(defvar var "initial value")
(setq var "changed value")
(some-function 'var)
=> "inital value"
Gibt es in Emacs Lisp eine Funktion, um den Anfangswert eines Symbols zu erhalten, das durch defvar
? Wie die some-function
unten dargestellt:
(defvar var "initial value")
(setq var "changed value")
(some-function 'var)
=> "inital value"
Dies ist im Allgemeinen nicht möglich (Emacs merkt sich den ursprünglichen Wert nicht), aber es gibt einige Ausnahmen.
defcustom
VariablenVariablen, die mit defcustom
und mit dem Anpassungssystem geändert werden, erhalten den ursprünglichen Wert, den gespeicherten Wert und den angepassten, aber noch nicht gespeicherten Wert als Eigenschaften:
(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
Siehe die Definieren von Anpassungsvariablen Abschnitt im elisp-Handbuch, insbesondere die Diskussion über die Dokumentation für die custom-reevaluate-setting
Funktion.
Pufferlokale Variablen haben einen Standardwert (global) und einen pufferlokalen Wert, der vom globalen Wert abweichen kann. Sie können den default-value
Funktion, um den Standardwert zu erhalten:
(setq indent-tabs-mode nil)
(default-value 'indent-tabs-mode) ;; evaluates to t
Es ist jedoch möglich, den Standardwert zu ändern, und Emacs speichert den ursprünglichen Standardwert nicht:
(set-default 'indent-tabs-mode nil)
(default-value 'indent-tabs-mode) ;; evaluates to nil
Siehe die Einführung in pufferlokale Variablen Abschnitt im elisp-Handbuch für weitere Details.
Emacs merkt sich den Anfangswert nicht. Wenn Sie
(defvar var "initial value")
(setq var "changed value")
im *scratch*
Puffer, "initial value"
ist nicht mehr verfügbar, Punkt.
Wenn die defvar
in einer geladenen Datei durchgeführt wurde, merkt sich Emacs, woher sie geladen wurde; (symbol-file var 'defvar)
gibt den Dateinamen zurück, und Sie können den ursprünglichen Ausdruck erhalten, mit dem die Variable initialisiert wurde (aber nicht den ursprünglichen Wert), vorausgesetzt, die Datei ist noch vorhanden. Dies ist auch über den Befehl M-x find-variable .
Wenn die Variable so eingerichtet ist, dass sie lokale Werte puffern o lokale Werte einrahmen , versuchen:
(default-value 'var)
Wenn jedoch jemand die setq-default
um die Standardeinstellung zu ändern, erhalten Sie die neue Einstellung und nicht die ursprüngliche, die über defvar
. Von der Dokumentation :
Diese Funktion gibt zurück Wert zurück. Dies ist der Wert, der in in Puffern und Rahmen zu sehen ist, die nicht über eigene Werte für diese Variable haben. Wenn Symbol nicht pufferlokal ist, ist dies äquivalent zu symbol-value (siehe Zugriff auf Variablen ).
Es sieht so aus, als hätte @tao-peng hier selbst die Antwort gefunden, aber die ganze Geschichte ist die folgende:
Ein Symbol, das mit defvar
hat in der Regel nur den Wert, auf den es gesetzt ist, sowie optional eine Eigenschaftsliste, die höchstens den Wert variable-documentation
oder vielleicht risky-local-variable
setzen, z.B.:
> (symbol-plist 'load-path)
(risky-local-variable t variable-documentation -587478)
Andererseits kann ein Symbol, das mit defcustom
hat eine viel längere symbol-plist
einschließlich einer standard-value
Eigenschaft, die Sie auf diese Weise erhalten können:
> (get 'package-archives 'standard-value)
((quote (("gnu" . "http://elpa.gnu.org/packages/"))))
Und wie @trey-jackson bemerkt, im Falle von Symbolen, die buffer-local oder frame-local Werte haben, können Sie den ursprünglichen Wert mit erhalten:
> (setq foo "bar")
> (make-variable-buffer-local 'foo)
> (setq foo "baz")
> (default-value 'foo)
"bar"
> foo
"baz"
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
1 Stimmen
Warum sollte es eine solche Funktion geben?
2 Stimmen
@DavidThornley:
gnus-sum-thread-tree-root is a variable defined in `gnus-sum.el'. Its value is "- " Original value was "> "