คุณสามารถทำสิ่งนี้ได้อย่างแน่นอนด้วยการคัดลอก / วาง (ใช้การเลือกโหมดบล็อก) แต่ฉันเดาว่านั่นไม่ใช่สิ่งที่คุณต้องการ
หากคุณต้องการทำสิ่งนี้ด้วยคำสั่ง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?