Vim - การเพิ่มบรรทัดว่างระหว่างบรรทัด


15

ฉันจะแทรกบรรทัดว่างระหว่างทุกบรรทัดที่ไม่ว่างได้อย่างไร

เช่น. จาก

line 1
line 2
line 3

line 4
line 5

ถึง

line 1

line 2

line 3

line 4

line 5

คำตอบ:


27

Vim's: g คำสั่งถูกออกแบบมาสำหรับงานประเภทนี้ เรียกใช้การกระทำเดียวในทุกบรรทัดที่ตรงกับรูปแบบเฉพาะ นี่คือคำตอบของฉัน:

:g/.\n\n\@!/norm o

/.\n\n\@!/การใช้รูปแบบที่ฉันเป็น แบ่งออกเป็นชิ้นส่วนของมัน:

  • .จับคู่อักขระใด ๆ ในบรรทัด (ใช้เพื่อละทิ้งบรรทัดว่างใด ๆ ที่มีอยู่ทันทีจากการพิจารณา)
  • \n จับคู่ \ n ตัวเดียวที่ส่วนท้ายของอักขระด้านบน
  • \n\@! ไม่สามารถแข่งขันได้หากมีอีก \ n ทันทีหลัง \ n ก่อนหน้านี้

(ตรวจสอบ:h E59ข้อมูลเพิ่มเติมเกี่ยวกับ\@!และตัวระบุการจับคู่ที่คล้ายกันในนิพจน์ทั่วไป - มีอีกสองสามรายการด้วย!)

ดังนั้น regex ของคำสั่ง: g ตอนนี้ได้เลือกทุกบรรทัดที่ไม่ว่างซึ่งถูกยกเลิกโดยบรรทัดใหม่เดียวและที่ไม่ได้ตามด้วยบรรทัดว่าง

หลังจากที่รูปแบบใน:gคำสั่งมาพร้อมคำสั่งให้ทำงานบนเส้นที่ตรงกัน ในกรณีนี้ฉันได้บอกให้รันคำสั่งโหมดปกติ (ตัวย่อnorm) และคำสั่งที่จะเรียกใช้นั้นเรียบง่ายoซึ่งแทรกบรรทัดว่างด้านล่างบรรทัดปัจจุบัน

เมื่อรวมกันแล้วคำสั่งจะค้นหาทุกบรรทัดที่ไม่มีบรรทัดว่างข้างใต้และเพิ่มหนึ่งบรรทัด และนั่นคือทั้งหมดที่มีให้มัน! คุณอาจต้องการตรวจสอบบทความPower of G ของ vim wiki สำหรับสิ่งแฟนซีเพิ่มเติมที่คุณสามารถทำได้:g(และเป็นน้องสาวด้านลบ:v) - มันเป็นหนึ่งในคำสั่งที่มีประโยชน์อย่างน่าอัศจรรย์ที่คุณจะไว้ใจได้ในไม่ช้า ซึ่งไม่มี


1
แม่นยำ. ฉันมักจะมองหา shorthands เหมือนแต่ปรากฎนี้ไม่ได้ทำงานตามที่ตั้งใจไว้ในกรณีของ:%norm o o+1
sehe

ประเภท:%s/$/แล้วตีตีแล้ว^V Enter
jpaugh

1
@jpaugh สมมติว่าคุณหมายถึง:%s/$/<C-V><CR><CR>(ใช้การเข้ารหัส vim-folk ทั่วไปของ keypresses) วิธีการนั้นจะเพิ่มบรรทัดใหม่หลังจากแต่ละบรรทัด นั่นคือบรรทัดที่คั่นด้วยช่องว่างแล้ว (ดูบรรทัดที่ 3 -> บรรทัดที่ 4 ในข้อความตัวอย่าง) ปิดท้ายรับบรรทัดว่างพิเศษ คำถามเดิมคือหลีกเลี่ยงการเพิ่มบรรทัดว่างที่มีอยู่แล้วในข้อความเริ่มต้น
Trevor Powell

