O comando "set" afeta apenas o buffer ativo?

14

Eu tenho dois buffers no vim:

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

Como visto acima, estou no primeiro buffer. Agora, se eu executar o :set softtabstop=16comando, espero que ele afete os dois buffers. No entanto, esse não é o caso - enquanto o stsvalor do primeiro buffer é realmente alterado e a Tabchave insere quatro caracteres de tabulação ( ts=4), para o segundo buffer o stsvalor ainda é 4:

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

Por que? Eu pensei que isso setafeta todos os buffers e setlocalafeta apenas o buffer ativo ..

Martin
fonte

Respostas:

25

As opções podem ser globais , window-local , ou tampão-local .

Quando você é :setuma opção global , o novo valor é global .

Quando você é :setlocaluma opção global , o novo valor é local .

Quando você tem :setuma opção local , o novo valor é local .

softtabstopSendo uma opção local do buffer , alterar seu valor afeta apenas o buffer atual.

O "escopo" de uma opção é indicado em :help option:

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

:help local-options, :help :setlocalE :help global-localexplicar tudo isso em mais detalhes.

romainl
fonte
3
Há também um :setglobal.
Sato Katsura
3
Além disso, algumas opções são globais, independentemente de como você as define. Por exemplo 'encoding'.
Antony
Existe uma maneira de definir a função local pelo ID do buffer e o valor da opção com algumas vimscriptchamadas de função?
St.Antario 02/12/19
Existe uma função setbufvarque pode ser usada para conseguir isso. Não o encontrou no início.
Paulo Ontem
2

Não é um especialista, @Martin, mas, ao ler, :help setvocê precisará "desarmar" o valor local de stscada buffer para que esse buffer pegue qualquer novo valor global. setlocal sts= (ou para sinalizadores booleanos setlocal flag<). Meio que faz sentido, as configurações locais inicializadas com os valores globais atuais em aberto e, em seguida, mantenha os valores locais até que seja informado o contrário. Se não houver configuração local em jogo, ele deverá receber novos valores globais.

Novamente, não sendo especialista, arriscaria adivinhar que esse segundo buffer tinha uma configuração local explícita antes do posterior set. Mais de 50/50 de que meu entendimento está errado, pois ainda não estou claro qual é a diferença entre sete setglobalé .

Brian Tiffin
fonte