在Emacs中定义多字符括号

8
在Verilog中,您需要用'begin'和'end'这两个单词将代码块括起来,如下所示:
if(foo) begin
   x <= 1'b0;
   y <= 1'b0;
end else begin
   x <= x_d;
   y <= y_d;
end

有没有办法在Emacs中设置开始和结束为括号,以便您可以使用check-parens或类似工具查找任何不匹配的内容?

我尝试将以下内容(及其变体)添加到我的~/.emacs文件中,但它不起作用...

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

感谢您的选择。

类似这样的事情通常由缩进引擎处理。您可以使用它来检查语法,例如标记整个缓冲区并运行“indent-region”。如果文件末尾的缩进不正确,则存在开始/结束不匹配的问题。 - Lindydancer
@Lindydancer 谢谢,但我正在处理由多人同时编辑的代码,他们都使用不同的编辑器,因此代码的不同部分经常以不同的方式缩进。此外,一些文件往往非常长,选择所有“indent-region”可能需要很长时间... - Katy Montgomerie
在这种情况下,我会简单地编写一个自定义包来查找匹配的开始/结束对。这并不是微不足道的,但如果您是新手,我认为这将是一个很好的elisp练习。 - Lindydancer
1个回答

3
很遗憾,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是否会在意外情况下遇到缓冲区结尾时给出适当的警告/错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接