Vous pouvez certainement faire tout cela avec un seul copier / coller (en utilisant la sélection en mode bloc), mais je suppose que ce n'est pas ce que vous voulez.
Si vous voulez le faire avec seulement des commandes Ex
:5,8del | let l=split(@") | 1,4s/$/\=remove(l,0)/
va transformer
work it
make it
do it
makes us
harder
better
faster
stronger
~
dans
work it harder
make it better
do it faster
makes us stronger
~
MISE À JOUR: Une réponse avec autant de votes positifs mérite une explication plus approfondie.
Dans Vim, vous pouvez utiliser le caractère pipe ( |
) pour chaîner plusieurs commandes Ex, donc ce qui précède est équivalent à
:5,8del
:let l=split(@")
:1,4s/$/\=remove(l,0)/
De nombreuses commandes Ex acceptent une plage de lignes comme argument de préfixe - dans le cas ci-dessus, 5,8
avant del
et 1,4
avant les///
spécifient sur quelles lignes les commandes opèrent.
del
supprime les lignes données. Il peut prendre un argument de registre, mais quand il n'est pas donné, il vide les lignes dans le registre sans nom @"
, tout comme la suppression en mode normal. let l=split(@")
divise ensuite les lignes supprimées en une liste, en utilisant le délimiteur par défaut: les espaces. Pour fonctionner correctement sur une entrée qui avait un espace dans les lignes supprimées, comme:
more than
hour
our
never
ever
after
work is
over
~
nous avions besoin de spécifier un séparateur différent, pour éviter « le travail est » d'être divisé en deux éléments de la liste: let l=split(@","\n")
.
Enfin, dans la substitution s/$/\=remove(l,0)/
, nous remplaçons la fin de chaque ligne ( $
) par la valeur de l'expression remove(l,0)
. remove(l,0)
modifie la liste l
, en supprimant et en renvoyant son premier élément. Cela nous permet de remplacer les lignes supprimées dans l'ordre dans lequel nous les lisons. Nous pourrions remplacer les lignes supprimées dans l'ordre inverse en utilisant remove(l,-1)
.
x
avec joinx+2
?