Vim在特定数量的分隔符后插入

时间:2012-07-25 19:28:45

标签: vim

我希望通过这样的方式使一些代码更容易阅读:

0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 ....

并添加新行以创建8的增量:

0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44 ....

任何人都知道任何vim魔法可以让我用专门选择的线来做到这一点吗?

5 个答案:

答案 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)

欺骗的一种方法是:

  1. set textwidth=48
  2. 突出显示(在可视模式下)您想要换行的行
  3. gq
  4. 只要textwidth大致是你要包装的地方,那就可以了。如果列表中的所有项目都具有相同的宽度,则此方法应该完美无缺。

    另一种更强大的方法是定义一个宏。

    1. 将光标移动到行的开头
    2. qw开始在寄存器w中录制宏(您可以使用任何寄存器)
    3. 8f,a按Enter,退出插入模式,然后再次按q
    4. @w可根据需要多次重播宏。我确信有一种聪明的方法可以自动重放宏的次数,但我不确定如何。您也可以按@@运行最近运行的宏。
    5. 正如@zanegray发布的那样,正则表达式也有效。

答案 2 :(得分:1)

这不会赢得任何vim高尔夫比赛,但我喜欢以简单的步骤思考这样的问题。

  1. 将每个元素放在自己的行上。
  2. 一次加入8行
  3. 手工完成任何必要的清理
  4. 为此,请执行以下操作:

    :s/, /,\r/g
    :'[,']g/./j 8
    

    说明:

    • :s/, /,\r/g用逗号(\r
    • 替换逗号后面的所有空格
    • '[,']是最近修改过的文字的范围。
    • g/./{cmd}将在匹配{cmd}(任何非空白行)的所有行上执行命令.
    • j 8join 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的否定会包含,