ฉันจะแทรกข้อความตรงกลางบรรทัดเป็นหลายบรรทัดใน Vim ได้อย่างไร


91

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

จาก:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

ถึง:

sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf

เป็นไปได้หรือไม่ที่จะไม่เพียงbar(แต่นำหน้า แต่ล้อมรอบfooด้วยbar(foo)?

ฉันต้องการวิธีที่รวดเร็วในการต่อท้าย//ความคิดเห็นในหลาย ๆ บรรทัด (ความคิดเห็นแบบ C)

ฉันใช้ Vim / GVim 7.2


1
ความคิดเห็นสไตล์ C คือ / * * / ความคิดเห็นสไตล์ BCPL คือ //
William Pursell

คำตอบ:


169

ไปที่แรกfooกดCtrl- vเพื่อเข้าสู่โหมดบล็อกภาพและกดลงไปจนทุกสายที่มีfooการทำเครื่องหมาย จากนั้นกดShift- iเพื่อแทรกที่จุดเริ่มต้น (ของบล็อก) เมื่อคุณทำเสร็จแล้วและกดEscตัวอักษรที่แทรกจะถูกเพิ่มในแต่ละบรรทัดทางด้านซ้ายของบล็อกที่ทำเครื่องหมายไว้

ในการแทรกในตอนท้ายให้กดอีกครั้งCtrl- vเลื่อนขึ้น / ลงเพื่อทำเครื่องหมายเส้นที่ได้รับผลกระทบทั้งหมดจากนั้นกดEndหรือ$เพื่อขยายส่วนที่เลือกไปจนสุดบรรทัด ตอนนี้คุณสามารถกดShift- aจะผนวกในตอนท้ายของทุกสายเช่นเดียวกับก่อนหน้านี้ด้วย-Shifti

การเลือกภาพสามารถทำได้ด้วยคำสั่งการเคลื่อนไหวปกติ ดังนั้นเพื่อแสดงความคิดเห็นบล็อกทั้งใน C คุณสามารถย้ายไปเปิดรั้งและประเภท-Ctrl -v % Shifti // Esc


5
เพียงเพิ่มเติม: ถ้า Ctrl-V ไม่เริ่มโหมดบล็อกภาพใน Vim บน Windows ควรใช้ Ctrl-Q แทน
พอล

3
รูปแบบของคำตอบคือการทำเครื่องหมายบล็อกภาพด้วย shift + V จากนั้นเปลี่ยนบล็อกในโหมด ex: '<,'> s / ^ / prexix_text /: '<,'> s / $ / suffix_text / หมายเหตุกว่า "'< , '> "จะพิมพ์เป็นกลุ่มโดยอัตโนมัติเมื่อคุณกด": "
dimba

1
หากต้องการยกเลิกการแสดงความคิดเห็นให้ใช้บล็อกภาพ (ทำเครื่องหมายด้วย Ctrl + V) หนึ่งคอลัมน์ที่มีเครื่องหมายแสดงความคิดเห็น "//" ถูกทำเครื่องหมายกด "d" เพื่อลบความคิดเห็น อย่าลืมเกี่ยวกับความคิดเห็น C ++ (/ ** /) ด้วยนะ :)
dimba

9
เป็นสิ่งที่น่าสังเกตใน Linux ฉันต้องหนีออกจากโหมดแทรกก่อนที่คำนำหน้าจะใช้กับทุกบรรทัดและเป็นเงินทุนที่ฉันต้องเข้าสู่โหมดแทรกจากโหมดภาพเช่น Shift + I, พิมพ์คำนำหน้า, Escape, Escape
Joshua Enfield

6
สิ่งนี้ใช้ไม่ได้กับสีโป๊ว เมื่อกดแล้วiไม่มีอะไรเกิดขึ้น เมื่อฉันกดshift+iการเลือกจะหายไป แต่ฉันสามารถแทรกข้อความได้ (ในตำแหน่งปัจจุบันที่เคอร์เซอร์อยู่เท่านั้น)
Jürgen Paul

44

เพื่อตอบคำถามแรกของคุณด้านล่าง

:%s/foo/bar(&)/g

จะมองหาและล้อมรอบรูปแบบการจับคู่กับfoo จะทำเช่นนี้หลายครั้งในหนึ่งบรรทัดbar()/g

ตั้งแต่คุณเพียงแค่การจับคู่คุณสามารถทำง่ายๆfoo :s/foo/bar(foo)/gอย่างไรก็ตามข้างต้นจะได้ผลหากคุณตัดสินใจที่จะจับคู่กับนิพจน์ทั่วไปมากกว่าคำง่ายๆ (เช่นf[a-z][a-z]) "&" ในด้านบนแสดงถึงสิ่งที่คุณจับคู่


ฉันมีคำตอบที่ยาวมากพร้อมมาโคร วิธีนี้ง่ายกว่า :-)
Brian Ramsay

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

ดูเหมือนว่าจะใช้ได้กับทุกบรรทัด ... สังเกต:% s และ / g
ojrac

สิ่งที่น่าสนใจคือ% s / foo / bar (&) / gc ไม่ยืนยัน - 'c' ไม่มีผล.. ฮึ

1
ข้อความระหว่าง:และsกำหนดว่าบรรทัดใดดำเนินการ ไม่มีความหมายแค่บรรทัดปัจจุบัน 1,30หมายถึงบรรทัดที่ 1 ถึง 30 (รวม) '<,'>หมายถึงเส้นในการเลือกภาพปัจจุบัน
rampion

