Ganti tab dengan spasi di vim

358

Saya ingin mengonversi tab menjadi spasi di gVim. Saya menambahkan baris berikut ke _vimrc:

set tabstop=2

Ini berfungsi untuk berhenti di dua spasi tetapi masih terlihat seperti satu tombol tab dimasukkan (saya mencoba menggunakan tombol h untuk menghitung spasi sesudahnya).

Saya tidak yakin apa yang harus saya lakukan untuk membuat tab konversi gVim ke spasi?

David.Chu.ca
sumber
1
Secara pribadi, saya akan menemukan tabstop = 2 indentasi terlalu kecil; Saya menggunakan ts = 4, dan mengerti mengapa orang (seperti tim kernel Linux) menggunakan ts = 8 (dan mereka tidak menggunakan expandtab - saya lakukan).
Jonathan Leffler
4
Apakah ada cara untuk mengonversi spasi menjadi tab di dalam vim?
cwd
2
@cwd mengganti spasi dengan karakter tab ( ^Iyang berasal dari Ctrl-vsaat itu Tab) akan berfungsi, misalnya jika tab Anda saat ini adalah 4 spasi::%s/ /^I/g
Indra Ginanjar

Jawaban:

381

IIRC, sesuatu seperti:

set tabstop=2 shiftwidth=2 expandtab

harus melakukan trik. Jika Anda sudah memiliki tab, ikuti dengan RE global yang bagus untuk menggantinya dengan spasi ganda.

D.Shawley
sumber
25
Ups, itu ":%! Perluas -t2"
Paul Tomblin
369
atau Anda bisa menggunakan: retab
rampion
bagaimana jika saya ingin menyimpannya dengan spasi? sekarang ketika saya: wq dan buka file lagi saya kembali ke tab
Gorkem Yurtseven
1
@Gorkem memasukkan perintah-perintah ini ke .vimrc Anda, sehingga vim menggunakan pengaturan tersebut setiap sesi
Krakkos
5
Apa artinya semua ini, dijelaskan dengan baik di wiki Vim .
Serge Stroobandt
825

Setelah Anda memperluas tab sesuai jawaban yang lain, cara yang sangat mudah untuk mengonversi file yang ada sesuai dengan pengaturan baru Anda adalah:

:retab

Ini akan bekerja pada buffer saat ini.

ʞɔıu
sumber
tetapi bagaimana kita bisa membuat retab meminta konfirmasi setiap terjadinya TAB?
Oculus Dexter
8
Dan sebagai Vim, ini bekerja pada daerah yang dipilih secara visual juga :)
Andy
2
Terima kasih telah mengajari saya hal baru. Saya telah menggunakan yang membosankan :%s/\t/ /gselama bertahun-tahun sebelum melihat komentar Anda.
Tai Le
Anda bahkan :args retab | wdapat melakukannya untuk semua file yang dibuka pada baris perintah, misalnya vim *.txt,.
JakeD
Adakah yang tahu versi vim yang mana: retab? 7.3.322 saya tidak.
Pembuat bit
114

Mencoba

set expandtab

untuk tab lunak.

Untuk memperbaiki tab yang sudah ada:

:%s/\t/  /g

Saya menggunakan dua spasi karena Anda telah mengatur tabstop Anda menjadi 2 spasi.

Hank Gay
sumber
5
Perbaikan itu akan menyisipkan dua ruang di mana hanya satu yang diperlukan.
Jonathan Leffler
8
alih-alih melakukan substitusi, Anda dapat melakukan apa yang disarankan Nick di atas - yaitu retab. Itu akan mengubah ulang semua tab yang ada saat jumlah ruang yang diatur di tabstop Anda.
Gowri
Tip yang luar biasa! Vim menunjukkan kepada saya file yang diidentifikasi sempurna sementara cat (linux cmd) menunjukkan identifikasi tidak teratur. Saya baru saja mengubah 2 spasi menjadi 4 seperti yang saya gunakan di Vim set ts = 4.
karlphillip
60

Ini bekerja untuk saya:

Anda dapat melihat tab dengan terlebih dahulu melakukan ini:

:set list

kemudian untuk memungkinkan untuk mengganti tab kemudian lakukan ini:

:set expandtab

kemudian

:retab

sekarang semua tab telah diganti dengan spasi, Anda dapat kembali ke tampilan normal seperti ini:

:set nolist
serup
sumber
1
:set listitu indah.
Amir A. Shabani
44

gg=G akan reindent seluruh file dan menghapus sebagian besar jika tidak semua tab yang saya dapatkan di file dari rekan kerja.

