7

Verilog では、次のように「begin」と「end」の間にコード ブロックを囲みます。

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

Emacs で begin と end を括弧として設定して、check-parens などを使用して不一致のものを見つける方法はありますか?

これ (およびそのバリエーション) を ~/.emacs ファイルに追加しようとしましたが、気に入りません...

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

ありがとう。

4

1 に答える 1

2

悲しいことに、Emacs の括弧マッチング インフラストラクチャは、複数文字トークンの多くを理解していません。Emacs-23.4 で追加された新しいライブラリ SMIE は、部分的にこの問題に対処することを意図しています。これにより、メジャー モードが (非常に限られた種類の文法で) 言語の構文を記述できるようになります。その後、CMf や CMb などは論理要素を飛び越える方法を認識します。たとえば、 abeginからそれに一致する にスキップし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予期しない瞬間にバッファの最後にぶつかった場合、適切な警告/エラーが表示されるかどうかはわかりません。

于 2012-05-18T19:22:51.190 に答える