Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在特定数量的分隔符后插入Vim_Vim - Fatal编程技术网

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

在特定数量的分隔符后插入Vim,vim,Vim,我希望通过以下方式使一些代码更易于阅读: 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 .... 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, ... 并添加新行以创建8的增量: 0x44, 0x44, 0x44, 0x44, 0

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

0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 ....
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
0x44, 0x44, 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

作弊的一种方法是:

  • set textwidth=48
  • 高亮显示(在视觉模式下)要换行的行
  • gq
  • 只要textwidth大致在您要换行的位置,这就行了。如果列表中的所有项目都具有相同的宽度,则此方法应该是完美的

    另一种稍微稳健一点的方法是定义宏

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

  • 正如@zanegray所发布的那样,正则表达式也可以工作。

    您可以使用一个多部分的命令来实现这一点,这可能更容易让您绞尽脑汁

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

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


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

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

  • 将每个元素放在自己的行上
  • 一次将8条线连接在一起
  • 用手进行任何必要的清理
  • 要执行此操作,请运行以下命令:

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

    • :s/,/,\r/g
      将逗号后的所有空格替换为返回(
      \r
    • “[,”]
      是最近修改的文本的范围
    • g/{cmd}
      将在与
      匹配的所有行(任何非空行)上执行命令
      {cmd}
    • j8
      join8
      的缩写,意思是连接8行
    现在有一个警告:这将连接8行,即使它超过了替换文本的结尾,
    ']
    。这可以通过一个更复杂的命令来克服,比如:
    :'[,']g/,+6/,$/j8
    ,但这对我来说还不够简单。如果这个问题是一个真正的问题,我会将原始文本移动到一个新的缓冲区(通过
    :new
    ),或者至少移动到当前缓冲区的底部。完成转换后,将其移回原位

    更多信息

    :h range
    :h :j
    :h :s
    :h :g
    :h '[
    

    因此,此解决方案基于Zanegray的解决方案和我的一些小调整:

    :s/\(\w\+,\s\)\{8}/&\r/g
    
    Zanegray的解决方案也可以像这样工作:

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

    由于空格
    \S
    的否定将包括

    键宏的官方Vim名称是“录制”<代码>帮助q也可以使用行范围而不是视觉选择:
    :,+5s…
    。另外,不需要转义量词中的
    }
    \{8}
    。我不能保证vim是我在工作,但在vi中,{8}必须转义括号。vi需要转义两个大括号吗?我没有真正的
    vi
    可供测试。上面的模式,使用
    \{8}
    设置compatible
    之后在vim中工作,但这不是证据。另外,
    :help/\{
    断言{Vi没有这些},re:量词。这似乎不正确,但我已经有一段时间没有在meIn vim面前有一个真正的Vi了,结尾的
    }
    不一定要逃过,但逃过它一点伤害也没有。我站出来纠正。vi不需要脱离闭合支架。很抱歉给你带来了困惑。
    :s/\(\w\+,\s\)\{8}/&\r/g
    
    :s/\(\S\+\s\)/&\r/g