6 Stimmen

Wie kann ich den Anfangswert einer Variablen in Elisp ermitteln?

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"

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 "> "

16voto

Richard Hansen Punkte 47390

Dies ist im Allgemeinen nicht möglich (Emacs merkt sich den ursprünglichen Wert nicht), aber es gibt einige Ausnahmen.

defcustom Variablen

Variablen, 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.

Puffer-lokale Variablen

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.

6voto

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 .

5voto

Trey Jackson Punkte 72000

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 ).

3voto

aculich Punkte 14009

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"

1voto

Unsere Lösung:

;;;###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)))))

CodeJaeger.com

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.

Powered by:

X