Как переформатировать исходный файл, чтобы перейти с 2 отступы пробела до 3?

Этот вопрос почти идентичен этому вопросу , за исключением того, что я должен перейти к трем пробелам (руководство по кодированию компании), а не к четырем, и принятое решение только удвоит совпадающий шаблон. Это была моя первая попытка:

:%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, чтобы я мог повторно использовать эту идею для решения других проблем в будущее.

8
задан Community 23 May 2017 в 12:06
поделиться