วิธีการแบ่งบรรทัดยาวเป็นกลุ่ม?


12

ฉันมีไฟล์ข้อความขนาดใหญ่ที่สร้างขึ้นจากบล็อกเช่น

Short line.
Really long line.
Short line.

คั่นด้วยบรรทัดว่างและฉันต้องการใช้กลุ่ม (บน Linux) เพื่อแยกย่อยบรรทัดยาวและรับบล็อกเช่น

Short line.
This was
part of
a long line.
Short line.

ปัญหาของฉันกับgq(และgw) คือมันจะทำการรีโฟลว์แต่ละบล็อกทั้งย่อหน้านั่นคือมันไม่ได้รักษาตัวแบ่งสองบรรทัดภายในแต่ละบล็อกและตามที่:help fo-tableไม่มีgqตัวเลือกการจัดรูปแบบใด ๆ ฉันยังคิดด้วยว่าฉันสามารถบรรลุเป้าหมายได้ถ้าฉันสามารถกำหนดอักขระขึ้นบรรทัดใหม่ให้เป็นตัวคั่นย่อหน้า:help paragraphได้

แก้ไข:ฉันรู้ว่าฉันสามารถใช้gqหรือจัดgwรูปแบบแต่ละบรรทัดยาวทีละหนึ่ง แต่เนื่องจากไฟล์ของฉันทำงานมากกว่าสองสามพันบรรทัดฉันกำลังมองหาวิธีที่จะบรรลุสิ่งนี้โดยอัตโนมัติ


โดยวิธีการ: ฉันค้นหาวิธีแก้ไขปัญหาของฉันในเอกสารของ vim ที่นี่ใน SU และบนเว็บว่างเปล่าขึ้นมา ฉันยินดีที่จะลบคำถามนี้หากฉันมองข้ามสิ่งที่ชัดเจน
AP


@ MartinSchröder: ดีใจที่รู้ว่ามี vi SE! คำตอบเหล่านั้นไม่ได้อยู่ที่ปัญหาของฉัน แต่เนื่องจากผมรู้แล้วเกี่ยวกับและgq gwฉันก็ดีใจที่ฉันไม่ได้หยุดอยู่แค่นั้นมิฉะนั้นฉันจะไม่ได้เรียนรู้เกี่ยวกับ:gคำสั่ง :)
AP

คำตอบ:


16
:%norm! gww

สิ่งนี้ใช้normalคำสั่งgww(ซึ่งจัดรูปแบบบรรทัดปัจจุบันเช่นเดียวกับgw) บนบัฟเฟอร์ทั้งหมดโดยไม่คำนึงถึงการแมปที่กำหนดเอง (เพื่อหลีกเลี่ยงปัญหาหากgwถูกแมปกับสิ่งอื่น)

ดู

  • :help :%
  • :help :norm
  • :help gww

ทางเลือกนี้เป็นไปตามข้อเสนอแนะของเบ็นในความคิดเห็นและตรงไปตรงมามากกว่าโซลูชันดั้งเดิมซึ่งถูกบันทึกไว้ด้านล่างเนื่องจากอาจเหมาะสมกว่าในสถานการณ์ที่คล้ายกันอื่น ๆ เนื่องจากความสามารถในการจับคู่นิพจน์ปกติ ในกรณี "จับคู่ทุกบรรทัด" มันเป็นสัตว์ที่ไม่จำเป็น


ใช้gwwกับแต่ละบรรทัดในบัฟเฟอร์โดยทางโปรแกรม:

:g/^/norm gww

ดูและ:help :g ตรงกับจุดเริ่มต้นของบรรทัดซึ่งในทางปฏิบัติทำให้การจับคู่นี้ทุกบรรทัด:help norm^

คุณสามารถเลือกเพื่อเลือกบรรทัดที่ยาวกว่าเช่น 60 อักขระด้วย

:g/\%>60v/norm gww

(ดู:help \%<) แต่ในทางปฏิบัติgwwจะทำการฟอร์แมตบรรทัดใหม่นานกว่าtextwidthนั้นดังนั้นจึงอาจไม่สำคัญมากนักในเรื่องความเร็วและผลลัพธ์

