2012-05-17 72 views
7

多字的括號內的Verilog您附上的話「開始」和「結束」這樣的之間的代碼塊:定義在Emacs

if(foo) begin 
    x <= 1'b0; 
    y <= 1'b0; 
end else begin 
    x <= x_d; 
    y <= y_d; 
end 

有什麼辦法來設置開始和結束在Emacs的括號,所以你可以使用支票或類似的東西來找到任何不匹配的東西?

我試着添加此(和變化)了我的〜/ .emacs文件,但它不喜歡它... ...

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

感謝。

+0

這樣的事情通常由縮進引擎處理。您可以使用它來檢查語法,例如通過標記整個緩衝區並運行'indent-region'。如果文件末尾的縮進不正確,則會出現開始/結束不匹配。 – Lindydancer

+0

@Lindydancer謝謝,但我正在編寫由多人同時編輯的代碼,所有代碼都使用不同的編輯器,因此代碼的不同部分通常以不同的方式縮進。還有一些文件往往很長,選擇所有'indent-region'可能需要很長時間... – kiteflyingmonkey

+0

在這種情況下,我會簡單地編寫一個自定義包,找到匹配的開始/結束對。這不是微不足道的,但我認爲如果你是新手的話,這對elisp來說是一個很好的練習。 – Lindydancer

回答

2

不幸的是,Emacs的括號匹配基礎結構並不能理解多字符標記。 Emacs-23.4中添加的新庫SMIE部分旨在解決此問題。它允許主要模式描述語言的語法(在非常有限的一種語法中),之後像C-M-f和C-M-b這樣的東西將知道如何跳過邏輯元素,例如,從begin跳至匹配的end。正如LindyDancer所指出的那樣,這種事通常是縮進所需要的,實際上SMIE背後的主要動機是提供一個通用的縮進引擎。

現在Verilog不使用SMIE,但它實現了類似的導航命令。所以,你也許可以嘗試像

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

芹苴我不知道,如果它撞到緩衝區在意想不到的時刻結束verilog-forward-sexp會給你相應的警告/錯誤。