Vim normal ifade değişmezini farklı sihirli modlara dönüştürmenin bir yolu var mı?


14

Bir dizgi değişmezinde sihirli bir Vim regex varsa, tüm regex'i farklı bir sihirli mod kullanan alternatif bir gösterime dönüştürmenin bir yolu var, bu yüzden bu eşdeğer regex'i kaynak koduna yapıştırabilir miyim?

Örneğin, bu sihirli mod kalıbını dönüştürmek istiyorsam:

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

daha okunabilir hale getirmek için çok sihirli moda

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

Sık sık onları elle dönüştürmeye çalışırken hatalar yaparım.


Birinin farkında değilim. Bunları her zaman tek tırnaklı dizelerde tutmayı planlıyor musunuz?
FDinoff

Belki de bu bir başlangıç ​​noktası olabilir. Ben ancak zorlukla test var.
Christian Brabandt

soru başlığı ile ilgili olarak, zor, çok sihirli bir regex sihirli olmayan bir regex dönüştürme düşünün [0-9]+... ;-)
Kent

Bunun için bir eklenti yapmaya çalışıyorum , bu biraz iş ama mükemmel olmaktan çok uzak. Ayrıca referans için yakut / perl regex'i
statox

1
@MuMind Sanırım hangi tür karşılaştırmayı aradığınızı anlamıyorum :-) Ve eklentinin iyileştirilmesi hakkında, bir hata bildirmek veya hatta bir çekme isteği önermek için bir kullanım github'u test etmekten çekinmeyin, Memnuniyetle bakacağım!
statox

Yanıtlar:


3

Komuta

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

herhangi bir desenin çoğunu \vmoda dönüştürmek için yeterli olmalıdır . Yine de lil ' \mmarkörünü değiştirmeyecek - ve bildiklerime göre tek bir yedekte imkansız. Manuel olarak yazmak için yeterince kısa ve daha sonra sadece :s/\\m/\\vmod işaretçisi için yapabilirsiniz .

\Wkısayol [^a-zA-Z0-9_], çok sihirli modun çalıştığı (reddedilen) karakter kümesidir. Bu, bu karakterlerden hemen önceki ters eğik çizgileri siler. Bilinen sorun:\\ İçindeki dizelerin yerini alacak \. Bunu hafifletmek için \Wile değiştirebilirsiniz \c[^a-z0-9\_], ancak birden fazla kez çalıştırırsanız ve daha uzun kaçış dizelerinde ( \\\\örneğin içeren ) başarısız olursanız, normal ifade değişmezinizi bozar.

Güncelleme: Orijinal soru, dönüşüme \vdönmeniz gerekip gerekmediğini netleştiriyor \m, ancak buradaki komut:

:s/\v(\\)@<!(\c[^a-z0-9\-\\\[\]\'_])/\\\2/
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.