【问题标题】:Align code in Emacs Verilog Mode?在 Emacs Verilog 模式下对齐代码?
【发布时间】:2014-07-01 16:44:52
【问题描述】:

我习惯于在 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

到这里:

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 语句外部的 &lt;= 不一致。基本上我希望每个开始/结束块单独处理。

【问题讨论】:

  • 好像没有自动对齐功能,但是可以手动使用align-regexp,如this question中所述。
  • 这适用于一小段代码,但对于手动对齐所有内容非常繁琐的大文件。

标签: emacs verilog


【解决方案1】:

我使用verilog模式,我发现这是默认的。

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

【讨论】:

    【解决方案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 应该应用新的对齐规则。

    【讨论】:

    • 我尝试将其添加到我的 .emacs 文件并收到以下消息:警告(初始化):加载 `c:/emacs/.emacs' 时发生错误:符号的值作为变量是无效的:对齐-rules-list
    • @Russell,听起来你还没有加载align。在我的回答中尝试更新 sn-p。
    • 这个解决方案非常好,但它的行为并不完全符合我的意愿。如果我的代码嵌套了 if-else 语句,它会将所有内容推到最远的位置,这在某些情况下会增加相当多的空白。在我接受它作为答案之前,我会将这个问题保持一段时间,看看是否有人有任何其他建议。
    • @Russell,如果您将更详细的用例添加到您的问题中可能会有所帮助。
    【解决方案3】:

    在 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 =

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多