搜索到的模式可以包含在正则表达式(Vim)中吗?

时间:2012-02-23 04:36:31

标签: vim highlighting indentation

我对正则表达式很新,我需要一些帮助。首先,我将解释我的动机和一些图表,因为这很难解释。

我最近安装了Vim Indent guides,它显示了那样的竖条/标尺(图片来自github帐号):

Vertical Bars

它的方式是通过模式匹配行开头的空格并将它们添加到IndentGuidesEvenIndentGuidesOdd。这个问题是它无法模拟匹配空行,并且你得到的理想情况不太理想: Poor highlighting

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

Animation

我在做的是:

  • 仅使用空格%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个缩进开始,然后回去工作,但这可能有点低效。

我知道只有空格的行很糟糕。但是,删除空格是微不足道的,我有键映射自动执行此操作。如果需要,我可以快速删除它们。此外,我知道问题比这更复杂,并且有更多的案例要考虑,但是,我会在他们出现时处理这些案件。

关于如何做到这一点的任何建议?

2 个答案:

答案 0 :(得分:3)

为了根据您的上一条评论实施第三步,可以 使用以下命令。

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

此全局替换依赖于具有表达式功能的替代 (参见:help sub-replace-\=)用含有的字符串替换空行 重复的空格字符min([indent(line('.')-1),indent(line('.')+1)]) 倍。空格数的计算最少为两个连接值 在临时名单中。这些值是行的缩进级别 紧接在当前一个之前和之后(line('.')评估为 它的数量);使用indent()确定缩进级别 功能

答案 1 :(得分:2)

使用vim填充空格:

:g/^$/s//\=printf('%*s', strlen(matchstr(getline(line('.')-1), '^\s*')),'')

或者

:g/^$/s//\=matchstr(getline(line('.')-1), '^\s*')