Bagaimana saya bisa membungkus teks dengan panjang tertentu di Vim?

102

Mari kita bicara tentang ukuran relatif. My Vim terlihat seperti:

aaaaaaaaaaaaa 
bbbbbbbbbbbbb 
ccccccccccccc 
etc

Saya ingin ukurannya lebih kecil:

aaaaa
aaaaa
bbbbb
bbbbb
ccccc
ccccc
etc

Bagaimana saya mendapatkannya? Dan bagaimana saya dapat mengatur panjang blok seperti itu?

Léo Léopold Hertz 준영
sumber
Apakah yang Anda maksud adalah bungkus teks, dan bukan teks indentasi?
lc.
lc: Saya tidak tahu bedanya. Saya akan menulis bungkus seperti yang direkomendasikan kepada saya, tetapi saya tidak pernah berhasil.
Léo Léopold Hertz 준영

Jawaban:

177

Anda sebenarnya dapat melakukan dua hal:

  1. Biarkan vim memformat (iechange) teks Anda menjadi baris yang lebih pendek, dengan menyisipkan penggalan baris
  2. Biarkan garis apa adanya, tetapi tampilkan dibungkus

Yang mana yang kamu mau

Opsi 1 akan dicapai dengan pengaturan textwidth(misalnya :set textwidth=30(dari jawaban Swaarop)). Kemudian Anda dapat memformat ulang teks Anda dengan menyorotnya (dalam mode visual) dan mengetik gq. ( textwidthdapat disingkat tw, jadi :set tw=30.)

Opsi 2 dapat diubah dengan menjalankan :set wrap/ :set nowrap. Ini akan membungkus garis yang terlalu panjang untuk jendela.

Keduanya independen.

sleske
sumber
33
+1 untuk perintah tombol gq dari mode visual, itu sangat berguna
Fire Crow
3
FYI ini memecah spasi dan gqgq tidak melakukan apa pun ke baris seperti yang ditunjukkan dalam pertanyaan bahkan jika tw = 5.
dlamblin
2
@Dlamblin: Benar. Jika Anda ingin melipat tepat pada lebar yang diberikan, tanpa memperhatikan spasi, gunakan foldperintah seperti pada jawaban fgm.
sleske
Pilihan Anda untuk tidak bekerja sejauh yang saya lihat. wrapakan membungkus di batas jendela, bukan di textwidth.
DerWeh
@DerWeh: Ya, bungkus akan membungkus di batas jendela. Saya mengedit untuk mengklarifikasi.
sleske
60

Setelah Anda menyetel 'lebar teks', Anda dapat memilih teks dengan mode visual dan menekan gq untuk membungkusnya dengan baik (Anda juga dapat menggunakan Q pada beberapa konfigurasi lama / lama).

Beberapa tip berguna:

gqq (wrap the current line)
gq} (wrap this 'paragraph', i.e. until the next blank line)
:h gq
Vlad Dogaru
sumber
3
+1, Saya tidak sengaja menekan gq saat berada di vim, telah menghabiskan setengah jam terakhir untuk mencoba melihat apa yang saya pukul. Ini sangat berguna.
pengguna176121
gqqjuga membungkus baris saat ini (bukan gqgqatau gq$).
Ash
21

Menggunakan lipatan (1) adalah salah satu kemungkinan:

:%!fold -w5 

Hasil:

aaaaa
aaaaa
aaa 
bbbbb
bbbbb
bbb 
ccccc
ccccc
ccc
Fritz G. Mehner
sumber
1
Ini juga tidak menghormati ruang untuk lipat
Lionel
7
@Lionel: Ya. Untuk menghargai spasi, tambahkan opsi "-s" ke perintah lipat.
sleske
14
:set textwidth=30
Swaroop CH
sumber
Bagaimana textwidth menanganinya saat tidak ada spasi, seperti pada contoh poster asli? Saya pernah bermain dan sepertinya hanya memformat berdasarkan lebar teks jika ada spasi (atau diasumsikan, jika variabel breakat disetel ke sesuatu yang lain).
Andy
3
@Andy textwidthtidak akan menangani situasi tanpa spasi. Anda dapat menulis formatexprfungsi Anda sendiri untuk melakukan itu.
Swaroop CH
8

Jika Anda memiliki teks tanpa spasi yang ingin Anda pisahkan pada panjang tertentu, tidak perlu menggunakan eksternal foldatau menulis milik Anda sendiri formatexpr.

:%s/\(.\{80\}\)/\1\r/g

akan merusak semua baris pada 80 karakter.

kthy
sumber
2
Ini menyelamatkan hari saya saat menghidupkan kembali sertifikat OpenSSL. Terima kasih
Cengiz Can