Есть ли способ конвертировать литерал регулярного выражения Vim в различные магические режимы?

14

Если у меня есть магическое регулярное выражение Vim в строковом литерале, есть ли способ преобразовать все регулярное выражение в альтернативное представление, использующее другой магический режим, чтобы я мог вставить это эквивалентное регулярное выражение в исходный код?

Например, если я хочу преобразовать этот шаблон магического режима:

'\m-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>'

в очень магический режим, чтобы сделать его более читабельным, что-то вроде:

'\v-=<\d+L=>|0[xX][0-9a-fA-F]+>'

Я часто делаю ошибки, пытаясь конвертировать их вручную.

Му Разум
источник
Я не знаю ни одного. Планируете ли вы всегда иметь их в одинарных кавычках?
FDinoff
Может быть, это может быть отправной точкой. Я, однако, это только еле проверено.
Кристиан Брабандт
Что касается названия вопроса, трудно подумать о преобразовании очень волшебного регулярного выражения [0-9]+в не волшебное ... ;-)
Кент,
Поэтому я пытался создать плагин для этого, это отчасти работает, но это далеко не идеально. Кроме того, для справки есть плагин , который преобразует рубин / Perl регулярное выражение в Vim регулярных выражений, код ... огромна: eregex
statox
1
@MuMind Я думаю, что я не понимаю, какой тип сравнения вы ищете :-) И по поводу улучшения плагина, не стесняйтесь проверить его использование GitHub, чтобы сообщить об ошибке или даже предложить запрос на извлечение, Я с удовольствием посмотрю это!
statox

Ответы:

3

Команда

:s\v\\(\W)/\1/

должно быть достаточно, чтобы преобразовать практически любой шаблон в \vрежим. Это не поменяет \mмаркер - хотя, насколько я знаю, это невозможно в одной замене. Это достаточно короткий, чтобы набирать вручную, хотя, и тогда вы можете просто сделать :s/\\m/\\vдля маркера режима.

\Wявляется сокращением, для [^a-zA-Z0-9_]которого (отрицательный) набор символов работает в очень магическом режиме. Это просто удаляет любые обратные слэши, непосредственно предшествующие одному из этих символов. Известная проблема: это заменит \\внутренние строки на \. Вы можете заменить \Wна, \c[^a-z0-9\_]чтобы смягчить это, но он все равно испортит ваш литерал регулярного выражения, если вы запустите его несколько раз, а также потерпите неудачу на более длинных escape-строках (содержащих, \\\\например)

Обновление: оригинальный вопрос неясно, если вам нужно преобразовать \vобратно \m, но команда есть:

:s/\v(\\)@<!(\c[^a-z0-9\-\\\[\]\'_])/\\\2/
Wolfie
источник