Как частично заменить текст в выделенном текстовом блоке?

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%, что вы хотите, может быть, реальный пример поможет (что у вас есть против того, что вы хотите). Вы знаете о гв? Он выбирает последний визуальный выбор и может быть полезен здесь.
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 «Предыдущей печатной буквой была буква Т, сделанная из 1. Измените /T/на что угодно.

Но при выборе последней заглавной буквы, показанной выше, она только изменила все «1» на «А» до точки «А», а остальные остались.

* Самая короткая строка.

Чтобы сделать все строки одинаковой длины, я добавил их пробелами. (Я новичок в vim, поэтому уверен, что можно написать лучший сценарий.)

Примечание. Пик А начался в строке 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 работал так, как рекламируется на последней печатной букве в ряду.

PS Я читал, что executeстрока выше должна работать без точек, но у меня это не сработало.

Рон
источник
Строка выполнения, перейти к началу строки i буквы блока и добавить пробелы b в конец строки. «b» - это разница в длине между текущей строкой и самой длинной строкой.
Рон