Apakah perintah "set" hanya memengaruhi buffer aktif?

14

Saya memiliki dua buffer di vim:

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

Seperti yang terlihat di atas, saya berada di buffer pertama. Sekarang jika saya menjalankan :set softtabstop=16perintah, maka saya berharap itu akan mempengaruhi kedua buffer. Namun, ini bukan kasus- sementara stsnilai untuk buffer pertama memang berubah dan Tabkunci memasukkan empat karakter tab ( ts=4), maka untuk buffer kedua stsnilainya masih 4:

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

Kenapa begitu? Saya pikir itu setmempengaruhi semua buffer dan setlocalhanya mempengaruhi buffer aktif ..

Martin
sumber

Jawaban:

25

Opsi dapat bersifat global , jendela-lokal , atau buffer-lokal .

Bila Anda :setseorang global yang pilihan, nilai baru global yang .

Bila Anda :setlocalseorang global yang pilihan, nilai baru adalah lokal .

Bila Anda :setseorang lokal pilihan, nilai baru adalah lokal .

softtabstopmenjadi opsi buffer-local , mengubah nilainya hanya memengaruhi buffer saat ini.

"Lingkup" opsi ditunjukkan dalam :help option:

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

:help local-options,, :help :setlocaldan :help global-localjelaskan semua itu secara lebih rinci.

romainl
sumber
3
Ada juga a :setglobal.
Sato Katsura
3
Juga, beberapa opsi bersifat global, tidak peduli bagaimana Anda mengaturnya. Misalnya 'encoding'.
Antony
Apakah ada cara untuk mengatur fungsi lokal dengan buffer id dan nilai opsi dengan beberapa vimscriptpanggilan fungsi?
St.Antario
Ada fungsi setbufvaryang bisa digunakan untuk mencapai itu. Awalnya tidak ditemukan.
St.Antario
2

Bukan ahli, @Martin, tetapi dari membaca :help setAnda perlu "menghapus" nilai lokal stsdi setiap buffer agar buffer mengambil nilai global baru. setlocal sts= (atau untuk bendera boolean, setlocal flag<). Agak masuk akal, pengaturan lokal diinisialisasi ke nilai-nilai global saat ini terbuka, kemudian pertahankan nilai-nilai lokal sampai dikatakan sebaliknya. Jika tidak ada pengaturan lokal dalam permainan, itu harus mengambil nilai global baru.

Sekali lagi, tidak menjadi ahli, saya akan menebak bahwa buffer kedua memiliki pengaturan lokal yang eksplisit sebelum nanti set. Lebih dari 50/50 pemahaman saya salah, karena saya masih tidak jelas tentang apa perbedaan antara setdan setglobalitu .

Brian Tiffin
sumber