C'è un modo per convertire un regex Vim letterale in diverse modalità magiche?


14

Se ho un regex Vim magico in una stringa letterale, c'è un modo per convertire l'intero regex in una rappresentazione alternativa che utilizza una diversa modalità magica, quindi potrei incollare quel regex equivalente nel codice sorgente?

Ad esempio, se voglio convertire questo modello in modalità magica:

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

in modalità molto magica per renderlo più leggibile, qualcosa del tipo:

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

Spesso commetto errori cercando di convertirli a mano.


Non ne sono consapevole. Pensi di averli sempre in stringhe tra virgolette singole?
FDinoff,

Forse questo potrebbe essere un punto di partenza. Tuttavia, ho appena provato.
Christian Brabandt,

per quanto riguarda il titolo della domanda, è difficile, pensa a convertire una regex molto magica [0-9]+in una non magica ... ;-)
Kent,

Quindi ho cercato di creare un plug-in per questo, funziona in qualche modo ma è tutt'altro che perfetto. Anche per il riferimento c'è un plugin che converte ruby ​​/ perl regex in Vim regex, il codice è ... enorme: eregex
statox

1
@MuMind Penso di non capire quale tipo di confronto stai cercando :-) E per quanto riguarda il miglioramento del plug-in, non esitare a testarlo utilizzando un github per segnalare un bug o anche suggerire una richiesta pull, Sarò lieto di vederlo!
statox

Risposte:


3

Il comando

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

dovrebbe bastare per trasformare quasi tutti i pattern in \vmodalità. \mTuttavia , non sostituirà il piccolo segno - e per quanto ne so, è impossibile in una singola sostituzione. Tuttavia, è abbastanza breve da digitare manualmente, quindi puoi fare solo :s/\\m/\\vper l'indicatore della modalità.

\Wè una scorciatoia per la [^a-zA-Z0-9_]quale è l'insieme (negato) di personaggi su cui opera la modalità molto magica. Questo elimina solo le barre rovesciate che precedono immediatamente uno di quei personaggi. Problema noto: questo sostituirà le \\stringhe interne a \. Potresti sostituirlo \Wcon \c[^a-z0-9\_]per mitigarlo, ma continuerà a rovinare letteralmente il tuo regex se lo esegui più volte e fallisci anche su stringhe di escape più lunghe (contenenti \\\\ad esempio)

Aggiornamento: la domanda originale rende poco chiaro se è necessario \vtornare a \m, ma il comando è:

:s/\v(\\)@<!(\c[^a-z0-9\-\\\[\]\'_])/\\\2/
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.