¿Hay alguna manera de convertir un Vim regex literal a diferentes modos mágicos?


14

Si tengo una expresión regular Vim mágica en un literal de cadena, ¿hay alguna forma de convertir la expresión regular completa en una representación alternativa que use un modo mágico diferente, para poder pegar esa expresión regular equivalente en el código fuente?

Por ejemplo, si quiero convertir este patrón en modo mágico:

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

al modo muy mágico para hacerlo más legible, algo como:

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

A menudo cometo errores al tratar de convertirlos a mano.


No estoy al tanto de uno. ¿Planea tenerlos siempre en cadenas de comillas simples?
FDinoff

Tal vez esto podría ser un punto de partida. Sin embargo, apenas lo he probado.
Christian Brabandt

con respecto al título de la pregunta, es difícil, piensa en convertir una expresión regular muy mágica [0-9]+en una no mágica ... ;-)
Kent

Así que he estado tratando de hacer un complemento para eso, funciona un poco, pero está lejos de ser perfecto. También para la referencia hay un complemento que convierte ruby ​​/ perl regex a Vim regex, el código es ... enorme: eregex
statox

1
@MuMind Creo que no entiendo qué tipo de comparación estás buscando :-) Y sobre la mejora del complemento, no dudes en probarlo y usar github para señalar un error o incluso sugerir una solicitud de extracción, ¡Con gusto lo miraré!
statox

Respuestas:


3

El comando

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

debería ser suficiente para transformar casi cualquier patrón en \vmodo. Sin \membargo , no cambiará el marcador lil ' , y que yo sepa, eso es imposible en un solo reemplazo. Sin embargo, es lo suficientemente corto como para escribir manualmente, y luego puede hacerlo :s/\\m/\\vpara el marcador de modo.

\Wes una abreviatura para la [^a-zA-Z0-9_]cual es el conjunto (negado) de caracteres en el que opera el modo muy mágico. Esto simplemente elimina cualquier barra diagonal inversa que precede inmediatamente a uno de esos caracteres. Problema conocido: esto reemplazará las \\cadenas internas de \. Puede reemplazar \Wcon \c[^a-z0-9\_]para mitigar esto, pero aún arruinará su literal regex si lo ejecuta varias veces y también falla en cadenas de escape más largas (que contienen, \\\\por ejemplo)

Actualización: la pregunta original deja en claro si necesita \vvolver a transformarse \m, pero el comando allí es:

:s/\v(\\)@<!(\c[^a-z0-9\-\\\[\]\'_])/\\\2/
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.