Замените все символы в регулярном выражении тем же символом в Vim

У меня есть регулярное выражение для замены определенного шаблона определенной строкой, где строка строится динамически, повторяя определенный символ столько раз, сколько есть символов в совпадении.

Например, скажем, у меня есть следующая команда замены:

%s/hello/-----/g

Однако вместо этого я хотел бы сделать что-то вроде этого:

%s/hello/-{5}/g

где несуществующее обозначение -{5} будет обозначать символ тире, повторяющийся пять раз.

Есть ли способ сделать это?

В конечном итоге я хотел бы добиться чего-то вроде этого:

%s/(hello)*/-{\=strlen(\0)}/g

который заменит любой экземпляр строки только hellos строкой, состоящей из символа тире, повторенного количество раз, равное длине совпадающей строки.


person beatgammit    schedule 07.09.2011    source источник


Ответы (2)


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

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

  1. Поиск начала следующего вхождения.

    /\(hello\)\+
    
  2. Выберите соответствующий текст до конца.

    v//e
    
  3. Заменить выделенный текст.

    r-
    
  4. Повторите с шага 1.

Таким образом, для автоматизации этой процедуры можно запустить команду

:let[@/,@s]=['\(hello\)\+',"//\rv//e\rr-@s"]

и выполнить содержимое этого регистра s, начиная с начала буфера (или другого подходящего места) с помощью

gg@s
person ib.    schedule 08.09.2011

person    schedule
comment
Работает! Спасибо. Вы знаете, где я могу найти все доступные функции (такие как strlen и repeat)? - person beatgammit; 07.09.2011
comment
Или function-list. Иногда это удобнее. - person sidyll; 07.09.2011