Vim正規表現リテラルを異なるマジックモードに変換する方法はありますか?


14

文字列リテラルに魔法のVim正規表現がある場合、正規表現全体を別の魔法モードを使用する代替表現に変換する方法はありますか?そのため、同等の正規表現をソースコードに貼り付けることができますか?

たとえば、このマジックモードパターンを変換する場合:

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

非常に魔法のモードにすると、読みやすくなります:

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

私はしばしば手で変換しようとしてミスを犯します。


私はそれを知りません。常に単一引用符で囲まれた文字列でそれらを保持する予定ですか?
FDinoff

たぶんこれが出発点かもしれません。ただし、ほとんどテストしていません。
クリスチャンブラバンド16年

質問のタイトルに関しては、難しいです。非常に魔法の正規表現[0-9]+を魔法のない正規表現に変換することを考えてください; ;
ケント

だから私はそのためのプラグインを作ろうとしてきた、それは一種の仕事ですが、完璧とはほど遠いです。また、参照用にruby / perl正規表現をVim正規表現に変換するプラグインがあります。コードは... huge:eregex
statox

1
@MuMind私はあなたが探している比較のタイプを理解していないと思います:-)そしてプラグインの改善については、バグを知らせるためにgithubを使用するか、プルリクエストを提案することをheしないでください、喜んで見ます!
statox

回答:


3

コマンド

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

ほとんどのパターンを\vモードに変換するのに十分です。\mしかし、lil ' マーカーは交換されません-私の知る限り、1回の交換では不可能です。ただし、手動で入力するのに十分な短いので:s/\\m/\\v、モードマーカーに対して行うことができます。

\W省略形です[^a-zA-Z0-9_]これは非常に魔法のモードがオン動作し、文字の(否定)のセットです。これは、それらの文字の1つ直前のバックスラッシュを削除するだけです。 既知の問題:これは\\内部文字列をに置き換えます\。あなたは置き換えることができます\W\c[^a-z0-9\_]、あなたがそれを複数回実行しても、長いエスケープ文字列(含むに失敗した場合、これを軽減するために、それはあなたの正規表現リテラルアップ混乱まだよ\\\\たとえば)

更新:あなたが変換する必要がある場合は、元の質問は、それが不明確になり\vに戻り\mますが、コマンドがあります:

:s/\v(\\)@<!(\c[^a-z0-9\-\\\[\]\'_])/\\\2/
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.