我对正则表达式很新,我需要一些帮助。首先,我将解释我的动机和一些图表,因为这很难解释。
我最近安装了Vim Indent guides,它显示了那样的竖条/标尺(图片来自github帐号):
它的方式是通过模式匹配行开头的空格并将它们添加到IndentGuidesEven
或IndentGuidesOdd
。这个问题是它无法模拟匹配空行,并且你得到的理想情况不太理想:
最简单的解决方案是删除所有空/空行,但是没有空格的代码可能难以阅读。我想到的是在几个阶段转换代码,最终添加空格,如下所示。
我在做的是:
%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个缩进开始,然后回去工作,但这可能有点低效。
我知道只有空格的行很糟糕。但是,删除空格是微不足道的,我有键映射自动执行此操作。如果需要,我可以快速删除它们。此外,我知道问题比这更复杂,并且有更多的案例要考虑,但是,我会在他们出现时处理这些案件。
关于如何做到这一点的任何建议?
答案 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*')