[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: hideshow minor-mode
From: |
Michael Heerdegen |
Subject: |
Re: hideshow minor-mode |
Date: |
Tue, 16 Oct 2012 20:09:15 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.2.50 (gnu/linux) |
Shiyuan <gshy2014@gmail.com> writes:
> That works.
Fine.
Maybe also have a look at folding.el, if you don't yet know it:
http://www.emacswiki.org/emacs/FoldingMode
It uses explicit markers, but therefore works out of the box in any
mode.
Regards,
Michael.
> 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.
>