您当然可以使用一个副本/ 粘贴( 使用区块模式选择) 来做所有这一切, 但我猜这不是您想要的 。
如果您想只用 < a href=" http://en.wikipedia.org/wiki/ ex28text_ editor% 29" 来做到这一点, 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 中,您可以使用管道字符 () 来连锁多个Ex 命令,因此以上等同
:5,8del
:let l=split(@")
:1,4s/$/=remove(l,0)/
许多Ex命令接受一系列行作为前缀参数 -- -- 在上述情况下, 5,8
之前的 del
和 1,4
之前的 ////
指定命令运行的行。
del
deletes the given lines. It can take a register argument, but when one is not given, it dumps the lines to the unnamed register, @"
, just like deleting in normal mode does. let l=split(@")
then splits the deleted lines 与 a list, using the default delimiter: whitespace. To work properly on input that had whitespace in the deleted lines, like:
more than
hour
our
never
ever
after
work is
over
~
we d need to specify a different delimiter, to prevent "work is" from being split 与 two list elements: let l=split(@","
")
.
最后,在替换 s/$/=remove(l,0)/
中,我们将每一行的结尾($
)改为 remove(l,0)
。 remove(l,0)
改变了列表 ,删除并返回其第一个元素。这让我们按照阅读顺序替换被删除的行。我们可以用 remove(l,-1)
取代被删除的行。