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

Jue*_*gen 13 vim paste

vi/vim可以做paste -d ' '其他:r !paste -d ' '吗?

如果有的话,调用的本机vi/vim命令是什么?

ib.*_*ib. 18

让我们考虑一个稍微不同但密切相关的问题:将一行范围附加到紧接其前面的另一个范围.解决之后,我们将回到原始问题并展示如何将其简化为建议的问题.

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

:1,g/^/''+m.|-j!
Run Code Online (Sandbox Code Playgroud)

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

这些命令的构造利用了两个隐含的事实.首先,在a中指定的命令在:global另一行上执行之前,光标位于该行的第一列.这意味着引用的地址.对应于当前正在运行命令的最新行.其次,在将:global命令发送到执行之前的光标位置被添加到跳转列表中.因此,可以通过'伪标记在范围内寻址该位置(请参阅参考资料:help :range).

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

:1,g/^/''+m.|s/^/\t/|-j!
Run Code Online (Sandbox Code Playgroud)

:join没有!修饰符的情况下运行命令时,可以使用默认的Vim句子分离行为选项,

:1,g/^/''+m.|-j
Run Code Online (Sandbox Code Playgroud)

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

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

:%y
Run Code Online (Sandbox Code Playgroud)

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

:$pu|'[-
Run Code Online (Sandbox Code Playgroud)

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

  1. 将未命名寄存器的内容粘贴到最后一行下方,将光标移动到粘贴文本的最后一行.
  2. 在粘贴之前将光标移动到最后一行.

在那之后,:global可以立即使用之前提出的命令之一.可以在一次运行中发出粘贴和转换:

:$pu|'[-|1,g/^/''+m.|s/^/\t/|-j!
Run Code Online (Sandbox Code Playgroud)