unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* Minor mode hook run when mode is deactivated?
@ 2020-10-07 23:15 Joost Kremers
  2020-10-07 23:45 ` Stefan Monnier
  0 siblings, 1 reply; 5+ messages in thread
From: Joost Kremers @ 2020-10-07 23:15 UTC (permalink / raw)
  To: help-gnu-emacs

Hi,

I recently ran into a problem that was apparently caused by a 
minor mode hook being run when the mode is deactivated. 
Counter-intuitive as that may be (to me, at least), a quick look 
at the code for `define-minor-mode` seems to suggest that it's in 
fact correct.

Is there a rationale behind this? I noticed in the code that there 
are actually two more hooks, `<mode>-on-hook` and 
`<mode>-off-hook`, which according to a comment in the code are 
there for backward compatibility only. Which suggests that someone 
at some point thought about these things and made a conscious 
decision to this effect.

Which in turn makes me wonder what the rationale was for that 
decision. :-) Also, I haven't been able to find any info on this 
in the Elisp and Emacs manuals. Aren't minor modes supposed to be 
turned off?

TIA


-- 
Joost Kremers
Life has its moments



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Minor mode hook run when mode is deactivated?
  2020-10-07 23:15 Minor mode hook run when mode is deactivated? Joost Kremers
@ 2020-10-07 23:45 ` Stefan Monnier
  2020-10-08  6:44   ` Joost Kremers
  0 siblings, 1 reply; 5+ messages in thread
From: Stefan Monnier @ 2020-10-07 23:45 UTC (permalink / raw)
  To: help-gnu-emacs

> I recently ran into a problem that was apparently caused by a minor mode
> hook being run when the mode is deactivated. Counter-intuitive as that may
> be (to me, at least), a quick look at the code for `define-minor-mode` seems
> to suggest that it's in fact correct.

If you need to do something when a minor mode is activated, you most
likely also need to do something to "undo" it when the mode
is deactivated.  So, yes, the minor mode hooks are run both when
activating and when deactivating, and they should check the value of the
minor mode variable to know which it is.


        Stefan




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Minor mode hook run when mode is deactivated?
  2020-10-07 23:45 ` Stefan Monnier
@ 2020-10-08  6:44   ` Joost Kremers
  2020-10-08 13:53     ` Stefan Monnier
  0 siblings, 1 reply; 5+ messages in thread
From: Joost Kremers @ 2020-10-08  6:44 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: help-gnu-emacs


On Thu, Oct 08 2020, Stefan Monnier wrote:
> If you need to do something when a minor mode is activated, you 
> most
> likely also need to do something to "undo" it when the mode
> is deactivated.  So, yes, the minor mode hooks are run both when
> activating and when deactivating, and they should check the 
> value of the
> minor mode variable to know which it is.

That makes sense, but it does mean that you cannot put a minor 
mode onto another minor mode hook.[1]

Which is OK, I was just surprised that I wasn't able to find 
anything about this in the documentation. Is in there and I just 
didn't search well enough, or should it perhaps be added?

Joost


Footnotes:
[1]  That was my scenario. I have a minor mode that I wrote and to 
which I added an extra hook that's run when the mode is 
deactivated. I thought this would allow me to turn off other minor 
modes that I had activated in my minor mode's hook, but it wasn't 
working. Turns out the minor mode hook is also run when the mode 
is deactivated, after my additional deactivate-hook was run... 
Details here 
<https://github.com/joostkremers/writeroom-mode/issues/63> if 
anyone's interested.



-- 
Joost Kremers
Life has its moments



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Minor mode hook run when mode is deactivated?
  2020-10-08  6:44   ` Joost Kremers
@ 2020-10-08 13:53     ` Stefan Monnier
  2020-10-08 14:33       ` Joost Kremers
  0 siblings, 1 reply; 5+ messages in thread
From: Stefan Monnier @ 2020-10-08 13:53 UTC (permalink / raw)
  To: Joost Kremers; +Cc: help-gnu-emacs

> That makes sense, but it does mean that you cannot put a minor mode onto
> another minor mode hook.[1]

And expect this minor mode to be enabled/disabled along with the
"parent" minor mode?  no, indeed!

> Which is OK, I was just surprised that I wasn't able to find anything about
> this in the documentation.  Is in there and I just didn't search well enough,
> or should it perhaps be added?

`C-h o <foo>-mode-hook RET` should say that it is run both when leaving
and entering.  So either your specific hook failed to mention it, or you
looked in some other part of the doc.  In either case it sounds like you
found a documentation bug, so please report it (it's important then to
say exactly where you looked for that info).


        Stefan




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Minor mode hook run when mode is deactivated?
  2020-10-08 13:53     ` Stefan Monnier
@ 2020-10-08 14:33       ` Joost Kremers
  0 siblings, 0 replies; 5+ messages in thread
From: Joost Kremers @ 2020-10-08 14:33 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: help-gnu-emacs


On Thu, Oct 08 2020, Stefan Monnier wrote:
>> That makes sense, but it does mean that you cannot put a minor 
>> mode onto
>> another minor mode hook.[1]
>
> And expect this minor mode to be enabled/disabled along with the
> "parent" minor mode?  no, indeed!

No, not at all. :-) I added an extra hook variable that got run in 
the body of `define-minor-mode` when deactivating the "parent" 
mode, which I used to turn off the "child" minor mode. I was just 
surprised that the "child" mode was then immediately reactivated 
again.

>> Which is OK, I was just surprised that I wasn't able to find 
>> anything about
>> this in the documentation.  Is in there and I just didn't 
>> search well enough,
>> or should it perhaps be added?
>
> `C-h o <foo>-mode-hook RET` should say that it is run both when 
> leaving
> and entering.  So either your specific hook failed to mention 
> it, 

No, it's there. I just never bothered to look, because I it's a 
mode that I wrote myself. :-) I didn't realize that the mode hook 
gets a default doc string.

> or you
> looked in some other part of the doc.  In either case it sounds 
> like you
> found a documentation bug, so please report it (it's important 
> then to
> say exactly where you looked for that info).

I'll report it as a documentation bug, then. Thanks for your 
reply.


-- 
Joost Kremers
Life has its moments



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-10-08 14:33 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-10-07 23:15 Minor mode hook run when mode is deactivated? Joost Kremers
2020-10-07 23:45 ` Stefan Monnier
2020-10-08  6:44   ` Joost Kremers
2020-10-08 13:53     ` Stefan Monnier
2020-10-08 14:33       ` Joost Kremers

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).