Saya telah melihat beberapa pertanyaan tentang Stack Overflow untuk bagaimana mengkonversi spasi menjadi tab tanpa menemukan apa yang saya butuhkan. Tampaknya ada lebih banyak pertanyaan tentang cara mengubah tab menjadi spasi, tapi saya mencoba melakukan yang sebaliknya.
Dalam Vim
Saya sudah mencoba :retab
dan :retab!
tidak berhasil, tapi saya percaya itu sebenarnya untuk pergi dari tab ke spasi.
Saya mencoba keduanya expand
dan unexpand
pada command prompt tanpa hasil.
Ini file yang dimaksud:
Bagaimana saya bisa mengonversi spasi utama ke tab menggunakan salah satu Vim
atau shell?
sed "s/ +/`echo -e '\t'`/g" < input.py > output.py
) muncul untuk mengonversi semua spasi, bukan hanya memimpin spasi. Dalam contoh kedua (sed "s/^ +/`echo -e '\t'`/g" < input.py > output.py
) itu hanya mengganti spasi pertama pada setiap baris dengan tab dan meninggalkan sisanya.find
,awk
dan blackjack (terlalu lama untuk meninggalkannya dalam komentar, meskipun)Jawaban:
Menggunakan Vim untuk memperluas semua ruang utama (lebih luas dari
'tabstop'
), Anda benar untuk menggunakanretab
tetapi pastikan terlebih dahulu'expandtab'
diatur ulang (:verbose set ts? et?
adalah teman Anda).retab
Dibutuhkan rentang , jadi saya biasanya menentukan%
berarti "seluruh file".Sebelum melakukan hal seperti ini (terutama dengan file Python!), Saya biasanya mengatur
'list'
, sehingga saya bisa melihat spasi dan berubah.Saya memiliki pemetaan berikut dalam saya
.vimrc
untuk ini:sumber
:set noet
,:set tabstop=2
,:retab!
,:%retab!
,:set tabstop=1
,:retab!
,:%retab!
%
. Pemetaan F2 persis seperti yang diketiknya .:set noet ts=2 |%retab!
:%retab!
masih berfungsi. Saya bingung dengan==
, dll yang tidak menghormati pengaturan preserveindent.:set tabstop=4
1 - Jika Anda memiliki spasi dan ingin tab.
Pertama, Anda perlu memutuskan berapa banyak ruang yang akan memiliki satu tab. Yang mengatakan, misalkan Anda memiliki garis dengan memimpin 4 spasi, atau 8 ... Dari yang Anda sadari Anda mungkin ingin tab menjadi 4 spasi. Sekarang dengan info itu, Anda lakukan:
Ada masalah di sini! Urutan perintah ini akan mencari semua teks Anda, tidak hanya spasi di awal baris. Itu berarti string seperti:
"Hey,␣this␣␣␣␣is␣4␣spaces"
akan menjadi"Hey,␣this⇥is␣4␣spaces"
, tetapi tidak! itu tab !.Untuk menyelesaikan masalah kecil ini saya merekomendasikan
search
, bukannyaretab
.Pencarian ini akan mencari di seluruh file untuk setiap baris yang dimulai dengan jumlah tab apa pun, diikuti oleh 4 spasi, dan menggantinya dengan jumlah tab apa pun yang ditemukan ditambah satu.
Sayangnya, ini tidak akan berjalan sekaligus!
Pada awalnya, file akan memiliki garis yang dimulai dengan spasi. Pencarian kemudian akan mengkonversi hanya 4 spasi pertama ke tab, dan biarkan yang berikut ...
Anda harus mengulangi perintahnya. Berapa kali? Sampai Anda mendapatkan
pattern not found
. Saya belum bisa memikirkan cara untuk mengotomatiskan prosesnya. Tetapi jika Anda melakukannya:Anda mungkin sudah selesai. Perintah ini mengulangi pencarian / penggantian terakhir untuk 10 kali. Sepertinya program Anda tidak akan memiliki banyak indentasi. Jika sudah, ulangi lagi
@@
.Sekarang, cukup lengkapi jawabannya. Saya tahu Anda meminta yang sebaliknya, tetapi Anda tidak pernah tahu kapan Anda harus membatalkan sesuatu.
2 - Anda memiliki tab dan ingin spasi.
Pertama, tentukan berapa banyak ruang yang Anda ingin tab Anda konversi. Katakanlah Anda ingin setiap tab menjadi 2 spasi. Anda kemudian melakukan:
Ini akan memiliki masalah yang sama dengan string. Tetapi karena gaya pemrogramannya yang lebih baik untuk tidak menggunakan tab keras di dalam string, Anda sebenarnya melakukan hal yang baik di sini. Jika Anda benar-benar membutuhkan tab di dalam string, gunakan
\t
.sumber
ex command
, karena ini akan menjadi apa yang ada di dalam fungsi. Dan tidak, itu tidak jarang. Anda hanya perlu memiliki string dengan spasi agar berantakan. Tidak jarang sama sekali. Saya sudah di sana. Terima kasih sudah berkomentar.^
simbol, untuk memulai pencarian dari awal baris, Anda berisiko mengubah ruang di dalam string. Dengan^
jaminan Anda hanya mengubah spasi dan tab sejak awal baris, karenanya, lekukan. Selain itu, jika Anda yakin tidak masalah untuk melakukan semuanya sekaligus, hapus^
dan jalankan hanya sekali dengan::%s/\(^I*\)␣␣␣␣/\1^I/g
Penerjemahan: Cari setiap instance dari 4 spasi berurutan (setelah karakter =), tetapi hanya jika seluruh baris hingga titik tersebut adalah spasi putih (ini menggunakan pernyataan selebar pandang lebar-nol,
\@<=
). Ganti setiap instance yang ditemukan dengan karakter tab.sumber
:%s/\(^\s*\)\@<= /\t/g
- masukkan jumlah spasi yang sesuai (untuk mengonversi 4 spasi menjadi 1 tab, masukkan 4 spasi) tepat setelah<=
Mengubah semua spasi menjadi tab:% s / \ s / \ t / g
sumber
Linux: dengan
unexpand
(danexpand
)Berikut adalah solusi yang sangat baik: https://stackoverflow.com/a/11094620/1115187 , sebagian besar karena menggunakan * nix-utilities:
Linux: skrip khusus
Jawaban asli saya
Cuplikan Bash untuk mengganti lekukan 4 spasi (ada dua
{4}
skrip) dengan tab di semua.py
file di./app
folder (secara rekursif):Itu tidak memodifikasi 4 spasi di tengah atau di akhir.
Diuji di bawah Ubuntu 16.0x dan Linux Mint 18
sumber
Dalam kasus saya, saya memiliki beberapa spasi (bidang dipisahkan oleh satu ruang atau lebih) yang ingin saya ganti dengan tab. Berikut ini melakukannya:
sumber
Jika Anda telah GNU coreutils diinstal, mempertimbangkan
%!unexpand --first-only
atau tab 4-ruang, mempertimbangkan%!unexpand -t 4 --first-only
(--first-only
hadir hanya dalam kasus Anda tidak sengaja memohonunexpand
dengan--all
).Perhatikan bahwa ini hanya akan menggantikan ruang sebelum tab yang ditentukan berhenti, bukan ruang yang mengikutinya; Anda tidak akan melihat perbedaan visual dalam vim kecuali Anda menampilkan tab secara lebih harfiah; misalnya, saya
~/.vimrc
mengandungset list listchars=tab:▸┈
(saya menduga ini adalah mengapa Anda berpikirunexpand
tidak bekerja).sumber
Untuk menggunakan Vim untuk me-retab satu set file (mis. Semua file * .ts dalam hierarki direktori) dari katakanlah 2 spasi hingga 4 spasi Anda bisa mencoba ini dari baris perintah:
Apa yang dilakukan adalah menggunakan
find
untuk meneruskan semua file yang cocok kexargs
(opsi-print0 pada menemukan bekerja dengan opsi -0 ke xargs untuk menangani file dengan spasi dalam nama).xargs menjalankan vim dalam mode ex (
-e
) pada setiap file yang mengeksekusi perintah ex yang diberikan yang sebenarnya adalah beberapa perintah, untuk mengubah spasi terdepan yang ada menjadi tab, mengatur ulang tab berhenti dan mengubah tab kembali ke spasi dan akhirnya menyimpan dan keluar.Berjalan dalam mode ex mencegah hal ini:
Vim: Warning: Input is not from a terminal
untuk setiap file.sumber
Skrip Python Sederhana:
sumber