Wie kann man Text in einem ausgewählten Textblock teilweise ersetzen?


14

Es ist nicht einfach, einen schönen Titel für mein Problem zu finden.

Mir ist bewusst, vor einem Textblock einzufügen:

Ctrl- v Wählen Sie Zeilentyp I Text ESC

Jetzt möchte ich dies tun, aber auch ein Teil in meiner Blockauswahl ersetzen. Derzeit mache ich zwei Operationen

Ctrl- v Wählen Sie Block x zurück zum Start

Gefolgt von der oben erwähnten Sequenz.

Gibt es eine Möglichkeit, diese beiden Operationen zu kombinieren, indem Sie den Block nur einmal auswählen ( Ctrl- v)?

Hier ist ein kleines Beispiel:

Ich möchte den folgenden Block transformieren

1  text
2  text
3  text
4  text
5  text

in

new text 
new text 
new text 
new text 
new text

nur eine "Operation" ausführen.


1
Ich bin mir nicht 100% sicher, was Sie wollen, vielleicht würde ein echtes Beispiel helfen (was Sie haben und was Sie wollen). Kennen Sie gv? Es wählt die letzte visuelle Auswahl erneut aus und kann hier hilfreich sein.
PhilippFrank

Antworten:


21

Wenn Sie cnach Auswahl Ihres Blocks statt xtippen, wird der Text im Auswahlblock entfernt und der Einfügemodus aktiviert. Sobald Sie etwas eingegeben und den Einfügemodus verlassen haben, sollten Sie in jeder Zeile die gleiche Änderung vornehmen.

Versuchen

Ctrl- v- Block auswählen - c- was auch immer einfügen -Esc


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

Stellen Sie sich eine Reihe von drei verschiedenen Blockbuchstaben wie oben vor. ^VWenn ich das Obige auswähle, kann ich Aaufgrund ungleicher Linien nicht alle im letzten Buchstaben der Zeile ändern . Die vorherigen Blockbuchstaben funktionierten gut mit :s/\%V1/T/g "Vorheriger Blockbuchstabe war ein T aus '1'. Wechseln Sie /T/zu was auch immer.

Bei Auswahl des letzten oben gezeigten Blockbuchstabens wurden jedoch nur alle Einsen in A bis zum Punkt A * geändert, und der Rest blieb erhalten.

* Die kürzeste Linie.

Um alle Linien gleich lang zu machen, habe ich sie mit Leerzeichen aufgefüllt. (Ich bin neu in vim, daher bin ich sicher, dass ein besseres Skript geschrieben werden könnte.)

Hinweis: Die Spitze des A begann in Zeile 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

Danach :s/\%V1/T/g arbeitete wie am letzten Blockbuchstaben in der Zeile angegeben.

PS Ich habe gelesen, dass die executeobige Zeile ohne die Punkte funktionieren sollte, aber es hat bei mir nicht funktioniert.


Die Ausführungszeile geht zum Anfang der Zeile i des Blockbuchstabens und fügt b Leerzeichen an das Ende der Zeile an. 'b' ist der Längenunterschied zwischen der aktuellen und der längsten Zeile.
Ron
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.