¿El comando "set" afecta solo al búfer activo?

14

Tengo dos buffers en vim:

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

Como se ve arriba, estoy en el primer búfer. Ahora, si ejecuto el :set softtabstop=16comando, espero que afecte a ambos búferes. Sin embargo, este no es el caso, mientras que el stsvalor para el primer búfer se modifica y la Tabtecla inserta cuatro caracteres de tabulación ( ts=4), entonces para el segundo búfer el stsvalor sigue siendo 4:

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

¿Por qué es así? Pensé que eso setafecta a todos los búferes y setlocalafecta solo al búfer activo.

Martín
fuente

Respuestas:

25

Las opciones pueden ser mundial , ventana local o local al búfer .

Cuando tiene :setuna opción global , el nuevo valor es global .

Cuando tiene :setlocaluna opción global , el nuevo valor es local .

Cuando tiene :setuna opción local , el nuevo valor es local .

softtabstopAl ser una opción local de búfer , cambiar su valor solo afecta el búfer actual.

El "alcance" de una opción se indica en :help option:

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

:help local-options, :help :setlocaly :help global-localexplique todo eso con más detalles.

romainl
fuente
3
También hay un :setglobal.
Sato Katsura
3
Además, algunas opciones son globales, sin importar cómo las configure. Por ej 'encoding'.
Antony
¿Hay alguna manera de configurar la función local mediante la identificación del búfer y el valor de la opción con alguna vimscriptllamada a una función?
St.Antario
Hay una función setbufvarque puede usarse para lograr eso. No lo encontré al principio.
St.Antario
2

No es un experto, @Martin, pero al leerlo :help setnecesitaría "desarmar" el valor local de stscada búfer para que ese búfer recoja cualquier valor global nuevo. setlocal sts= (o para banderas booleanas setlocal flag<). Tiene sentido, la configuración local se inicializa a los valores globales actuales en abierto, luego mantiene los valores locales hasta que se indique lo contrario. Si no hay una configuración local en juego, debería recoger cualquier valor global nuevo.

Nuevamente, al no ser un experto, me arriesgaría a suponer que ese segundo búfer tenía una configuración local explícita antes que la posterior set. Más de 50/50 que mi entendimiento es incorrecto, ya que estoy todavía no está claro en lo que la diferencia entre sety setglobales .

Brian Tiffin
fuente