2013-08-11 7 views
57

Ich habe eine Frage zu Emacs Lisp. Was ist der Unterschied zwischen setq und setq-default? Ich bin sehr verwirrt darüber.Der Unterschied zwischen Setq und Setq-Standard in Emacs Lisp

Tutorials sagen setq Effekt im lokalen Puffer während setq-default nimmt alle Puffer wirkt.

Zum Beispiel, wenn ich schrieb (setq a-var a-Vars-Wert) in init.el, ich nach dem Start Emacs gefunden und Öffnen eines neuen Puffer, die a-var gibt es auch und sein Wert ist a-vars-Wert. Ich dachte, es sollte nicht dort sein. Es scheint keinen Unterschied zu geben zwischen setq und setq-default.

Ist etwas falsch mit meinem Verständnis?

Vielen Dank.

Zum Beispiel:
1) Ich schrieb (setq Hallo 123) in derinit.el Datei und I laufen emacs abuffer in der Schale, dann I-Eingang "Hallo Cx Ce" Es zeigt "123". Dasselbe passiert, wenn ich dies in allen neuen Puffern ausführe.

2) Ich schrieb (setq Tabulatorbreite 4) in der init.el Datei. Wenn ich Tab-Breite C-x C-e ausführen, zeigt es "8" (aktueller Modus ist "Text"). Wenn ich jedoch (setq-default tab-width 4) verwende, wird "4" angezeigt. Ich kann dieses Phänomen nicht erklären.

Antwort

63

Einige Variablen in Emacs sind "buffer-local", was bedeutet, dass jeder Puffer einen separaten Wert für diese Variable haben darf, der den globalen Standard überschreibt. tab-width ist ein gutes Beispiel für eine Puffer-lokale Variable. Wenn eine Variable pufferlokal ist, setzt setq ihren lokalen Wert im aktuellen Puffer und setq-default setzt den globalen Standardwert. Wenn eine Variable nicht puffer-lokal ist, dann machen setq und setq-default dasselbe.

In Ihrem Fall 2 eingestellt (setq tab-width 4) den Puffer-lokalen Wert tab-width-4 in den aktuellen Puffer, den globalen Standardwert von tab-width verlassen noch auf 8, so dass, wenn Sie tab-width in einem anderen Puffer bewertet, hatte keine lokalen Wert , Sie haben das 8 gesehen. Als Sie dann den Standardwert auf 4 gesetzt haben, hat dieser Puffer den Wert übernommen, da er immer noch keinen lokalen Wert hatte.

+0

wenn ich (setzt Tab-Breite 4), und es auswerten, ist es immer 8 in jedem Puffer. Ich weiß nicht warum. Scheint, es wird nicht wirksam. Aber wenn ich (sets-Standard-Tab-Breite 4) verwende, wird es in jedem Puffer wirksam.Ich weiß auch nicht warum :( – ruanhao

+0

'(setq tab-width 4)' wird wirksam in dem Puffer, wo Sie den Ausdruck ausgewertet haben; wenn Sie es im '* scratch *' Puffer auswerten, dann prüfen Sie seinen Wert in diesem Puffer. – tripleee

+0

'tab-width' ist eine bufferlokale Variable, dh wenn Sie' (setq tab-width 4) 'setzen, wird sie nur im aktuellen Puffer auf 4. Alle anderen Puffer behalten eine' tab-width' des globalen Standards bei , 8. Wenn Sie '(setq-default tab-width 4)' 'setzen, ändern Sie den globalen Standardwert von' tab-width' auf 4, so dass jetzt jeder Puffer, der nicht 'tab-width' definiert hat, diesen neuen Standard hat – dfan