这个问题与这个问题几乎相同,只是我需要用三个空格(公司编码规范)而不是四个,并且被接受的解决方案只会将匹配模式加倍。以下是我的第一次尝试:
但是这种方法行不通,因为四个空格会被替换成三个。所以我认为我需要一种方法来获取匹配"+"的次数,并使用该数字创建替换的另一侧,但我感觉这种功能在Vim的正则表达式中可能不可用(如果您认为可能可能,请告诉我)。
我还尝试手动进行替换,先替换最大的缩进,然后替换下一个较小的缩进,直到将所有内容都转换完成,但这样很难跟踪空格的数量:
:%s/^\(\s\s\)\+/\1 /gc
但是这种方法行不通,因为四个空格会被替换成三个。所以我认为我需要一种方法来获取匹配"+"的次数,并使用该数字创建替换的另一侧,但我感觉这种功能在Vim的正则表达式中可能不可用(如果您认为可能可能,请告诉我)。
我还尝试手动进行替换,先替换最大的缩进,然后替换下一个较小的缩进,直到将所有内容都转换完成,但这样很难跟踪空格的数量:
:%s/^ \(\S\)/ \1/gc
我可以使用Perl发送它,因为似乎Perl可能具有使用其扩展模式的能力。但是我无法在我的Perl版本中使其正常工作。这是我尝试计算a的代码:
:%!perl -pe 'm<(?{ $cnt = 0 })(a(?{ local $cnt = $cnt + 1; }))*aaaa(?{ $res = $cnt })>x; print $res'
如果没有更好的方法,我会写一个Perl脚本来进行转换,但我希望在Vim中找到一种更通用的解决方案,以便将来可以重复使用这个想法来解决其他问题。