Ви, звичайно, можете зробити все це за допомогою однієї копії / вставки (використовуючи режим блочного вибору), але я здогадуюсь, що це не те, що ви хочете.
Якщо ви хочете зробити це за допомогою лише команд 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
до del
і 1,4
перед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
приєднанняx+2
?