Czy polecenie „set” wpływa tylko na bufor aktywny?

15

Mam dwa bufory w vimie:

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

Jak widać powyżej, jestem na pierwszym buforze. Teraz, jeśli wykonam :set softtabstop=16polecenie, spodziewam się, że wpłynie to na oba bufory. Tak jednak nie jest - podczas gdy stswartość pierwszego bufora jest rzeczywiście zmieniana, a Tabklawisz wstawia cztery znaki tabulacji ( ts=4), a następnie dla drugiego bufora stswartość jest nadal 4:

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

Dlaczego to jest takie? Myślałem, że setwpływa to na wszystkie bufory i setlocalwpływa tylko na bufor aktywny.

Jaskółka oknówka
źródło

Odpowiedzi:

26

Opcje mogą być globalny , okno lokalnego lub bufor lokalny .

Kiedy globalna opcja, nowa wartość jest globalny .:set

W :setlocalprzypadku opcji globalnej nowa wartość jest lokalna .

W :setprzypadku opcji lokalnej nowa wartość jest lokalna .

softtabstopbędąc opcją lokalną dla bufora , zmiana jej wartości wpływa tylko na bieżący bufor.

„Zakres” opcji jest wskazany w :help option:

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

:help local-options, :help :setlocali :help global-localwyjaśnij to bardziej szczegółowo.

romainl
źródło
3
Jest też :setglobal.
Sato Katsura
3
Ponadto niektóre opcje są globalne, bez względu na to, jak je ustawisz. Np 'encoding'.
Antony
Czy istnieje sposób ustawienia funkcji lokalnej za pomocą identyfikatora bufora i wartości opcji w przypadku niektórych vimscriptwywołań funkcji?
St.Antario
Istnieje funkcja, setbufvarktórą można wykorzystać do osiągnięcia tego. Na początku nie znalazłem.
St.Antario
2

@Martin nie jest ekspertem, ale po przeczytaniu :help settrzeba by „rozbroić” lokalną wartość stsw każdym buforze, aby bufor mógł pobrać nową wartość globalną. setlocal sts= (lub w przypadku flag boolowskich setlocal flag<). Trochę ma to sens, ustawienia lokalne są inicjalizowane na bieżące wartości globalne przy otwartym, a następnie zachowują wartości lokalne, dopóki nie zostanie podane inaczej. Jeśli w grze nie ma ustawień lokalnych, powinno ono pobrać nowe wartości globalne.

Ponownie, nie będąc ekspertem, zaryzykuję przypuszczenie, że ten drugi bufor miał wyraźne ustawienie lokalne przed późniejszym set. Więcej niż 50/50, że moje rozumienie jest błędne, ponieważ jestem jeszcze jasne, na czym polega różnica między seti setglobaljest .

Brian Tiffin
źródło