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

例如,如果我想将此魔术模式转换为:

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


转换为非常魔术模式以使其更具可读性,例如:

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


尝试手动将它们转换时,我经常犯错误。

评论

我不知道一个。您打算始终将它们用单引号引起来吗?

也许这可能是一个起点。但是,我只是勉强测试过。

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

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

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

#1 楼

命令

:s\v\(\W)//


应该足以将大多数模式转换为\v模式。但是,它不会替换掉liq'\m标记-据我所知,这是一次替换不可能实现的。它足够短,可以手动键入,然后可以对模式标记执行:s/\m/\v

\W[^a-zA-Z0-9_]的简写形式,它是运行非常魔术模式的(取反)字符集。这只会删除其中一个字符之前的任何反斜杠。
已知问题:这会将字符串内的\替换为\。您可以用\W替换\c[^a-z0-9\_]来减轻这种情况,但是如果您多次运行它并且仍然无法处理更长的转义字符串(例如包含\\),它仍然会弄乱正则表达式文字。

更新:The最初的问题使您不清楚是否需要将\v转换回\m,但是命令如下:

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