Sie können dies sicherlich alles mit einem einzigen Kopieren / Einfügen (unter Verwendung der Blockmodus-Auswahl) tun, aber ich vermute, das ist nicht das, was Sie wollen.
Wenn Sie dies nur mit Ex- Befehlen tun möchten
:5,8del | let l=split(@") | 1,4s/$/\=remove(l,0)/
wird sich verwandeln
work it
make it
do it
makes us
harder
better
faster
stronger
~
in
work it harder
make it better
do it faster
makes us stronger
~
UPDATE: Eine Antwort mit so vielen positiven Stimmen verdient eine gründlichere Erklärung.
In Vim können Sie das Pipe-Zeichen ( |
) verwenden, um mehrere Ex-Befehle zu verketten
:5,8del
:let l=split(@")
:1,4s/$/\=remove(l,0)/
Viele Ex-Befehle akzeptieren einen Zeilenbereich als Präfixargument - im obigen Fall geben die 5,8
vor del
und 1,4
vor den s///
Zeilen an, auf welchen Zeilen die Befehle ausgeführt werden.
del
löscht die angegebenen Zeilen. Es kann ein Registerargument annehmen, aber wenn eines nicht angegeben wird, werden die Zeilen in das unbenannte Register @"
verschoben, genau wie beim Löschen im normalen Modus. let l=split(@")
teilt dann die gelöschten Zeilen unter Verwendung des Standardtrennzeichens: Leerzeichen in eine Liste auf. So arbeiten Sie ordnungsgemäß an Eingaben mit Leerzeichen in den gelöschten Zeilen:
more than
hour
our
never
ever
after
work is
over
~
Wir müssten ein anderes Trennzeichen angeben, um zu verhindern, dass "work is" in zwei Listenelemente aufgeteilt wird : let l=split(@","\n")
.
Schließlich s/$/\=remove(l,0)/
ersetzen wir bei der Ersetzung das Ende jeder Zeile ( $
) durch den Wert des Ausdrucks remove(l,0)
. remove(l,0)
Ändert die Liste l
, löscht das erste Element und gibt es zurück. Auf diese Weise können wir die gelöschten Zeilen in der Reihenfolge ersetzen, in der wir sie gelesen haben. Wir könnten stattdessen die gelöschten Zeilen in umgekehrter Reihenfolge durch verwenden remove(l,-1)
.
x
mit Join verbindenx+2
?