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)
最后一个命令结合了两个动作:
在那之后,:global可以立即使用之前提出的命令之一.可以在一次运行中发出粘贴和转换:
:$pu|'[-|1,g/^/''+m.|s/^/\t/|-j!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2163 次 |
| 最近记录: |