Чи є спосіб перетворити виразний вираз Vim в буквальний режим в різні магічні режими?


14

Якщо у мене є магічний регекс Vim у рядковому літералі, чи є спосіб перетворити цілий регекс в альтернативне представлення, яке використовує інший магічний режим, щоб я міг вставити цей еквівалентний регулярний вираз у вихідний код?

Наприклад, якщо я хочу перетворити цей шаблон магічного режиму:

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

в дуже магічний режим, щоб зробити його більш читабельним, щось на зразок:

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

Я часто помиляюся, намагаючись перетворити їх вручну.


Я не знаю жодного. Чи плануєте ви завжди мати їх в одних цитованих рядках?
FDinoff

Можливо, це може стати відправною точкою. Однак у мене це лише ледь перевірено.
Крістіан Брабандт

що стосується назви питання, важко, подумайте про перетворення дуже магічного виразка [0-9]+в не магічне ... ;-)
Кент,

Тож я намагався зробити плагін для цього, це робота, але це далеко не ідеально. Також для довідки є плагін, який перетворює ruge / perl regex у Vim regex, код ... величезний: eregex
statox

1
@MuMind Я думаю, що я не розумію, який тип порівняння ви шукаєте :-) А щодо вдосконалення плагіна, не соромтеся перевірити його, використовуючи github для сигналізації про помилку або навіть запропонуйте запит на потяг, Я з радістю дивлюсь на це!
statox

Відповіді:


3

Команда

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

повинно вистачити для перетворення більшості будь-якого шаблону в \vрежим. Він не поміняє \mмаркер lil ', але, наскільки мені відомо, це неможливо в одній заміні. Це досить коротко, якщо ввести вручну, і тоді ви можете просто зробити :s/\\m/\\vмаркер режиму.

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

Оновлення: в оригінальному запитанні стає незрозумілим, чи потрібно вам перетворюватися \vназад \m, але команда є:

:s/\v(\\)@<!(\c[^a-z0-9\-\\\[\]\'_])/\\\2/
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.