Czy istnieje sposób na konwersję literału regularnego Vima na różne tryby magiczne?

14

Jeśli mam magiczne wyrażenie regularne Vim w literałach łańcuchowych, czy istnieje sposób na przekonwertowanie całego wyrażenia regularnego na alternatywną reprezentację, która używa innego trybu magicznego, więc mógłbym wkleić ten równoważnik regularny do kodu źródłowego?

Na przykład, jeśli chcę przekonwertować ten wzorzec trybu magicznego:

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

do trybu bardzo magicznego, aby był bardziej czytelny, coś w stylu:

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

Często popełniam błędy, próbując przekonwertować je ręcznie.

Mu Mind
źródło
Nie jestem tego świadomy. Czy planujesz zawsze mieć je w ciągach pojedynczych?
FDinoff,
Może to może być punkt wyjścia. Mam jednak tylko ledwo przetestowane.
Christian Brabandt,
jeśli chodzi o tytuł pytania, ciężko jest pomyśleć o przekształceniu bardzo magicznego wyrażenia regularnego [0-9]+w niemagiczny ... ;-)
Kent
Więc próbowałem stworzyć wtyczkę , to trochę praca, ale daleko jej do ideału. Dla odniesienia jest też wtyczka, która konwertuje wyrażenie regularne Ruby / Perl na wyrażenie regularne Vim, kod jest ... ogromny: eregex
statox
1
@MuMind Myślę, że nie rozumiem, jakiego rodzaju porównania szukasz :-) A jeśli chodzi o ulepszenie wtyczki, nie wahaj się przetestować jej, użyj github do zasygnalizowania błędu lub nawet zasugeruj żądanie ściągnięcia, Z przyjemnością na to spojrzę!
statox

Odpowiedzi:

3

Komenda

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

powinno wystarczyć, aby przekształcić dowolny wzór w \vtryb. Nie zamieni jednak \mznacznika lil ' - i o ile mi wiadomo, nie jest to możliwe w przypadku pojedynczego zastąpienia. Jest jednak wystarczająco krótki, aby pisać ręcznie, a następnie możesz po prostu zrobić :s/\\m/\\vdla znacznika trybu.

\Wjest skrótem, dla [^a-zA-Z0-9_]którego (negowany) zestaw znaków, na którym działa tryb bardzo magiczny. To po prostu usuwa wszelkie ukośniki odwrotne bezpośrednio poprzedzające jeden z tych znaków. Znany problem: zastąpi to \\wewnętrzne ciągi do \. Można wymienić \Wz \c[^a-z0-9\_]złagodzić, ale to będzie nadal bałagan regex dosłowny, gdy uruchomisz go kilka razy i również nie dłuższych ciągów ewakuacyjnych (zawierających \\\\na przykład)

Aktualizacja: Oryginalne pytanie sprawia, że ​​nie jest jasne, czy musisz się z \vpowrotem przekształcić \m, ale dostępne polecenie:

:s/\v(\\)@<!(\c[^a-z0-9\-\\\[\]\'_])/\\\2/
Wolfie
źródło