ใน VIM ฉันจะแบ่งหนึ่งบรรทัดที่ยาวมากเป็นหลายบรรทัดได้อย่างไร?


169

ว่าฉันมีสายยาวสุดในตัวแก้ไข VIM (พูดประมาณ 300+ ตัวอักษร) ฉันจะแบ่งมันออกเป็นหลายบรรทัดได้อย่างไรเพื่อให้ขอบเขตของคำแตกประมาณ 80 อักขระ?

ตัวอย่าง:

This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line

ถึง

This is a really long line 
This is a really long line
This is a really long line
This is a really long line
This is a really long line
This is a ...

คำตอบ:


254

เป็นกลุ่มนี้ง่ายมาก (แบ่งบรรทัดที่ขอบเขตของคำ)

gq{motion} % format the line that {motion} moves over
{Visual}gq % format the visually selected area
gqq        % format the current line
...

ผมขอแนะนำให้คุณตรวจสอบและ:help gq:help gw

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

:set tw=80

โดยการตั้งค่าตัวเลือกการจัดรูปแบบเพื่อรวมความกว้างของข้อความเป็นกลุ่มโดยอัตโนมัติจะแตกที่การตั้งค่า tw

:set fo+=t

5
ดังนั้นสำหรับกรณีของคุณgqคำสั่งจะเป็น<ESC>(ออกจากโหมดแทรก / แทนที่ / ฯลฯ ) จากนั้นgq80l
MidnightLightning

6
ตรงข้ามกับ Ctrl + j (รวมหลายบรรทัดเป็นหนึ่ง)
Yzmir Ramirez

9
เสียงเรียกเข้าไม่หยุดทำให้ฉันประหลาดใจ นี่คือทองคำบริสุทธิ์
Jondlm

10
เพียงแค่สำหรับคนต่อไปที่พบสิ่งนี้ gq เพียง แต่จะไม่แยกบรรทัดของข้อความที่เป็นของแข็งมันต้องการช่องว่างที่จะทำสิ่งที่มัน
stringy05

2
[วิ่งgqq] aaaahhh มันสวยงาม
underscore_d

85

ก่อนอื่นให้ตั้งเสียงเรียกเข้าของคุณเพื่อให้เข้าใจว่าคุณต้องการ 80 ตัวอักษร:

:set tw=80

จากนั้นสายรุ่งโรจน์:

V

และทำให้เป็นรูปเป็นร่างมัน:

gq

17

นี่ไม่เกี่ยวข้องกับ VIM จริงๆ แต่คุณสามารถใช้โปรแกรมfmt ได้

$ fmt myfile

38
:% fmt% "สามารถทำให้มันเป็นกลุ่มที่เกี่ยวข้อง :)
Maxim Sloyko

2
มีประโยชน์สำหรับ vi แม้ว่าฉันต้องการ gqq บนกลุ่ม
WhyNotHugo

13

สำหรับเส้นทึบของข้อความเน้นพื้นที่โดยใช้ v ในโหมดปกติแล้วกด

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

สิ่งนี้จะเพิ่มบรรทัดใหม่ในตอนท้ายของอักขระทุกยุค 80

:s/       replaces within the current select
\v        uses regular expressions
(.{80})   selects 80 characters & placed them into group one
\1\r      replaces group one with group one and a newline

นี่เป็นทางออกเดียวที่ทำงานกับสตริง base64 แบบยาว
jviotti

6

หากคุณใช้ * ระวังคุณอาจfoldว่าง

เลือกภูมิภาคที่คุณต้องการใช้vจากนั้นคุณสามารถแบ่งช่องว่างที่ความกว้าง 80 โดยใช้:

!fold --spaces --width=80

นี่คือ esentially gqเหมือนกับการใช้

อย่างไรก็ตามหากคุณต้องการแยกตัวละครที่ 80 และไม่ถูก จำกัด ที่ช่องว่างคุณสามารถใช้:

!fold --width=80

หากคุณต้องการด้วยการกดแป้นเพียงปุ่มเดียวก็เพียงตั้งค่าการทำแผนที่ - ฉันใช้ไปแล้ว

vmap <f1> !fold --width=80<CR>


นี่คือคำตอบที่ใช้งานได้สำหรับสตริงยาวที่ไม่ได้คั่นด้วยช่องว่าง ใน macOS คุณอาจต้องใช้ gfold แทนการพับครึ่ง
Aaron D

บน mac os ฉันต้องทำ! fold -w 80
user674669

5

หากต้องการแยกเส้นยาวในเอกสารฉบับสมบูรณ์โดยไม่ต้องลบตัวแบ่งบรรทัดที่มีอยู่แล้วให้ใช้:

:set formatoptions+=w
:set tw=80
gggqG

4

ฉันต้องการฟอร์แมตใหม่ทั้งไฟล์แทนที่จะเป็นหนึ่งบรรทัด ในฐานะที่เป็น Wernsey ชี้ให้เห็นฉันสามารถใช้ 'fmt' ได้ แต่ลำดับต่อไปนี้ใน vim ก็ใช้กลอุบายด้วย (ยืมมาจากคำตอบต่าง ๆ ที่นี่):

<ESC>
:setl tw=80 fo=t
1GVGgq

3

รวดเร็วและน่ารังเกียจลองใช้แผนที่ต่อไปนี้:

map q 080lwbels<CR><ESC>

ซึ่งพูดว่า:

  • เริ่มตำแหน่งที่บรรทัดที่ 0
  • ย้ายไปที่ถ่าน 80 ไปทางขวา
  • ไปที่จุดเริ่มต้นของคำถัดไป
  • กลับไปที่คำก่อนหน้า
  • ไปที่ท้ายคำปัจจุบัน
  • ไปขวาถ่านหนึ่งตัวและ
  • แทนที่ CR สำหรับถ่านนั้น

จากนั้นกดปุ่ม q และ CR จะแบ่งแถวออกเป็นชิ้น ๆ ในขอบเขตของคำ


0

ฉันแทรก '\' ด้วยตนเอง (แล้ว CR / แท็บเพื่อจัดรูปแบบ) ในแต่ละ LONGLINE หลังจากช่องว่างสุดท้าย แต่ก่อนหน้าคอลัมน์ 80 กล่าวคือ:

1 this is a long, long, line

ตอนนี้ดูเหมือนว่า

1 this is a long, \
        long line

และคอมไพล์ตามปกติ

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