有没有办法将Vim regex文字转换为不同的魔术模式?


14

如果我在字符串文字中有一个神奇的Vim正则表达式,是否可以将整个正则表达式转换为使用不同魔术模式的替代表示形式,因此可以将该等效正则表达式粘贴到源代码中?

例如,如果我要转换此魔术模式,请执行以下操作:

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

变成非常魔幻的模式,使其更具可读性,例如:

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

我经常犯错误,尝试手动将其转换。


我不知道一个。您是否打算始终将它们用单引号引起来?
FDinoff '16

也许可能是一个起点。但是,我只是勉强测试过。
Christian Brabandt '16

关于题名,很难,请考虑将一种非常魔术的正则表达式[0-9]+转换为没有魔术的正则表达式... ;-)
肯特

因此,我一直在尝试为此制作一个插件,虽然可以工作,但还远远不够完美。同样作为参考,有一个将ruby / perl regex转换为Vim regex的插件,代码是...巨大的:eregex
statox

1
@MuMind我想我不明白您要寻找的比较类型:-)关于插件的改进,请毫不犹豫地使用github对其进行测试,以表示错误或什至提出请求,我很乐意看看!
statox

Answers:


3

命令

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

应该足以将大多数模式转换为\v模式。不过,它不会替换掉lil' \m标记-据我所知,单次替换是不可能的。它足够短,可以手动键入,然后可以:s/\\m/\\v对模式标记进行操作。

\W是简写形式[^a-zA-Z0-9_],是非常魔术模式操作的(否定)字符集。这只是删除那些字符之一之前的任何反斜杠。 已知问题:这会将\\内部字符串替换为\。您可以替换\W\c[^a-z0-9\_]以减轻这种情况,但是如果您多次运行它,并且仍然无法对更长的转义字符串(\\\\例如包含)进行失败,它仍然会弄乱您的regex文字。

更新:最初的问题使您不清楚是否需要转换\v\m,但是其中的命令是:

:s/\v(\\)@<!(\c[^a-z0-9\-\\\[\]\'_])/\\\2/
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.