Você certamente pode fazer tudo isso com uma única cópia / pasta (usando a seleção do modo de bloco), mas acho que não é isso que você deseja.
Se você quiser fazer isso apenas com comandos Ex
:5,8del | let l=split(@") | 1,4s/$/\=remove(l,0)/
vai transformar
work it
make it
do it
makes us
harder
better
faster
stronger
~
para dentro
work it harder
make it better
do it faster
makes us stronger
~
ATUALIZAÇÃO: Uma resposta com tantos votos positivos merece uma explicação mais completa.
No Vim, você pode usar o caractere de barra vertical ( |
) para encadear vários comandos Ex, portanto, o acima é equivalente a
:5,8del
:let l=split(@")
:1,4s/$/\=remove(l,0)/
Muitos comandos Ex aceitam um intervalo de linhas como argumento de prefixo - no caso acima, o 5,8
antes del
e o 1,4
antes da s///
especificação de quais linhas os comandos operam.
del
exclui as linhas fornecidas. Pode levar um argumento de registro, mas quando um não é fornecido, ele despeja as linhas no registro sem nome @"
, assim como a exclusão no modo normal. let l=split(@")
depois divide as linhas excluídas em uma lista, usando o delimitador padrão: espaço em branco. Para funcionar corretamente em entradas com espaços em branco nas linhas excluídas, como:
more than
hour
our
never
ever
after
work is
over
~
tínhamos necessidade de especificar um delimitador diferente, para evitar que "o trabalho é" de ser dividido em dois elementos da lista: let l=split(@","\n")
.
Finalmente, na substituição s/$/\=remove(l,0)/
, substituímos o final de cada linha ( $
) pelo valor da expressão remove(l,0)
. remove(l,0)
altera a lista l
, excluindo e retornando seu primeiro elemento. Isso nos permite substituir as linhas excluídas na ordem em que as lemos. Em vez disso, poderíamos substituir as linhas excluídas na ordem inversa usando remove(l,-1)
.
x
com joinx+2
?