Этот вопрос почти идентичен этому вопросу , за исключением того, что я должен перейти к трем пробелам (руководство по кодированию компании), а не к четырем, и принятое решение только удвоит совпадающий шаблон. Это была моя первая попытка:
:%s/^\(\s\s\)\+/\1 /gc
Но это не работает, потому что четыре пробела заменяются тремя. Поэтому я думаю, что мне нужен какой-то способ подсчитать, сколько раз шаблон соответствовал "+", и использовать это число для создания другой стороны подстановки, но я чувствую, что эта функция, вероятно, недоступна в регулярном выражении Vim (пусть я знаю, если вы думаете, что это возможно).
Я также попытался выполнить замену вручную, заменив сначала самые большие отступы, а затем следующий меньший отступ, пока я все это не преобразовал, но это было трудно отслеживать пробелы:
:%s/^ \(\S\)/ \1/gc
Я мог бы отправить его через Perl, так как кажется, что Perl может делать это с помощью своих Extended Patterns . Но я не мог заставить его работать с моей версией Perl. Это была моя попытка подсчитать «а»:
:%!perl -pe 'm<(?{ $cnt = 0 })(a(?{ local $cnt = $cnt + 1; }))*aaaa(?{ $res = $cnt })>x; print $res'
Моим последним средством будет написать сценарий Perl для преобразования, но я надеялся на более общее решение в Vim, чтобы я мог повторно использовать эту идею для решения других проблем в будущее.