Ciertamente puede hacer todo esto con una sola copia / pegar (usando la selección de modo de bloque), pero supongo que eso no es lo que quiere.
Si quieres hacer esto con solo comandos Ex
:5,8del | let l=split(@") | 1,4s/$/\=remove(l,0)/
transformará
work it
make it
do it
makes us
harder
better
faster
stronger
~
dentro
work it harder
make it better
do it faster
makes us stronger
~
ACTUALIZACIÓN: Una respuesta con tantos votos a favor merece una explicación más completa.
En Vim, puede usar el carácter de canalización ( |
) para encadenar múltiples comandos Ex, por lo que lo anterior es equivalente a
:5,8del
:let l=split(@")
:1,4s/$/\=remove(l,0)/
Muchos comandos Ex aceptan un rango de líneas como argumento de prefijo; en el caso anterior, 5,8
antes del
y 1,4
antes de s///
especificar en qué líneas operan los comandos.
del
elimina las líneas dadas. Puede tomar un argumento de registro, pero cuando no se proporciona uno, volca las líneas en el registro sin nombre @"
, tal como lo hace la eliminación en modo normal. let l=split(@")
luego divide las líneas eliminadas en una lista, utilizando el delimitador predeterminado: espacios en blanco. Para funcionar correctamente en la entrada que tenía espacios en blanco en las líneas eliminadas, como:
more than
hour
our
never
ever
after
work is
over
~
tendríamos que especificar un delimitador diferente, para evitar que "el trabajo es" de ser dividida en dos elementos de la lista: let l=split(@","\n")
.
Finalmente, en la sustitución s/$/\=remove(l,0)/
, reemplazamos el final de cada línea ( $
) con el valor de la expresión remove(l,0)
. remove(l,0)
altera la lista l
, eliminando y devolviendo su primer elemento. Esto nos permite reemplazar las líneas eliminadas en el orden en que las leemos. En su lugar, podríamos reemplazar las líneas eliminadas en orden inverso mediante el uso remove(l,-1)
.
x
con unirsex+2
?