เข้าร่วมบรรทัดภายในย่อหน้าในกลุ่ม


13

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

ย่อหน้าถูกกำหนดเขตในเอกสารของคุณด้วยบรรทัดว่าง

ตอนนี้คุณตัดสินใจว่าคุณไม่ต้องการให้ตัวแบ่งบรรทัดภายในย่อหน้าเลย

คุณจะลบตัวแบ่งบรรทัดทั้งหมดภายในย่อหน้าโดยไม่ต้องกำจัดขอบเขตย่อหน้าทั้งหมดได้อย่างไร

ฉันทำแฮ็คที่รวดเร็วและงี่เง่า แต่กำลังมองหาวิธีที่เหมาะสม

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks

เฮ้อย่าเคาะถ้าทางออกของคุณใช้ได้ผลและวิธีแก้ปัญหาของคุณก็ใช้ได้
pdwalker

คำตอบ:


12

ฉันคิดว่านี่เป็นสิ่งที่คุณต้องการ: ตรวจสอบให้แน่ใจว่ามีบรรทัดว่างที่ท้ายไฟล์แล้วเข้าร่วมทุกย่อหน้า (สิ้นสุดด้วยบรรทัดว่าง)

G:a

.
:g/^./ .,/^$/-1 join

คำอธิบาย: ไปที่จุดสิ้นสุดของไฟล์ก่อนและต่อท้ายบรรทัดว่างพิเศษด้วย:a(อาจมีวิธีที่สง่างามกว่าในการทำแบบโต้ตอบคุณสามารถแทนที่สามบรรทัดแรกด้วยo<ESC>) จากนั้นสำหรับทุกบรรทัดที่ไม่ว่างที่ยังไม่ได้พิจารณา ( :g/^./) ให้ใช้joinคำสั่งกับช่วงที่เริ่มต้นที่บรรทัดที่เลือก ( .) และสิ้นสุดหนึ่งบรรทัดก่อนบรรทัดว่างถัดไป ( /^$/-1)

เป็นทางเลือก:g/^$/dหากคุณไม่ต้องการให้บรรทัดว่างใด ๆ อยู่ (จากนั้นคุณสามารถถอด-1)


ขอบคุณ นี่กำลังเข้าใกล้ฉันมาก แต่มันเป็นการลบบรรทัดว่างระหว่างย่อหน้า (ฉันพยายาม fileformat unix และ dos เพื่อดูว่ามันเป็นสิ่งที่ Windows) นอกจากนี้คุณช่วยแปลคำสั่งหน่อยได้ไหม? G ไปที่บรรทัดสุดท้าย : ความช่วยเหลือที่ตามมาคือ "ผนวก" แต่ฉันไม่แน่ใจว่ามันทำอะไร นอกจากนี้คุณยังมี g / pattern / cmd ทำให้ฉันหลงทาง คำสั่งคืออะไร?
dggoldst

@dggoldst: ฉันได้เปลี่ยนคำสั่งเพื่อรักษาบรรทัดว่าง สามบรรทัดแรกเป็นเพียงการเพิ่มบรรทัดว่างที่ท้ายไฟล์ (มิฉะนั้นย่อหน้าสุดท้ายจะไม่ถูกจับคู่) คำสั่งสุดท้ายคือ:gซึ่งใช้คำสั่งกับทุกบรรทัดที่ตรงกัน; ดู:help :gและบางทีหัวข้อนี้เกี่ยวกับวิธีที่:gจะทำงานเมื่อคุณแบ่งบรรทัดลบ
Gilles 'หยุดชั่วร้าย'

:$pu _ ในตอนท้ายให้ลงทะเบียนหลุมดำซึ่งส่งผลในบรรทัดว่างในตอนท้าย
SergioAraujo

12

สิ่งนี้ควรทำ:

:set tw=99999
gggqG

twถูกตั้งค่าเป็นอย่างน้อยมีขนาดใหญ่เท่ากับจำนวนอักขระในย่อหน้าที่ยาวที่สุด ggย้ายเคอร์เซอร์ไปที่บรรทัดแรก; gqเป็นคำสั่งให้ฟอร์แมต; Gย้ายเคอร์เซอร์ไปที่บรรทัดสุดท้ายโดยบอกgqให้ฟอร์แมตใหม่จากตำแหน่งเคอร์เซอร์ปัจจุบันไปยังบรรทัดสุดท้าย


5
  1. ตั้งเคอร์เซอร์ไว้ในย่อหน้าที่ต้องการ

  2. ประเภท: vipJ

( vipไฮไลต์ย่อหน้าปัจจุบันJรวมทุกบรรทัด)


2

อาจไม่ใช่วิธีที่สะอาดที่สุดที่จะทำ แต่นี่คือสิ่งที่ฉันจะใช้:

ggqav}bgJ}wq999@a   # go to the top of the file (gg)
                    # start recording macro "a" (qa)
                    # select the entire paragraph (v})
                    # go back one word so as not to join the blank line (b)
                    # join the selected lines without spaces (gJ)
                    # go to first word of the next paragraph (}w)
                    # finish recording the macro (q)
                    # 999 times (arbitrary number of paragraphs to join)
                    # run macro "a" (@a)

( ทำงานใน VIM 7.2. )

คุณอาจต้องการแทนที่gJคำสั่ง (เข้าร่วมโดยไม่มีช่องว่าง) ด้วยJคำสั่ง (เข้าร่วมกับช่องว่าง) ทั้งนี้ขึ้นอยู่กับวิธีแบ่งย่อหน้าเมื่อพวกเขาถูกจัดรูปแบบเดิม

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

:%s/^$//gn     # returns "999 matches on 999 lines"

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