Saya memiliki file teks yang cukup besar yang terbentuk dari blok seperti
Short line.
Really long line.
Short line.
dipisahkan oleh baris kosong, dan saya ingin menggunakan vim (di Linux) untuk memecah garis panjang dan mendapatkan blok seperti
Short line.
This was
part of
a long line.
Short line.
Masalah saya dengan gq
(dan gw
) adalah bahwa hal itu mencerminkan setiap blok sebagai seluruh paragraf, yaitu tidak mempertahankan dua jeda baris dalam setiap blok, dan menurut :help fo-table
tidak ada gq
opsi format akan memungkinkan saya untuk melakukan apa yang saya inginkan. Saya juga berpikir bahwa saya dapat mencapai tujuan saya jika saya dapat mendefinisikan karakter baris baru untuk menjadi pembatas paragraf, tetapi menurut :help paragraph
mereka adalah kode keras.
Sunting: Saya tahu bahwa saya dapat menggunakan gq
atau gw
memformat setiap baris panjang satu per satu, tetapi karena file saya berjalan lebih dari beberapa ribu baris, saya mencari cara untuk mencapai hal ini secara otomatis.
gq
dangw
. Saya juga senang saya tidak berhenti di situ, kalau tidak saya tidak akan belajar tentang:g
perintah itu. :)Jawaban:
Ini menerapkan
normal
perintahgww
(yang memformat baris saat ini dengangw
) pada seluruh buffer, tanpa memperhitungkan pemetaan yang disesuaikan (untuk menghindari masalah jika misalnyagw
telah dipetakan ke sesuatu yang lain).Lihat
:help :%
:help :norm
:help gww
Alternatif ini sesuai saran Ben dalam komentar, dan lebih mudah daripada solusi asli, yang disimpan di bawah karena mungkin lebih cocok dalam keadaan serupa lainnya karena kemampuan pencocokan ekspresi reguler. Dalam kasus "cocokkan semua baris", itu tidak perlu kasar, meskipun.
Menerapkan
gww
pada setiap baris di buffer secara terprogram:Lihat
:help :g
dan:help norm
.^
cocok dengan awal garis, yang dalam praktiknya membuat ini cocok dengan setiap baris.Satu juga dapat memilih untuk memilih hanya garis yang lebih panjang dari misalnya 60 karakter dengan
(lihat
:help \%<
) tetapi dalam praktiknyagww
hanya akan memformat ulang garis lebih lama dari padatextwidth
itu, sehingga mungkin tidak masalah dalam kecepatan maupun hasil.(Saya menggunakan
v
untuk "kolom virtual" bukanc
untuk "kolom", karena yang terakhir benar-benar menghitung sejumlah byte ke dalam baris. Ini dapat menyebabkan hasil yang tidak terduga ketika menggunakan pengkodean multibyte, yang sering menjadi alasan untuk waspada. Dalam praktiknya itu bukan masalah nyata karena alasan yang sama seperti di atas, berkenaan dengan itugww
tidak akan memformat ulang garis yang lebih pendek dari padatextwidth
.)sumber
:g
gagal tanpa pola, jadi:g//norm gww
tidak berfungsi tetapi:g/.*/norm gww
tidak.:g//
menggunakan kembali pola pencarian terakhir; jika tidak ada, itu gagal. Gunakan:g/^/
untuk menerapkan ke semua lini.:help last-pattern
untuk pencarian normal juga berlaku untuk:global
perintah.Karena Anda sudah membaca manual untuk
gq
dangw
perintah, saya pikir Anda mungkin menginginkan sesuatu yang lebih nyaman daripada secara manual pindah ke garis panjang dan kemudian menggunakangw0
,gw$
ataugw
perintah lain untuk hanya memformat baris saat ini.Saya tidak tahu cara mudah memecah garis panjang di Vim di atas blok teks. Namun, karena Anda telah menyebutkan bahwa Anda menggunakan Vim pada sistem GNU / Linux, saya sarankan memfilter teks Anda melalui
fmt
perintah GNU .Untuk seluruh file:
Untuk paragraf saat ini (menggunakan opsi pendek):
Penjelasan
fmt
opsi yang relevan adalah:-w, --width=WIDTH
- Lebar garis maksimum (default 75 kolom). Opsi-WIDTH
adalah bentuk singkatan--width=DIGITS
(jika menggunakan versi singkat ini, itu harus menjadi opsi pertama).-s, --split-only
- memecah garis panjang, tetapi tidak mengisi ulang; ini adalah opsi yang mempertahankan jeda garis keras Anda yang sudah ada sebelumnya.sumber
fmt
. Saya lebih suka menerima jawaban yang lain, karena hanya membutuhkan vim.Dari:
Menempatkan penanda pada baris "lorem ipsum" dan menekan
gww
hasil (dengantextwidth=40
kejelasan):yang bagi saya sepertinya seperti yang Anda minta. Jika tidak, silakan klarifikasi.
sumber