我对正则表达式非常陌生,我需要一些帮助。首先,我将解释我的动机和一些图表,因为它很难解释,否则。
我最近安装了Vim缩进指南,它显示垂直条/尺子,如下所示(图片来自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个缩进开始,然后按我的方式返回,但这可能有点效率低下。
我知道只有空格的线条是不好的。但是,删除空格是很简单的,而且我已经映射了键来自动完成这一任务。如果需要的话,我可以迅速移除它们。而且,我知道问题比这更复杂,而且有更多的案件需要考虑,但我将在这些案件出现时加以处理。
关于我该怎么做有什么建议吗?
发布于 2012-02-23 10:26:19
为了根据最后一个注释实现第三步,可以使用以下命令。
:%s/^$/\=repeat(' ',min([indent(line('.')-1),indent(line('.')+1)]))这种全局替换依赖于带有表达式特性的替换(参见:help sub-replace-\=)来用包含重复min([indent(line('.')-1),indent(line('.')+1)])次数的空格字符的字符串替换空行。空格数计算为在临时列表中加入的两个值的最小值。这些值是紧接当前行之前和之后的行的缩进级别(line('.')计算为其数目);缩进级别由indent()函数确定。
发布于 2012-02-23 04:45:33
使用vim填充空白:
:g/^$/s//\=printf('%*s', strlen(matchstr(getline(line('.')-1), '^\s*')),'')或
:g/^$/s//\=matchstr(getline(line('.')-1), '^\s*')https://stackoverflow.com/questions/9407233
复制相似问题