จะแทนที่ข้อความในบล็อกข้อความที่เลือกได้อย่างไร?


14

ไม่ใช่เรื่องง่ายที่จะหาชื่อที่ดีสำหรับปัญหาของฉัน

ฉันรู้ที่จะแทรกหน้าบล็อกข้อความ:

Ctrl- v เลือก ข้อความประเภทบรรทัดI ESC

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

Ctrl- v เลือกบล็อก x กลับไปเริ่มต้น

ตามด้วยลำดับที่ฉันพูดถึงข้างต้น

มีวิธีรวมการดำเนินการทั้งสองนี้ด้วยการเลือก ( Ctrl- v) บล็อกเพียงครั้งเดียวหรือไม่

นี่คือตัวอย่างเล็ก ๆ :

ฉันต้องการแปลงบล็อกต่อไปนี้

1  text
2  text
3  text
4  text
5  text

เข้าไป

new text 
new text 
new text 
new text 
new text

ทำ "การดำเนินการ" เพียงครั้งเดียว


1
ฉันไม่แน่ใจ 100% ว่าสิ่งที่คุณต้องการอาจเป็นตัวอย่างที่แท้จริงจะช่วยได้ (สิ่งที่คุณมีกับสิ่งที่คุณต้องการ) คุณรู้จัก gv หรือไม่? มันเลือกการเลือกภาพล่าสุดอีกครั้งและอาจช่วยได้ที่นี่
PhilippFrank

คำตอบ:


21

การพิมพ์cหลังจากเลือกบล็อกของคุณแทนที่จะเป็นการxลบข้อความในบล็อกการเลือกและจะเข้าสู่โหมดแทรก เมื่อคุณพิมพ์บางสิ่งและออกจากโหมดแทรกคุณควรมีการเปลี่ยนแปลงเหมือนกันทุกบรรทัด

ลอง

Ctrl- v- เลือกบล็อก - c- ใส่อะไรก็ได้ -Esc


1
    1
   1 1
  1   1
 1111111
 1     1
 1     1
 1     1

รูปภาพแถวตัวอักษรบล็อกที่แตกต่างกันสามแบบเหมือนกับตัวอักษรด้านบน ^Vการเลือกด้านบนฉันไม่สามารถเปลี่ยนทุกอย่างเป็นAตัวอักษรสุดท้ายในแถวเนื่องจากมีความยาวไม่เท่ากัน ตัวอักษรบล็อกก่อนหน้านี้ทำงานได้ดีกับ :s/\%V1/T/g "ตัวอักษรก่อนหน้าบล็อกคือ T ที่ทำจาก '1's เปลี่ยน/T/เป็นอะไรก็ได้

แต่การเลือกตัวอักษรบล็อกสุดท้ายที่แสดงด้านบนจะเปลี่ยน '1's เป็น' A 'ทั้งหมดจนถึงจุด A * เท่านั้นและส่วนที่เหลือยังคงอยู่

* บรรทัดที่สั้นที่สุด

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

หมายเหตุ: จุดสูงสุดของ A เริ่มต้นที่บรรทัด 2

let Maxlen = 0
" Find longest line
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a > Maxlen
        Maxlen = a
    endif
endfor

" Append spaces 'til all lines are the same length.
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a < Maxlen
        let b = Maxlen - a
        execute "normal!" . i . "gg0" . b . "A "
    endif
endfor

หลังจากนี้:s/\%V1/T/g ทำงานเป็นโฆษณาบนตัวอักษรบล็อกสุดท้ายในแถว

ป.ล. ฉันอ่านว่าexecuteบรรทัดข้างต้นควรทำงานโดยไม่มีจุด แต่ไม่ได้ผลสำหรับฉัน


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