Apakah ada cara untuk mengubah Vim regex literal ke mode sihir yang berbeda?

14

Jika saya memiliki regex Vim ajaib dalam string literal, apakah ada cara untuk mengubah regex keseluruhan menjadi representasi alternatif yang menggunakan mode sulap yang berbeda, jadi saya bisa menempelkan regex yang setara ke dalam kode sumber?

Misalnya, jika saya ingin mengubah pola mode-ajaib ini:

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

ke mode yang sangat ajaib untuk membuatnya lebih mudah dibaca, seperti:

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

Saya sering membuat kesalahan dengan mencoba mengubahnya dengan tangan.

Mu Mind
sumber
Saya tidak menyadarinya. Apakah Anda berencana untuk selalu memilikinya dalam string yang dikutip tunggal?
FDinoff
Mungkin ini bisa menjadi titik awal. Namun saya baru saja diuji.
Christian Brabandt
mengenai judul pertanyaan, sulit, pikirkan untuk mengubah regex yang sangat ajaib [0-9]+menjadi yang tidak ajaib ... ;-)
Kent
Jadi saya sudah mencoba membuat plugin untuk itu, itu berfungsi tetapi itu jauh dari sempurna. Juga untuk referensi ada plugin yang mengubah regex ruby ​​/ perl ke Vim regex, kodenya ... besar: eregex
statox
1
@MuMind Saya pikir saya tidak mengerti jenis perbandingan yang Anda cari :-) Dan tentang peningkatan plugin, jangan ragu untuk mengujinya menggunakan github untuk memberi sinyal bug atau bahkan menyarankan permintaan tarik, Saya dengan senang hati akan melihatnya!
statox

Jawaban:

3

Perintah

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

harus cukup untuk mengubah sebagian besar pola menjadi \vmode. Itu tidak akan menukar \mpenanda lil ' - dan setahu saya itu tidak mungkin dalam satu penggantian. Cukup pendek untuk mengetik secara manual, dan kemudian Anda bisa melakukannya :s/\\m/\\vuntuk penanda mode.

\Wadalah singkatan [^a-zA-Z0-9_]yang merupakan set (dinegasikan) karakter yang beroperasi dengan mode sangat ajaib. Ini hanya menghapus garis miring terbalik segera sebelum salah satu karakter tersebut. Masalah yang diketahui: Ini akan menggantikan \\string di dalam menjadi \. Anda bisa mengganti \Wdengan \c[^a-z0-9\_]untuk mengurangi ini, tetapi masih akan mengacaukan regex literal Anda jika Anda menjalankannya berkali-kali dan juga gagal pada string escape yang lebih lama (mengandung \\\\misalnya)

Pembaruan: Pertanyaan awal membuatnya tidak jelas apakah Anda perlu mengubahnya \vkembali \m, tetapi perintahnya ada:

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