我有一系列十六进制数字,如下面的colums所示。
cdef
89ab
4567
0123
我想将数字排在从最后一行开始的一行中,如下所示。
即 0123456789abcdef 。如何在不使用宏的情况下在vim中完成它?
答案 0 :(得分:4)
命令
使用
反转行:g/./m 0
加入所有行,!
标志不插入或删除空格。
:%j!
解释
:global
命令采用以下形式::g/{pat}/{cmd}
。因此,在与模式{cmd}
匹配的任一行上运行命令{pat}
。在这种情况下,我们的模式是.
,它匹配非空行。我们的命令是:move
。 :move {address}
命令会将整行移动到地址/行{address}
。在我们的例子中,我们将每一行移动到文件的顶部,因此我们使用0
。
:g/./m0
一起使用非空行并将其移至顶部。由于:global
命令从文件顶部运行到底部,因此第一行将首先移至顶部,最后一行最后移至文件顶部。想想这种类似堆栈(LILO)。因此线条反转。
现在剩下的就是连接所有的行以及任何额外的空白区域。 :join
命令采用:{range}join[!]
形式。我们希望从第一行1
加入到最后一行$
,因此我们的范围为1,$
。但是这很常见,因此这个范围有一个快捷方式%
。可选的!
标记告诉:join
不添加或删除任何空格。所有:%j!
将所有行连接成一条长行。
由于:g/^/m0
模式匹配每一行而不仅仅是非空行,因此通过^
反转行可能更为常见。
如需更多帮助,请参阅:
:h :g
:h :m
:h :j
答案 1 :(得分:1)
使用加入插件(https://github.com/sk1418/Join),您可以这样做:
:%J '' r
或
:J '' 4 r
r
标志表示反向连接线
实现目标。它支持更多关于线连接的功能。检查出来..
和....那个脚本是我写的。 :P
答案 2 :(得分:1)
Kent的插件可以完成这项工作,如果您需要经常这样做,建议使用它;这是一个内置命令的(更长篇)替代方案:
首先,使用:move
命令和:global
来反转这些行。
:1,4g/^/m0
然后,在没有任何分隔符的情况下加入:
:1,4j!