bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#57534: 29.0.50; Highlighting lost after auto-revert-mode triggers


From: Juri Linkov
Subject: bug#57534: 29.0.50; Highlighting lost after auto-revert-mode triggers
Date: Tue, 25 Jun 2024 09:52:27 +0300
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/31.0.50 (x86_64-pc-linux-gnu)

> 1. seq 10 > /tmp/file
>
> 2. emacs -Q /tmp/file
>
> 3. (highlight-lines-matching-regexp "3")
>
>    This is bound to "M-s h l". I see the line containing "3" highlighted
>    in yellow, as expected
>
> 4. M-x auto-revert-mode
>
> 5. Back in the shell: seq 20 > /tmp/file
>
> auto-revert-mode kicks in, updating the buffer with the results of 'seq
> 20' (possibly updating to an empty buffer first, if we react immediately
> to the file truncation). At this point I would expect either:
>
> 1. The buffer being fully reverted, with all the highlighting
>    disappearing. This is what happens if we did M-x revert buffer
>
> 2. The buffer contents being reverted, but the highlighting being
>    reapplied
>
> In this auto-revert scenario, we get something in-between: after the
> auto-revert hi-lock-interactive-patterns still contains the highlighting
> regex, but no highlighting actually happens. It'd be really nice and
> useful if the highlighting stayed.

Now re-highlighting after revert is implemented in Emacs 30.

However, I noticed one problem that makes this feature unusable:
when a file contains file patterns, then after every revert it asks
again and again.  This is because hi-lock-file-patterns-policy
missed the value `always', now added in this patch:

diff --git a/lisp/hi-lock.el b/lisp/hi-lock.el
index 64b84cdf859..de4384054ef 100644
--- a/lisp/hi-lock.el
+++ b/lisp/hi-lock.el
@@ -122,9 +122,10 @@ hi-lock-file-patterns-policy
   "Specify when hi-lock should use patterns found in file.
 If `ask', prompt when patterns found in buffer; if bound to a function,
 use patterns when function returns t (function is called with patterns
-as first argument); if nil or `never' or anything else, don't use file
-patterns."
+as first argument); if `always', use file patterns without prompt;
+if nil or `never' or anything else, don't use file patterns."
   :type '(choice (const :tag "Do not use file patterns" never)
+                 (const :tag "Always use file patterns" always)
                  (const :tag "Ask about file patterns" ask)
                  (function :tag "Function to check file patterns"))
   :group 'hi-lock
@@ -334,8 +335,8 @@ hi-lock-mode
   (See `font-lock-keywords'.)  They may be edited and re-loaded with 
\\[hi-lock-find-patterns],
   any valid `font-lock-keywords' form is acceptable.  When a file is
   loaded the patterns are read if `hi-lock-file-patterns-policy' is
-  `ask' and the user responds y to the prompt, or if
-  `hi-lock-file-patterns-policy' is bound to a function and that
+  `always' or if it's `ask' and the user responds y to the prompt,
+  or if `hi-lock-file-patterns-policy' is bound to a function and that
   function returns t.
 
 \\[hi-lock-find-patterns]
@@ -852,6 +853,7 @@ hi-lock-find-patterns
                    (funcall hi-lock-file-patterns-policy all-patterns))
                   ((eq hi-lock-file-patterns-policy 'ask)
                    (y-or-n-p "Add patterns from this buffer to hi-lock? "))
+                  ((eq hi-lock-file-patterns-policy 'always) t)
                   (t nil)))
         (hi-lock-set-file-patterns all-patterns)
         (if (called-interactively-p 'interactive)
@@ -866,12 +868,16 @@ hi-lock-font-lock-hook
 (defun hi-lock-revert-buffer-rehighlight ()
   "Rehighlight hi-lock patterns after `revert-buffer'.
 Apply the previous patterns after reverting the buffer."
-  (when-let ((patterns hi-lock-interactive-lighters))
-    (lambda ()
-      (when hi-lock-interactive-lighters
-        (hi-lock-unface-buffer t))
-      (dolist (pattern (reverse patterns))
-        (highlight-regexp (car pattern) (cadr (nth 1 (caddr pattern))))))))
+  (let ((policy (if hi-lock-file-patterns 'always 'never))
+        (patterns hi-lock-interactive-lighters))
+    (when patterns
+      (lambda ()
+        (unless hi-lock-mode
+          (let ((hi-lock-file-patterns-policy policy))
+            (when hi-lock-interactive-lighters
+              (hi-lock-unface-buffer t))
+            (dolist (pattern (reverse patterns))
+              (highlight-regexp (car pattern) (cadr (nth 1 (caddr 
pattern)))))))))))
 
 (defvar hi-lock--hashcons-hash
   (make-hash-table :test 'equal :weakness t)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]