0

我有一系列十六进制数字,如下所示。

cdef
89ab
4567
0123

我想从最后一行开始将数字排列在一行中,如下所示。

0123456789abcdef。如何在不使用宏的情况下在 vim 中完成它?

4

3 回答 3

4

命令

用反转线

:g/./m 0

加入所有行,!标志不会插入或删除空格。

:%j!

说明

:global命令采用以下形式::g/{pat}/{cmd}. {cmd}因此,在与 pattern 匹配的任何行上运行命令{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
于 2013-09-23T14:25:14.920 回答
1

使用加入插件(https://github.com/sk1418/Join)你可以这样做:

:%J '' r

或者

:J '' 4 r

rflag 表示反向连接线

实现目标。它支持更多关于线连接的功能。一探究竟..

还有....那个剧本是我写的。:P

于 2013-09-23T14:18:59.883 回答
1

Kent 的插件可以完成这项工作,如果您需要经常这样做,建议您使用;这是带有内置命令的(更冗长的)替代方案:

首先,使用:move命令与:global反转线。

:1,4g/^/m0

然后,不带任何分隔符加入:

:1,4j!
于 2013-09-23T14:27:42.617 回答