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

搜索的模式可以包含在正则表达式(Vim)中吗?,vim,highlighting,indentation,Vim,Highlighting,Indentation,我对正则表达式非常陌生,需要一些帮助。首先,我将解释我的动机和一些图表,否则很难解释 我最近安装了一个这样显示垂直条/标尺的软件(来自github帐户的图片): 它的方法是在行首匹配空格,并将它们添加到IndentGuidesEven或IndentGuidesOdd中。这样做的问题是,它无法匹配空线的模式,并且会得到不理想的hilighting,如下所示: 最简单的解决方案是删除所有的空行,但是没有空格的代码很难阅读。我的想法是分几个阶段转换代码,并最终添加空格,如下所示 我正在做的是:

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

我最近安装了一个这样显示垂直条/标尺的软件(来自github帐户的图片):

它的方法是在行首匹配空格,并将它们添加到
IndentGuidesEven
IndentGuidesOdd
中。这样做的问题是,它无法匹配空线的模式,并且会得到不理想的hilighting,如下所示:

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

我正在做的是:

  • 从所有只包含空格的行中删除空格
    %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个缩进开始,然后再往回走,但这可能会有点低效

我知道只有空格的行是不好的。然而,删除空格很简单,我有一个键映射来自动完成这项工作。如果需要的话,我可以很快把它们移除。而且,我知道问题比这更复杂,而且有更多的案例要考虑,但是,我会处理这些情况。
关于如何进行此操作,有什么建议吗?

使用
vim
填充空白:

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


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

:%s/^$/\=repeat(' ',min([indent(line('.')-1),indent(line('.')+1)]))
此全局替换依赖于具有表达式功能的替换 (请参见
:help sub replace-\=
)将空行替换为包含 重复的空格字符
min([缩进(行('.')-1),缩进(行('.')+1)])
时代。空间数至少计算为两个连接的值 在临时列表中。这些值是行的缩进级别 当前代码(
行('.')的前一行和后一行(
计算结果为 其数量);缩进的级别是使用
indent()确定的。

功能。

这几乎是完美的!是否有任何方法使其匹配上一行或下一行的最小缩进?如果(例如在python中)在一个空行之前有8个嵌套的if语句,但在该行之后它们不会继续(假设第三行仅缩进1),则会产生误导。我不希望第2行有8个标签,第3行只有1个。@puk:这确实是可能的。仔细想想,我想做的是不可能的。水平间距基于上下文。我想我得检查一下语言的结构。等等。我不知道你是怎么做到的,但它奏效了!我将用我的余生去破译那条线。我不值得。@puk:means:重复空格的次数是上一行和下一行缩进的最小次数。请参见
:help indent()
:help min()
,以及
:help sub replace expression
:%s/^$/\=repeat(' ',min([indent(line('.')-1),indent(line('.')+1)]))