2012-08-07 79 views
1

我一直在使用Emacs创建和修改Verilog代码。 然而,在Verilog的模式,我面临的一个小问题,当我尝试插入一个“如果”使用emacs的命令语句:在Emacs Verilog模式下if语句后插入“begin”

C-c C-t ?

以下是声明是如何在创建了一个例子上述情形:

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

但是我需要的emacs插入下一行的 “开始”,如下所示:

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

在挖掘了Verilog自定义选项后,我发现了一个名为Verilog Indent Begin After If的选项,我认为这个选项会产生上述效果。然而,切换这个选项并没有给我任何明显的改变。

任何帮助将不胜感激。

+1

为什么不干脆砍了自己的命令基于你在verilog模式下看到了什么,并将它添加到键盘映射中? – pmr 2012-08-07 12:49:06

+0

@pmr:雅这是真的,但不幸的是,我没有经验的lisp编程:(我正在寻找是否有verilog模式有相同的任何直接选项,如果没有,我想我将不得不自己做点什么:/ – Pulimon 2012-08-07 12:51:35

+0

我试过为你提供你所需要的一切,看看骨架的文档以更好地理解它们,你可能希望远离key-map部分,直到你更加流利地使用elisp,'Ch f'和'Ch v''是你的朋友 – pmr 2012-08-07 13:03:05

回答

3

看代码,你会看到这个函数:

(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))) 
+0

非常感谢。它帮助:) – Pulimon 2012-08-07 13:14:48

+1

另请参阅yasnippet。 – 2012-08-07 14:56:10

+0

@event_jr是的,这可能是一个替代品。不幸的是,yas并不是Emacs核心的一部分,所以像verilog这样的核心软件包不能依赖它。另外,当你已经有了样板,为什么要去改变什么? ;) – pmr 2012-08-07 15:14:40