help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: outline-flag-region: Variable binding depth exceeds max-specpdl-size


From: Thorsten Jolitz
Subject: Re: outline-flag-region: Variable binding depth exceeds max-specpdl-size
Date: Tue, 21 May 2013 23:28:49 +0200
User-agent: Gnus/5.130002 (Ma Gnus v0.2) Emacs/24.3 (gnu/linux)

Thorsten Jolitz <tjolitz@gmail.com> writes:

> I implemented a new (optional and customizable) feature for 'outshine.el':
> behind every folded headline, a little 'cookie' can show the number of
> hidden lines till the next visible headline. 

[...snip...] 

> This works alright so far, and when a folded buffer is expanded or the
> number of hidden lines change, the cookies are updated correctly. But
> obviously its a bit tedious to manually do 
>
> ,------------------------------------------
> | M-:(outshine-show-hidden-lines-cookies)
> `------------------------------------------
>
> each time the status of the buffer changes, so the right thing to do
> seems to be:
>
> ,-----------------------------------------------
> | (add-hook 'outline-view-change-hook
> |           'outshine-show-hidden-lines-cookies)
> `-----------------------------------------------
>
> This worked shortly, but since then results in the following error:
>
> ,---------------------------------------------------------------------
> | outline-flag-region: Variable binding depth exceeds max-specpdl-size
> `---------------------------------------------------------------------
>
> Whats this error about and what would be a possible fix? There are
> several reports about this error for several Emacs modes, but the
> background and cure are not really explained. 

Following up to my own post, help and source code of
'outline-flag-region' and 'max-specpdl-size' do give some hints:

,---------------------------------------------------------------------------
| max-specpdl-size is a variable defined in `C source code'.
| Its value is 1340
| Original value was 1300
|
|   This variable can be risky when used as a file-local variable.
|
| Documentation:
| Limit on number of Lisp variable bindings and `unwind-protect's.
| If Lisp code tries to increase the total number past this amount,
| an error is signaled.
| You can safely use a value considerably larger than the default value,
| if that proves inconveniently small.  However, if you increase it too far,
| Emacs could run out of memory trying to make the stack bigger.
|
| You can customize this variable.
`---------------------------------------------------------------------------

so it appears that in a call to 'outline-flag-region' more than 1340
Lisp variable bindings and `unwind-protect's are created.

,--------------------------------------------------------------------------
| outline-flag-region is a compiled Lisp function in `outline.el'.
|
| (outline-flag-region FROM TO FLAG)
|
| Hide or show lines from FROM to TO, according to FLAG.
| If FLAG is nil then text is shown, while if FLAG is t the text is hidden.
`--------------------------------------------------------------------------

But its hard to see where this happens in a (test) file with some 30
outline headlines. 

,-----------------------------------------------------------------------------
| (defun outline-flag-region (from to flag)
|   "Hide or show lines from FROM to TO, according to FLAG.
| If FLAG is nil then text is shown, while if FLAG is t the text is hidden."
|   (remove-overlays from to 'invisible 'outline)
|   (when flag
|     ;; We use `front-advance' here because the invisible text begins at the
|     ;; very end of the heading, before the newline, so text inserted at FROM
|     ;; belongs to the heading rather than to the entry.
|     (let ((o (make-overlay from to nil 'front-advance)))
|       (overlay-put o 'evaporate t)
|       (overlay-put o 'invisible 'outline)
|       (overlay-put o 'isearch-open-invisible
|                    (or outline-isearch-open-invisible-function
|                        'outline-isearch-open-invisible))))
|   ;; Seems only used by lazy-lock.  I.e. obsolete.
|   (run-hooks 'outline-view-change-hook))
`-----------------------------------------------------------------------------

Looking at the code, I can't really see why a function called each time
an outline region is flagged, that jumps to all visible headlines, checks
if the headline is folded and/or if it has a "hidden-lines-cookie", and
only in the first case gets the number of hidden lines before the next
visible headline, would create so many variable bindings and
unwind-protects. 

Any hints?

PS 
And, by the way, if I could solve the problem described in this thread,
'outline-view-change-hook' would be quite useful for outshine.el and
thus not obsolete any more?

-- 
cheers,
Thorsten




reply via email to

[Prev in Thread] Current Thread [Next in Thread]