折叠 - 在Emacs中为UVM / SystemVerilog展开代码/注释部分

时间:2014-03-30 23:49:12

标签: emacs system-verilog uvm

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

我想为代码/注释块添加fold-unfold功能。

例如 我的课程如下

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实现这个目标吗?

2 个答案:

答案 0 :(得分:1)

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

(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 sit amet,consectetur adipiscing elit。 Vivamus convallis sodales sapien,ut vulputate tellus mollis vel。 Aenean accumsan leo est,nec euismod sem imperdiet blandit。在sed consequat mi,在convallis arcu。 Vestibulum ultrices lectus nec nisi malesuada hendrerit。 Proin molestie placerat rutrum。 Donec gravida,ligula sit amet luctus interdum,nisl quam tempus sem,eget varius lacus orci ac sapien。 Nulla in metus non neque condimentum blandit。 Phasellus sed est a tellus fermentum viverra vulputate non dui。整数的温度nisi。菜豆(Phasellus turpis lectus),孕妇坐骨,肛门,肛门,肛门。

Pellentesque居民morbi tristique senectus et netus et malesuada fames ac turpis egestas。 Sed hendrerit commodo consectetur。 Mauris sollicitudin ut sapien interdum。 Maecenas ac nibh sodales,adipiscing leo a,dictum turpis。 Sed vestibulum odio id pulvinar rhoncus。 Ugest fringilla lacus在egestas semper。 Nulla aliquet eleifend quam,nec varius tortor tincidunt at。 Donec non vehicula tortor,eu congue augue。 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,graelida in felis non,volutpat lacinia quam。 Nulla ut sagittis turpis。 Curabitur faucibus ullamcorper felis,eget hendrerit dolor。 Donec volutpat,nisi at condimentum posuere,nulla justo blandit tortor,rhoncus odio augue id dolor。 Praesent坐在amet aliquam risus。 Praesent odio velit,dignissim eget tincidunt nec,ultricies ut est.Morbi坐在amet pellentesque ipsum。 Ut vitae laoreet mauris。 Donec lobortis auctor tortor,id faucibus urna luctus quis。 Praesent vel sollicitudin mi。 Sed neque mi,ultrices nec erat ut,con conv conv conv an an。 Sed eu ipsum blandit,porttitor libero ac,volutpat est。

在prete pretium,sed interdum sem elementum的Phasellus gravida urna。 Maecenas认为purus nec aliquam lobortis。在eleifend的Praesent lacinia ac libero。 Mauris nec blandit ante。 Integer accumsan et elit vitae scelerisque。 Maecenas hendrerit,elit quis facilisis rhoncus,mi justo adipiscing erat,vitae pellentesque dui purus eu magna。 Vestibulum tincidunt,lacus vitae molestie hendrerit,quam justo feugiat odio,eu ullamcorper risus sem vitae lacus。 Vestibulum坐在dolor placerat congue hendrerit vel augue中的amet nunc。 Vivamus ac odio ut purus malesuada gravida eget a dolor。 Nullam坐在amet nisi congue,lobortis lacus eu,varius ante。 Donec vehicula lacinia elit ac condimentum。 Aliquam egestas adipiscing orci in pharetra。 Curabitur pulvinar tincidunt neque,non tempus nisi volutpat eget。 Nulla tincidunt egestas libero,一种pharetra orci ullamcorper fermentum。 Nulla nec nunc nec urna semper tristique。 Proin est dolor,sodales ut pretium eu,luctus a magna。 \ {端} lawlist

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

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


Example http://www.lawlist.com/images/toggle_block_a.png

Example http://www.lawlist.com/images/toggle_block_b.png

Example http://www.lawlist.com/images/toggle_block_c.png


示例#2

  
(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 :(得分:0)

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

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