Subject: Re: bug#68352: 29.1; gnus-message-citation-mode removes values from font-lock-keywords

From: Eric Abrahamsen <[email-masked]>
Date: Tue, 09 Jan 2024 21:25:15 -0800

Morgan Willcock <[email-masked]> writes:

> Eric Abrahamsen <[email-masked]> writes:
>
>> Morgan Willcock <[email-masked]> writes:
>>
>>> When Gnus enables gnus-message-citation-mode in message buffers, as it
>>> does by default, it calls the function `font-lock-set-defaults' and
>>> loses any additional font-lock rules which may have been added by global
>>> minor-modes.
>>
>> Thanks for the report. I don't know font locking well enough to know
>> what the right solution is here. It looks calling `font-lock-flush' will
>> also end up calling `font-lock-set-defaults' as well, at least with
>> default values:
>>
>> font-lock-flush-function ->
>> font-lock-after-change-function ->
>> font-lock-fontify-region ->
>> font-lock-set-defaults
>>
>> Is the problem setting `font-lock-set-defaults' to nil? Is there
>> anything else you can recommend?
>
> I think that I did test not setting `font-lock-set-defaults' to nil to
> see if that made a difference, but the same problem was still there.
>
> I don't know very much myself, but in that section of code there is a
> comment left by Stefan Monnier:
>
>   ;; FIXME: Use font-lock-add-keywords!

Ha, my eyes went right by that comment.

> So I would guess that the correct solution would be to add the citation
> font-locking rules with `font-lock-add-keywords' and then remove them
> again with `font-lock-remove-keywords' if the mode is ever disabled, and
> if the highlighting needs an update after those changes, call
> `font-lock-flush'.

So maybe this is enough?

(define-minor-mode gnus-message-citation-mode
  "Minor mode providing more font-lock support for nested citations.
When enabled, it automatically turns on `font-lock-mode'."
  :lighter ""
  (when (derived-mode-p 'message-mode)
    (if gnus-message-citation-mode
	(font-lock-add-keywords nil gnus-message-citation-keywords)
      (font-lock-remove-keywords nil gnus-message-citation-keywords))
    (if font-lock-mode
	(font-lock-flush)
      (gnus-message-citation-mode (font-lock-mode 1)))))