emacs-devel
[Top][All Lists]
Advanced

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

Re: Redundant (harmful) duplication of run-hooks in define-globalized-mi


From: Alan Mackenzie
Subject: Re: Redundant (harmful) duplication of run-hooks in define-globalized-minor-mode [patch]
Date: Tue, 15 Jan 2013 14:08:55 +0000
User-agent: Mutt/1.5.21 (2010-09-15)

Hi, Stefan.

On Mon, Jan 14, 2013 at 09:12:15PM -0500, Stefan Monnier wrote:
> > !          (add-hook 'after-change-major-mode-hook
> > !                    ',MODE-enable-in-buffers)
> > !          (add-hook 'change-major-mode-after-body-hook
> >                      ',MODE-enable-in-buffers)
> >            (add-hook 'find-file-hook ',MODE-check-buffers)
> >            (add-hook 'change-major-mode-hook ',MODE-cmhh))
> > --- 399,407 ----
> >      ;; Setup hook to handle future mode changes and new buffers.
> >      (if ,global-mode
> >          (progn
> > !          (add-hook ',(if call-before-hook
> > !                          'change-major-mode-after-body-hook
> > !                        'after-change-major-mode-hook)

> I think we first need to understand why we currently use both.

This is difficult.  The change was in revision 106202.  Previously,
MODE-enable-in-buffers was simply add-hooked into
after-change-major-mode-hook.  The relevant ChangeLog entry runs:

+ 2011-10-27  Chong Yidong  <address@hidden>
+
+       * subr.el (change-major-mode-after-body-hook): New hook.
+       (run-mode-hooks): Run it.
+
+       * emacs-lisp/easy-mmode.el (define-globalized-minor-mode): Use
+       change-major-mode-before-body-hook.
+
+       * simple.el (fundamental-mode):
+       * emacs-lisp/derived.el (define-derived-mode): Revert 2010-04-28
+       change introducing fundamental-mode-hook.
+

The new hook change-major-mode-after-body-hook came into existence after
a naming competition in the thread starting at:

From: Christoph Scholtes <address@hidden>
To: address@hidden
Subject: Fundamental mode vs. special mode
Date: Sat, 22 Oct 2011 14:13:03 -0600
Message-ID: <address@hidden>

That thread mainly discussed the propriety of fundamental-mode-hook, and
prompted Yidong to remove it, putting change-major-mode-after-body-hook 
in its place.  Here is his email proposing this:
> I propose to remove the fundamental-mode-hook variable introduced in
> that change, and introduce `run-mode-hooks-hook'[*], which
> `run-mode-hooks' runs before all the other hooks.  Then minor modes
> can use `run-mode-hooks-hook', and the "turning off global modes"
> feature will be available to non-derived modes.
[*] renamed to `change-major-mode-after-body-hook' before
implementation.

> Also, the MODE-enable-in-buffers function should enable the mode only
> once, normally, even if called via both hooks.

I think that's true.  My problem is that font-lock-mode is being called
too soon, before the mode has been fully set up by the major mode hook.
That first call of f-l-m sets up font-lock-keywords to include entries
for fontifying "doc comments".  A buffer local variable specifies what
sort of doc comments.

It has to be admitted that the CC Mode code here isn't totally correct;
a complete solution to this bug probably involves making
font-lock-keywords buffer local when doc comments are specified.  I
don't want to make this change (which would be somewhat involved) before
Emacs 24.3.  ;-(  Postponing `font-lock-mode' until after the mode hook
seems a safer bet at the moment.

> So if you see a problem, maybe it's because (eq ,MODE-major-mode
> major-mode) is not true the second time around, i.e. because
> `major-mode' has changed between the two hooks.  Is that the case?
> If so, why?


>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).



reply via email to

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