Jak częściowo zastąpić tekst w wybranym bloku tekstu?

14

Niełatwo znaleźć dobry tytuł dla mojego problemu.

Jestem świadom wstawiania przed blokiem tekstowym:

Ctrl- v wybierz tekst liniiI ESC

Teraz chciałbym to zrobić, ale także z wymianą części w moim wyborze bloku. Obecnie wykonuję dwie operacje

Ctrl- v wybierz blok x wróć, aby rozpocząć

Następuje sekwencja, o której wspomniałem powyżej.

Czy istnieje sposób na połączenie tych dwóch operacji poprzez wybranie ( Ctrl- v) bloku tylko raz?

Oto mały przykład:

Chciałbym przekształcić następujący blok

1  text
2  text
3  text
4  text
5  text

w

new text 
new text 
new text 
new text 
new text

wykonując tylko jedną „operację”.

Patrick B.
źródło
1
Nie jestem w 100% pewien, czego chcesz, być może prawdziwy przykład by pomógł (co masz kontra to, co chcesz). Czy znasz gv? Ponownie wybiera ostatnią selekcję wizualną i może być tutaj pomocny.
PhilippFrank

Odpowiedzi:

21

Pisanie cpo wybraniu bloku zamiast xusunie tekst w bloku wyboru i przejdzie w tryb wstawiania. Po wpisaniu czegoś i wyjściu z trybu wstawiania powinieneś wprowadzić tę samą zmianę w każdej linii.

Próbować

Ctrl- v- wybierz blok - c- wstaw cokolwiek -Esc

Dumitru
źródło
1
    1
   1 1
  1   1
 1111111
 1     1
 1     1
 1     1

Wyobraź sobie rząd trzech różnych liter drukowanych, takich jak powyższy. ^Vwybierając powyższe, nie mogłem zmienić wszystkich Ana ostatnią literę w rzędzie z powodu nierównej długości linii. Poprzednie litery blokowe działały poprawnie z :s/\%V1/T/g „Poprzednia litera blokowa była literą„ T ”z„ 1 ”. Zmień /T/na cokolwiek.

Ale wybranie ostatniej litery blokowej pokazanej powyżej zmieniło tylko wszystkie „1” na „A” do punktu A *, a pozostałe pozostały jednymi.

* Najkrótsza linia.

Aby wszystkie linie były tej samej długości, wypełniłem je spacjami. (Jestem nowy w vimie, więc jestem pewien, że można napisać lepszy skrypt).

Uwaga: szczyt A rozpoczął się na linii 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

Następnie :s/\%V1/T/g pracował zgodnie z reklamą na ostatniej literze blokowej w rzędzie.

PS Przeczytałem, że executepowyższa linia powinna działać bez kropek, ale dla mnie nie działała.

Ron
źródło
Linia wykonania, przejdzie na początek wiersza i litery bloku i dopisze b spacje na końcu wiersza. „b” to różnica długości między bieżącą linią a najdłuższą linią.
Ron