3

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

การใช้ lookbehind และ lookahead แก้ปัญหานี้และทำให้ regex สั้นลงเช่นกัน:

:%s/\n\@<!\n\n\@!/\r\r/g

ขอบคุณ! ใช้งานได้และจะไม่เพิ่มบรรทัดมากขึ้นถ้าฉันเรียกใช้การค้นหาอีกครั้ง (ถ้าพูดว่าฉันเพิ่มบรรทัดใหม่ลงในไฟล์ของฉัน)

1
คุณช่วยอธิบายความหมายของ regex แต่ละอันในรูปแบบการค้นหาได้ไหม เมื่อดูที่ความช่วยเหลือเป็นกลุ่ม\n\@<!\nหมายความว่าการกระจายตัวใด ๆ ที่ไม่ถูกต้องหลังจากการกระจายอีกครั้งนั้นถูกต้องหรือไม่ แต่ฉันไม่เข้าใจความ\n\@!หมาย ฉันต้องการที่จะเข้าใจมันดังนั้นฉันสามารถเรียนรู้และนำไปใช้กับรูปแบบการค้นหาอื่น ๆ :)

ใช่\n\@<!\nหมายถึงการใด ๆ ที่ไม่ได้ติดตามอีกครั้งในการแตกครั้งเดียว \n\@!จับคู่กับความกว้างเป็นศูนย์หากอะตอมก่อนหน้า (เช่น\n) ไม่ตรงกับก่อนหน้าสิ่งต่อไปนี้ ลอง:help \@<!ดูเอกสารประกอบในส่วนนี้เป็นกลุ่ม I
Simon

3

อีกวิธีหนึ่ง:

%s/\(.\)\n\(.\)/\1\r\r\2/

ซึ่งหมายความว่า,

\(.\) match and capture a non-newline character,
\n    match a newline
\(.\) match and capture a non-newline character

แทนที่ด้วย: การจับภาพครั้งแรก, การขึ้นบรรทัดใหม่สองครั้งและการจับภาพที่สอง

ตัวอย่างเช่นline1\nLine2ผลในและ\1 = 1\2 = L


0

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


kเลื่อนขึ้นบรรทัด jเลื่อนลงบรรทัด
Neil Forrester

ใช่แน่นอนมันทำ ความผิดพลาดของฉัน. ขอบคุณนีล!

0
/[^\n]\n[^\n]
:map <F2> no<esc><F2>

<F2>จากนั้นกด ที่จะค้นหาสองบรรทัดที่ไม่ว่างต่อเนื่องกันแล้วเพิ่มบรรทัดระหว่างบรรทัดนั้นซ้ำ ๆ

แก้ไข:

ต่อไปนี้เป็นวิธีทางเลือกในการค้นหาทั่วโลกและแทนที่:

:%s/\([^\n]\)\n\([^\n]\)/\1\r\r\2/g

ไฟล์ของฉันมีจำนวนบรรทัดมาก มีวิธีการค้นหา regex & แทรกบรรทัดว่างสำหรับไฟล์ทั้งหมดหรือไม่ ฉันได้ดูstackoverflow.com/questions/2673209/แต่ไม่สามารถเข้าใจความหมายของคำสั่ง regex ทั้งหมดได้

ดูการแก้ไขข้างต้นของฉันสำหรับวิธีอื่นในการบรรลุสิ่งเดียวกันในคำสั่งเดียวและไม่มีการทำแผนที่แบบเรียกซ้ำ วิธีแรกควรทำงานกับไฟล์ทั้งหมดแม้ว่า
Neil Forrester

0

ลองใช้คำสั่งนี้ ( 16ตัวอักษร):

:%!sed G|cat -s

แทนที่จะพยายาม "vimgolf" คำสั่งสั้น ๆ คำอธิบายเล็ก ๆ น้อย ๆ ของตัวเลือกที่ค่อนข้างคลุมเครือที่ใช้จะมีประโยชน์มากขึ้น
Ingo Karkat

0

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

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