17

เพื่อนำหน้าชุดบรรทัดฉันใช้หนึ่งในสองวิธีที่แตกต่างกัน:

แนวทางหนึ่งคือการเลือกบล็อก (กล่าวถึงโดย sth) โดยทั่วไปคุณสามารถเลือกพื้นที่สี่เหลี่ยมctrl-Vโดยมีการเคลื่อนเคอร์เซอร์ตามด้วย เมื่อคุณไฮไลต์สี่เหลี่ยมผืนผ้าแล้วการกดshift-Iจะแทรกอักขระทางด้านซ้ายของสี่เหลี่ยมผืนผ้าหรือshift-Aจะต่อท้ายทางด้านขวาของสี่เหลี่ยม ดังนั้นคุณสามารถใช้เทคนิคนี้เพื่อสร้างสี่เหลี่ยมผืนผ้าที่มีคอลัมน์ทางซ้ายสุดของบรรทัดที่คุณต้องการนำหน้าตีshift-Iพิมพ์คำนำหน้าจากนั้นกด Escape

อีกวิธีหนึ่งคือการใช้การทดแทน (ตามที่กล่าวโดย Brian Agnew) การแทนที่ของ Brian จะมีผลกับไฟล์ทั้งหมด (% ในคำสั่งหมายถึง "ทุกบรรทัด") หากต้องการส่งผลกระทบเพียงไม่กี่บรรทัดวิธีที่ง่ายที่สุดคือการตีshift-V(ซึ่งเปิดใช้งานโหมดเส้นภาพ) ในขณะที่อยู่ในบรรทัดแรก / บรรทัดสุดท้ายจากนั้นย้ายไปที่บรรทัดสุดท้าย / แรก จากนั้นพิมพ์:

:s/^/YOUR PREFIX/

^ คือนิพจน์ทั่วไป (ในกรณีนี้คือจุดเริ่มต้นของบรรทัด) เมื่อพิมพ์สิ่งนี้ในโหมดเส้นภาพคุณจะเห็น '<,'> แทรกอยู่ข้างหน้าโดยอัตโนมัติ ซึ่งหมายความว่าช่วงของการทดแทนจะเป็นการเลือกภาพ

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

:s:^:// :

สำหรับการเพิ่มคำต่อท้ายวิธีการแทนที่มักจะง่ายกว่าเว้นแต่ว่าบรรทัดทั้งหมดของคุณจะมีความยาวเท่ากัน เพียงใช้ $ สำหรับรูปแบบแทน ^ และสตริงของคุณจะถูกต่อท้ายแทนการจี้ล่วงหน้า

หากคุณต้องการเพิ่มคำนำหน้าและคำต่อท้ายพร้อมกันคุณสามารถดำเนินการดังนี้:

:s/.*/PREFIX & SUFFIX/

. * ตรงกันทั้งบรรทัด เครื่องหมาย & ในการแทนที่ทำให้ข้อความที่ตรงกัน (ทั้งบรรทัด) กลับมา แต่ตอนนี้จะมีการเพิ่มคำนำหน้าและคำต่อท้ายของคุณ

BTW: เมื่อแสดงความคิดเห็นเกี่ยวกับรหัสคุณอาจต้องการยกเลิกการแสดงความคิดเห็นในภายหลัง คุณสามารถใช้ visual-block ( ctrl-V) เพื่อเลือกเครื่องหมายทับแล้วกด d เพื่อลบออกหรือคุณสามารถใช้การแทนที่ (อาจใช้การเลือกเส้นภาพด้วยshift-V) เพื่อลบเครื่องหมายทับนำหน้าดังนี้

:s:// ::

6

: ปกติกู้ภัย!

:%norm Wibar(

:%norm WEa)

: norm (al) เล่นคำสั่งซ้ำราวกับว่าคุณพิมพ์คำสั่งเหล่านั้น:

W - ไปที่คำถัดไป

i - เริ่มโหมดแทรก

bar (- พิมพ์ลำดับ 'bar ('

หรือในบรรทัดเดียว:

:%norm Wibar(ctrlvESCEa)

หากคุณใช้ Windows ให้พิมพ์ctrlqแทนctrlv.


3

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

  • วางเคอร์เซอร์ไว้ที่ใดก็ได้ในบรรทัดบนสุดแล้วกด 'a
  • วางเคอร์เซอร์ไว้ที่ใดก็ได้ในบรรทัดสุดท้ายแล้วกด 'b
  • ออกคำสั่ง :'a,'b s/foo/bar(&)/

ฉันมักจะชอบโหมดบล็อกภาพถ้าทุกอย่างสามารถมองเห็นได้บนหน้าจอและฉันมักจะชอบเครื่องหมายถ้าจุดเริ่มต้นและจุดหยุดถูกคั่นด้วยหลาย ๆ หน้าจอ


มันควรจะเป็นmแทน'การตั้งเครื่องหมายใหม่ 'มีไว้สำหรับกระโดดไปที่เส้นของเครื่องหมายที่มีอยู่ `ข้ามไปที่บรรทัดและคอลัมน์ของเครื่องหมายนั้น
tiktak


0

สำหรับความคิดเห็นรูปแบบ C ให้ใช้คำตอบ regexp ของ Brian และจับคู่กับการลงท้ายบรรทัด$และแทรกออกไป

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