6

我希望通过以下方式使一些代码更易于阅读:

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

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

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

任何人都知道任何 vim 魔法可以让我用特别选择的行来做到这一点?

4

5 回答 5

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, ...
于 2012-07-25T20:11:49.743 回答
1

一种作弊方法是:

  1. set textwidth=48
  2. 突出显示(在可视模式下)要换行的行
  3. gq

只要 textwidth 大致是您想要换行的位置,那将可以正常工作。如果列表中的所有项目的宽度相同,则此方法应该是完美的。

另一种更稳健的方法是定义一个宏。

  1. 将光标移动到行首
  2. qw开始在寄存器 w 中录制宏(您可以使用任何寄存器)
  3. 8f,a按回车键,离开插入模式,然后再按q一次
  4. @w根据需要多次重播宏。我确信有一种聪明的方法可以自动重播宏的次数,但我不确定如何。您也可以按@@运行最近运行的宏。

正如@zanegray 所发布的,正则表达式也有效。

于 2012-07-25T20:16:00.903 回答
1

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

  1. 将每个元素放在自己的行上。
  2. 一次加入 8 条线路
  3. 进行任何必要的手工清理

为此,请运行以下命令:

: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 '[
于 2012-07-25T22:15:14.450 回答
0

你可以用一个多部分的命令来做到这一点,这可能更容易让你绕着头……

制作一个在第 8 个逗号后添加分号的宏。

qq8f,lr;qu

选择文本,然后执行该宏 1000 次(如果每行超过 8000 次,则执行更多)

:'<,'>norm 1000@q

用换行符重新选择区域gv并将所有分号替换为换行符。

gv
:'<,'>s/;/\r/g

这将在第 8 个逗号后添加一个分号,然后用换行符替换该分号。

于 2012-07-25T20:17:40.467 回答
0

所以这个解决方案是基于Zanegray 的解决方案和我的一些小调整:

:s/\(\w\+,\s\)\{8}/&\r/g

Zanegray 的解决方案也可以像这样工作:

:s/\(\S\+\s\)/&\r/g

因为空格的否定\S会包括,.

于 2012-07-26T12:43:24.227 回答