Penjual Jake
sumber
1
apakah itu mengganti tab dengan spasi?
likejudo
1
Luar biasa! Bekerja untuk saya juga.
Nawaz
1
Bisakah Anda jelaskan apa yang gg = G lakukan? ini melakukan persis apa yang saya cari. Saya memiliki html pada luhur dan ketika saya menempelkannya di vim, itu indentasi. Ini sekarang terlihat bersih.
jes516
3
@ jes516 ggmemindahkan kursor Anda ke awal buffer. =adalah format, dan mengambil perintah gerakan. Gmemindahkan kursor Anda ke ujung buffer, sehingga memberitahu vim untuk memformat dari awal hingga akhir buffer Anda saat ini.
Penjual Jake
40

Tambahkan baris berikut ke .vimrc Anda

set expandtab
set tabstop=4
set shiftwidth=4
map <F2> :retab <CR> :wq! <CR>

Buka file dalam vim dan tekan F2 Tab akan dikonversi ke 4 spasi dan file akan disimpan secara otomatis.

anish
sumber
Mungkin perlu dicatat bahwa qakan menutup buffer file saat ini juga. Ini mungkin atau mungkin tidak diinginkan.
Willem van Ketwich
14

Jika Anda ingin tetap \tsama dengan 8 spasi maka pertimbangkan pengaturan:

   set softtabstop=2 tabstop=8 shiftwidth=2

Ini akan memberi Anda dua spasi per <TAB>pers, tetapi \tkode Anda yang sebenarnya masih akan dilihat sebagai 8 karakter.

pk.
sumber
Terima kasih telah menyebutkan softtabstop, salah satu fitur pembunuh, saya pikir.
Martin Ueding
6

Ini membuatnya bekerja untuk saya:

:set tabstop=2 shiftwidth=2 expandtab | retab
Willem van Ketwich
sumber
4

pertama cari tab di file Anda: / ^ I: set expandtab: retab

akan bekerja.

Shekar
sumber
bagian pertama bisa tolong jelaskan itu
serup
3

Artikel ini memiliki skrip vimrc yang sangat baik untuk menangani tab + spasi, dan melakukan konversi di antaranya.

Perintah-perintah ini disediakan:

Space2Tab Konversi spasi menjadi tab, hanya di indentasi.

Tab2Space Konversi tab menjadi spasi, hanya dalam indentasi.

RetabIndent Execute Space2Tab (jika 'expandtab' diatur), atau Tab2Space (jika tidak).

Setiap perintah menerima argumen yang menentukan jumlah spasi di kolom tab. Secara default, pengaturan 'tabstop' digunakan.

Sumber: http://vim.wikia.com/wiki/Super_retab#Script

" Return indent (all whitespace at start of a line), converted from
" tabs to spaces if what = 1, or from spaces to tabs otherwise.
" When converting to tabs, result has no redundant spaces.
function! Indenting(indent, what, cols)
  let spccol = repeat(' ', a:cols)
  let result = substitute(a:indent, spccol, '\t', 'g')
  let result = substitute(result, ' \+\ze\t', '', 'g')
  if a:what == 1
    let result = substitute(result, '\t', spccol, 'g')
  endif
  return result
endfunction

" Convert whitespace used for indenting (before first non-whitespace).
" what = 0 (convert spaces to tabs), or 1 (convert tabs to spaces).
" cols = string with number of columns per tab, or empty to use 'tabstop'.
" The cursor position is restored, but the cursor will be in a different
" column when the number of characters in the indent of the line is changed.
function! IndentConvert(line1, line2, what, cols)
  let savepos = getpos('.')
  let cols = empty(a:cols) ? &tabstop : a:cols
  execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
  call histdel('search', -1)
  call setpos('.', savepos)
endfunction

command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)

Ini membantu saya sedikit lebih banyak daripada jawaban di sini ketika saya pertama kali mencari solusi.

Adam Eberlin
sumber
3

expandadalah utilitas unix untuk mengonversi tab menjadi spasi. Jika Anda tidak ingin setapa pun di vim, Anda dapat menggunakan perintah shell dari vim:

:!% expand -t8
qwr
sumber
1
jika Anda hanya ingin memperluas sebagian kode: pertama pilih bagian itu dalam mode visual, lalu tekan :. Sekarang baris perintah vim muncul :'<,'>. Kemudian masukan !expand -t4untuk tab ke 4 spasi. (Baris perintah yang dihasilkan adalah seperti :'<,'>!expand -t4)
Penghe Geng