Влияет ли команда «set» только на активный буфер?

14

У меня есть два буфера в VIM:

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

Как видно выше, я на первом буфере. Теперь, если я выполню :set softtabstop=16команду, то я ожидаю, что она повлияет на оба буфера. Однако это не так - хотя stsзначение для первого буфера действительно изменяется, и Tabключ вставляет четыре символа табуляции ( ts=4), тогда для второго буфера stsзначение по-прежнему 4:

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

Почему это так? Я думал, что setвлияет на все буферы и setlocalвлияет только на активный буфер ..

Мартин
источник

Ответы:

25

Параметры могут быть глобальными , локальными для окон или локальными для буфера .

Когда вы глобальный параметр, новое значение глобальное .:set

Когда вы глобальный параметр, новое значение локальное .:setlocal

Когда вы :setиспользуете локальный параметр, новое значение является локальным .

softtabstopБудучи локальным параметром буфера , изменение его значения влияет только на текущий буфер.

«Объем» опции указывается в :help option:

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

:help local-options, :help :setlocalИ :help global-localобъяснить все , что более подробно.

romainl
источник
3
Там также есть :setglobal.
Сато Кацура
3
Кроме того, некоторые параметры являются глобальными, независимо от того, как вы их установили. Например 'encoding'.
Энтони
Есть ли способ установить локальную функцию по идентификатору буфера и значению параметра с помощью некоторого vimscriptвызова функции?
Сент-Антарио
Существует функция, setbufvarкоторая может быть использована для достижения этой цели. Сначала не нашел.
Сент-Антарио
2

Не эксперт @Martin, но при чтении :help setвам нужно будет "сбросить" локальное значение stsв каждом буфере, чтобы этот буфер воспринял любое новое глобальное значение. setlocal sts= (или для логических флагов setlocal flag<). Kinda имеет смысл, локальные настройки инициализируются текущими глобальными значениями при открытии, затем сохраняют локальные значения, пока не будет указано иное. Если в игре нет локальных настроек, следует выбрать новые глобальные значения.

Опять же, не будучи экспертом, я рискнул бы предположить, что у второго буфера была явная локальная настройка до более поздней set. Более 50/50, что мое понимание неверно, так как мне до сих пор неясно, в чем разница между setи setglobalесть .

Брайан Тиффин
источник