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))
但是没有效果。
求解…
谢谢
谢谢楼下各位。
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).
以为是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;但是根据实验结果,只能支持其一。
办法推荐:
Emacs技巧:selective-display 代码折叠 http://linux.chinaunix.net/techdoc/desktop/2009/02/23/1099775.shtml
解决方案见6楼
verilog-mode-mode
?应该是 verilog-mode
吧?!我看下了我的 Emacs 也是这样,而 hs-minor-mode
和 verilog-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,感觉这个问题相当有趣
smallst:
可是设成verilog-mode也不能收缩,
不清楚「不能」是什么意思。我这里可以:
(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 没有么?
smallst:
感觉这个问题相当有趣
我这边看起来只是一个 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))