首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Vim中合并两个多行文本块?

如何在Vim中合并两个多行文本块?
EN

Stack Overflow用户
提问于 2012-05-25 19:30:08
回答 9查看 81K关注 0票数 327

我想把Vim中的两行合并,即取k行到l行,并将它们附加到m到n行。如果您更喜欢伪代码解释:[line[k+i] + line[m+i] for i in range(min(l-k, n-m)+1)]

例如,

代码语言:javascript
运行
复制
abc
def
...

123
45
...

应该变成

代码语言:javascript
运行
复制
abc123
def45

有没有一个很好的方法来做到这一点,而不复制和粘贴手动逐行?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-05-25 19:44:06

您当然可以使用单个复制/粘贴(使用块模式选择)来完成所有这些操作,但我猜这不是您想要的。

如果你只想用Ex命令来做这件事

代码语言:javascript
运行
复制
:5,8del | let l=split(@") | 1,4s/$/\=remove(l,0)/

将转变

代码语言:javascript
运行
复制
work it 
make it 
do it 
makes us 
harder
better
faster
stronger
~

转到

代码语言:javascript
运行
复制
work it harder
make it better
do it faster
makes us stronger
~

更新:--这么多人投票的答案--值得更彻底的解释。

在Vim中,您可以使用管道字符(|)来链接多个Ex命令,因此上面的内容相当于

代码语言:javascript
运行
复制
:5,8del
:let l=split(@")
:1,4s/$/\=remove(l,0)/

许多Ex命令接受一系列行作为前缀参数--在上述情况下,5,8del之前,1,4s///之前指定命令在哪些行上操作。

del删除给定的行。它可以使用一个寄存器参数,但是当没有给出一个参数时,它会将行转储到未命名的寄存器@"中,就像正常模式下的删除一样。然后,let l=split(@")使用默认分隔符:空格将已删除的行拆分为列表。若要正确处理已删除行中有空格的输入,请执行以下操作:

代码语言:javascript
运行
复制
more than 
hour 
our 
never 
ever
after
work is
over
~

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

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

票数 885
EN

Stack Overflow用户

发布于 2012-05-26 07:09:30

通过组合:global:move:join命令,可以获得一个优雅而简洁的Ex命令来解决这个问题。假设第一个行块从缓冲区的第一行开始,并且光标位于紧接第二块第一行的行上,则命令如下所示。

代码语言:javascript
运行
复制
:1,g/^/''+m.|-j!

有关此技术的详细说明,请参见my answer中本质上相同的问题“How to achieve the “paste -d '␣'” behavior out of the box in Vim?”。

票数 59
EN

Stack Overflow用户

发布于 2012-05-25 19:41:02

要连接行块,必须执行以下步骤:

转到第三行:jj

  • Enter可视块模式:CTRL-v

  • Anchor光标到行尾(对于不同长度的行很重要):$

  • Go到末尾:CTRL-END

  • Cut,块:x

  • Go到第一行的末尾:kk$

  • Paste,块在这里:p

这个运动并不是最好的运动(我不是专家),但它的工作方式是你想要的。希望会有一个较短的版本。

这里有一些前提条件,所以这种技术很好地工作:

起始块的所有行(在问题XOR

  • the和def中的示例中)都具有相同的长度,起始块的第一行是最长的,并且您不关心中间的附加空格),XOR

  • The第一行的起始块不是最长的,您需要额外的空格到末尾。
票数 45
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10760326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档