(ฉันใช้vสำหรับ "virtual column" แทนที่จะcเป็น "column" เนื่องจากหลังนี้คำนวณจำนวนไบต์ที่แน่นอนลงในบรรทัดสิ่งนี้สามารถนำไปสู่ผลลัพธ์ที่ไม่คาดคิดเมื่อใช้การเข้ารหัสแบบหลายไบต์ซึ่งมักเป็นเหตุผลที่ต้องระวัง ในทางปฏิบัติมันไม่ได้เป็นปัญหาจริงด้วยเหตุผลเดียวกันกับข้างต้นซึ่งgwwจะไม่ทำให้เส้นฟอร์แมตสั้นกว่าtextwidthเดิม)


เห็นได้ชัดว่า:gล้มเหลวหากไม่มีรูปแบบดังนั้นจึง:g//norm gwwใช้งาน:g/.*/norm gwwไม่ได้
AP

@AP: หืมทำงานให้ฉัน ฉันใช้ Vim 7.4.488-6 จาก Debian Unstable
Daniel Andersson

4
:g//นำรูปแบบการค้นหาล่าสุดมาใช้ซ้ำ หากไม่มีเลยก็จะล้มเหลว ใช้:g/^/เพื่อนำไปใช้กับทุกบรรทัด
Ingo Karkat

@IngoKarkat: อ่าเข้าใจแล้วตั้งแต่รูปแบบสุดท้ายของฉันในระหว่างการทดสอบคือความยาวบรรทัดที่ฉันรู้ในภายหลัง ฉันจะอัปเดตคำตอบ คุณรู้หรือไม่ว่ามีการกล่าวถึงพฤติกรรม "รูปแบบที่ว่างเปล่า" นี้ในที่ใด ฉันไม่สามารถหามันได้
Daniel Andersson

หากดูจากคู่มืออาจเป็นนัยว่าข้อมูลที่ให้ใน:help last-patternการค้นหาปกติใช้กับ:globalคำสั่งด้วย
Daniel Andersson

4

เนื่องจากคุณได้แล้วอ่านคู่มือสำหรับgqและgwคำสั่งฉันคิดว่าคุณอาจต้องการบางสิ่งบางอย่างสะดวกสบายกว่าด้วยตนเองย้ายไปอยู่ที่เส้นยาวแล้วใช้gw0, gw$หรืออีกgwคำสั่งเพียงรูปแบบบรรทัดปัจจุบัน

ฉันไม่รู้จักวิธีง่ายๆในการทำลายเส้นยาว ๆ ใน Vim บนบล็อกข้อความ อย่างไรก็ตามเนื่องจากคุณได้กล่าวว่าการใช้ Vim บนระบบ GNU / Linux ฉันขอแนะนำให้กรองข้อความของคุณผ่านfmtคำสั่งGNU

สำหรับไฟล์ทั้งหมด:

:%!fmt --width=75 --split-only

สำหรับย่อหน้าปัจจุบัน (ใช้ตัวเลือกสั้น ๆ ):

:'{,'}!fmt -75 -s

คำอธิบายของfmtตัวเลือกที่เกี่ยวข้องคือ:

  • -w, --width=WIDTH- ความกว้างของบรรทัดสูงสุด (ค่าเริ่มต้น 75 คอลัมน์) ตัวเลือก-WIDTHเป็นรูปแบบย่อของ--width=DIGITS(หากใช้เวอร์ชันย่อนี้จะต้องเป็นตัวเลือกแรก)

  • -s, --split-only- แบ่งสายยาว ๆ แต่อย่าเติม นี่คือตัวเลือกที่เก็บรักษาตัวแบ่งบรรทัดของคุณล่วงหน้า


fmtขอขอบคุณสำหรับการกล่าวขวัญ ฉันชอบที่จะยอมรับคำตอบอื่น ๆ เพราะมันต้องเป็นกลุ่มเท่านั้น
AP

@AP ไม่ต้องกังวล มันเป็นคำตอบที่ยอดเยี่ยมและฉันก็ยอมรับด้วยตัวเอง ทั้งมันและคำถามของคุณทำเครื่องหมาย upvotes
Anthony Geoghegan

1

จาก:

Short line.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Short line.

วางเครื่องหมายบนบรรทัด "lorem ipsum" และgwwอัตราผลตอบแทนกด( textwidth=40เพื่อความชัดเจน):

Short line.
Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
Short line.

ซึ่งสำหรับฉันดูเหมือนว่าสิ่งที่คุณขอ ถ้าไม่โปรดอธิบาย

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