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,8
przed del
i 1,4
przed s///
określają, na których wierszach działają polecenia.
del
usuwa 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)
.
x
z łączeniemx+2
?