Заменить слово на количество найденных слов - PullRequest
2 голосов
/ 26 марта 2012

Я хотел бы использовать вкладки в коде, который их не использует. То, что я делал до сих пор для реализации вкладок, было довольно ручным:

%s/^  /\t/g
%s/^\t  /\t\t/g
..

Вопрос: Есть ли способ заменить два пробела () на табуляцию (\t), сколько раз он был найден в начале строки?

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Существуют (как минимум) три метода замещения, относящиеся к этому делу.

Первый использует синтаксис сопоставления предыдущего атома для естественно определить шаг отступа. Согласно постановке вопроса, шаг отступа - пара соседних пробелов, перед которыми ничего не стоит но пробелы с начала строки. Следуя этому определению, можно построить фактический шаблон замещения справа налево.

:%s/\%(^ *\)\@<=  /\t/g

Действительно, шаблон обозначает вхождение двух буквенных пробелов после совпадения нулевой ширины \@<= предыдущего атома, который является шаблон ^ *, заключенный в круглые скобки \%( / \). Эти не захватывая вместо обычных фиксирующих скобок используются \( / \), так как нет необходимости далее ссылаться на совпадающие начальные пробелы Из-за g флаг, указанная выше команда :substitute проходит через пару начальных пробелов пара, и заменяет каждый из них одним символом табуляции.

Вторая техника использует другой подход. Вместо сопоставления отдельных уровни отступа, можно разбить каждую строку, начиная с пробелов вниз на две части: одна содержит отступы исходной строки, другой держит остальное. После этого его легко заменить все пары пробелов в первой строке и конкатенировать строки обратно вместе.

:g/^ /s/^ \+/&\r/|-s/  /\t/g|j!

Третья идея - обрабатывать начальные пробелы с помощью сценариев Vim. язык. Удобный способ сделать это - использовать замену с особенность выражения команды :substitute (см. :help sub-replace-\=). Помещение в строку замены команды \=, позволяет подставить совпадения шаблона с результатами оценки выражения указывается после \=.

:%s#^ \+#\=repeat("\t",len(submatch(0))/2)
3 голосов
/ 26 марта 2012

Если вы специально хотите преобразовать пробелы в табуляции (или наоборот) в начале строки , есть полезная команда :retab, которая позаботится об этом.Например:

  • :retab! 2 преобразует пробелы в группах по две во вкладки
  • :set expandtab, а затем :retab! 2 преобразует табуляции (шириной 2) обратно в пробелы

Подробнее см. :h :retab:h 'ts').

Это не общее решение исходной проблемы, но я думаю, что оно охватывает наиболее распространенный вариант использования.

0 голосов
/ 26 марта 2012

Нет общего способа сделать это с помощью: s regex's.Вы не можете заставить модификатор /g смотреть назад, иначе он был бы бесполезен, и вы не можете надежно проверить, что находитесь в начале строки, не оглядываясь назад.

Единственный способделать это, как правило, циклично, вот так:

:for i in range(100)
:   %s/^\t*\zs  /\t/e
:endfor

Что некрасиво, медленно и крайне не рекомендуется.Используйте :retab

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...