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

标签 vim

我想在 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/

相关文章:

vim - 将缓冲区发送到Vim 8中正在运行的终端窗口

linux - VIM 中 python 代码窗口关闭后自动关闭 pylint 窗口

vim - Vim 如何显示 :ls results (curses/cooked mode)

vim - 通常,我如何在 VIM 中使用 "go to definition"?那我怎么用golang呢?

javascript - jsc标签 : tags not sorted

vim - 从特定分支安装插件

python - 从 Ubuntu 迁移到 Windows——恢复 Vim+Python 工作流程

VI中的正则表达式搜索和替换

linux - ARM 的 vim 交叉编译

Vim autocmd(保存文件、运行代码格式化程序、重新加载文件)