คำสั่ง vim เพื่อปรับโครงสร้าง / บังคับให้ข้อความเป็น 80 คอลัมน์


240

ฉันรู้ว่ามีวิธีการตั้งค่าความกว้างของข้อความโดยอัตโนมัติในการใช้เป็นกลุ่มset textwidth(เช่นVim 80 คอลัมน์เลย์เอาต์ที่เกี่ยวข้อง ) สิ่งที่ฉันกำลังมองหาคือสิ่งที่คล้ายกับ=(คำสั่งเยื้องบรรทัด) แต่ถึง 80 กรณีการใช้งานบางครั้งคุณแก้ไขข้อความที่มีความกว้างของข้อความและหลังจากที่เข้าร่วมบรรทัดหรือลบ / เพิ่มข้อความมันถูกห่อหุ้มไม่ดี

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

long line is long!  
short

หลังจากรันคำสั่ง (สมมติว่าการตัดคือ 13 cols):

long line is  
long! short

หากไม่สามารถทำได้ด้วยคำสั่ง vim จริงอาจมีโปรแกรมบรรทัดคำสั่งที่ฉันสามารถไพพ์อินพุตได้หรือไม่

หลังจากค้นหาฉันพบการอ้างอิงนี้ซึ่งมีตัวเลือกเพิ่มเติม: http://www.cs.swarthmore.edu/help/vim/reformatting.html


9
นอกจากนี้คุณอาจจะสนใจที่จะเรียนรู้ว่าเป็นกลุ่มสามารถมอบหมายข้อความการจัดรูปแบบโปรแกรมภายนอกเช่นที่ตราไว้หุ้น ฉันทำ screencast ซึ่งแสดงให้เห็นถึงวิธีการไปยังรูปแบบข้อความที่มีตราไว้หุ้นละ
nelstrom

@nelstrom ขอบคุณ TIL parเกี่ยวกับ มันยอดเยี่ยมมาก!
Steven Lu

2
เมื่อคุณต้องการให้ข้อความที่จะมองไปที่บางเฉียบและตัด (ตัดด้วย) มักจะคิดว่าgq- สุภาพบุรุษไตรมาส (ขอโทษสำหรับผู้ชายที่เปลี่ยนมนุษย์ แต่งานช่วยในการจำ)
ruffin

คำตอบ:


372

ตั้งtextwidth80 ( :set textwidth=80) ย้ายไปจุดเริ่มต้นของไฟล์ (สามารถทำได้ด้วยCtrl- Homeหรือgg) gqGและประเภท

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


14
และยังใช้งานได้กับการเลือกภาพ เช่น: V}gq. ด้วยวิธีนี้คุณจะเห็นสิ่งที่คุณกำลังจะจัดรูปแบบก่อนที่จะจัดรูปแบบจริง
Plouff

6
โดยวิธีการที่สิ่งที่ไม่ได้qด้วยตัวเอง?
Richard-Degenne

1
มีวิธีในการทำเช่นนี้กับบรรทัดที่เป็นเพียงอักขระยาวหนึ่งสตริงโดยไม่มีช่องว่างหรือไม่? แก้ไข: ฉันค้นพบยูทิลิตี้ "fold" ยังคงสงสัยเกี่ยวกับการทำสิ่งนี้ใน vi
Donald Smith

7
ใช้set tw=80แทนset textwidth=80การประหยัดเวลา
Yibo Yang

4
@dmranck หลังจากset textwidth=76บรรทัดของคุณจะ autowrap ขณะพิมพ์ การร้องเรียนของฉันคือมันไม่ได้ทำอะไรกับสายที่มีอยู่กำลังแก้ไข แต่V}gqมีประโยชน์อย่างมากในเรื่องนั้น Vเข้าสู่โหมดการเลือกด้วยภาพเลือก}ลงไปที่ตัวแบ่งย่อหน้าถัดไปและgqเรียกใช้ตัวจัดรูปแบบปัจจุบันที่มัน (หรือใช้gwเพื่อเรียกรูปแบบ vi อย่างชัดเจน) นอกจากนี้{จะเลือกขึ้น คุณสามารถเลือกทั้งเอกสารและรูปแบบได้ggVGgqแม้จะมีวิธีที่ง่ายกว่า บันทึกเป็นแมโครที่ใช้@เพื่อทำให้ง่ายขึ้น ใช้vipgqเพื่อ fmt ย่อหน้าปัจจุบัน
ktbiz

94

ทางออกของไมเคิลเป็นกุญแจสำคัญ แต่ฉันมักพบว่าฉันต้องการฟอร์แมตส่วนที่เหลือของย่อหน้าปัจจุบัน gq}สำหรับพฤติกรรมนี้การใช้งาน


