Existe-t-il un moyen de convertir un littéral d'expression régulière Vim en différents modes magiques?

14

Si j'ai une expression rationnelle magique de Vim dans un littéral de chaîne, existe-t-il un moyen de convertir l'intégralité de l'expression régulière en une représentation alternative qui utilise un mode magique différent, afin que je puisse coller cette expression régulière équivalente dans le code source?

Par exemple, si je veux convertir ce modèle en mode magique:

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

en mode très magique pour le rendre plus lisible, quelque chose comme:

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

Je fais souvent des erreurs en essayant de les convertir à la main.

Mu Mind
la source
Je n'en connais pas. Envisagez-vous de toujours les avoir en guillemets simples?
FDinoff
Peut - être que cela pourrait être un point de départ. Je l'ai cependant à peine testé.
Christian Brabandt
en ce qui concerne le titre de la question, c'est difficile, pensez à convertir une expression très magique [0-9]+en une expression non magique ... ;-)
Kent
J'ai donc essayé de faire un plugin pour ça, ça marche mais c'est loin d'être parfait. Aussi pour la référence il y a un plugin qui convertit les expressions
régulières
1
@MuMind Je pense que je ne comprends pas quel type de comparaison vous recherchez :-) Et à propos de l'amélioration du plugin, n'hésitez pas à le tester en utilisant github pour signaler un bug ou même suggérer une pull pull, Je regarderai avec plaisir!
statox

Réponses:

3

La commande

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

devrait suffire pour transformer la plupart des motifs en \vmode. \mCependant, il n'échangera pas le petit marqueur - et à ma connaissance, c'est impossible en un seul remplacement. Cependant, il est assez court pour taper manuellement, puis vous pouvez simplement le faire :s/\\m/\\vpour le marqueur de mode.

\West un raccourci pour [^a-zA-Z0-9_]lequel est l'ensemble (annulé) de caractères sur lequel le mode très magique fonctionne. Cela supprime simplement toutes les barres obliques inverses précédant immédiatement l'un de ces caractères. Problème connu: cela remplacera les \\chaînes internes de \. Vous pouvez remplacer \Wpar \c[^a-z0-9\_]pour atténuer cela, mais cela gâchera toujours votre littéral d'expression régulière si vous l'exécutez plusieurs fois et échouez également sur des chaînes d'échappement plus longues (contenant \\\\par exemple)

Mise à jour: la question d'origine ne permet pas de savoir clairement si vous devez \vrevenir à \m, mais la commande y est:

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