Hapus "tab" yang diperluas ruang di Vim dengan satu penekanan tombol?

19

Saya mengedit kode Python dengan Vim.

Dengan tabkunci, saya mendapatkan empat spasi yang dimasukkan untuk lekukan. Bagaimana saya bisa menghapus spasi itu dengan satu stroke "Backspace" (?) - bukan empat?

Harus ada beberapa opsi "set" untuk itu ...

Inilah .vimrc saya:

set autoindent
set ts=4
set sw=4
set et
Evgeny
sumber

Jawaban:

23

Anda dapat menggunakan Ctrl+Duntuk membuat cadangan satu perhentian tab. Ini benar-benar memindahkan seluruh baris ke satu tab berhenti; Ctrl+Tmelakukan hal yang sama ke kanan. Perhatikan bahwa penekanan tombol ini hanya berfungsi dalam mode Sisipkan (gunakan <<dan >>untuk yang setara dalam mode Perintah).

Greg Hewgill
sumber
30
set softtabstop=4
sf17k
sumber
10
IMO inilah yang diminta OP. Pantas lebih banyak upvotes.
Ludwig Weinzierl
2
Ini jawaban yang benar.
mk12
1
Tidak tahu tentang ini, dan inilah tepatnya yang saya cari. +1
NigoroJr
5

tl; dr: set tabstop=4 softtabstop=-1 shiftwidth=0 expandtab

bentuk pendek: set ts=4 sts=-1 sw=0 et

Penjelasan

Jika Anda mengatur softtabstop(atau sts) untuk -1itu secara otomatis akan berperilaku sama dengan tabstop( ts), yang akan menghemat beberapa kerumitan jika Anda sering mengubah tab. Pengaturan shiftwidth( sw) 0harus secara efektif membuat hal yang sama tabstopjuga.

Secara terperinci

shiftwidth sw

Jumlah ruang yang digunakan untuk setiap langkah indentasi (otomatis). Digunakan untuk cindent, >>, <<, dll
Ketika nol tabstopnilai akan digunakan.

tabstop ts

Jumlah spasi yang diperhitungkan dalam file. Lihat juga : perintah retab , dan softtabstopopsi.

softtabstop sts

Jumlah spasi yang Tabdiperhitungkan saat melakukan operasi pengeditan, seperti menyisipkan Tabatau menggunakan BS. Ini terasa seperti Tabs sedang dimasukkan, padahal campuran ruang dan s digunakan. Ini berguna untuk menjaga tabspengaturan is pada nilai standarnya, sementara bisa mengedit seperti diatur ke sts. Ketika stsnegatif, nilai shiftwidthdigunakan. Ini akan menghemat beberapa kerumitan jika Anda sering mengubah tabstops. Ketika expandtabtidak diatur, jumlah ruang diminimalkan dengan menggunakan Tabs.

expandtab et

Dalam mode Sisipkan: Gunakan jumlah spasi yang sesuai untuk menyisipkan a. Ruang yang digunakan dalam indentasi dengan >dan <perintah dan ketika autoindentaktif. Untuk memasukkan tab asli saat expandtabaktif, gunakan Ctrl- V Tab. Lihat juga : retab

Orwellophile
sumber
Rapi, saya telah menggunakan vim selama bertahun-tahun tetapi warisan sts / sw / ts tidak pernah menarik perhatian saya.
timss
2

Saya menulis GreedyBackspace.vim untuk seseorang yang menginginkan sesuatu seperti ini. Saya pribadi tidak menggunakannya jadi sudah lama sejak saya memperbaruinya. Saya belum menerima laporan bug apa pun tentang itu akhir-akhir ini.

Heptite
sumber
1

Beberapa pilihan:

  1. Anda bisa 'mem-retab' semua spasi putih sehingga diganti dengan tab. Dengan begitu mereka bisa dengan mudah dihapus.
  2. Anda bisa (ini belum teruji, jadi saya hanya mengusulkan ide di sini) membuat fungsi yang 'mengeksekusi dalam mode normal 4 kali tombol backspace. Kemudian petakan itu untuk sesuatu. Namun, tidak ada cara untuk mengetahui apakah itu akan menghapus spasi atau beberapa karakter penting, jadi ini berpotensi tidak aman.
  3. '4X' akan menghapus 4 karakter terakhir (itu X besar, bukan kecil, yang kecil akan bertindak seperti tombol Del '.
Benteng
sumber
0

Cara termudah adalah <<, ulangi dengan a.

vimmer
sumber
Halo dan selamat datang di superuser. Meskipun saya setuju dengan jawaban Anda menjadi pengguna vi sendiri. Jawaban Anda singkat, tidak menjelaskan mengapa Anda menyarankan apa yang Anda sarankan dan mengapa Anda tidak menyarankan sesuatu yang sesuai dengan pertanyaan yang diajukan.
Mogget
-1

Sudahkah Anda memeriksa menggunakan pengaturan tab memperluas di VIM Anda?

:set noet

Saya biasanya lebih suka menjaga tab saat bekerja pada file.
Saat diperlukan, saya mengganti tab menjadi 4 spasi atau sebanyak yang diperlukan.

:%s/<ctrl+V><tab>/    /g
                  ----

Sebagai bonus kecil, file sumber Anda lebih pendek 3 chars per tab :-)

nik
sumber
oh, saya punya et karena saya harus memperluas tab - saya pikir - karena kode yang saya edit pada awalnya ditulis seperti itu. sekarang saya hanya mengikuti konvensi itu.
Evgeny
Anda masih bisa melakukan apa yang saya katakan dan mengembalikan spasi di akhir (ketika Anda harus mengembalikan file ke repositori)
nik
Mungkin Anda bisa memiliki fungsi vim yang membentangkannya ke tab saat terbuka dan menciutkannya menjadi spasi saat ditutup? Adakah yang punya ide?
sixtyfootersdude
Ini adalah jawaban yang benar-benar tidak membantu - itu membuka kembali tab-vs-space, tanpa benar-benar memberikan informasi yang berguna.
Dietrich Epp
-2

Saya pikir tidak ada jalan. Setelah tombol tab diperluas ke empat spasi, vim tidak memiliki cara untuk mengetahui bahwa mereka pernah menjadi tab.

David Mackintosh
sumber
4
-1: Kurang imajinasi.
sixtyfootersdude