Eli Zaretskii <eliz@gnu.org> writes:

+(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?

Well, this is extracted by expanding define-globalized-minor-mode macro, I've deleted them (i'm wondering why that macro adds them since i find them unnecessaries)

@@ -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?

I've moved it to global-hl-line-highlight, which should work better.