关于系统Verilog:在Emacs中为UVM / SystemVerilog折叠代码/注释部分

Fold-Unfold block of code / comment section in Emacs for UVM / SystemVerilog

我目前使用emacs进行UVM测试平台环境开发。 我使用verilog模式与日晒主题。 我喜欢当前的设置,但是我想改善emacs的功能。

我想为代码/注释块添加折叠功能。

例如
我的课如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class myClass ;
   function myFunction
     // variable define
     // more variable define

     begin
    //line 1
    //line 2
    //line 3
     end

      begin
     //line1
     //line2
     //line3
      end

   endfunction //
endclass // myClass

如果我正在使用第二个(底部)开始-结束块,我想折叠第一个(顶部)
//后面的任何内容都是注释,可以用实际代码替换。
我可以用emacs实现吗?


这是一个使用\\begin{anything}\\end{anything}作为正则表达式和结束正则表达式的示例,该正则表达式由函数toggle-block使用以确定要使用哪两个点来折叠这两个点之间的所有内容。原始张贴者可以将beg-flag-regexp修改为类似于function1\\\\|function2\\\\|function3\\\\|function4的内容,而结束的regexp将类似于endfunction的内容。起点可能应该在function1之后,以便在折叠代码块时function1仍然可见。需要对该功能进行其他调整/修改以适合原始海报的确切需求,但是此示例应有助于说明使用outline库中的outline-flag-region的一般概念。

好的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
(defvar beg-flag-regexp (concat
 "\\\\(\\\\\\\\begin\\{\\\\)\\\\("
 "[^}]*"
 "\\\\)\\\\(\\}\\\\)" )
"Regexp matching the beginning of the folded region.")

