在Emacs中定义多字符括号

时间:2012-05-17 09:47:12

标签: emacs verilog parentheses

在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" )

感谢。

1 个答案:

答案 0 :(得分: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在意外时刻碰到缓冲区末尾,是否会给你适当的警告/错误。