Vim粘贴-d''开箱即用的行为?

时间:2012-03-11 20:28:33

标签: vim paste

vi / vim可以paste -d ' '以后再:r !paste -d ' '吗?

调用的本机vi / vim命令是什么?

2 个答案:

答案 0 :(得分:17)

让我们考虑一个有些不同但密切相关的问题: 将一行范围附加到紧邻其前的另一个范围。 解决之后,我们将回到原始问题并展示它是如何实现的 可以简化为建议的。

在不限制一般性的情况下,我们假设第一个块 line(将第二个追加到的那一行)从第一行开始 缓冲区,以及光标位于该缓冲区的最后一行 第一块。在这种情况下,可以使用以下方式连接线 简短有效的Ex命令,

:1,g/^/''+m.|-j!

:global命令在从第一行到第一行的行范围内运行 当前的一个,顺序执行两个Ex命令:''+m.-j!。前一个:move命令删除其旁边的行 光标已定位,并将其插入光标下方 当前正由:global命令处理。后者,:join 命令,将刚刚移动的行附加到上面的行(不添加或 删除它们之间的空格,因为!修饰符。)

这些命令的构造利用了两个隐含的优点 事实。首先,在执行:global中指定的命令之前 在另一行上,光标位于第一列 那条线。这意味着引用为.的地址对应于 当前正在运行命令的最新行。第二, 在发送:global命令之前的光标位置是 添加到跳转列表中。因此,该位置可以解决 范围为'伪标记(请参阅:help :range)。

如果需要在连接线之间放置分隔符,可以添加 执行:join之前插入的替换命令:

:1,g/^/''+m.|s/^/\t/|-j!

有一个默认的Vim句子分离行为选项 在没有:join修饰符

的情况下运行!命令时使用
:1,g/^/''+m.|-j

有关该空间分隔行为的详细信息,请参阅:help J:help :join,尤其是:helpg These commands, except "gJ"可以找到的段落。

该技术很容易适用于所讨论的问题,因为 最初的情况可以缩小到我们考虑过的情况 以上。为此,请转到包含行的缓冲区 追加并复制它们,

:%y

然后切换到目标缓冲区,其中包含要追加的文本,和 将复制的行粘贴到缓冲区的当前内容下面,

:$pu|'[-

最后一个命令结合了两个动作:

  1. 将未命名寄存器的内容粘贴到最后一行下方, 将光标移动到粘贴文本的最后一行。
  2. 将光标移动到之前的最后一行 粘贴。
  3. 在此之后,可以使用之前提出的:global命令之一 立即。可以发布粘贴和转换 一次运行:

    :$pu|'[-|1,g/^/''+m.|s/^/\t/|-j!
    

答案 1 :(得分:0)

我的UnconditionalPaste plugingdp / gdP映射,它将寄存器内容粘贴为带有查询分隔符的最小拟合(即非矩形)块,就像{{ 1}}会做的。

就像@ ib。的优秀答案一样,这首先需要将源缓冲区放入寄存器中。

演示

enter image description here