- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 Vim 中合并两个行 block ,即从第 k 行到 l 行并将它们附加到第 m 行通过n。如果您更喜欢伪代码解释:[line[k+i] + line[m+i] for i in range(min(l-k, n-m)+1)]
。
例如,
abc
def
...
123
45
...
应该变成
abc123
def45
有没有一种好的方法可以做到这一点,而无需手动逐行复制和粘贴?
最佳答案
您当然可以通过一次复制/粘贴(使用 block 模式选择)来完成所有这些操作,但我猜这不是您想要的。
如果您只想使用 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 命令接受一系列行作为前缀参数 - 在上述情况下,del
之前的 5,8
和 1,4<
s///
之前的/code> 指定命令操作的行。
del
删除给定的行。它可以接受一个寄存器参数,但是当没有给出一个参数时,它会将这些行转储到未命名的寄存器,@"
,就像在正常模式下删除一样。let l=split(@ ")
然后使用默认分隔符:空格将删除的行分割成一个列表。要在已删除行中包含空格的输入上正常工作,例如:
more than
hour
our
never
ever
after
work is
over
~
我们需要指定一个不同的分隔符,以防止“work is”被拆分为两个列表元素:
p>let l=split(@","\n")
。
最后,在替换 s/$/\=remove(l,0)/
中,我们将每行的末尾 ($
) 替换为表达式remove(l,0)
。 remove(l,0)
更改列表 l
,删除并返回其第一个元素。这使我们可以按照读取的顺序替换已删除的行。我们可以使用 remove(l,-1)
以相反的顺序替换已删除的行。
关于vim - 如何在 Vim 中合并两个多行文本 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10760326/
我是一名优秀的程序员,十分优秀!