Як частково замінити текст у вибраному текстовому блоці?


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-х /T/.

Але, вибравши останній буквенний лист, показаний вище, він лише змінив усі "1" на "A" до точки A *, а решта залишилася тією.

* Найкоротша лінія.

Щоб всі лінії були однакової довжини, я проклав їх пробілами. (Я новачок у vim, тому я впевнений, що кращий сценарій можна було б написати.)

Примітка. Пік А починався з другого рядка.

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 працювали так, як рекламується на останньому друкованому листі підряд.

PS Я прочитав, що executeрядок вище повинен працювати без крапок, але це не спрацювало для мене.


Рядок виконання, перейдіть до початку рядка i друкованої літери та додайте пробіли b до кінця рядка. 'b' - різниця в довжині між поточною лінією і найдовшою лінією.
Рон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.