ฉันจะตัดข้อความให้มีความยาวเป็นกลุ่มได้อย่างไร


102

มาพูดถึงมาตรการที่สัมพันธ์กัน Vim ของฉันดูเหมือนว่า:

aaaaaaaaaaaaa 
bbbbbbbbbbbbb 
ccccccccccccc 
etc

ฉันต้องการให้เล็กลง:

aaaaa
aaaaa
bbbbb
bbbbb
ccccc
ccccc
etc

ฉันจะรับมันได้อย่างไร? และฉันจะจัดการการตั้งค่าความยาวของบล็อกดังกล่าวได้อย่างไร


คุณหมายถึงตัดข้อความไม่ใช่เยื้องข้อความ?
lc.

lc: ฉันไม่รู้ความแตกต่าง ฉันกำลังจะเขียนห่อตามที่แนะนำให้ฉัน แต่ฉันไม่เคยใช้งานได้เลย
LéoLéopold Hertz 준영

คำตอบ:


177

คุณสามารถทำได้สองสิ่ง:

  1. ให้จัดรูปแบบเป็นกลุ่ม (iechange) ข้อความของคุณให้มีบรรทัดที่สั้นลงโดยการแทรกตัวแบ่งบรรทัด
  2. เว้นบรรทัดตามที่เป็นอยู่ แต่แสดงเป็นแบบห่อ

คุณต้องการอะไร

ตัวเลือกที่ 1 สามารถทำได้โดยการตั้งค่าtextwidth(ตัวอย่างเช่น:set textwidth=30(จากคำตอบของ Swaarop)) จากนั้นคุณสามารถฟอร์แมตข้อความของคุณโดยการเน้นมัน (ในโหมดภาพ) gqและการพิมพ์ ( textwidthสามารถย่อเป็นtwเพราะฉะนั้น:set tw=30.)

ตัวเลือกที่ 2 สามารถสลับด้วยการวิ่ง/:set wrap :set nowrapซึ่งจะตัดเส้นที่ยาวเกินไปสำหรับหน้าต่าง

ทั้งสองเป็นอิสระ


33
+1 สำหรับคำสั่งคีย์ gq จากโหมดภาพซึ่งมีประโยชน์อย่างมาก
Fire Crow

3
FYI นี่แบ่งช่องว่างและ gqgq ไม่ทำอะไรกับบรรทัดอย่างที่แสดงในคำถามแม้ว่า tw = 5
dlamblin

2
@Dlamblin: ถูกต้อง. หากคุณต้องการพับตามความกว้างที่กำหนดโดยไม่คำนึงถึงช่องว่างให้ใช้foldคำสั่งในคำตอบของ fgm
sleske

ตัวเลือกของคุณไม่ทำงานเท่าที่ฉันเห็น จะตัดที่ขอบเขตหน้าต่างที่ไม่ได้อยู่ที่wrap textwidth
DerWeh

@DerWeh: ใช่ห่อจะห่อที่ขอบหน้าต่าง ฉันแก้ไขเพื่อชี้แจง
sleske

60

เมื่อคุณตั้งค่า 'ความกว้างของข้อความ' คุณสามารถเลือกข้อความด้วยโหมดภาพและกด gq เพื่อรวมเข้าด้วยกัน (คุณยังสามารถใช้ Q ในการกำหนดค่ารุ่นเก่า / แบบเดิมได้อีกด้วย)

เคล็ดลับที่เป็นประโยชน์:

gqq (wrap the current line)
gq} (wrap this 'paragraph', i.e. until the next blank line)
:h gq

3
+1 ฉันเผลอกด gq ในขณะที่อยู่ในกลุ่มใช้เวลาครึ่งชั่วโมงที่ผ่านมาเพื่อพยายามดูว่าฉันโดนอะไร สิ่งนี้มีประโยชน์มาก
user176121

gqqยังรวมบรรทัดปัจจุบัน (แทนgqgqหรือgq$)
เถ้า

21

การใช้พับ (1) เป็นไปได้อย่างหนึ่ง:

:%!fold -w5 

ผลลัพธ์:

aaaaa
aaaaa
aaa 
bbbbb
bbbbb
bbb 
ccccc
ccccc
ccc

1
นอกจากนี้ยังไม่เคารพช่องว่างสำหรับการพับ
Lionel

7
@ ไลโอเนล: ใช่ ในการเคารพช่องว่างให้เพิ่มตัวเลือก "-s" ในคำสั่ง fold
sleske

14
:set textwidth=30

ความกว้างของข้อความจะจัดการอย่างไรเมื่อไม่มีช่องว่างเหมือนในตัวอย่างโปสเตอร์ต้นฉบับ ฉันเคยเล่นและดูเหมือนว่าจะจัดรูปแบบตามความกว้างของข้อความเท่านั้นหากมีช่องว่าง (หรือสมมติว่าตัวแปร breakat ถูกตั้งค่าเป็นอย่างอื่น)
Andy

3
@ แอนดี้textwidthจะไม่จัดการกับสถานการณ์ที่ไม่มีช่องว่าง คุณสามารถเขียนformatexprฟังก์ชันของคุณเองเพื่อทำสิ่งนั้นได้
Swaroop CH

8

หากคุณมีข้อความโดยไม่มีช่องว่างที่คุณต้องการที่จะทำลายในระยะเวลาหนึ่งก็จะไม่จำเป็นต้องใช้ภายนอกมิได้เขียนของคุณเองfoldformatexpr

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

จะทำลายทุกบรรทัดที่ 80 ตัวอักษร


2
สิ่งนี้ช่วยชีวิตฉันในขณะที่คืนชีพใบรับรอง OpenSSL ขอบคุณ
Cengiz Can
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.