在Emacs Verilog模式下如何对齐代码?

3

我习惯于在emacs中使用VHDL编写代码,它具有美化功能,可以对齐信号赋值。那么,在Verilog Mode中有类似的功能吗?

将此内容转换为:

r_Tx_Done <= 1'b1;
r_Clock_Count <= 0;
if (r_Done == 1'b1)
  begin
    r_SM_Main <= s_CLEANUP;
    o_Tx_Active <= 1'b0;
  end

转换为:

r_Tx_Done     <= 1'b1;
r_Clock_Count <= 0;
if (r_Done == 1'b1)
  begin
    r_SM_Main   <= s_CLEANUP;
    o_Tx_Active <= 1'b0;
  end

Verilog模式在保持ifelsebeginend对齐方面做得很好,但它没有像我想要的那样对齐赋值语句。请注意,如果语句内部未与if语句外部的<=对齐。基本上我希望每个begin/end块被单独处理。


1
好像没有自动对齐功能,但是可以手动使用align-regexp,具体方法可以参考这个问题 - legoscia
1
这适用于小代码部分,但对于大文件来说,手动对齐每个内容将会非常繁琐。 - Russell
3个回答

6

我使用的是verilog模式,并且默认情况下可以正常工作。

  1. 按下 C-x h 键来高亮整个缓冲区。
  2. 然后按下TAB键,使其美化所有内容。这样做更加容易,也不那么乏味!

2
在GNU Emacs 24.3.1的Verilog模式中,您可以将光标放在任何赋值操作中的非阻塞赋值运算符"<="上。例如,在代码的顶部部分:
r_Tx_Done <= 1'b1;
r_Clock_Count <= 0;

将光标放在赋值运算符的任意一个上面,然后输入C-c =。代码现在会变成:

r_Tx_Done     <= 1'b1;
r_Clock_Count <= 0;

此操作仅在该代码部分执行,不会跳转到其他语句:if-else、case、always等。如果要在另一个语句中执行相同的操作,则必须进入该语句并单击赋值运算符,然后再次键入C-c=


2

基于这个答案,您可以尝试自定义align-rules-list

像这样的东西应该会有所帮助:

(eval-after-load "align"
  '(add-to-list 'align-rules-list
                '(verilog-assignment
                  (regexp . "\\(\\s-*\\)<=")
                  (mode   . '(verilog-mode))
                  (repeat . nil))))

现在,M-x align 应该应用新的对齐规则。

我尝试将它添加到我的.emacs文件中,但是收到了以下消息: 警告(初始化):加载“c:/emacs/.emacs”时发生错误:符号作为变量的值为空:align-rules-list - Russell
@Russell,听起来你还没有加载align。尝试使用我回答中的更新片段。 - Chris
这个解决方案还不错,但它并不完全按照我想要的方式运行。如果我的代码有嵌套的if-else语句,它会将所有内容推到最远的一个,这在某些情况下会增加相当多的空格。我会继续保持问题的开放性,看看是否有其他建议。 - Russell
@Russell,如果您在问题中添加更详细的用例,可能会有所帮助。 - Chris

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