Bagaimana cara memecah garis panjang dalam vim?

12

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-tabletidak ada gqopsi 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 paragraphmereka adalah kode keras.

Sunting: Saya tahu bahwa saya dapat menggunakan gqatau gwmemformat 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.

AP
sumber
By the way: Saya mencari solusi untuk masalah saya dalam dokumentasi vim, di sini di SU, dan di web, muncul kosong. Saya dengan senang hati akan menghapus pertanyaan ini jika saya mengabaikan sesuatu yang sudah jelas.
AP
Ada Can I membenarkan teks dalam Vim? di vi.sx .
Pasang kembali Monica - M. Schröder
@ MartinSchröder: Senang mengetahui ada vi SE! Namun, jawaban itu tidak membahas masalah saya, karena saya sudah tahu tentang gqdan gw. Saya juga senang saya tidak berhenti di situ, kalau tidak saya tidak akan belajar tentang :gperintah itu. :)
AP

Jawaban:

16
:%norm! gww

Ini menerapkan normalperintah gww(yang memformat baris saat ini dengan gw) pada seluruh buffer, tanpa memperhitungkan pemetaan yang disesuaikan (untuk menghindari masalah jika misalnya gwtelah 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 gwwpada setiap baris di buffer secara terprogram:

:g/^/norm gww

Lihat :help :gdan :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

:g/\%>60v/norm gww

(lihat :help \%<) tetapi dalam praktiknya gwwhanya akan memformat ulang garis lebih lama dari pada textwidthitu, sehingga mungkin tidak masalah dalam kecepatan maupun hasil.

(Saya menggunakan vuntuk "kolom virtual" bukan cuntuk "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 itu gwwtidak akan memformat ulang garis yang lebih pendek dari pada textwidth.)

Daniel Andersson
sumber
Tampaknya :ggagal tanpa pola, jadi :g//norm gwwtidak berfungsi tetapi :g/.*/norm gwwtidak.
AP
@AP: Huh, bekerja untuk saya. Saya menggunakan Vim 7.4.488-6 dari Debian Unstable.
Daniel Andersson
4
:g//menggunakan kembali pola pencarian terakhir; jika tidak ada, itu gagal. Gunakan :g/^/untuk menerapkan ke semua lini.
Ingo Karkat
@IngoKarkat: Ah, masuk akal, karena pola terakhir saya selama tes adalah panjang garis yang saya perhatikan kemudian. Saya akan memperbarui jawabannya. Apakah Anda tahu di mana dalam bantuan perilaku "pola kosong" ini disebutkan? Saya tidak bisa dengan mudah menemukannya.
Daniel Andersson
Melihat melalui manual, mungkin tersirat bahwa informasi yang diberikan :help last-patternuntuk pencarian normal juga berlaku untuk :globalperintah.
Daniel Andersson
4

Karena Anda sudah membaca manual untuk gqdan gwperintah, saya pikir Anda mungkin menginginkan sesuatu yang lebih nyaman daripada secara manual pindah ke garis panjang dan kemudian menggunakan gw0, gw$atau gwperintah 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 fmtperintah GNU .

Untuk seluruh file:

:%!fmt --width=75 --split-only

Untuk paragraf saat ini (menggunakan opsi pendek):

:'{,'}!fmt -75 -s

Penjelasan fmtopsi yang relevan adalah:

  • -w, --width=WIDTH- Lebar garis maksimum (default 75 kolom). Opsi -WIDTHadalah 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.

Anthony Geoghegan
sumber
Terima kasih telah menyebutkan fmt. Saya lebih suka menerima jawaban yang lain, karena hanya membutuhkan vim.
AP
@ AAP Jangan khawatir. Ini jawaban yang bagus dan saya akan menerimanya, sendiri. Baik itu dan pertanyaan Anda pantas upvotes.
Anthony Geoghegan
1

Dari:

Short line.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Short line.

Menempatkan penanda pada baris "lorem ipsum" dan menekan gwwhasil (dengan textwidth=40kejelasan):

Short line.
Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
Short line.

yang bagi saya sepertinya seperti yang Anda minta. Jika tidak, silakan klarifikasi.

Daniel Andersson
sumber