搜索的模式可以包含在正则表达式(Vim)中吗?
我对正则表达式非常陌生,需要一些帮助。首先,我将解释我的动机和一些图表,否则很难解释 我最近安装了一个这样显示垂直条/标尺的软件(来自github帐户的图片): 它的方法是在行首匹配空格,并将它们添加到搜索的模式可以包含在正则表达式(Vim)中吗?,vim,highlighting,indentation,Vim,Highlighting,Indentation,我对正则表达式非常陌生,需要一些帮助。首先,我将解释我的动机和一些图表,否则很难解释 我最近安装了一个这样显示垂直条/标尺的软件(来自github帐户的图片): 它的方法是在行首匹配空格,并将它们添加到IndentGuidesEven或IndentGuidesOdd中。这样做的问题是,它无法匹配空线的模式,并且会得到不理想的hilighting,如下所示: 最简单的解决方案是删除所有的空行,但是没有空格的代码很难阅读。我的想法是分几个阶段转换代码,并最终添加空格,如下所示 我正在做的是:
IndentGuidesEven
或IndentGuidesOdd
中。这样做的问题是,它无法匹配空线的模式,并且会得到不理想的hilighting,如下所示:
最简单的解决方案是删除所有的空行,但是没有空格的代码很难阅读。我的想法是分几个阶段转换代码,并最终添加空格,如下所示
我正在做的是:
- 从所有只包含空格的行中删除空格
%s/\s\+$//e
- 截断所有多个空行
%s/\n\{3,}/\r\r/e
- 向空行添加空格
%s/^\\\(\*\)\([^\]\)\(.*\)\n^\*$\n^\/\\1\2\3\r\\1\r\/gc
关于如何进行此操作,有什么建议吗?使用
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)]))