2012-05-17 15 views
7

çoklu karakter parantez tanımlayın kod böyle bir deyişle 'başlar' ve 'end' arasındaki blokları içine uyumsuz olanları bulmak için check-parens veya benzerlerini kullanabilmeniz için mi?Verilog olarak Emacs

ben ...

(modify-syntax-entry ?begin "(end") 
(modify-syntax-entry ?end ")begin") 

Teşekkür Bu ekleyerek (ve varyasyonlar arasında) benim ~/.emacs dosyaya, ama bunu sevmez denedim.

+0

Bunun gibi şeyler genellikle girinti motoru tarafından ele alınır. Sözdizimini kontrol etmek için, örneğin tüm arabelleği işaretleyerek ve "indent-region" işlevini çalıştırarak kullanabilirsiniz. Dosyanın sonu yanlış girilirse, bir başlangıç ​​/ bitiş uyuşmazlığınız olur. – Lindydancer

+0

@Lindydancer teşekkürler, ama hepsi farklı editörler kullanarak, aynı anda birkaç kişinin düzenlediği kod üzerinde çalışıyorum ve çoğu zaman kodun farklı bölümleri farklı şekillerde girintilidir. Ayrıca bazı dosyalar çok uzun olma eğilimindedir ve tüm "indent-bölge" yi seçmek uzun sürebilir ... – kiteflyingmonkey

+0

Bu durumda, basit/başlangıç ​​çiftleri eşleştiren bir özel paket yazabilirim. Bu önemsiz değil, ama eğer yeni iseniz, elisp'te iyi bir egzersiz olacağını düşünüyorum. – Lindydancer

cevap

2

Maalesef, Emac'ın parantez uyumlu altyapısı çok karakterli jetonların çoğunu anlamıyor. Emacs-23.4'te eklenen yeni SMIE kütüphanesinin kısmen bu sorunu ele alması amaçlanmıştır. Ana modların, dilin sözdizimini (çok sınırlı bir dilbilgisi türünde) tanımlamasına izin verir; bundan sonra C-M-f ve C-M-b gibi şeyler mantıksal elemanların üzerinden nasıl atlanacağını bilir; begin'dan eşleşen end'a atlayın. LindyDancer'ın belirttiği gibi, bu tür şeyler genellikle girinti için gereklidir ve aslında SMIE'nin arkasındaki temel motivasyon, jenerik bir girinti motoru sağlamaktı.

Artık Verilog SMIE kullanmıyor ancak benzer gezinme komutlarını uygular. beklenmeyen bir anda tampon sonuna çarparsa verilog-forward-sexp size uygun uyarı/hata verecektir Yani muhtemelen bilmiyorum

(defun sm-verilog-check-parens() 
    (save-excursion 
    (goto-char (point-min)) 
    (while (not (eobp)) 
     (verilog-forward-sexp)))) 

Tho gibi bir şey deneyebilirsiniz.