17
ขยายนี้ - คุณสามารถใช้ gq <motion> เพื่อจัดรูปแบบสิ่งที่คุณต้องการ
Dan Schnau

1
นอกจากนี้ตัวเลือก 'nojoinspaces' ซึ่งป้องกันช่องว่างสองช่องไม่ให้ปรากฏหลังจากช่วงเวลาที่เส้นเข้าร่วมที่ขอบเขตประโยค ดีเมื่อสไตล์การพิมพ์ของคุณเป็นช่องว่างเดียวระหว่างประโยคในภาษาอังกฤษ
Alex Hirzel

36

คุณสามารถใช้gqกับผู้ประกอบการเคลื่อนไหวใด ๆ ตัวอย่างเช่นหากคุณต้องการฟอร์แมตใหม่จนจบบรรทัดปัจจุบัน (เช่นเพื่อตัดบรรทัดที่เคอร์เซอร์ของคุณเปิดอยู่) คุณสามารถใช้gq$

นอกจากนี้คุณยังสามารถฟอร์แมตใหม่โดยเลือกข้อความในโหมดภาพ (โดยใช้ `v และย้าย) จากนั้นพิมพ์ gq

มีตัวเลือกอื่น ๆ สำหรับการบังคับให้ตัดบรรทัดด้วย

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

:set textwidth=80
:set wrapmargin=2

(ไม่ได้รับการติดตามด้านข้างโดยwrapและlinebreakเพียงฟอร์แมตข้อความที่แสดงบนหน้าจอและไม่เปลี่ยนข้อความในบัฟเฟอร์)


9
จากwrapmarginความช่วยเหลือ: เมื่อ 'textwidth' ไม่เป็นศูนย์ตัวเลือกนี้จะไม่ถูกใช้
mmoya

21

ขอบคุณที่มีความคิดเห็นจาก DonaldSmith ฉันพบสิ่งนี้เนื่องจากtextwidthตัวเลือกไม่ได้ปรับรูปแบบข้อความที่มีความยาว (ฉันกำลังแปลงการเล่นด้วยการแปลงแบบ hex-to-byte):

:%!fold -w 60

นั่นคือการปฏิรูปไฟล์ทั้งหมด (ซึ่งเป็นหนึ่งบรรทัดสำหรับฉัน) เป็นความยาว 60


1
นี่เป็นสิ่งที่ดีมาก คำตอบทั้งหมดมุ่งเน้นที่การจำกัดความกว้างของบรรทัดเมื่อบรรทัดถูกแบ่งช่องว่างเป็นคำ วิธีนี้ใช้ได้ผลกับคำที่ยาวมาก (ลำดับดีเอ็นเอ)
pedrosaurio

1
สำหรับ URL ที่ยาวนี่เป็นสิ่งเดียวที่ฉันพบว่าใช้ได้ผล ฉันแล้วใหม่เกี่ยวกับความกว้างของข้อความ แต่มันจะไม่ทำลายสตริงไม่แตกสลาย (ซึ่งมักจะเป็นสิ่งที่ดี)
SkyLeach

13

หากคุณกำลังมองหาวิธีที่ไม่ Vimมีคำสั่ง UNIX fmtและparเสมอ

หมายเหตุ:

  • ฉันไม่สามารถแสดงความคิดเห็นเกี่ยวกับ Unicode มันอาจหรืออาจไม่ทำงานแตกต่างกัน
  • @nelstrom ได้กล่าวถึงการใช้งานparในเว็บคาสต์ของเขาแล้ว

นี่คือวิธีที่เราจะใช้ทั้งสองอย่างสำหรับตัวอย่างของคุณ

$ 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

วิธีใช้จากภายในเป็นกลุ่ม:

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

นอกจากนี้คุณยังสามารถตั้งค่า:formatprgหุ้นหรือ fmt gqและแทนที่ สำหรับข้อมูลเพิ่มเติมโทร:help formatprgภายในเป็นกลุ่ม


9

เกือบทุกครั้งที่ฉันใช้gqในโหมดภาพ ฉันบอกนักเรียนของฉันว่าหมายถึง "Gentlemens 'Quarterly" นิตยสารสำหรับคนพิถีพิถัน

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