Ini cukup umum ketika pemrograman atau membuka file teks untuk menemukan file dengan spasi spasi di akhir baris. vim memiliki cara untuk menunjukkan ini dengan mengatur trail
opsi pada listchars
opsi lalu menghidupkan list
.
Namun, apa cara termudah untuk menghilangkan spasi spasi global di seluruh file (idealnya tanpa plugin)?
whitespace
line-breaks
Andrew Ferrier
sumber
sumber
:h vim-faq
dan cari/trailing
. Tag yang sulit diingat adalah:h faq-12.1
.Jawaban:
Gunakan pengikat kunci untuk menghapus semua spasi spasi
Karena beberapa halaman yang saya edit benar-benar membutuhkan trailing spasi (mis. Markdown) dan yang lain tidak, saya membuat keybinding F5sehingga sepele untuk dilakukan tanpa otomatis. Untuk melakukannya, tambahkan kode di bawah ini (dari vim.wikia) atau beberapa variasi untuk Anda
.vimrc
:nnoremap <F5>
melakukan pemetaan non-rekursif ke tombolF5
dalam mode normal:let _s=@/
menyimpan istilah pencarian terakhir (dari makro@/
) dalam variabel_s
<Bar>
Berfungsi sebagai simbol pipa|
untuk memisahkan perintah, namun|
akan mengakhiri perintah dalam konteks ini, jadi<Bar>
harus digunakan sebagai gantinya.:%s/\s\+$//e
mencari trailing whitespace dan menghapusnya di mana-mana di buffer (lihat jawaban CarpetSmoker untuk rincian terperinci dari ungkapan ini)let @/=_s
mengembalikan istilah pencarian terakhir Anda ke makro@/
, sehingga akan tersedia saat Anda menekan berikutnyan
.<CR>
mengakhiri pemetaan... atau lebih selektif
Jika Anda memiliki case di mana Anda tidak ingin menghapus semua spasi spasi, Anda bisa menggunakan pola untuk lebih selektif. Sebagai contoh, kode berikut ini menunjukkan bagaimana saya menghapus trailing spasi hanya jika itu datang setelah tanda titik koma (di sini ini terkait dengan F8).
Ini berguna jika, seperti saya, Anda memiliki beberapa file dengan heredocs mirip-markdown diselingi di antara pernyataan pemrograman yang diakhiri dengan titik koma.
sumber
:keeppatterns
untuk mencegah penggantian@/
. Dan lihat juga:keepjumps
.:help keeppattern
dan tidak mendapatkan apa pun.:nohl
baik, jika jika Anda sedang menyoroti sesuatu, itu akan terus menyoroti itu (lihat jawaban saya yang diperbarui).Cara "paling sederhana" adalah dengan hanya menggunakan
:substitute
::%s
untuk menjalankan:substitute
rentang%
, yang merupakan seluruh buffer.\s
t cocok dengan semua karakter spasi putih.\+
untuk mengulanginya 1 kali atau lebih.$
untuk berlabuh di ujung garis.e
bendera untuk tidak memberikan kesalahan jika tidak ada pertandingan (yaitu file sudah tanpa trailing spasi).Namun, ini mungkin bukan cara "terbaik" karena menyebabkan dua efek samping:
Anda dapat memperbaiki kedua item dengan mengubahnya menjadi fungsi:
Dan kemudian gunakan seperti:
winsaveview()
akan menyimpan "tampilan" saat ini, yang mencakup posisi kursor, lipatan, lompatan, dll. Padawinrestview()
akhirnya akan mengembalikan ini dari variabel yang disimpan.:keeppatterns
mencegah\s\+$
pola dari yang ditambahkan ke riwayat pencarian.Karena ini agak menjengkelkan untuk mengetik
:call
sepanjang waktu, Anda dapat mendefinisikan perintah:Yang dapat digunakan tanpa
:call
:Dan tentu saja Anda dapat mengikatnya ke kunci:
Beberapa orang suka melakukan ini secara otomatis sebelum mereka menulis file ke disk, seperti:
Saya tidak suka, karena beberapa format memerlukan trailing spasi (seperti penurunan harga), dan pada beberapa kesempatan lain Anda bahkan ingin trailing spasi dalam kode Anda (seperti memformat email, dan menggunakan
--<Space>
penanda untuk menunjukkan awal tanda tangan ).Modus plug Shameless: beberapa waktu lalu saya menulis skrip Python kecil untuk membersihkan spasi putih untuk seluruh proyek sekaligus.
sumber
`
dua kali setelah penggantian selesai. Ini membuka kemungkinan untuk membuat oneliner seperti ini:%s/\s\+$//e | exe "normal ``"
Untuk menghapus semua spasi spasi tambahan (di akhir setiap baris), Anda dapat menggunakan perintah:
Untuk memasukkan tab, gunakan
\s
bukan ruang.Dari baris perintah:
Semua file di direktori saat ini (digunakan secara rekursif
**/*.*
):Cara python:
atau:
Gunakan
lstrip()
untuk strip kiri (trailing),rstrip()
untuk strip kanan (depan) ataustrip()
untuk menghapus dari kedua ujungnya.Berikut adalah fungsi yang berguna yang menghilangkan ruang putih berlebihan dari ujung garis yang dapat Anda tambahkan ke
.vimrc
:Ada juga plugin DeleteTrailingWhitespace untuk itu.
Menyoroti ruang putih
Untuk memeriksa ulang apakah semua spasi tambahan hilang, gunakan:
Ketik
/ $
untuk menemukannya. Jika ada beberapa, vim akan menyorotinya untuk Anda.Gunakan warna untuk menyorotnya:
Gunakan karakter yang terlihat ( sumber ):
Lihat juga: Sorot ruang yang tidak diinginkan
Untuk menyorot jejak spasi kosong secara default, Anda dapat mengonfigurasi
.vimrc
sebagai berikut:Menghapus spasi putih secara default
Jika Anda ingin memastikan bahwa semua spasi kosong dalam file dihapus secara otomatis saat save, Anda dapat menambahkan perintah berikut ke dalam
.vimrc
:yang tidak direkomendasikan, karena akan menghapus trailing spasi dari setiap file yang disimpan pengguna (bahkan di mana spasi putih dapat diinginkan).
Lihat juga:
sumber
Mengulas sedikit atas jawaban Christopher Bottoms : Jonathan Palardy menulis artikel yang bagus tentang ini . Di dalamnya, ia menulis sebuah fungsi,,
Preserve(command)
yang menjaga status editor (terutama posisi kursor dan pola pencarian terakhir) saat menjalankan perintah arbitrer:Ini memiliki keuntungan menjadi multiguna, misalnya Anda dapat menggunakannya untuk mengganti semua spasi spasi (seperti yang dilakukan Jonathan) dengan memetakan ini ke:
Anda juga dapat menggunakannya untuk pemetaan mode visual untuk hanya menghapus spasi tambahan pada garis yang dipilih secara visual:
Dan Anda dapat menggunakannya untuk panggilan lain, seperti memformat seluruh dokumen menggunakan
=
sambil mempertahankan tempat Anda (baik gunakan kunci yang berbeda kali ini agar tidak bertentangan):Semua dan semua, saya telah menemukan
Preserve(command)
fungsi untuk menjadi alat yang bagus untuk dimiliki.sumber
@/
seharusnya tidak diperlukan (dalam hal ini, bagaimanapun).winsaveview()
danwinrestview()
jauh lebih unggul.Versi lain dari Fungsi StripTrailingSpaces:
SEBENARNYA ADA BUG DALAM FUNGSI INI (yang ini): kepemilikannya tidak disimpan karena opsi "range". itu dihapus berfungsi dengan sangat baik, namun saya membagikan kode untuk menerima bantuan.
Seperti yang Anda lihat, ia juga menggunakan fungsi Preserve yang terlihat di atas, tetapi dengan cara yang sedikit berbeda.
Perbedaannya di sini adalah bahwa saya dapat memilih rentang baris atau paragraf dengan
vip
dan kemudian rentang tersebut:'<,'>
akan secara otomatis muncul pada command prompt.Ide itu datang dari pos Bez Hermoso .
sumber