Betrifft der Befehl "set" nur den aktiven Puffer?

14

Ich habe zwei Puffer in vim:

:ls
  1 %a   ".vimrc"                       line 1
  2 #h   "script.sh"                    line 1
Press ENTER or type command to continue

Wie oben gesehen, bin ich im ersten Puffer. Wenn ich nun den :set softtabstop=16Befehl ausführe , erwarte ich, dass er beide Puffer beeinflusst. Dies ist jedoch nicht der Fall. Während der stsWert für den ersten Puffer tatsächlich geändert wird und die TabTaste vier Tabulatorzeichen ( ts=4) einfügt , ist der stsWert für den zweiten Puffer immer noch 4:

:ls
  1 #h + ".vimrc"                       line 1
  2 %a + "script.sh"                    line 1
  softtabstop=4
Press ENTER or type command to continue

Warum ist das so? Ich dachte, das setbetrifft alle Puffer und setlocalnur den aktiven Puffer.

Martin
quelle

Antworten:

25

Die Optionen können global , fensterlokal oder pufferlokal sein .

Wenn Sie :seteine globale Option wählen, ist der neue Wert global .

Wenn Sie :setlocaleine globale Option wählen, ist der neue Wert lokal .

Wenn Sie :seteine lokale Option wählen, ist der neue Wert lokal .

softtabstopDa es sich um eine pufferlokale Option handelt, wirkt sich das Ändern des Werts nur auf den aktuellen Puffer aus.

Der "Umfang" einer Option ist angegeben in :help option:

'softtabstop' 'sts'    number    (default 0)
                       local to buffer
                       {not in Vi}
Number of spaces that a <Tab> counts[...]

:help local-options, :help :setlocalUnd :help global-localerklärt alles , was mehr Details in.

romainl
quelle
3
Es gibt auch eine :setglobal.
Sato Katsura
3
Einige Optionen sind auch global, unabhängig davon, wie Sie sie festlegen. ZB 'encoding'.
Antony
Gibt es eine Möglichkeit, die lokale Funktion anhand der Puffer-ID und des Optionswerts bei einigen vimscriptFunktionsaufrufen festzulegen?
St.Antario
Es gibt eine Funktion, mit setbufvarder dies erreicht werden kann. Habe es zuerst nicht gefunden.
St.Antario
2

Kein Experte, @Martin, aber nach dem Lesen :help setmüssten Sie den lokalen Wert von stsin jedem Puffer "deaktivieren" , damit dieser Puffer einen neuen globalen Wert aufnimmt . setlocal sts= (oder für boolesche Flags setlocal flag<). Ein bisschen macht es Sinn, lokale Einstellungen beim Öffnen auf aktuelle globale Werte zu initialisieren und dann lokale Werte beizubehalten, bis etwas anderes gesagt wird. Wenn keine lokale Einstellung im Spiel ist, sollten neue globale Werte erfasst werden.

Da ich kein Experte bin, würde ich die Vermutung wagen, dass dieser zweite Puffer vor dem späteren eine explizite lokale Einstellung hatte set. Mehr als 50/50, dass mein Verständnis falsch ist, da ich immer noch unklar bin, was der Unterschied zwischen setund setglobalist .

Brian Tiffin
quelle