จะเพิ่มข้อความที่ท้ายแต่ละบรรทัดใน Vim ได้อย่างไร?


116

ในกลุ่มฉันมีข้อความต่อไปนี้:

key => value1
key => value2
key => value1111
key => value12
key => value1122222

ฉันต้องการเพิ่ม "," ที่ท้ายแต่ละบรรทัด ข้อความก่อนหน้าจะกลายเป็นข้อความต่อไปนี้:

key => value1,
key => value2,
key => value1111,
key => value12,
key => value1122222,

ไม่มีใครรู้วิธีการทำเช่นนี้? เป็นไปได้ไหมที่จะใช้โหมดบล็อกภาพเพื่อทำสิ่งนี้


คำถามที่คล้ายกันที่นี่
glts

คำตอบ:


163

สิ่งนี้จะทำกับทุกบรรทัดในไฟล์:

:%s/$/,/

หากคุณต้องการสร้างชุดย่อยของบรรทัดแทนที่จะเป็นทั้งไฟล์คุณสามารถระบุได้แทนไฟล์%.

วิธีหนึ่งคือทำการเลือกภาพจากนั้นพิมพ์ไฟล์:. มันจะกรอก:'<,'>ให้คุณจากนั้นคุณพิมพ์ส่วนที่เหลือ (สังเกตว่าคุณต้องเพิ่มเท่านั้นs/$/,/)

:'<,'>s/$/,/

4
แถวสุดท้ายมีเป็นพิเศษควรจะเป็น' :'<,'>s/$/,/
cjg

ทำไมไม่จำเป็นต้องมีg? ( :'<,'>s/$/,/g)
Thorbjørn EK Christensen

@ ThorbjørnE.Kคริสเตนเซ่นเพราะ/$/แมตช์เดียว
Bubaya

157

ในความเป็นจริงมีวิธีดำเนินการโดยใช้โหมดบล็อกภาพ เพียงแค่กด$Aในโหมด Visual block จะต่อท้ายบรรทัดทั้งหมดในส่วนที่เลือก Escข้อความต่อท้ายจะปรากฏบนทุกสายทันทีที่คุณกด

ดังนั้นนี่คือทางออกที่เป็นไปได้:

vip<C-V>$A,<Esc>

นั่นคือในโหมดปกติ Visual เลือกย่อหน้าvipเปลี่ยนเป็นโหมด Visual block CTRLVต่อท้ายทุกบรรทัด$Aด้วยเครื่องหมายจุลภาค,จากนั้นกดEscเพื่อยืนยัน

:h v_b_Aเอกสารที่ :h v_b_A_exampleแม้จะมีภาพของวิธีการทำงานในส่วนของตัวอย่าง:


1
ไม่มีนี้เป็นมาตรฐานที่เป็นกลุ่ม: เลือกเส้นบางในโหมดบล็อกภาพ (มีC-V) แล้วเลื่อนเคอร์เซอร์ไปยังจุดสิ้นสุดของเส้นและผนวกทั้งหมดของพวกเขา$ Aคุณจะหลงรัก:h v_b_Aซึ่งมีความละเอียดรอบคอบ
glts

1
โอ้ฉันเห็นว่าเกิดอะไรขึ้น! ฉันมักจะใช้ Ctrl-C แทน <Esc> เพื่อออกจากโหมดแทรกและดูเหมือนว่า Ctrl-C จะไม่ได้ผล! แปลกแค่ไหน
weronika

3
คุณสามารถบันทึกการกดแป้นพิมพ์โดยใช้ในสถานที่ของ<C-V>ip vip<C-V>
Aaron Thoma

1
@accolade ไม่เข้าสู่โหมดบล็อกภาพด้วยวิธีนั้นและจะไม่ทำงาน <CV> จะต้องเกิดขึ้นอีกครั้งหากคุณทำเช่นนั้น
Imagineer

นั่นแปลก - มันใช้ได้กับฉัน - ต้องเป็นเพราะตัวเลือกที่ไม่ใช่ค่าเริ่มต้น (ไม่'virtualedit'- ฉันทดสอบแล้ว) ฉันยืนยันว่ามันไม่ได้ผลในกลุ่มที่สะอาด ขอบคุณสำหรับหมายเหตุ!
Aaron Thoma

44

อีกวิธีหนึ่งโดยใช้คุณสมบัติที่ยอดเยี่ยมอีกอย่าง:

:'<,'>norm A,

ดู:help :normal.


1
@ สวิสคุณจะชอบความคิดเห็นนี้แล้ว
romainl

1
@Swiss คุณอาจยังชอบudioca ของexposé:normalบน ฉันพบว่ามันให้ข้อมูล!
Conner

1
ไม่ทราบเกี่ยวกับ subreddit นี้ ขอบคุณ
romainl


10

คำสั่งทดแทนสามารถนำไปใช้กับการเลือกภาพ สร้างบล็อกภาพผ่านสายที่คุณต้องการที่จะเปลี่ยนแปลงและประเภทและแจ้งให้ทราบว่าบรรทัดคำสั่งที่จะเริ่มต้นได้เช่นนี้: :'<,'>ซึ่งหมายความว่าคำสั่งแทนที่จะดำเนินการกับการเลือกภาพดังนี้:

:'<,'>s/$/,/

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

:'<,'>s/\s*$/,/

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

คำสั่งเดียวกันสามารถทำงานได้ในช่วงของสายเช่นสำหรับ 5 บรรทัดถัดไปหรือบัฟเฟอร์ทั้งหมด::,+5s/$/,/:%s/$/,/


3

หากคุณต้องการเพิ่ม ',' ที่ท้ายบรรทัดที่ขึ้นต้นด้วย 'key' ให้ใช้:

:%s/key.*$/&,

หรือ:g/key/s/$/,. ดู:help :global.
romainl

2

ฉันมีการ<M-DOWN>แมป (ลูกศรลง alt) เพื่อ<DOWN>.ให้สามารถทำซ้ำคำสั่งสุดท้ายในชุดบรรทัดได้อย่างรวดเร็ว ด้วยการทำแผนที่นี้ฉันสามารถ:

A,<ESC>

จากนั้นกด alt ค้างไว้ในขณะที่กดลงซ้ำ ๆ เพื่อต่อท้ายเครื่องหมายจุลภาคที่ท้ายแต่ละบรรทัด
สิ่งนี้ใช้ได้ดีสำหรับฉันเพราะช่วยให้สามารถควบคุมสิ่งที่เส้นทำและไม่ได้รับการเปลี่ยนแปลงได้ดีมาก
(ฉันยังมีการแมปลูกศรอื่น ๆ ในทำนองเดียวกันเพื่อให้สามารถทำซ้ำได้ง่าย.)

นี่คือบรรทัดการแมปที่จะวางลงใน vimrc ของคุณ:

map <M-DOWN> <DOWN>.

1
:%s/$/,/g

$ ตรงกับจุดสิ้นสุดของบรรทัด


2
ที่จะเพิ่มไปถึงเส้นได้เป็นอย่างดีไม่เพียง$ ,
ZyX

2
/gใช้เพื่อทำการแทนที่ทุกครั้งที่เกิดขึ้นในบรรทัด เนื่องจากมีเพียง$บรรทัดเดียวที่คุณสามารถวางได้อย่างปลอดภัย
romainl

ใช่ฉันผิดพลาดที่ $ และ / g มาจาก habbit และใช่มันเป็นทางเลือก
kalhartt

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