Конечно, вы можете сделать все это с помощью одной копии / вставки (используя выбор в блочном режиме), но я предполагаю, что это не то, что вы хотите.
Если вы хотите сделать это только с помощью команд Ex
:5,8del | let l=split(@") | 1,4s/$/\=remove(l,0)/
преобразует
work it
make it
do it
makes us
harder
better
faster
stronger
~
в
work it harder
make it better
do it faster
makes us stronger
~
ОБНОВЛЕНИЕ: ответ с таким большим количеством голосов заслуживает более подробного объяснения.
В Vim вы можете использовать символ pipe ( |) для объединения нескольких команд Ex, поэтому приведенное выше эквивалентно
:5,8del
:let l=split(@")
:1,4s/$/\=remove(l,0)/
Многие команды Ex принимают диапазон строк в качестве аргумента префикса - в приведенном выше случае 5,8before delи the 1,4before s///указывают, какие строки работают с командами.
delудаляет указанные строки. Он может принимать аргумент регистра, но когда он не задан, он сбрасывает строки в безымянный регистр, @"как удаление в обычном режиме. let l=split(@")затем разбивает удаленные строки в список, используя разделитель по умолчанию: пробел. Для правильной работы с вводом, который имеет пробелы в удаленных строках, например:
more than
hour
our
never
ever
after
work is
over
~
мы должны были бы указать другой разделитель, чтобы предотвратить «работа» из раскалывается на два списка элементов: let l=split(@","\n").
Наконец, в подстановке s/$/\=remove(l,0)/мы заменяем конец каждой строки ( $) значением выражения remove(l,0). remove(l,0)изменяет список l, удаляя и возвращая его первый элемент. Это позволяет нам заменять удаленные строки в том порядке, в котором мы их читаем. Вместо этого мы могли бы заменить удаленные строки в обратном порядке, используя remove(l,-1).
xс помощью joinx+2?