perintah vim untuk merestrukturisasi / memaksa teks ke 80 kolom

240

Saya tahu ada cara untuk secara otomatis mengatur lebar teks dalam vim menggunakan set textwidth(seperti kekhawatiran tata letak kolom Vim 80 ). Apa yang saya cari adalah sesuatu yang mirip dengan =(perintah baris indent) tetapi untuk membungkus ke 80. Kasus penggunaan kadang-kadang Anda mengedit teks dengan lebar teks dan setelah bergabung dengan garis atau menghapus / menambahkan teks itu keluar dibungkus dengan buruk.

Idealnya, perintah ini akan sepenuhnya mengatur ulang garis yang saya pilih dan memotong garis panjang sambil menambahkan yang pendek. Sebuah contoh:

long line is long!  
short

Setelah menjalankan perintah (dengan asumsi bungkusnya 13 cols):

long line is  
long! short

Jika ini tidak mungkin dengan perintah vim sejati, mungkin ada program command-line yang melakukan ini yang saya dapat pipa input ke?

Setelah mencari saya menemukan referensi ini yang memiliki beberapa opsi lagi: http://www.cs.swarthmore.edu/help/vim/reformatting.html

jahat
sumber
9
Anda mungkin juga tertarik mengetahui bahwa Vim dapat mendelegasikan pemformatan teks ke program eksternal, seperti par . Saya membuat screencast yang menunjukkan cara memformat teks dengan par .
nelstrom
@nelstrom terima kasih, TIL tentang par. Fantastis!
Steven Lu
2
Ketika Anda ingin teks terlihat ramping & rapi (terpotong dengan baik?), Selalu pikirkan gq- Gentleman's Quarterly . (Permintaan maaf untuk antropomorfisasi laki-laki, tetapi mnemonik bekerja.)
ruffin

Jawaban:

372

Setel textwidthke 80 ( :set textwidth=80), pindah ke awal file (dapat dilakukan dengan Ctrl- Homeatau gg), dan ketik gqG.

gqGmemformat teks mulai dari posisi saat ini dan ke akhir file. Secara otomatis akan bergabung dengan garis berturut-turut bila memungkinkan. Anda dapat menempatkan garis kosong di antara dua baris jika Anda tidak ingin keduanya digabungkan.

Michael Madsen
sumber
14
Dan itu juga berfungsi dengan pilihan visual. Yaitu sesuatu seperti: V}gq. Dengan cara ini Anda melihat apa yang akan Anda format sebelum benar-benar memformatnya.
Plouff
6
Ngomong-ngomong, apa sebenarnya yang dilakukan qdengan sendirinya?
Richard-Degenne
1
Apakah ada cara untuk melakukan ini dengan garis-garis yang hanya satu rangkaian karakter yang panjang, tanpa spasi? EDIT: Saya telah menemukan utilitas "lipat". Masih bertanya-tanya tentang melakukan ini di vi.
Donald Smith
7
gunakan set tw=80alih-alih set textwidth=80untuk menghemat waktu
Yibo Yang
4
@ dmranck Setelah set textwidth=76baris Anda akan di autowrap saat mengetik. Keluhan saya adalah bahwa itu tidak melakukan apa pun untuk baris yang sedang diedit. Tetapi V}gqsangat berguna dalam hal itu. Vmemasuki mode pemilihan visual, }memilih ke istirahat paragraf berikutnya, dan gqmengeksekusi pemformat saat ini di atasnya (atau gunakan gwuntuk secara eksplisit memanggil formatter vi). Juga, {akan memilih ke atas. Anda dapat memilih seluruh dokumen dan format dengan ggVGgqmeskipun mungkin ada cara yang lebih mudah. Simpan itu sebagai makro @untuk membuatnya lebih mudah. Gunakan vipgquntuk menemukan paragraf saat ini.
ktbiz
94

Solusi Michael adalah kuncinya, tetapi saya paling sering menemukan saya ingin memformat ulang sisa paragraf saat ini; untuk perilaku ini, gunakan gq}.

Alex Hirzel
sumber
17
memperluas ini - Anda dapat menggunakan gq <motion> untuk memformat apa pun yang Anda suka.
Dan Schnau
1
Juga, opsi 'nojoinspaces' yang mencegah dua spasi muncul setelah periode ketika garis digabungkan pada batas kalimat. Bagus saat gaya tipografi Anda adalah spasi tunggal antara kalimat dalam bahasa Inggris.
Alex Hirzel
36

Anda dapat menggunakan gqdengan operator gerakan apa pun. Misalnya, jika Anda hanya ingin memformat ulang ke akhir baris saat ini (yaitu untuk membungkus garis di mana kursor Anda aktif) Anda dapat menggunakangq$

Anda juga dapat memformat ulang dengan memilih teks dalam mode visual (menggunakan `v dan bergerak) dan kemudian mengetik gq.

Ada opsi lain untuk memaksa garis untuk membungkus juga.

Jika Anda ingin vim untuk membungkus baris Anda saat Anda memasukkan teks di dalamnya daripada harus menunggu sampai akhir untuk merestrukturisasi teks, Anda akan menemukan opsi ini berguna:

:set textwidth=80
:set wrapmargin=2

(Jangan dilacak oleh wrapdan linebreak, yang hanya memformat ulang teks yang ditampilkan di layar, dan jangan mengubah teks di buffer)

JohnGH
sumber
9
Dari wrapmarginbantuan: Ketika 'textwidth' bukan nol, opsi ini tidak digunakan.
mmoya
21

Berkat komentar dari DonaldSmith saya menemukan ini, karena textwidthopsi tidak memformat ulang garis panjang teks saya (saya mengkonversi bermain dengan konversi hex-to-byte):

:%!fold -w 60

Itu mereformasi seluruh file (yang merupakan satu baris untuk saya) menjadi baris dengan panjang 60.

shearn89
sumber
1
Ini sangat bagus. Semua jawaban fokus pada membatasi lebar garis ketika garis dibagi spasi menjadi kata-kata. Solusi ini bekerja untuk kata-kata yang sangat panjang (urutan DNA).
pedrosaurio
1
Untuk url yang panjang ini adalah satu-satunya hal yang saya temukan yang berfungsi. Saya sudah baru tentang textwidth tetapi tidak akan memutus string yang tidak terputus (yang biasanya merupakan hal yang baik)
SkyLeach
13

Jika Anda mencari cara non-Vim , selalu ada perintah UNIX fmt dan par .

Catatan:

  • Saya tidak dapat mengomentari Unicode, mungkin atau mungkin tidak berperilaku berbeda.
  • @nelstrom telah disebutkan menggunakan pardi webcastnya .

Inilah cara kami akan menggunakan keduanya sebagai contoh Anda.

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

Untuk digunakan dari dalam Vim:

:%! fmt -w 13
:%! par 13gr

Anda juga dapat mengatur :formatprgke par atau fmt dan menimpa gq. Untuk info lebih lanjut, hubungi :help formatprgbagian dalam Vim.

Ehtesh Choudhury
sumber
9

Hampir selalu saya gunakan gqdalam mode visual. Saya memberi tahu murid-murid saya bahwa itu adalah singkatan dari "Gentlemens 'Quarterly," sebuah majalah untuk orang yang cerewet.

ncmathsadist
sumber