Конечно, вы можете сделать все это с помощью одной копии / вставки (используя выбор в блочном режиме), но я предполагаю, что это не то, что вы хотите.
Если вы хотите сделать это только с помощью команд 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,8
before del
и the 1,4
before 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
?