我希望通过以下方式使一些代码更易于阅读:
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 ....
并添加新行以创建 8 的增量:
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44 ....
任何人都知道任何 vim 魔法可以让我用特别选择的行来做到这一点?
我希望通过以下方式使一些代码更易于阅读:
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 ....
并添加新行以创建 8 的增量:
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44 ....
任何人都知道任何 vim 魔法可以让我用特别选择的行来做到这一点?
这不是最漂亮的解决方案,我相信它可以被清理/简化一些。首先选择文本,然后输入以下命令:
:'<,'>s/\(\S\+,\s*\)\{8}/&\r/g
这会输出如下内容:
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 0x44, 0x44, ...
一种作弊方法是:
set textwidth=48
gq
只要 textwidth 大致是您想要换行的位置,那将可以正常工作。如果列表中的所有项目的宽度相同,则此方法应该是完美的。
另一种更稳健的方法是定义一个宏。
qw
开始在寄存器 w 中录制宏(您可以使用任何寄存器)8f,a
按回车键,离开插入模式,然后再按q
一次@w
根据需要多次重播宏。我确信有一种聪明的方法可以自动重播宏的次数,但我不确定如何。您也可以按@@
运行最近运行的宏。正如@zanegray 所发布的,正则表达式也有效。
这不会赢得任何 vim 高尔夫比赛,但我喜欢用简单的步骤来思考这样的问题。
为此,请运行以下命令:
:s/, /,\r/g
:'[,']g/./j 8
解释:
:s/, /,\r/g
用返回 ( \r
)替换逗号后的所有空格'[,']
是最近修改文本的范围。g/./{cmd}
{cmd}
将在匹配的所有行.
(任何非空行)上执行命令j 8
是join 8
表示加入 8 行的缩写现在警告一句:即使超过了替换文本的结尾,这也会加入 8 行,']
. 这可以通过更复杂的命令来克服,例如::'[,']g/./.,+6/,$/j 8
,但这对我的口味来说还不够简单。如果这个问题是一个真正的问题,我会将原始文本移动到一个新的缓冲区(通过:new
),或者至少是当前缓冲区的底部。完成转换后将其移回原位。
了解更多信息
:h range
:h :j
:h :s
:h :g
:h '[
你可以用一个多部分的命令来做到这一点,这可能更容易让你绕着头……
制作一个在第 8 个逗号后添加分号的宏。
qq8f,lr;qu
选择文本,然后执行该宏 1000 次(如果每行超过 8000 次,则执行更多)
:'<,'>norm 1000@q
用换行符重新选择区域gv
并将所有分号替换为换行符。
gv
:'<,'>s/;/\r/g
这将在第 8 个逗号后添加一个分号,然后用换行符替换该分号。
所以这个解决方案是基于Zanegray 的解决方案和我的一些小调整:
:s/\(\w\+,\s\)\{8}/&\r/g
Zanegray 的解决方案也可以像这样工作:
:s/\(\S\+\s\)/&\r/g
因为空格的否定\S
会包括,
.