Apakah mungkin untuk mengonversi tab menjadi spasi, sambil mempertahankan perataan teks?
Cukup mengganti hanya berfungsi bila tidak ada karakter utama.
Apakah mungkin untuk mengonversi tab menjadi spasi, sambil mempertahankan perataan teks?
Cukup mengganti hanya berfungsi bila tidak ada karakter utama.
Jawaban:
Anda bisa menggunakan :retab
perintah. Dari
:help :retab
Ganti semua urutan ruang putih yang berisi
<Tab>
string baru dengan ruang putih menggunakan nilai tabstop baru yang diberikan. Jika Anda tidak menentukan ukuran tabstop baru atau nol, Vim menggunakan nilai saat ini dari'tabstop'
. [...] Dengan'expandtab'
aktif, Vim mengganti semua tab dengan jumlah spasi yang sesuai.
Perhatikan bahwa perintah menerima rentang, sehingga Anda dapat membuat pemilihan visual dan kemudian hanya :retab
garis yang dipilih.
Namun, Anda dapat menggunakan :retab
, seperti yang dinyatakan, ini akan mengubah semua tab menjadi spasi, tidak hanya tab di awal baris
Jadi ini (di mana ⇥
karakter tab):
if :; do
⇥echo "⇥hello"
end
diubah menjadi (di mana ␣
karakter spasi):
if :; do
␣␣echo "␣␣hello"
end
Ini dapat menghasilkan efek samping yang tidak terduga dalam beberapa skenario, dan itu bahkan lebih menjadi masalah ketika mengubah spasi menjadi tab!
Jadi, saya menulis sedikit fungsi untuk mengubah hanya tab / spasi di awal baris:
" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
let l:spaces = repeat(' ', &tabstop)
" Replace tabs with spaces
if a:expandtab
silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
" Replace spaces with tabs
else
silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
endif
endfun
Dengan versi ini, Anda harus menentukan secara manual expandtab
dalam panggilan fungsi (mis. :call Retab(1)
Untuk mengubah tab menjadi spasi), tetapi Anda juga dapat memodifikasinya untuk mengambil nilai saat ini &expandtab
(seperti yang sudah terjadi dengan &tabstop
) sama seperti :retab
halnya. (Kebetulan saya lebih suka menentukannya secara manual).
a
di if a:expandtab
berarti?
set expandtab
di .vimrc lalu autocmd BufWritePre * :call Retab(&expandtab)
- indentasi akan diubah menjadi tab, alih-alih spasi.
Vim menyediakan !retab
perintah yang akan mengganti semua urutan <Tab>
dengan string white-space baru menggunakan nilai tabstop baru (misalnya :set tabstop=2
) yang diberikan, tetapi semua tab di dalam string dapat dimodifikasi (misalnya dalam program C, Anda harus menggunakan \t
untuk menghindari ini)!
Jadi atau Anda dapat mengubah semua tab menjadi spasi menggunakan perintah berikut:
:%s/\t/ /g
atau seperti yang disarankan oleh @Shahbaz :
:%s/^\t\+/ g
Jadi hanya tab yang digunakan dalam indentasi yang dikonversi.
Penjelasan:
%
mewakili seluruh buffer / file ( :help :%
)s
singkatan pengganti ( :help sub-replace-special
)\t
, atau ^I
kependekan dari tab
- Gunakan ruang sebanyak yang Anda butuhkan per satu tabg
- singkatan global, dan itu akan mengonversi banyak kemunculan tab di baris yang samaKemudian untuk memperbaiki lekukan dari seluruh file, Anda dapat mencoba: gg=G. Periksa: Mengindeks ulang kode yang indentasi buruk untuk detail lebih lanjut.
Untuk menggunakan spasi secara default alih-alih tab, Anda perlu menambahkan pengaturan berikut ke .vimrc
file Anda :
set tabstop=2 " (ts) width (in spaces) that a <tab> is displayed as
set expandtab " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2 " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)
Solusi alternatif adalah menggunakan tidy
Terkait:
%s/^\t\+/ g
sehingga hanya tab yang digunakan dalam indentasi yang dikonversi. Juga, gg=G
bisa menjadi bencana besar dengan bahasa seperti python.
Coba gunakan:
expand -t 4 input_filename output_filename
expand
adalah alat baris perintah untuk mengonversi tab menjadi spasi, yang bisa Anda jalankan dari shell atau dengan :!expand
.
Ada dalam POSIX sehingga harus tersedia di sebagian besar sistem. unexpand
akan melakukan yang sebaliknya.
expand
?
:%!expand -t 4
di dalam vim. Lebih baik lagi, Anda juga bisa menggunakan opsi lebar shift saat ini: :exe '%!expand -t ' . &shiftwidth
Untuk kelengkapan, =
bisa juga digunakan untuk memperbaiki lekukan, setelah Anda menentukan bahwa tab diganti dengan spasi. Dalam mode normal, Anda dapat melakukannya dengan mengetik :set expandtab
. Kemudian =
dapat digunakan dalam dua cara:
=
akan memperbaiki lekukan blok kode yang dipilih.gg=G
akan memperbaiki seluruh file, di mana gg
memindahkan kursor ke awal file, kemudian =
diterapkan, dan G
memindahkan kursor ke akhir file.Referensi: tautan
:h vim-faq
dan cari/tab characters
. Tag yang sulit diingat adalah:h faq-14.16
.