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?


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.


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

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

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

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.


2
Ini menyelamatkan hari saya saat menghidupkan kembali sertifikat OpenSSL. Terima kasih
Cengiz Can
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.