Vim 可以做些什么来达到 paste -d ' '
的效果吗? shell
命令,然后通过 :r !paste -d ' '
运行它?
可用于此目的的原生 Vim 命令有哪些(如果有)?
最佳答案
首先,让我们考虑一个有些不同但密切相关的
问题:立即将一个范围的行附加到另一个范围
在它之前。解决之后,我们将回到原来的状态
答案的第二部分中的问题,并将展示如何
原来的问题可以简化为建议的问题。
1. 在不限制一般性的情况下,我们假设第一个
行块(要附加第二行的行)开始于
缓冲区的第一行,并且光标位于最后一行
第一个块的行。在这种情况下,可以使用连接线
以下简短有效的 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"
.2. 该技术很容易适用于所讨论的问题,
因为最初的情况可以缩小到我们所拥有的情况
以上考虑。为此,请转到包含
追加和复制它们的行,
:%y
然后,切换到包含要追加的文本的目标缓冲区,并将复制的行粘贴到缓冲区的当前内容下方,
:$pu|'[-
上面的命令结合了两个 Action :将光标移动到粘贴文本的最后一行。
在那之后,其中之一是
:global
可以使用之前提出的命令立即地。当然,也可以同时发布粘贴和
在一次运行中转换:
:$pu|'[-|1,g/^/''+m.|s/^/\t/|-j!
关于vim - 如何在 Vim 中开箱即用地实现 “paste -d ' ␣'” 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9658612/