[DONE]Hs-minor-mode自定义折叠语法。没有效果,求解。

verilog语言代码如下

module aaa(
           output z;
           input  a;
           input  b
           );

   assign z = a&b;

   reg           out;
   always @(*)
     begin
        out = a;
     end

endmodule

利用hs-minor-mode,修改变量hs-special-modes-alist,增加begin…end自定义折叠,使verilog-mode支持代码隐藏。

hs-special-modes-alist is a variable defined in `hideshow.el'.
Its value is ((verilog-mode-mode "\\<begin\\>" "\\<end\\>" nil)
 (verilog-mode-mode "\\<begin\\>" "\\<end\\>" nil)
 (c-mode "{" "}" "/[*/]" nil nil)
 (c++-mode "{" "}" "/[*/]" nil nil)
 (bibtex-mode
  ("@\\S(*\\(\\s(\\)" 1))
 (java-mode "{" "}" "/[*/]" nil nil)
 (js-mode "{" "}" "/[*/]" nil))

但是没有效果。 求解… 谢谢


谢谢楼下各位。

  1. hs-special-modes-alist变量说明 Alist for initializing the hideshow variables for different modes. Each element has the form (MODE START END COMMENT-START FORWARD-SEXP-FUNC ADJUST-BEG-FUNC).
  2. 以为是verilog-forward-sexp-function参数原因,仿照hideshow.el,改成nil。如上所示,失败了。emacs命令的参数有很多都不理解。还需要加强学习理解。

特别感谢xuchunyang,帮我答疑两次。为你点赞:clap:。另外,如果不嫌麻烦,请你提交这个bug吧,希望以后emacs能改进。


最后补充一句,看了hideshow.el的代码。自己elisp知识很弱,只了解lisp类型的简单语法(tcl语言经验)。个人得出结论,hs-minor-mode对于某个major-mode,只支持hs-special-modes-alist列表的第一个major-mode匹配项。 verilog代码,最好同时支持(…)和begin…end;但是根据实验结果,只能支持其一。:frowning: 办法推荐: Emacs技巧:selective-display 代码折叠 http://linux.chinaunix.net/techdoc/desktop/2009/02/23/1099775.shtml


解决方案见6楼

verilog-mode-mode?应该是 verilog-mode 吧?!我看下了我的 Emacs 也是这样,而 hs-minor-modeverilog-mode 都是 Emacs 自带的,这样的话,就是 Emacs 的 bug 了。你应该 M-x report-emacs-bug


PS,我的 Emacs 中的 hs-special-modes-alist 的缺省值,我没有自定义过。

hs-special-modes-alist
=> ((verilog-mode-mode "\\<begin\\>" "\\<end\\>" nil verilog-forward-sexp-function)
    (c-mode "{" "}" "/[*/]" nil nil)
    (c++-mode "{" "}" "/[*/]" nil nil)
    (bibtex-mode ("@\\S(*\\(\\s(\\)" 1))
    (java-mode "{" "}" "/[*/]" nil nil)
    (js-mode "{" "}" "/[*/]" nil))
1 个赞

可是设成verilog-mode也不能收缩, 用http://www.veripool.org/projects/verilog-mode/wiki/Intro里的verilog-mode依然不能收缩begin-end,感觉这个问题相当有趣

不清楚「不能」是什么意思。我这里可以:

(push '(verilog-mode "\\<begin\\>" "\\<end\\>" nil verilog-forward-sexp-function)
      hs-special-modes-alist)

如果 hs-minor-mode 已经开着了的话,需要重启下 hs-minor-mode

Emacs 已经自带了 verilog-mode,至少是 24.5。你的 Emacs 没有么?

我这边看起来只是一个 typo 而已。

1 个赞

好吧呀发现一些我自己的问题

第一点是我写verilog大概是一两年前,那时emacs还没有verilog-mode(好像),至少功能是比我提供的链接里的verilog-mode少的。刚刚试了一下24.5里自带的mode,应该是同一个,好棒!

第二点是我的锅,使用

(push '(verilog-mode "\\<begin\\>" "\\<end\\>" nil verilog-forward-sexp-function)
      hs-special-modes-alist)

后没有在begin的b位置触发hs-hide-function导致我认为无法收缩,刚刚试了hs-hide-all后发现确实是verilog-mode-mode的typo,简直被自己蠢哭

1 个赞

同时支持多种折叠是可行的,如下

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

bug#24410 #24410 - 25.1.50; Fix typo in verilog-mode.el: verilog-mode-mode -> verilog-mode - GNU bug report logs