Vim sangat akomodatif dalam hal tab Vs. preferensi ruang. Seperti yang saya pahami, tabstop
pengaturan menunjukkan lebar karakter tab. The shiftwidth
Pengaturan menetapkan berapa kolom untuk kenaikan / pengurangan bila menggunakan <<dan >>perintah, sedangkan softtabstop
pengaruh pengaturan jumlah spasi untuk dimasukkan saat Anda menekan Tabtombol dalam modus insert. Jika expandtab
aktif, tombol tab menyisipkan softtabstop
jumlah karakter spasi. Sedangkan dengan expandtab
dimatikan, menekan Tabtombol akan menyisipkan sesedikit mungkin jumlah karakter tab + spasi yang cocok softtabstop
. (Harap perbaiki saya jika saya salah.)
Poin terakhir ini membuat saya bertanya-tanya: adakah kasus praktis yang tidak Anda inginkan shiftwidth == tabstop && tabstop == softtabstop
? Saya tidak bisa memikirkan satu pun. Sejauh yang saya ketahui, akan sangat mudah jika saya dapat mengatur semua 3 ini ke nilai yang sama, dalam satu tugas tunggal. misalnya menelepon:
:set stab=4
yang setara dengan berlari:
:set tabstop=4 softtabstop=4 shiftwidth=4
Adakah yang bisa menyarankan bagaimana ini bisa dilakukan?
MEMPERBARUI
Terima kasih atas balasan begitu jauh dari terlalu banyak php , Hobbs dan kaiser.se . Daripada membalas satu per satu, saya memperbarui pertanyaan di sini.
Softtabstop dengan expandtab dimatikan
Saya katakan di atas bahwa dengan expandtab dimatikan, menekan tombol Tab akan menyisipkan sesedikit mungkin jumlah karakter tab + spasi yang cocok softtabstop
. Saya mendukungnya, tetapi saya pikir saya perlu menjelaskan apa yang saya maksud. Saya akan mencoba melakukannya dengan beberapa contoh. Untuk mengikuti, jalankan :set list
sehingga Anda dapat melihat karakter tab.
tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab
Dalam mode sisip, menekan tombol tab menyisipkan 2 karakter spasi. Tekan tombol tab untuk kedua kalinya, dan alih-alih memasukkan dua karakter spasi lagi (dengan total 4 karakter spasi), 2 spasi sebelumnya diganti dengan karakter tab tunggal. Tabstop disetel ke 4, jadi satu karakter tab memiliki lebar yang sama dengan 4 spasi.
tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab
Dalam mode sisip, menekan tombol tab akan menyisipkan 1 karakter tab ditambah 2 spasi. Karakter tab memiliki lebar 4, jadi total lebar adalah 6, dan ini dicapai dengan menggunakan 3 karakter. Menekan tombol tab untuk kedua kalinya menyisipkan dua karakter tab, dan menghapus dua spasi yang telah disisipkan sebelumnya. Lebar totalnya adalah 12, dan ini dicapai dengan menggunakan 3 karakter.
Dalam kedua contoh ini, Vim menyisipkan jumlah minimum karakter tab + spasi yang cocok dengan softtabstop.
Jika saya bekerja dengan expandtab dimatikan, saya tidak dapat melihat diri saya menginginkan kontrol ekstra granular yang dapat dicapai dengan mengatur softtabstop ke nilai yang berbeda dari tabstop. Akan tetap berguna bagi saya untuk dapat mengatur tabstop
, softtabstop
dan shiftwidth
ke nilai yang sama dengan satu perintah.
Apakah expandtab membuat softtabstop menjadi mubazir?
tabstop=4 softtabstop=0 shiftwidth=4 expandtab
Dalam mode sisip, menekan tombol tab menyisipkan 4 spasi. Menekan tombol hapus menghapus satu spasi - jadi Anda harus mundur 4 kali jika Anda menekan tombol tab secara tidak sengaja.
tabstop=4 softtabstop=4 shiftwidth=4 expandtab
Dalam mode sisip, menekan tombol tab menyisipkan 4 spasi. Menekan tombol spasi mundur menghapus 4 spasi.
Jika saya bekerja dengan expandtab
dihidupkan, saya lebih suka tombol hapus untuk menghapus jumlah spasi yang sama seperti sisipan tombol tab. Jadi dalam kasus ini, juga, saya merasa akan berguna untuk dapat menetapkan nilai yang sama tabstop
, softtabstop
dan shiftwidth
secara bersamaan.
Jalan pintas akan tetap berguna
Sangat bagus bahwa Vim memberikan begitu banyak fleksibilitas, tetapi saya tidak dapat melihat diri saya membutuhkannya. Saya hanya ingin dapat memilih lebar tab, dan apakah itu tab 'keras' (menggunakan karakter tab) atau tab 'lunak' (terdiri dari spasi). Beralih antara tab keras dan lunak cukup mudah ( :set expandtab!
), tetapi saya berharap lebih mudah untuk mengatur lebar tab, tanpa harus mengutak-atik 3 parameter berbeda.
Jadi saran yang saya usulkan untuk sesuatu seperti :set stab=4
masih terdengar bagus bagi saya.
sumber
is there a practical case where you wouldn't want shiftwidth == tabstop && tabstop == softtabstop?
, kode sumber Vim sendiri menggunakanset shiftwidth=4 tabstop=8 noexpandtab
. Ya, seseorang biasanya menginginkanshiftwidth == softtabstop
, tetapi itu terlepas dari nilai yangtabstop
dimilikinya.Jawaban:
Membuat
stab
opsi di Vim itu sendiri tidak mudah, tetapi saya telah menyiapkan perintah / fungsi ini yang dapat Anda masukkan.vimrc
(atau file plugin jika Anda sangat terorganisir). Gunakan:Stab
dan Anda akan diminta untuk tingkat indentasi dan apakah akan digunakan atau tidakexpandtab
. Jika Anda menekan enter tanpa memberikan level indentasi baru, itu hanya akan mencetak pengaturan saat ini.sumber
Ini adalah upaya pertama saya untuk menulis VimScript, tetapi begini:
Jika saya meletakkan ini di file .vimrc saya, saya dapat memanggilnya dengan menjalankan
:call Stab(X)
, di mana X adalah lebar tab yang diinginkan. Ini adalah solusi yang memadai untuk saat ini, tetapi jika ada yang bisa menyarankan cara untuk mempermudah panggilan, saya akan berterima kasih.Saya juga telah membuat fungsi yang dengan cepat merangkum pengaturan saat ini, yang telah saya petakan ke ctrl-Tab:
Baiklah, saya memberikan hadiah 100 poin untuk jawaban ini, dan sekarang saya sudah setengah menyelesaikannya sendiri. Tidak yakin apakah saya dapat menerima jawaban saya sendiri ...
sumber
Anda dapat dalam mode edit juga menggunakan Ctrl-Tuntuk membuat indentasi dan Ctrl-Duntuk membatalkan ke tingkat indentasi berikutnya seperti yang diatur oleh
shiftwidth
, terlepas daritabstop
,softtabstop
atauexpandtab
pengaturannya. Vim secara otomatis akan menambah / menghapus spasi atau tab untuk membawa Anda ke kolom kanan.Jika Anda menggunakan perintah ini untuk mengontrol indentasi alih-alih Tab/ BackspaceAnda tidak perlu khawatir tentang semua pengaturan tab ini cocok bersama dan selalu mendapatkan tingkat indentasi yang benar.
sumber
Jika
expandtab
diset maka (seperti yang ditunjukkan oleh banyak php),softtabstop
menjadi mubazir. Satu-satunya alasan Anda mungkin menetapkan secarashiftwidth
berbedatabstop
adalah untuk memenuhi kebiasaan aneh; misalnya, Anda menggunakan indentasi empat spasi tetapi lebih suka tabmemasukkan delapan spasi.Jika
expandtab
tidak disetel maka segalanya menjadi lebih kabur. Jika Anda ingin kode Anda terlihat sama dicat
editor with dan non-vim seperti di vim, makatabstop
harus selalu disetel ke 8; dalam hal ini Anda akan menyetelsofttabstop
danshiftwidth
keduanya ke tingkat indentasi pilihan Anda. Jika Anda lebih suka bahwa setiap "tab fisik" dalam file mewakili satu tingkat indentasi, Anda akan menyeteltabstop
danshiftwidth
ke tingkat indentasi yang Anda inginkan dan membiarkannyasofttabstop
di nol (menyetelnya sama dengantabstop
sama kecuali jika Anda mengubahnyatabstop
akan tidak sinkron, sedangkan nol berarti "tolong abaikan ini").sumber
softtabstop
set ke nilai yang benar, backspace akan menghapus indentasi spasi seolah-olah itu adalah tab. yang merupakan keharusan untuk penggunaan yang waras.Pemahaman Anda tentang
softtabstop
danexpandtab
salah - jadistab
opsi yang Anda sarankan tidak akan terlalu berguna.expandtab
adalah saat Anda ingin menggunakan spasi, bukan tab untuk semuanya . Jika Anda mengaturexpandtab
, maka Vim mengabaikansofttabstop
opsi dan menggunakantabstop
danshiftwidth
untuk mengetahui berapa banyak spasi untuk disisipkan.softtabstop
hanya untuk saat Anda ingin menggunakan campuran tab dan spasi, memungkinkan Anda membuat indentasi dengan kontrol halus (2 atau 4 spasi), sambil menjaga lebar tab pada nilai yang lebih tinggi (biasanya 8) sehingga teks muncul di aplikasi lain . Pengaturansofttabstop=tabstop
tidak mencapai apa-apa karena Vim akan selalu menggunakan tab untuk membuat indentasi.Pembaruan: Seperti yang telah ditunjukkan oleh kaizer.se , jika Anda menggunakan
expandtab
, maka Anda masih perlu mengatursofttabstop
jika Anda ingin Vim mundur beberapa spasi seolah-olah itu adalah tab.sumber
tabstop
dansofttabstop
menjadi satu variabel terlalu banyak ketikaextpandtab
ditetapkan, saya pikir Anda salah dalam prioritas. Coba saja: setelts=8 sts=4 et
dan tekan tab; kursor akan berada di kolom lima, dan empat spasi akan disisipkan, seperti jika Anda telah mengaturnyats=4 sts=0 et
.softtabstop
set ke nilai yang benar, backspace akan menghapus indentasi spasi seolah-olah itu adalah tab. yang merupakan keharusan untuk penggunaan yang waras.Apakah Anda sering mengubah pengaturan ruang putih sehingga Anda benar-benar membutuhkan fungsi untuk mengelolanya? Jika Anda sering mengotak-atik tabstop dan juga menyetel expandtab, Anda mungkin akan mengalami kekacauan seiring waktu saat Anda mengubah file dengan nilai berbeda yang diteruskan
stab
. Hari ini saya gunakan:call stab (4)
, besok itu:call stab (2)
dan minggu lalu itu:call stab (8)
. Kedengarannya bahkan jika Anda menulisnya, Anda akan segera berhenti menggunakannya.Jika Anda berencana untuk selalu memberikan nilai yang sama untuk menusuk, mengapa tidak mengedit pengaturan global Anda saja? Dalam vim:
dan tambahkan yang berikut ini:
Ini adalah bagaimana saya .vimrc diatur.
sumber
Salah satu opsi yang berguna adalah
softtabstop=-1
yang akan mengaturnya ke nilaishiftwidth
.Anda juga dapat menyetel
shiftwidth
ke 0, dalam hal initabstop
nilainya akan digunakan.sumber