vi / vim可以paste -d ' '
以后再:r !paste -d ' '
吗?
调用的本机vi / vim命令是什么?
答案 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|'[-
最后一个命令结合了两个动作:
在此之后,可以使用之前提出的:global
命令之一
立即。可以发布粘贴和转换
一次运行:
:$pu|'[-|1,g/^/''+m.|s/^/\t/|-j!
答案 1 :(得分:0)
我的UnconditionalPaste plugin有gdp
/ gdP
映射,它将寄存器内容粘贴为带有查询分隔符的最小拟合(即非矩形)块,就像{{ 1}}会做的。
就像@ ib。的优秀答案一样,这首先需要将源缓冲区放入寄存器中。