Gabungkan baris di dalam paragraf di vim

13

Misalkan Anda telah mengetik dokumen panjang dalam vim dengan garis otomatis terputus, sehingga semua baris telah rusak, katakanlah, 79 karakter. Anda bahkan mungkin telah menerapkan pemformatan ke seluruh dokumen untuk memecah semua garis pada panjang itu.

Paragraf dibatasi dalam dokumen Anda dengan baris kosong.

Sekarang Anda memutuskan untuk tidak ingin jeda baris dalam paragraf sama sekali.

Bagaimana Anda bisa menghapus semua jeda baris dalam paragraf tanpa menghilangkan batas paragraf sama sekali?

Saya telah melakukan peretasan yang cepat dan konyol ini, tetapi saya sedang mencari cara yang tepat.

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks
dggoldst
sumber
hei, jangan ketuk itu jika solusi Anda berhasil, dan solusi Anda berhasil.
pdwalker

Jawaban:

12

Saya pikir ini sesuai keinginan Anda: pastikan ada baris kosong di akhir file, lalu gabung setiap paragraf (diakhiri oleh baris kosong).

G:a

.
:g/^./ .,/^$/-1 join

Penjelasan: pertama pergi ke akhir file dan menambahkan baris kosong tambahan dengan :a(mungkin ada cara yang lebih elegan untuk melakukan itu; secara interaktif, Anda dapat mengganti tiga baris pertama dengan o<ESC>). Kemudian, untuk setiap baris non-kosong yang belum dianggap ( :g/^./), terapkan joinperintah ke rentang mulai dari baris yang dipilih ( .) dan akhiri satu baris sebelum baris kosong berikutnya ( /^$/-1).

Secara opsional, :g/^$/djika Anda tidak ingin baris kosong tetap ada (maka Anda dapat melepasnya -1).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih. Ini semakin dekat bagi saya, namun menghapus garis kosong di antara paragraf. (Saya mencoba format file unix dan dos untuk melihat apakah itu Windows). Juga, bisakah Anda menerjemahkan sedikit perintah? G pergi ke baris terakhir. : menurut bantuan adalah "tambahkan" tapi saya tidak yakin apa yang dilakukannya. Juga g / pola / cmd yang Anda miliki di sana telah kehilangan saya. Apa perintahnya?
dggoldst
@dggoldst: Saya telah mengubah perintah untuk mempertahankan baris kosong. Tiga baris pertama hanya untuk menambahkan baris kosong di akhir file (jika tidak paragraf terakhir tidak akan cocok). Perintah terakhir adalah :g, yang menerapkan perintah ke semua baris yang cocok; lihat :help :gdan mungkin utas ini tentang bagaimana :gberperilaku ketika Anda menghapus jeda baris .
Gilles 'SANGAT berhenti menjadi jahat'
:$pu _ di akhir letakkan register lubang hitam, yang menghasilkan garis kosong di bagian akhir.
SergioAraujo
12

Ini harus dilakukan:

:set tw=99999
gggqG

twdiatur ke beberapa nilai setidaknya sebesar jumlah karakter dalam paragraf terpanjang. ggmemindahkan kursor ke baris pertama; gqadalah perintah untuk memformat ulang; Gmemindahkan kursor ke baris terakhir, memberitahukan gquntuk memformat ulang dari lokasi kursor saat ini ke baris terakhir.

garyjohn
sumber
5
  1. Atur kursor di dalam paragraf yang diinginkan

  2. Tipe: vipJ

( vipmenyoroti paragraf saat ini, Jbergabung dengan semua baris)

Juan
sumber
2

Mungkin bukan cara paling bersih untuk melakukannya, tapi inilah yang akan saya gunakan:

ggqav}bgJ}wq999@a   # go to the top of the file (gg)
                    # start recording macro "a" (qa)
                    # select the entire paragraph (v})
                    # go back one word so as not to join the blank line (b)
                    # join the selected lines without spaces (gJ)
                    # go to first word of the next paragraph (}w)
                    # finish recording the macro (q)
                    # 999 times (arbitrary number of paragraphs to join)
                    # run macro "a" (@a)

( Bekerja di VIM 7.2. )

Bergantung pada bagaimana paragraf dipisah ketika mereka awalnya diformat, Anda mungkin ingin mengganti gJperintah (gabung tanpa spasi) dengan Jperintah (gabung dengan spasi).

999Hitungan sewenang-wenang hanya perlu setidaknya jumlah paragraf dalam file - Anda dapat memilih nomor yang lebih besar jika Anda ingin dan tidak kehilangan apa pun kecuali siklus prosesor. Dengan asumsi satu dan hanya satu baris kosong antara paragraf, Anda bisa mendapatkan penghitungan paragraf yang lebih akurat menggunakan:

:%s/^$//gn     # returns "999 matches on 999 lines"
goldpseudo
sumber
Ini bekerja untuk saya. Akan bagus untuk menambahkan "gg" di awal untuk meletakkan kursor di bagian atas file. Juga, menggunakan J bukan gJ tidak menyebabkan kata-kata yang terpisah menjadi satu. Ini mungkin hanya berlaku untuk nilai "formatoptions" saya, yang saat ini membingungkan saya.
dggoldst