Puoi certamente fare tutto questo con una sola copia / incolla (usando la selezione in modalità blocco), ma immagino che non sia quello che vuoi.
Se vuoi farlo con i soli comandi Ex
:5,8del | let l=split(@") | 1,4s/$/\=remove(l,0)/
si trasformerà
work it
make it
do it
makes us
harder
better
faster
stronger
~
in
work it harder
make it better
do it faster
makes us stronger
~
AGGIORNAMENTO: una risposta con così tanti voti merita una spiegazione più approfondita.
In Vim, puoi usare il carattere pipe ( |
) per concatenare più comandi Ex, quindi quanto sopra equivale a
:5,8del
:let l=split(@")
:1,4s/$/\=remove(l,0)/
Molti comandi Ex accettano un intervallo di righe come argomento prefisso - nel caso precedente il 5,8
prima del
e il 1,4
precedente s///
specificano le linee su cui operano i comandi.
del
elimina le righe indicate. Può prendere un argomento di registro, ma quando non ne viene dato uno, scarica le righe nel registro senza nome @"
, proprio come fa l'eliminazione in modalità normale. let l=split(@")
quindi divide le righe eliminate in un elenco, utilizzando il delimitatore predefinito: spazio bianco. Per funzionare correttamente su input con spazi bianchi nelle righe eliminate, ad esempio:
more than
hour
our
never
ever
after
work is
over
~
avremmo bisogno di specificare un delimitatore diverso, per evitare che "il lavoro è" di essere diviso in due elementi della lista: let l=split(@","\n")
.
Infine, nella sostituzione s/$/\=remove(l,0)/
, sostituiamo la fine di ogni riga ( $
) con il valore dell'espressione remove(l,0)
. remove(l,0)
modifica l'elenco l
, eliminando e restituendo il suo primo elemento. Questo ci consente di sostituire le righe eliminate nell'ordine in cui le leggiamo. Potremmo invece sostituire le righe eliminate in ordine inverso utilizzando remove(l,-1)
.
x
con joinx+2
?