regex için destek arkaya ve ileriye bakmak?


12

Ben regex sorgusu yerine gerçekleştirmek gerekir, öyle ki

fooiçinde foo bareşleşti, ancak fooiçinde foo bazdeğildir. Normalde, regex ileriye bakmak, örneğin kullanabilirsiniz foo(?=bar).

Ancak, Emacs bunu yapamıyor gibi görünüyor? Vim yetenekli görünüyor , ancak uzay haritalarındaki kötü mod yapamıyor.


Şunlar da var: github.com/gamesun/emacs-regex-lookaround , ama bu yama ile inşa etmeyi denemedim ve bir süredir görünüyor.
wvxvw

Yanıtlar:


10

Hayır, Emacs düzenli ifadeleri rastgele sıfır genişliğinde ileriye dönük / ileriye dönük iddiaları desteklemez.

nb Evil ve Spacemacs (tüm elisp kütüphaneleri gibi), Emacs Lisp dil ​​uygulamasıyla ilgili sorular söz konusu olduğunda ilgisizdir.


Yani yerine koymak imkansız mı foo, foobardeğil foobazmi? Bu, bir çözüm olması gerektiğini düşündüğüm yeterince yaygın bir işlem. Belki ileri ve geri bakmak yanlış yaklaşımdır?
Heisenberg

Bu kesinlikle eşdeğer değildir, ancak başka eşleşme içermeyen tüm durumlarda bunun yerine foo\(bar\)geçmek baz\1yeterli olacaktır bar.
phils

Elisp yazıyorsanız, çok fazla esnekliğe sahipsiniz ve etkileşimli olarak değiştiriyorsanız, değiştirme sırasında keyfi bir elisp çağırabilirsiniz, bu nedenle sonuçta bunları yapmanın yolları vardır. Bu iddialarla yapabileceğiniz kadar rahat değil.
phils

örneğin: değiştirirken fooile \,(if (looking-at "bar") "baz" \&)yerini alacak fooolan bazaşağıdaki metin ise bar(ve değiştirme fooile fooaksi). Hangi hala sadece aynı şey değildir eşleşen foo o izledi ne zaman bar, ancak başka bir seçenek.
phils

Sanırım bu yukarıda söylediğin gibi, ama sen-ebilmek yazmak gibi görünüyor: CSM-% foo \ (bar \) RET FOO \ 1 RET tüm foo bar FOO bar ile değiştirmek, ama tüm foo baz yalnız bırakın. Bu istediğin bir şey mi eksik?
John Kitchin
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.