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