Michael, That works. Thank you very much for guiding me into the world of Lisp. Shiyuan On Tue, Oct 16, 2012 at 12:17 AM, Michael Heerdegen < michael_heerdegen@web.de> wrote: > Hi again, > > > Michael, > > Thanks for the detailed reply. However, it doesn't work for me. I > > guess I make a mistake somewhere. Here is mymode.el: > > > > http://paste.lisp.org/display/132611 > > Yes, there are two little errors. > > First, you register your mode in `hs-special-modes-alist' after you > enable hs-minor-mode. That's too late, because hideshow then has > already initialized its stuff. Also, adding to `hs-special-modes-alist' > has to be done only once, and not every time mymode is enabled. > > Second, you quoted mymode-forward-sexp-func in your quoted list: > > | '(mymode "\\[begin]" "\\[end]" "#" 'mymode-forward-sexp-func nil)) > ^ > > That's not needed, remember, the quote before a list already prevents > evaluation of its members (you want to specify a symbol). > > So, this should do the trick: > > --8<---------------cut here---------------start------------->8--- > (require 'hideshow) > > (defun mymode-forward-sexp-func (arg) > "move over ARG balanced blocks; This is needed by hs-minor-mode" > (dotimes (number arg) > (let ((counter 0)) > (catch 'done > (while t > (search-forward-regexp "\\[begin]\\|\\[end]") > (setq counter (+ counter (if (looking-back "\\[begin]") 1 -1))) > (when (= counter 0) (throw 'done t))))))) > > (add-to-list 'hs-special-modes-alist '(mymode "\\[begin]" "\\[end]" "#" > mymode-forward-sexp-func)) > > (define-derived-mode mymode fundamental-mode > "mymode is a major mode for fun." > (setq mode-name "mymode") > (setq comment-start "#") > (setq comment-end "") > (hs-minor-mode 1)) > --8<---------------cut here---------------end--------------->8--- > > Of course, that's all just for playing. If mymode was a major-mode > really to be used, you would leave it up to the user to call > `hs-minor-mode' e.g. in `mymode-hook', and not call it in the mode > definition. > > > Michael. > >