(defun toggle-block ()
"When FLAG is non-nil, hide the region.  Otherwise make it visible.  For this
function to work, the cursor must be on the same line as the beginning regexp."
(interactive)
  (require 'outline)
  (cond
    ((or
        ;; sweet-spot
        (looking-at beg-flag-regexp)
        ;; point could be between backslash and before the letter n
        (let ((line-begin (save-excursion (beginning-of-line 1) (point))))
          (save-excursion
            (re-search-backward"\\\\\\\" line-begin t)
            (looking-at beg-flag-regexp)))
        ;; point could be to the right of \\begin
        (let ((line-begin (save-excursion (beginning-of-line 1) (point))))
          (save-excursion
            (re-search-backward"\\\\\\\\begin" line-begin t)
            (looking-at beg-flag-regexp)))
        ;; point could be to the left of \\begin
        (let ((line-end (save-excursion (end-of-line 1) (point))))
          (save-excursion
            (re-search-forward"\\\\\\\\begin" line-end t)
            (backward-char 6)
            (looking-at beg-flag-regexp))))
      (let* (
          (flag (not (get-char-property (match-end 0) 'invisible)))
          (beg (match-end 0))
          end
          (base-flag-match (regexp-quote
            (buffer-substring-no-properties (match-beginning 2) (match-end 2))))
          (end-flag-match (concat"\\\\\\\\end\\{" base-flag-match"\\}"))
          (go-fish (concat"\\\\begin\\{" base-flag-match"\\}"))  )
        (save-excursion
          (if (re-search-forward end-flag-match nil t)
            (progn
              (setq end (point))
              (outline-flag-region beg end flag)
              (cond
                (flag
                  (overlay-put (make-overlay beg end) 'display"\\u25be"))
                (t
                  (mapc 'delete-overlay (overlays-in beg end)))))
            (user-error"Error locating an ending match for:  %s." go-fish)))
        (if (> (point) beg)
          (goto-char beg)) ))
    (t
      (message"Sorry, you are not on a line containing the beginning regexp."))))

第一步:将变量beg-flag-regexp和函数toggle-block的整个代码粘贴到.emacs文件中,然后重新启动Emacs。

好的。

第二步:打开一个空缓冲区,然后键入M-x text-mode RET

好的。

第三步:将以下示例复制并粘贴到刚创建的缓冲区中:

好的。

\ begin {wisemonkey} Lorem ipsum dolor坐着,不动声色地奉献着精英。 Vivamus convallis sodales sapien,ut vulputatetellus mollis vel。 Aenean accumsan leo est,ne euismod sem imperdiet blandit。在sed结果中,在convallis arcu中。溃疡性外阴念珠菌。 Proin s亵placerat rutrum。 Donec gravida,ligula坐在amet luctus interdum,nisl quam tempus sem,eget varius lacus orci ac sapien。 Nulla在非痣状调味品中。菜豆对非特维尔发酵罐发酵。整数vel tempor nisi。菜豆,豆科植物,藤本植物,soluliitudin quis metus。

好的。

Pellentesque居民morbi tristique senectus et netus et malesuada成名ac turpis egestas。塞德·亨德利特(Sed Hendrerit)指挥官。毛利人中间人。 Maecenas ac nibh sodales,忠告利奥,死刑。桑树前庭dioo id鼠李。在egestas semper的fringilla lacus。 Nulla aliquet eleifend quam,nec varius tortor tincidunt处。 Donec non vehicula totor,欧盟非盟。 Nulla a nisi hendrerit,tincidunt sapien eget,accumsan mauris。 Cum sociis natoque penatibus et magnis dis parturient montes,nascetur ridiculus mus。\ end {wisemonkey}

好的。

\ begin {lawlist}精灵(Nunc sapien elit),非妊娠的孕妇,volutpat lacinia quam。 Nulla ut sagittis turpis。 Curabitur faucibus ullamcorper felis,eget hendrerit dolor。 Donec volutpat,调味品生产者,空壳龙虾。 Praesent坐在amet aliquam病中。神奇的速效法,dignissim eget tincidunt nec,uttricies ut est。Morbi坐着pellentesque ipsum。履历表毛里斯。 Donec lobortis auctor Tortor,id faucibus urna luctus quis。 Praesent vel sollicitudin mi。 Sed neque mi,未治溃疡,conval convallis ante。 Sed eu ipsum blandit,porttitor libero ac,volutpat est。

好的。


Nam怀孕锅价格,但有时沙拉元素。 Maecenas congue purus,或其他任何政策。目前免费裙装和免赔额。 Mauris nec blandit ante。一整层巧克力和汤。 Maecenas hendrerit neque,commodo quis facilisis rhoncus,mi quis dui adipiscing erat,vitae pellentesque dui purus eu magna。 Vestibulum tincidunt,履历表相告诉,生活压力,生活压力等。现在,现实的期望投资在精明的计划局或宣传上。 Gravida eget purus malesuada Vivamus从消费者那里开始受到仇恨。胡萝卜但没有功课,纸箱足球池,各种前台。直到车辆裙边显影剂和调味料。最新的执法本科生临床软糖。 Curabitur pulvinar坐着,除非有广告,他们也不需要他所有的时间。没有免费的开发人员需要颤抖的临床ullamcorper发酵。但是现在没有锅会永远不会难过。消费者微波,会员如足球的价格,哀悼极大。 \结束{} lawList

好的。


第四步:折叠文本,将光标放在包含\\begin{wisemonkey}\\begin{lawlist}的代码行上的任意位置,然后键入M-x toggle-block

好的。


第五步:要展开文本,只需重复第四步。

好的。


Example
(来源:lawlist.com)

好的。


Example
(来源:lawlist.com)

好的。


Example
(来源:lawlist.com)

好的。


Example#2

好的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
(defun wisemonkey ()
"When FLAG is non-nil, hide the region.  Otherwise make it visible.  For this
function to work, the cursor must be on the same line as the beginning regexp."
(interactive)
  (require 'outline)
  (cond
    ((let ((line-end (save-excursion (end-of-line 1) (point))))
      (save-excursion
        (beginning-of-line 1)
        (re-search-forward"function" line-end t)))
      (let* (
          (beg (save-excursion (end-of-line 1) (point)))
          (flag (not (get-char-property beg 'invisible)))
          end
          (end-flag-match"endfunction"))
        (save-excursion
          (if (re-search-forward end-flag-match nil t)
            (progn
              (setq end (point))
              (outline-flag-region beg end flag)
              (cond
                (flag
                  (overlay-put (make-overlay beg end) 'display"\\u25be"))
                (t
                  (mapc 'delete-overlay (overlays-in beg end)))))
            (user-error"Error locating an ending match for:  `function`.")))
        (if (> (point) beg)
          (goto-char beg)) ))
    (t
      (message"Sorry, you are not on a line containing the beginning regexp."))))

好。


我在配置文件中找到了这个,可以尝试一下:

1
2
3
4
5
6
(setq hs-special-modes-alist
      (cons '(verilog-mode"\\\\<begin\\\\>\\\\|\\\\<task\\\\>\\\\|\\\\<function\\\\>\\\\|\\\\<class\\\\>\\\\|\\\\<module\\\\>\\\\|\\\\<package\\\\>"
                          "\\\\<end\\\\>\\\\|\\\\<endtask\\\\>\\\\|\\\\<endfunction\\\\>\\\\|\\\\<endclass\\\\>\\\\|\\\\<endmodule\\\\>\\\\|\\\\<endpackage\\\\>"
                           nil
                           verilog-forward-sexp-function)
            hs-special-modes-alist))