我对正则表达式很陌生,我需要一些帮助。首先,我将解释我的动机和一些图表,否则很难解释。

我最近安装了 Vim Indent guides,它像这样显示那些垂直条/标尺(图片来自 github 帐户):

这样做的方法是通过模式匹配行首的空格并将它们添加到 IndentGuidesEvenIndentGuidesOdd 。这样做的问题是它不能模式匹配空行,而且你得到的高亮效果并不理想,如下所示:

最简单的解决方案是删除 所有 空行/空白行,但没有空格的代码可能难以阅读。我的想法是分几个阶段转换代码,并最终添加空格,如下所示。

我正在做的是:

  • 从所有只有空格的行中删除空格 %s/\s\+$//e
  • 截断所有多个空行 %s/\n\{3,}/\r\r/e
  • 向空行添加空格 %s/^\ \(\ *\)\([^\ ]\)\(.*\)\n^\ *$\n^\ /\ \1\2\3\r\ \1\r\ /gc

  • 最后一条语句的作用是查看三行,其中第一行和第三行非空,第二行是空的。但是,如果第一行缩进 8 次,而第三行仅缩进 3 次,则会导致问题。无论如何,在找到第一个模式(在本例中为 8 个缩进)后,是否可以在相同的搜索模式中使用它以确保第 1 行和第 3 行以相同数量的空格开头?我确信我可以用一个迭代函数来做到这一点,并从例如 30 个缩进开始,然后再回来,但这可能有点低效。

    我知道只有空格的行是不好的。但是,删除空格是微不足道的,我已经映射了键来自动执行此操作。如果需要,我可以快速删除它们。另外,我知道问题比这更复杂,需要考虑的情况也更多,但是,我会在这些情况出现时进行处理。

    关于我如何去做这件事的任何建议?

    最佳答案

    为了根据你最后的评论实现第三步,你可以
    使用以下命令。

    :%s/^$/\=repeat(' ',min([indent(line('.')-1),indent(line('.')+1)]))
    

    这种全局替换依赖于具有表达式特征的替换
    (请参阅 :help sub-replace-\= )用包含的字符串替换空行
    空格字符重复 min([indent(line('.')-1),indent(line('.')+1)])次。空格数计算为两个连接值的最小值
    在临时列表中。这些值是行的缩进级别
    紧接在当前的之前和之后( line('.') 计算为
    其编号);缩进的级别是使用 indent() 确定的
    功能。

    关于vim - 搜索到的模式可以包含在正则表达式 (Vim) 中吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9407233/

    10-10 03:26