Il comando "set" ha effetto solo sul buffer attivo?


14

Ho due buffer in vim:

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

Come visto sopra, sono sul primo buffer. Ora se eseguo il :set softtabstop=16comando, mi aspetto che influisca su entrambi i buffer. Tuttavia, questo non è il caso, mentre il stsvalore per il primo buffer viene effettivamente modificato e la Tabchiave inserisce quattro caratteri di tabulazione ( ts=4), quindi per il secondo buffer il stsvalore è ancora 4:

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

Perchè è così? Ho pensato che setinfluisce su tutti i buffer e setlocalriguarda solo il buffer attivo.

Risposte:


25

Le opzioni possono essere globali , window-local o buffer-local .

Quando :setun globale opzione, il nuovo valore è globale .

Quando :setlocalun globale opzione, il nuovo valore è locale .

Quando :setun locale di opzione, il nuovo valore è locale .

softtabstopessendo un'opzione buffer-local , la modifica del suo valore influisce solo sul buffer corrente.

Lo "scopo" di un'opzione è indicato 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 :setlocale :help global-localspiegare tutto ciò in modo più dettagliato.


3
C'è anche un :setglobal.
Sato Katsura,

3
Inoltre, alcune opzioni sono globali, indipendentemente da come le hai impostate. Es 'encoding'.
Antony,

Esiste un modo per impostare la funzione locale tramite ID buffer e il valore dell'opzione con una vimscriptchiamata di funzione?
Sant'Antario,

C'è una funzione setbufvarche può essere utilizzata per raggiungere questo obiettivo. All'inizio non l'ho trovato.
Sant'Antario,

2

Non un esperto, @Martin, ma dalla lettura :help setdovresti "disinserire" il valore locale di stsogni buffer per far sì che quel buffer raccolga qualsiasi nuovo valore globale. setlocal sts= (o per bandiere booleane, setlocal flag<). Kinda ha senso, le impostazioni locali inizializzate sui valori globali correnti su aperto, quindi mantengono i valori locali fino a quando non viene indicato diversamente. Se non ci sono impostazioni locali in gioco, dovrebbe raccogliere tutti i nuovi valori globali.

Ancora una volta, non essendo un esperto, rischierei di supporre che quel secondo buffer avesse un'impostazione locale esplicita prima del successivo set. Più di 50/50 che la mia comprensione è sbagliato, come io sono ancora chiaro su ciò che la differenza tra sete setglobalè .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.