Der Unterschied zwischen setq und setq-default in Emacs Lisp

86

Ich habe eine Frage zu Emacs Lisp. Was ist der Unterschied zwischen setq und setq-default? ?

In Tutorials heißt es, dass setq im lokalen Puffer wirksam wird, während setq-default alle Puffer betrifft.

Wenn ich zum Beispiel in init.el geschrieben habe (setq a-var a-vars-value) , habe ich nach dem Starten von Emacs und dem Öffnen eines neuen Puffers festgestellt, dass die a-var ebenfalls vorhanden ist und ihr Wert a-vars-value ist . Ich dachte, es sollte nicht da sein. Es scheint keinen Unterschied zwischen setq und setq-default zu geben .

Stimmt etwas mit meinem Verständnis nicht?

Beispielsweise:

  1. Ich habe (setq hello 123) in die Datei init.el geschrieben und emacs abuffer in der Shell ausgeführt. Dann habe ich "hallo Cx Ce" eingegeben , es wird "123" angezeigt . Das gleiche passiert, wenn ich dies in allen neuen Puffern ausführe.

  2. Ich habe (setq tab-width 4) in die Datei init.el geschrieben . Wenn ich Cx Ce mit Tabulatorbreite ausführe , wird "8" angezeigt (aktueller Modus ist "Text"). Wenn ich jedoch (setq-default tab-width 4) verwende , wird "4" angezeigt . Ich kann dieses Phänomen nicht erklären.

Ruanhao
quelle

Antworten:

96

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-widthist ein gutes Beispiel für eine pufferlokale Variable.

Wenn eine Variable pufferlokal ist, wird setqihr lokaler Wert im aktuellen Puffer und festgelegtsetq-default der globale Standardwert festgelegt.

Wenn eine Variable nicht pufferlokal ist, dann setqundsetq-default das gleiche tun.

(setq tab-width 4)Setzen Sie in Ihrem Fall 2 den pufferlokalen Wert tab-widthim aktuellen Puffer auf 4, wobei der globale Standardwert tab-widthimmer noch bei 8 bleibt. Wenn Sie also tab-widthin einem anderen Puffer ohne lokalen Wert ausgewertet haben, haben Sie diesen 8 gesehen. Wenn Sie den Standardwert auf 4 setzen, hat dieser Puffer ihn aufgenommen, da er noch keinen lokalen Wert hatte.

dfan
quelle
Wenn ich (Tabulatorbreite 4 setzt) ​​und es auswerte, ist es in jedem Puffer immer 8. Ich weiß nicht warum. Scheint, dass es nicht wirksam wird. Aber wenn ich benutze (setzt die Standard-Tabulatorbreite 4), wird es in jedem Puffer wirksam. Ich weiß auch nicht warum :(
Ruanhao
(setq tab-width 4)wird in dem Puffer wirksam, in dem Sie den Ausdruck ausgewertet haben. Wenn Sie es im *scratch*Puffer auswerten, überprüfen Sie seinen Wert in diesem Puffer.
Tripleee
tab-widthist eine pufferlokale Variable. Wenn Sie (setq tab-width 4)dies tun , wird es im aktuellen Puffer nur auf 4 gesetzt. Alle anderen Puffer behalten tab-widthden globalen Standardwert 8 bei(setq-default tab-width 4) den globalen Standardwert tab-widthauf 4 ändern , hat jetzt jeder Puffer, der sich nicht tab-widthselbst definiert hat, diesen neuen Standardwert.
dfan
3
Ja. Siehe die Liste der Aktionen von emacs beim Start . Das Lesen der Init-Datei ist Schritt 12, und das
Aufrufen
1
@ruanhao Wenn Sie (setq tab-width 4) in der init.el haben, gilt dies nur für diesen Puffer (init.el). Wenn Sie möchten, dass diese Änderung auf alle neuen Puffer angewendet wird, wird dies durch (setq-default tab-width 4) erreicht. Wenn Sie einen Modus für einen bestimmten Dateityp erstellen möchten, möchten Sie wahrscheinlich (setq tab-width 4) verwenden, um den globalen Standard nicht zu überschreiben.
Hemm