2011-05-09 16 views
10

M-x replace-regexp kullanarak tüm kelimelerin tüm örneklerini emacs (foo) ile değiştirmeye çalışıyorum.Emacs regex word sınırı (özellikle alt çizgilerle ilgili)

sorun böyle word_foo_word olarak çizili ifadeyle foo tekrarlarını değiştirmek istemiyorum olmasıdır

Ben o zaman çizili dizeleri maç olacak foo maç için \ bfoo \ b kullanırsanız; çünkü anladığım kadarıyla, emacs, altçizgi, perl gibi diğer regex sistemlerinden farklı olan sözcük sınırlarının bir parçası olarak görmektedir.

Devam etmek için doğru yol ne olurdu?

Teşekkür

cevap

5

yazmıştın: Ben emacs diğer regex sistemleri

gibi alt çizgi tedavisi, farklıdır sözcük sınırları parçası olmaya çizgi gördüğü anlamak gibi

emacs içindeki her şey yapılandırılabilir. Bu soru, soranı sorar:
How to make forward-word, backward-word, treat underscore as part of a word?

... soran sorar.

Sözdizimi tablosunda alt yazıların sözdizimini değiştirerek, sözcüklerin bir parçası olmadıklarını ve sonra aramayı/değiştirmeyi yaparak sorununuzu çözebilirsiniz.

Bunu yapmak için, kullandığınız modu ve bu mod için sözdizimi tablosunun adını bilmeniz gerekir. C++, böyle olacaktır:

(modify-syntax-entry ?_ "." c++-mode-syntax-table) 

nokta bir kelime ait değil kısmını ima "noktalama", anlamına gelir. Daha fazlası için, modify-syntax-entry numaralı telefondan M-x describe-function'u deneyin.

+0

Sözdizimi tablolarına bakın. – nsimplex

9

regexp'in \<foo\> veya \bfoo\b maçlar (foo1 o foo_bar ile eşleşen böylece, genellikle alphanumerics syntax codew değil) bir kelime kurucu karakteri önce veya sonra değil sadece foo.

Emacs 22'den beri, regexp yalnızca foo_bar ile eşleşmez veya bir simge oluşturucu karakteri tarafından izlenir. Bir sembol bileşeni ya bir kelime bileşenidir ya da sözdizimi _ olan bir karakterdir. Çoğu programlama modu, bir sembol bileşeni olmak için _'u tanımlar.

+0

Teşekkürler \ _ nsimplex