gpt4 book ai didi

vim - 如何在 Vim 中合并两个多行文本 block ?

转载 作者:行者123 更新时间:2023-12-03 03:59:57 26 4
gpt4 key购买 nike

我想在 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,81,4<s/// 之前的/code> 指定命令操作的行。

del 删除给定的行。它可以接受一个寄存器参数,但是当没有给出一个参数时,它会将这些行转储到未命名的寄存器,@",就像在正常模式下删除一样。let l=split(@ ") 然后使用默认分隔符:空格将删除的行分割成一个列表。要在已删除行中包含空格的输入上正常工作,例如:

more than 
hour
our
never
ever
after
work is
over
~

我们需要指定一个不同的分隔符,以防止“work is”被拆分为两个列表元素:let l=split(@","\n") p>

最后,在替换 s/$/\=remove(l,0)/ 中,我们将每行的末尾 ($) 替换为表达式remove(l,0)remove(l,0) 更改列表 l,删除并返回其第一个元素。这使我们可以按照读取的顺序替换已删除的行。我们可以使用 remove(l,-1) 以相反的顺序替换已删除的行。

关于vim - 如何在 Vim 中合并两个多行文本 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10760326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com