Untuk apa `softtabstop` digunakan?

21

Saya mengetahui pengaturan terkait tab ini di Vim:

  • ts
  • sw
  • expandtab
  • smarttab
  • sts

Pengaturan normal saya adalah set ts=4 sw=4 expandtab smarttab.

Tetapi menurut stsdokumentasi , jika expandtabtidak disetel, ia akan mencoba menggunakan kombinasi spasi dan tab untuk membuat jumlah kosong yang diinginkan untuk ukuran tab.

Saya tidak dapat benar-benar memikirkan skenario yang berguna untuk pengaturan ini: Mengapa seseorang ingin memiliki jumlah tab dan ruang tetap yang mungkin hanya mengacaukan segalanya? Satu-satunya keuntungan melakukan hal ini yang dapat saya pikirkan adalah mengurangi jumlah karakter dan dengan demikian mengurangi ukuran file, yang terasa aneh bagi saya.

KFL
sumber

Jawaban:

20

Seperti yang softtabstopdisebutkan dalam dokumentasi, ini berguna jika Anda ingin mempertahankan ukuran berhenti tab default sebesar 8, tetapi mengedit file seolah-olah ukuran penghentian tab adalah beberapa nilai lainnya. Misalnya, jika Anda ingin tingkat lekukan dari 4 ketika mengedit kode, tetapi beberapa komentar memiliki teks tab-menjorok seperti meja yang bergantung pada tab berhenti dari 8, Anda bisa mengatur stsuntuk 4.

Satu perbedaan yang saya perhatikan antara pengaturan tab Anda ( set ts=4 sw=4 expandtab smarttab) dan penggunaan sts(misalnya set ts=8 sts=4) adalah ketika backspacing lebih dari spasi di tengah baris teks. Misalnya, pertimbangkan baris teks berikut, di mana ·menunjukkan spasi:

some·text·······more·text

Dalam mode insert, memindahkan kursor sebelum mdari more text. Dengan pengaturan Anda, menekan Backspace menghapus satu ruang. Tetapi saat menggunakan sts=4, Backspace menghapus semua jalan ke penghentian tab sebelumnya, karena akan berperilaku jika spasi adalah karakter tab sebagai gantinya.

Anda dapat mengatur sts=4selain pengaturan Anda dan mendapatkan perilaku backspace garis tengah sambil tidak mencampur tab dan spasi. Tab akan diperluas ke empat ruang, tetapi Anda dapat mundur mundur dalam rentang ruang di tengah garis.

Lithis
sumber
3

Lihat contoh di bawah ini,

// Start vim without loading your vimrc. set only tabstop=8 softtabstop=4.
// This makes <Tab> in insert mode equals to 4 <Space> length at max.

// In insert mode, type 12, one <Tab>, 5. We get insertion below,
12··5
// Quit insert mode. Move cursor back, we find 2 <Space> inserted.

// In insert mode, type 12, two <Tab>, 9. We get insertion below,
12······9
// Quit insert mode. Move cursor back, you find a <Tab> inserted.

// In insert mode, type 12, three <Tab>, 3. We get insertion below,
12··········3
// Move the cursor back, you find a <Tab> and 4 <Space> inserted.

// We can even set sotftabstop=12, but this time we only need type one <Tab>, then 3.
12··········3
// Move the cursor back, you find a <Tab> and 4 <Sapce> inserted.

Begitu tabstopjuga tentang seberapa lebar suatu Tabdidefinisikan, sedangkan softtabstoptentang seberapa jauh kursor bergerak saat mengetik Tab . Ketika mereka tidak diatur untuk menjadi nilai yang sama, itu berarti bahwa jika Anda menekan Tabtombol, itu tidak berarti sepele Tabkarakter. Dalam kasus apa pun, itu adalah vim yang memutuskan setelah Anda keluar dari mode penyisipan. Vim pertama-tama akan mencoba untuk mencocokkan penyisipan dengan sebanyak tabstopmungkin; jika pada akhirnya itu tidak dapat membuat penuh tabstop, vim cukup mengimbangi dengan Space.

Untuk berbicara sedikit lebih banyak, jika Anda mengatur expandtab, itu sama dengan mengatakan ke vim:

Tolong jangan repot-repot menghitung berapa Tabdan Sapcedibutuhkan. Cukup masukkan Space.

Chen XI
sumber
Jawaban Anda tampaknya seperti kata-kata kasar, dan tampaknya tidak menjawab pertanyaan.
Herb Wolfe
@ Wolf Wolfe Saya berharap jawaban saya dapat membantu PO mengetahui apa yang terjadi ketika pengaturan yang tidak biasa dibuat :set st=7 sts=13. Seperti vim tidak hanya dirancang untuk pengkodean, tetapi awalnya untuk mengedit teks.
Chen XI
1

Jawaban sederhana:

Sebagai contoh, ini sangat berguna untuk pemrograman, terutama di Python, di mana tabulasi sangat penting. Ketika Anda menekan backspace dengan sts = 4, itu akan menghapus baris, bukan menghapus satu spasi karakter.

SergeyR
sumber