Subject: Re: bug#64048: 30.0.50; global-display-line-numbers-mode has no easy way to set modes where it is enabled

From: Eli Zaretskii <[email-masked]>
Date: Wed, 14 Jun 2023 14:58:36 +0300

> From: Ihor Radchenko <[email-masked]>
> Cc: [email-masked]
> Date: Tue, 13 Jun 2023 19:36:14 +0000
> 
> Eli Zaretskii <[email-masked]> writes:
> 
> > (Btw, I don't think I understand the use of :predicate which you
> > proposed: it isn't documented as accepting a function, only nil, t, or
> > a list of modes.)
> 
> Hmm. You are right, I did not look far enough into the code.
> 
> Let me correct my initial suggestion:
> 
> (define-globalized-minor-mode global-display-line-numbers-mode
>   display-line-numbers-mode display-line-numbers--turn-on
>   :predicate t)

This change is probably harmless, but OTOH what does it give you that
the current code doesn't?  AFAIU, you still cannot customize the modes
where line numbers will be off.

IOW, :predicate is not a means for user customizations of the modes
where the minor mode will be turned on.  Or am I missing something?

> :predicate defines the default value of
> `global-display-line-numbers-modes' variable.

It does?  Where is this documented?

> The above code will not change the existing behaviour, except that
> `global-display-line-numbers-modes' will be accounted for, iff
> customized by the user.

Is this behavior documented anywhere?  What I see in the docs (both
the doc string and the ELisp manual) is that the argument of
:predicate determines _statically_ which modes will activate the minor
mode.  The variable created by :predicate can be used to query Emacs
which modes are those, but cannot be used to change which modes do and
which don't.

If this is not what happens, we have a major mis-documentation on our
hands.

> >> I recall multiple occasions when I tried hard to disable a global mode
> >> in some buffers, remembered that there is some special variable for it;
> >> just to find out that a specific global minor mode does not support it.
> >
> > The usual way of enabling a mode selectively is to enable the
> > non-global variant of the mode in a mode hook.  I'm sure you know it.
> 
> The use case I am talking about is enabling minor mode everywhere,
> except certain major modes. It is more tricky.
> 
> One can, of course, disable the minor mode selectively in some major
> modes from that major mode hooks, but it is surprisingly non-obvious
> approach.

You can either disable it selectively (which is very obvious to me,
FWIW), or you can selectively enable it.  Both approaches are not
rocket science, IMO.