【问题标题】:Insert "begin" after if statement in Emacs Verilog Mode在 Emacs Verilog 模式下的 if 语句后插入“begin”
【发布时间】:2012-08-07 21:01:42
【问题描述】:

我使用 Emacs 创建和修改 Verilog 代码已有一段时间了。 但是,在 Verilog 模式下,当我尝试使用 emacs 命令插入“if”语句时遇到了一个小问题:

C-c C-t ?

以下是上述场景中如何创建语句的示例:

if (a<b) begin
// the rest of the code

但是我需要emacs在下一行插入“begin”,如下所示:

if (a<b)
begin
//rest of the code

在挖掘了可用的 Verilog 自定义选项之后,我发现了一个名为 Verilog Indent Begin After If 的选项,我认为它应该会产生上述效果。然而,切换此选项并没有给我任何可见的变化。

任何帮助将不胜感激。

【问题讨论】:

  • 为什么不根据您在 verilog 模式中看到的内容来破解您自己的命令并将其添加到键盘映射中?
  • @pmr: 没错,但不幸的是我没有 lisp 编程经验我自己的东西:/
  • 我尽力为您提供所需的一切。查看骨架的文档以更好地理解它们。您可能希望远离 key-map 部分,直到您对 elisp 更加流利为止。 C-h fC-h v 是你的朋友。
  • 谢谢。我想我会按照你的建议花一些时间阅读 elisp。 :)

标签: emacs verilog emacs24


【解决方案1】:

查看代码你会看到函数:

(define-skeleton verilog-sk-if
  "Insert a skeleton if statement."
  > "if (" '(verilog-sk-prompt-condition) & ")" " begin" \n
  > _ \n
  > (- verilog-indent-level-behavioral) "end " \n )

实际上定义了一个骨架。只需复制粘贴并添加另一个换行符:

(define-skeleton my-verilog-sk-if
  "Insert a skeleton if statement."
  > "if (" '(verilog-sk-prompt-condition) & ")" \n " begin" \n
  > _ \n
  > (- verilog-indent-level-behavioral) "end " \n )

现在我们只需要在 verilog 模式下将我们的函数与旧函数挂钩:

(add-hook 'verilog-mode-hook
          '(lambda ()
             ;; this is quite the hack because we don't respect
             ;; the usual prefix of verilog-mode but sufficient for us
             (define-key verilog-mode-map "\C-c\C-t?"
                         'my-verilog-sk-if)))

【讨论】:

  • @event_jr 是的,这可能是一个替代品。不幸的是,yas 不是 Emacs 核心的一部分,所以像 verilog 这样的核心包不能依赖它。另外,当你已经有了样板文件时,为什么还要去改变任何东西呢? ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
相关资源
最近更新 更多