From 3c276adca2435d045110883c0e6cfc73c72cf12c Mon Sep 17 00:00:00 2001 From: Richard Hansen Date: Mon, 20 Jun 2022 01:04:29 -0400 Subject: [PATCH] whitespace: Redraw if indentation or line length changes * lisp/whitespace.el (whitespace-color-on): Convert the indentation matcher from a static regular expression to a function so that changes to `indent-tabs-mode' and `tab-width' are picked up the next time `font-lock-flush' runs. (whitespace--indentation-matcher): The new function matcher. (whitespace--variable-watcher): New variable watcher that calls `font-lock-flush' if `whitespace-mode' is enabled for the buffer. (whitespace--watched-vars): List of variables to watch. (whitespace-unload-function): Un-watch the variables. --- lisp/whitespace.el | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/lisp/whitespace.el b/lisp/whitespace.el index 7ee8a46cec..45e7ce683c 100644 --- a/lisp/whitespace.el +++ b/lisp/whitespace.el @@ -2112,16 +2112,7 @@ whitespace-color-on ,@(when (or (memq 'indentation whitespace-active-style) (memq 'indentation::tab whitespace-active-style) (memq 'indentation::space whitespace-active-style)) - `((,(cond - ((memq 'indentation whitespace-active-style) - ;; Show indentation SPACEs (indent-tabs-mode). - (whitespace-indentation-regexp)) - ((memq 'indentation::tab whitespace-active-style) - ;; Show indentation SPACEs (SPACEs). - (whitespace-indentation-regexp 'tab)) - ((memq 'indentation::space whitespace-active-style) - ;; Show indentation SPACEs (TABs). - (whitespace-indentation-regexp 'space))) + `((,#'whitespace--indentation-matcher 1 whitespace-indentation t))) ,@(when (memq 'big-indent whitespace-active-style) ;; Show big indentation. @@ -2356,6 +2347,28 @@ whitespace-post-command-hook (font-lock-flush ostart (overlay-end whitespace-point--used)) (delete-overlay whitespace-point--used)))))) + +(defun whitespace--indentation-matcher (limit) + "Indentation matcher for `font-lock-keywords'. +This matcher is a function instead of a static regular expression +so that the next call to `font-lock-flush' picks up any changes +to `indent-tabs-mode' and `tab-width'." + (re-search-forward + (whitespace-indentation-regexp + (cond + ((memq 'indentation whitespace-active-style) nil) + ((memq 'indentation::tab whitespace-active-style) 'tab) + ((memq 'indentation::space whitespace-active-style) 'space))) + limit t)) + + +(defun whitespace--variable-watcher (_symbol _newval _op buffer) + "Variable watcher that calls `font-lock-flush' for BUFFER." + (when buffer + (with-current-buffer buffer + (when whitespace-mode + (font-lock-flush))))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Hacked from visws.el (Miles Bader ) @@ -2468,9 +2481,16 @@ whitespace-warn-read-only ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defvar whitespace--watched-vars + '(fill-column indent-tabs-mode tab-width whitespace-line-column)) + +(dolist (var whitespace--watched-vars) + (add-variable-watcher var #'whitespace--variable-watcher)) (defun whitespace-unload-function () "Unload the whitespace library." + (dolist (var whitespace--watched-vars) + (remove-variable-watcher var #'whitespace--variable-watcher)) (global-whitespace-mode -1) ;; be sure all local whitespace mode is turned off (save-current-buffer -- 2.36.1