Existe uma maneira de converter um literal de regex do Vim para diferentes modos mágicos?

14

Se eu tiver um regex mágico do Vim em uma string literal, existe uma maneira de converter todo o regex em uma representação alternativa que use um modo mágico diferente, para que eu possa colar esse regex equivalente no código-fonte?

Por exemplo, se eu quiser converter esse padrão de modo mágico:

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

para o modo muito mágico para torná-lo mais legível, algo como:

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

Costumo cometer erros ao tentar convertê-los manualmente.

Mu Mind
fonte
Eu não estou ciente de um. Você planeja sempre tê-los em cadeias de caracteres entre aspas simples?
FDinoff 02/10/19
Talvez isso possa ser um ponto de partida. No entanto, eu apenas mal testei.
Christian Brabandt
sobre o título da pergunta, é difícil, pense sobre como converter um regex muito mágica [0-9]+em um nenhuma mágica ... ;-)
Kent
Então, eu tenho tentado fazer um plugin para isso, funciona, mas está longe de ser perfeito. Também para referência, existe um plug-in que converte ruby ​​/ perl regex em Vim regex, o código é ... enorme: eregex
statox
1
@MuMind Acho que não entendo o tipo de comparação que você está procurando :-) E sobre a melhoria do plug-in, não hesite em testá-lo e usar o github para sinalizar um bug ou até sugerir uma solicitação de recebimento, Terei prazer em procurar!
statox

Respostas:

3

O comando

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

deve ser suficiente para transformar quase qualquer padrão em \vmodo. \mPorém, ele não trocará o marcador de lil - e que eu saiba, é impossível em uma única substituição. É curto o suficiente para digitar manualmente, e você pode fazer apenas :s/\\m/\\vpelo marcador de modo.

\Wé uma abreviação para o [^a-zA-Z0-9_]qual é o conjunto (negado) de caracteres em que o modo muito mágico opera. Isso exclui as barras invertidas imediatamente anteriores a um desses caracteres. Problema conhecido: isso substituirá as \\cadeias internas para \. Você pode substituir \Wpor \c[^a-z0-9\_]para mitigar isso, mas ele ainda estragará o seu regex literal se você executá-lo várias vezes e também falhar em seqüências de escape mais longas (contendo, \\\\por exemplo)

Atualização: a pergunta original deixa claro se você precisa \vvoltar \m, mas o comando existe:

:s/\v(\\)@<!(\c[^a-z0-9\-\\\[\]\'_])/\\\2/
Wolfie
fonte