在 Emacs 中定义多字符括号



在Verilog中,您将代码块括在单词"begin"和"end"之间,如下所示:

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

谢谢。

遗憾的是,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在意外时刻撞到缓冲区的末尾,它是否会给你适当的警告/错误。

最新更新