在Emacs Verilog模式中对齐代码?

时间:2014-07-01 16:44:52

标签: emacs verilog

我习惯用emacs中的VHDL编写代码,它具有很好的美化功能,可以对齐信号分配。是否有与Verilog模式类似的东西?

转换它:

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

To This:

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模式可以很好地保持if else begin end对齐,但它不会像我想要的那样对齐分配。请注意,if语句内部未与if语句之外的<=对齐。基本上我希望每个开始/结束块单独处理。

3 个答案:

答案 0 :(得分:4)

我使用verilog模式,我发现默认情况下这是有效的。

  1. 输入C-x h以突出显示整个缓冲区。
  2. 然后TAB让它美化一切。更简单,更乏味!

答案 1 :(得分:2)

根据this answer,您可以尝试自定义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应该应用新的对齐规则。

答案 2 :(得分:1)

在GNU Emacs 24.3.1的Verilog模式下,您可以将光标放在任何赋值操作中的非阻塞赋值运算符“&lt; =”上。例如,在代码的顶部:

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 =再次。