From 4b584f14e53513727e1762b28f62b21875a54cec Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Tue, 29 Apr 2025 12:34:10 +0100 Subject: [PATCH] Flymake: promptly delete eol overlay if source overlay changed In the vast majority of cases, changing the source overlay invalidates the content of the end-of-line overlay, so best to delete it asap. * lisp/progmodes/flymake.el (flymake--delete-overlay): Use 'flymake--eol-ov' (flymake--highlight-line): Use some overlay modification hooks. (cherry picked from commit 825ea052ad5638c056037c4cac92c9e666dc3820) --- lisp/progmodes/flymake.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el index 13c488b2cab..32a78918fae 100644 --- a/lisp/progmodes/flymake.el +++ b/lisp/progmodes/flymake.el @@ -792,7 +792,7 @@ Return to original margin width if ORIG-WIDTH is non-nil." (defun flymake--delete-overlay (ov) "Like `delete-overlay', delete OV, but do some more stuff." - (let ((eolov (overlay-get ov 'eol-ov))) + (let ((eolov (overlay-get ov 'flymake--eol-ov))) (when eolov (let ((src-ovs (delq ov (overlay-get eolov 'flymake-eol-source-overlays)))) (overlay-put eolov 'flymake-eol-source-overlays src-ovs))) @@ -1098,6 +1098,11 @@ Return nil or the overlay created." ;; (overlay-put ov 'evaporate t) (overlay-put ov 'flymake-overlay t) + (overlay-put ov 'modification-hooks + `(,(lambda (ov after &rest _) + (when-let* ((eolov + (and (null after) (overlay-get ov 'flymake--eol-ov)))) + (delete-overlay eolov))))) (overlay-put ov 'flymake-diagnostic diagnostic) ;; Handle `flymake-show-diagnostics-at-end-of-line' ;; @@ -1119,7 +1124,7 @@ Return nil or the overlay created." (overlay-put eolov 'flymake--eol-overlay t) (overlay-put eolov 'flymake-eol-source-overlays (list ov)) (overlay-put eolov 'evaporate (not (= start end)))) ; FIXME: fishy - (overlay-put ov 'eol-ov eolov)))) + (overlay-put ov 'flymake--eol-ov eolov)))) ov)) (defvar-local flymake--state nil -- 2.39.5