Z pewnością możesz to wszystko zrobić za pomocą pojedynczego kopiowania / wklejania (przy użyciu wyboru trybu blokowego), ale zgaduję, że nie tego chcesz.
Jeśli chcesz to zrobić za pomocą tylko poleceń Ex
:5,8del | let l=split(@") | 1,4s/$/\=remove(l,0)/
przekształci się
work it
make it
do it
makes us
harder
better
faster
stronger
~
w
work it harder
make it better
do it faster
makes us stronger
~
AKTUALIZACJA: Odpowiedź na tak wiele pozytywnych opinii zasługuje na dokładniejsze wyjaśnienie.
W Vimie możesz użyć znaku potoku ( |) do połączenia wielu poleceń Ex, więc powyższe jest równoważne z
:5,8del
:let l=split(@")
:1,4s/$/\=remove(l,0)/
Wiele poleceń Ex akceptuje zakres wierszy jako argument przedrostka - w powyższym przypadku 5,8przed deli 1,4przed s///określają, na których wierszach działają polecenia.
delusuwa podane linie. Może przyjmować argument rejestru, ale jeśli go nie podano, zrzuca linie do rejestru bez nazwy @", podobnie jak usuwanie w trybie normalnym. let l=split(@")następnie dzieli usunięte linie na listę, używając domyślnego separatora: białe znaki. Aby działać poprawnie na danych wejściowych, które miały białe znaki w usuniętych wierszach, takie jak:
more than
hour
our
never
ever
after
work is
over
~
musielibyśmy określić inny separator, aby zapobiec „praca” od bycia podzielony na dwie listy elementów: let l=split(@","\n").
Wreszcie w podstawieniu s/$/\=remove(l,0)/zamieniamy koniec każdej linii ( $) wartością wyrażenia remove(l,0). remove(l,0)zmienia listę l, usuwając i zwracając jej pierwszy element. To pozwala nam zastąpić usunięte linie w kolejności, w jakiej je czytamy. Zamiast tego możemy zastąpić usunięte linie w odwrotnej kolejności za pomocą remove(l,-1).
xz łączeniemx+2?