คุณสามารถทำสิ่งนี้ได้อย่างแน่นอนด้วยการคัดลอก / วาง (ใช้การเลือกโหมดบล็อก) แต่ฉันเดาว่านั่นไม่ใช่สิ่งที่คุณต้องการ
หากคุณต้องการทำสิ่งนี้ด้วยคำสั่งEx
:5,8del | let l=split(@") | 1,4s/$/\=remove(l,0)/
จะเปลี่ยน
work it
make it
do it
makes us
harder
better
faster
stronger
~
เข้าไป
work it harder
make it better
do it faster
makes us stronger
~
UPDATE:คำตอบของ upvotes นี้สมควรได้รับคำอธิบายที่ละเอียดยิ่งขึ้น
ในกลุ่มคุณสามารถใช้ไพพ์ไพพ์ ( |
) เพื่อโยงคำสั่ง Ex หลายคำสั่งได้ดังนั้นคำสั่งข้างต้นจึงเทียบเท่า
:5,8del
:let l=split(@")
:1,4s/$/\=remove(l,0)/
คำสั่ง Ex จำนวนมากยอมรับช่วงของบรรทัดเป็นอาร์กิวเมนต์ส่วนนำหน้า - ในกรณีข้างต้น5,8
ก่อนdel
และ1,4
ก่อนหน้านั้นs///
ระบุว่าบรรทัดใดที่คำสั่งทำงาน
del
ลบบรรทัดที่กำหนด มันสามารถรับอาร์กิวเมนต์ register แต่เมื่อไม่มีการกำหนดมันจะทิ้งบรรทัดไปยัง register ที่ไม่มีชื่อ@"
เช่นเดียวกับการลบในโหมดปกติ let l=split(@")
จากนั้นแยกบรรทัดที่ถูกลบออกเป็นรายการโดยใช้ตัวคั่นเริ่มต้น: ช่องว่าง ในการทำงานอย่างถูกต้องกับอินพุตที่มีช่องว่างในบรรทัดที่ถูกลบเช่น:
more than
hour
our
never
ever
after
work is
over
~
เราจะต้องระบุตัวคั่นที่แตกต่างกันเพื่อป้องกันไม่ให้ "งานคือ" let l=split(@","\n")
จากการถูกแยกออกเป็นสององค์ประกอบของรายการ:
สุดท้ายในการทดแทนs/$/\=remove(l,0)/
เราเปลี่ยนจุดสิ้นสุดของแต่ละบรรทัด (คน$
) remove(l,0)
โดยมีมูลค่าของการแสดงออก remove(l,0)
เปลี่ยนแปลงรายการl
ลบและส่งคืนองค์ประกอบแรก สิ่งนี้ช่วยให้เราสามารถแทนที่บรรทัดที่ถูกลบตามลำดับที่เราอ่านได้ remove(l,-1)
เราแทนสามารถใช้ทดแทนเส้นที่ถูกลบในลำดับที่กลับโดยใช้
x
กับเข้าร่วมx+2
?