Subject: bug#77022: [PATCH] Allow specify in which major modes global-hl-line-mode must be enabled.

From: Eli Zaretskii <[email-masked]>
Date: Sat, 15 Mar 2025 11:19:54 +0200

> From: Elijah Gabe Pérez <[email-masked]>
> Date: Fri, 14 Mar 2025 19:26:36 -0600
> 
> El vie., 14 de marzo de 2025 7:22 p. m., Elijah Gabe Pérez <[email-masked]> escribió:
> 
>  Hello, this patch add a user option for specify in which major modes should global-hl-line-mode be
>  switched on. 
> 
>  Originally i wanted to replace global-hl-line define-minor-mode definition with
>  define-globalized-minor-mode, however i found that this was already done and was reverted in
>  a34afbf2aea2fdaf691f4bf250a18991b21301d7 commit, so I decided to bring this feature, since i find
>  this better than using add-hook. 

Thanks.

> +*** New variable 'global-hl-line-modes'.
> +This specifies in which major modes should the global-hl-line-mode be
                                                  ^^^^^^^^^^^^^^^^^^^
The mode should be quoted 'like this'.

> +(defcustom global-hl-line-modes t
> +  "Which major modes `hl-line-mode' is switched on in.
> +This variable can be either t (all major modes), nil (no major modes),
> +or a list of modes and (not modes) to switch use this minor mode or
> +not.  For instance
> +
> +  (c-mode (not message-mode mail-mode) text-mode)
> +
> +means \"use this mode in all modes derived from `c-mode', don't use in
> +modes derived from `message-mode' or `mail-mode', but do use in other
> +modes derived from `text-mode'\".  An element with value t means \"use\"
> +and nil means \"don't use\".  There's an implicit nil at the end of the
> +list."
> +  :type
> +  '(choice (const :tag "Enable in all major modes" t)
> +           (const :tag "Don't enable in any major mode" nil)

Why is it useful to have a value of nil here?  Why would anyone
activate this mode when the variable has the value nil?

> @@ -224,7 +254,8 @@ global-hl-line-mode
>  on `post-command-hook'."
>    :global t
>    :group 'hl-line
> -  (if global-hl-line-mode
> +  (if (and global-hl-line-mode
> +           (easy-mmode--globalized-predicate-p global-hl-line-modes))
>        (progn
>          ;; In case `kill-all-local-variables' is called.
>          (add-hook 'change-major-mode-hook #'global-hl-line-unhighlight)

Maybe I'm missing something, but don't you need to consult this new
variable in global-hl-line-highlight-all?