Gibt es eine Möglichkeit, ein Vim-Regex-Literal in verschiedene magische Modi zu konvertieren?

14

Wenn ich einen magischen Vim-Regex in einem String-Literal habe, gibt es eine Möglichkeit, den gesamten Regex in eine alternative Darstellung zu konvertieren, die einen anderen magischen Modus verwendet, sodass ich diesen entsprechenden Regex in den Quellcode einfügen kann?

Wenn ich zum Beispiel dieses Magic-Mode-Muster konvertieren möchte:

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

in den sehr magischen Modus, um es lesbarer zu machen, so etwas wie:

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

Ich mache oft Fehler, wenn ich versuche, sie von Hand umzuwandeln.

Mu Mind
quelle
Mir ist keiner bekannt. Planen Sie, sie immer in einfachen Anführungszeichen zu haben?
FDinoff
Vielleicht dies könnte ein Ausgangspunkt sein. Ich habe es aber nur knapp getestet.
Christian Brabandt
in Bezug auf den Fragentitel ist es schwierig, darüber nachzudenken, einen sehr magischen Regex [0-9]+in einen nicht magischen zu verwandeln ... ;-)
Kent
Also habe ich versucht, ein Plugin dafür zu erstellen , das funktioniert, aber es ist alles andere als perfekt. Als Referenz gibt es auch ein Plugin, das Ruby / Perl-Regex in Vim-Regex konvertiert. Der Code ist ... riesig: eregex
statox
1
@MuMind Ich glaube, ich verstehe nicht, welche Art von Vergleich Sie suchen :-) Und über die Verbesserung des Plugins, zögern Sie nicht, es zu testen und einen Github zu verwenden, um einen Fehler zu signalisieren oder sogar eine Pull-Anfrage vorzuschlagen. Ich schau es mir gerne an!
statox

Antworten:

3

Der Befehl

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

sollte ausreichen, um fast jedes Muster in einen \vModus umzuwandeln . Es wird den kleinen \mMarker jedoch nicht austauschen - und meines Wissens ist dies mit einem einzigen Ersatz unmöglich. Es ist jedoch kurz genug, um manuell zu tippen, und dann können Sie es nur :s/\\m/\\vfür den Modus-Marker tun .

\Wist eine Abkürzung für [^a-zA-Z0-9_]die (negierte) Menge von Zeichen, mit denen der sehr magische Modus arbeitet. Dadurch werden nur alle umgekehrten Schrägstriche unmittelbar vor einem dieser Zeichen gelöscht. Bekanntes Problem: Dies ersetzt \\innere Zeichenketten bis \. Sie könnten ersetzen \Wmit \c[^a-z0-9\_]dieser zu mildern, aber es wird immer noch vermasselt Ihre regex wörtliche , wenn Sie es mehrmals ausgeführt und auch auf längere Flucht Saiten versagen (mit \\\\zum Beispiel)

Update: Die ursprüngliche Frage ist es nicht klar , ob Sie transformieren müssen , \vum wieder \m, aber der Befehl ist:

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