我希望通过这样的方式使一些代码更容易阅读:
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 ....
并添加新行以创建8的增量:
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44 ....
任何人都知道任何vim魔法可以让我用专门选择的线来做到这一点吗?
答案 0 :(得分:5)
这不是最漂亮的解决方案,我确信它可以清理/简化一些。首先选择文本,然后输入以下命令:
:'<,'>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, ...
答案 1 :(得分:1)
欺骗的一种方法是:
set textwidth=48
gq
只要textwidth大致是你要包装的地方,那就可以了。如果列表中的所有项目都具有相同的宽度,则此方法应该完美无缺。
另一种更强大的方法是定义一个宏。
qw
开始在寄存器w中录制宏(您可以使用任何寄存器)8f,a
按Enter,退出插入模式,然后再次按q
@w
可根据需要多次重播宏。我确信有一种聪明的方法可以自动重放宏的次数,但我不确定如何。您也可以按@@
运行最近运行的宏。正如@zanegray发布的那样,正则表达式也有效。
答案 2 :(得分:1)
这不会赢得任何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 '[
答案 3 :(得分:0)
您可以使用多部分命令来执行此操作,这可能更容易包围您的想法......
制作一个在第8个逗号后添加分号的宏。
qq8f,lr;qu
选择文本,然后执行该宏1000次(如果每行超过8000次,则执行更多)
:'<,'>norm 1000@q
使用gv
重新选择区域,并用换行符替换所有分号。
gv
:'<,'>s/;/\r/g
这将在第8个逗号后添加一个分号,然后用换行符替换该分号。
答案 4 :(得分:0)
所以这个解决方案基于 Zanegray的解决方案以及我的一些小调整:
:s/\(\w\+,\s\)\{8}/&\r/g
Zanegray的解决方案也会像:
:s/\(\S\+\s\)/&\r/g
因为空格\S
的否定会包含,
。