unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
@ 2022-03-20 15:52 dick
  2022-03-21 15:09 ` Lars Ingebrigtsen
  2022-03-22  3:13 ` Michael Heerdegen
  0 siblings, 2 replies; 23+ messages in thread
From: dick @ 2022-03-20 15:52 UTC (permalink / raw)
  To: 54481

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: 0001-Rewrite-hl-line-mode.patch --]
[-- Type: text/x-diff, Size: 21160 bytes --]

From f61a14c16154e0a170e0b9b58851279e282face9 Mon Sep 17 00:00:00 2001
From: dickmao <dick.r.chiang@gmail.com>
Date: Sun, 20 Mar 2022 11:34:56 -0400
Subject: [PATCH] Rewrite hl-line-mode

The fashion of dual global and minor modes, each managing a replica of
state, has long been outmoded by globalized minor modes (nee
easy-mmode-define-global-mode) around the turn of the century.

* lisp/calendar/todo-mode.el (todo-toggle-item-highlighting,
todo-hl-line-range, todo-modes-set-2): Adapt to new
hl-line-highlight-hook.
* lisp/hl-line.el (hl-line-overlay): Rename hl-line--overlay.
(global-hl-line-overlay, global-hl-line-overlays,
global-hl-line-sticky-flag, hl-line-overlay-buffer,
hl-line-range-function): Obsolesce.
(hl-line--overlay): Erstwhile hl-line-overlay.
(hl-line, hl-line-face): Consolidate.
(hl-line-sticky-flag): Say less (Gen Z Hospital).
(hl-line-overlay-priority): Make this a custom.
(hl-line-highlight-hook): Prefer hook over specialized
hl-line-range-function.
(hl-line-mode): Say less (Gen Z Hospital).
(hl-line-make-overlay): Remove
(hl-line-highlight, hl-line-unhighlight): Rewrite.
(hl-line-maybe-unhighlight): Remove.
(hl-line-turn-on): Necessary for globalized minor mode.
(global-hl-line-mode, global-hl-line-highlight,
global-hl-line-highlight-all, global-hl-line-unhighlight,
global-hl-line-maybe-unhighlight, global-hl-line-unhighlight-all):
Prefer globalized minor mode.
(hl-line-move, hl-line-unload-function): Remove.
* test/lisp/calendar/todo-mode-tests.el (todo-test-item-highlighting,
todo-test-done-items-separator06-bol,
todo-test-done-items-separator06-eol,
todo-test-done-items-separator07): Adapt to consolidated face.
---
 lisp/calendar/todo-mode.el            |  11 +-
 lisp/hl-line.el                       | 297 ++++++--------------------
 test/lisp/calendar/todo-mode-tests.el |  10 +-
 test/lisp/hl-line-tests.el            |  51 +++++
 4 files changed, 123 insertions(+), 246 deletions(-)
 create mode 100644 test/lisp/hl-line-tests.el

diff --git a/lisp/calendar/todo-mode.el b/lisp/calendar/todo-mode.el
index 57fcd1b17e1..eed597a0337 100644
--- a/lisp/calendar/todo-mode.el
+++ b/lisp/calendar/todo-mode.el
@@ -1040,9 +1040,7 @@ todo-toggle-item-highlighting
   (eval-and-compile (require 'hl-line))
   (when (memq major-mode
 	      '(todo-mode todo-archive-mode todo-filtered-items-mode))
-    (if hl-line-mode
-	(hl-line-mode -1)
-      (hl-line-mode 1))))
+    (hl-line-mode 'toggle)))
 
 (defvar todo--item-headers-hidden nil
   "Non-nil if item date-time headers in current buffer are hidden.")
@@ -6676,9 +6674,8 @@ todo-modes-set-1
 (defun todo-hl-line-range ()
   "Make `todo-toggle-item-highlighting' highlight entire item."
   (save-excursion
-    (when (todo-item-end)
-      (cons (todo-item-start)
-            (todo-item-end)))))
+    (when (and (todo-item-end) hl-line--overlay)
+      (move-overlay hl-line--overlay (todo-item-start) (todo-item-end)))))
 
 (defun todo-modes-set-2 ()
   "Make some settings that apply to multiple Todo modes."
@@ -6686,7 +6683,7 @@ todo-modes-set-2
   (setq buffer-read-only t)
   (setq-local todo--item-headers-hidden nil)
   (setq-local desktop-save-buffer 'todo-desktop-save-buffer)
-  (setq-local hl-line-range-function #'todo-hl-line-range))
+  (add-hook 'hl-line-highlight-hook #'todo-hl-line-range nil t))
 
 (defun todo-modes-set-3 ()
   "Make some settings that apply to multiple Todo modes."
diff --git a/lisp/hl-line.el b/lisp/hl-line.el
index 8e60ddf6b07..daa24c4fbf3 100644
--- a/lisp/hl-line.el
+++ b/lisp/hl-line.el
@@ -24,274 +24,103 @@
 
 ;;; Commentary:
 
-;; Provides a local minor mode (toggled by M-x hl-line-mode) and
-;; a global minor mode (toggled by M-x global-hl-line-mode) to
-;; highlight, on a suitable terminal, the line on which point is.  The
-;; global mode highlights the current line in the selected window only
-;; (except when the minibuffer window is selected).  This was
-;; implemented to satisfy a request for a feature of Lesser Editors.
-;; The local mode is sticky: it highlights the line about the buffer's
-;; point even if the buffer's window is not selected.  Caveat: the
-;; buffer's point might be different from the point of a non-selected
-;; window.  Set the variable `hl-line-sticky-flag' to nil to make the
-;; local mode behave like the global mode.
-
-;; You probably don't really want to use the global mode; if the
-;; cursor is difficult to spot, try changing its color, relying on
-;; `blink-cursor-mode' or both.  The hookery used might affect
-;; response noticeably on a slow machine.  The local mode may be
-;; useful in non-editing buffers such as Gnus or PCL-CVS though.
-
-;; An overlay is used.  In the non-sticky cases, this overlay is
-;; active only on the selected window.  A hook is added to
-;; `post-command-hook' to activate the overlay and move it to the line
-;; about point.
-
-;; You could make variable `global-hl-line-mode' buffer-local and set
-;; it to nil to avoid highlighting specific buffers, when the global
-;; mode is used.
-
-;; By default the whole line is highlighted.  The range of highlighting
-;; can be changed by defining an appropriate function as the
-;; buffer-local value of `hl-line-range-function'.
-
 ;;; Code:
 
-(defvar-local hl-line-overlay nil
-  "Overlay used by Hl-Line mode to highlight the current line.")
+(make-obsolete-variable 'hl-line-overlay nil "29.1")
+(make-obsolete-variable 'global-hl-line-overlay nil "29.1")
+(make-obsolete-variable 'global-hl-line-overlays nil "29.1")
+(make-obsolete-variable 'global-hl-line-sticky-flag nil "29.1")
+(make-obsolete-variable 'hl-line-overlay-buffer nil "29.1")
+(make-obsolete-variable 'hl-line-range-function nil "29.1")
 
-(defvar-local global-hl-line-overlay nil
-  "Overlay used by Global-Hl-Line mode to highlight the current line.")
+(defvar-local hl-line--overlay nil
+  "Keep state else scan entire buffer in `post-command-hook'.")
 
-(defvar global-hl-line-overlays nil
-  "Overlays used by Global-Hl-Line mode in various buffers.
-Global-Hl-Line keeps displaying one overlay in each buffer
-when `global-hl-line-sticky-flag' is non-nil.")
+;; 1. define-minor-mode creates buffer-local hl-line--overlay
+;; 2. overlay wiped by kill-all-local-variables
+;; 3. post-command-hook dupes overlay
+;; Solution: prevent step 2.
+(put 'hl-line--overlay 'permanent-local t)
 
 (defgroup hl-line nil
   "Highlight the current line."
   :version "21.1"
   :group 'convenience)
 
-(defface hl-line
-  '((t :inherit highlight :extend t))
-  "Default face for highlighting the current line in Hl-Line mode."
+(defface hl-line-face '((t :inherit highlight :extend t))
+  "Default face for highlighting the current line in hl-line-mode."
   :version "22.1"
   :group 'hl-line)
 
-(defcustom hl-line-face 'hl-line
-  "Face with which to highlight the current line in Hl-Line mode."
-  :type 'face
-  :group 'hl-line
-  :set (lambda (symbol value)
-	 (set symbol value)
-	 (dolist (buffer (buffer-list))
-	   (with-current-buffer buffer
-	     (when (overlayp hl-line-overlay)
-	       (overlay-put hl-line-overlay 'face hl-line-face))))
-	 (when (overlayp global-hl-line-overlay)
-	   (overlay-put global-hl-line-overlay 'face hl-line-face))))
-
 (defcustom hl-line-sticky-flag t
-  "Non-nil means the HL-Line mode highlight appears in all windows.
-Otherwise Hl-Line mode will highlight only in the selected
-window.  Setting this variable takes effect the next time you use
-the command `hl-line-mode' to turn Hl-Line mode on.
-
-This variable has no effect in Global Highlight Line mode.
-For that, use `global-hl-line-sticky-flag'."
+  "Non-nil to preserve highlighting overlay when focus leaves window."
   :type 'boolean
   :version "22.1"
+  :group 'hl-line
+  :set (lambda (symbol value)
+         (set-default symbol value)
+         (unless value
+           (let ((selected (window-buffer (selected-window))))
+             (dolist (buffer (buffer-list))
+               (unless (eq buffer selected)
+                 (with-current-buffer buffer
+                   (hl-line-unhighlight))))))))
+
+(defcustom hl-line-overlay-priority -50
+  "Priority used on the overlay used by hl-line."
+  :type 'integer
+  :version "22.1"
   :group 'hl-line)
 
-(defcustom global-hl-line-sticky-flag nil
-  "Non-nil means the Global HL-Line mode highlight appears in all windows.
-Otherwise Global Hl-Line mode will highlight only in the selected
-window.  Setting this variable takes effect the next time you use
-the command `global-hl-line-mode' to turn Global Hl-Line mode on."
-  :type 'boolean
-  :version "24.1"
+(defcustom hl-line-highlight-hook nil
+  "After hook for `hl-line-highlight'.
+Currently used in calendar/todo-mode."
+  :type 'hook
   :group 'hl-line)
 
-(defvar hl-line-range-function nil
-  "If non-nil, function to call to return highlight range.
-The function of no args should return a cons cell; its car value
-is the beginning position of highlight and its cdr value is the
-end position of highlight in the buffer.
-It should return nil if there's no region to be highlighted.
-
-This variable is expected to be made buffer-local by modes.")
-
-(defvar hl-line-overlay-buffer nil
-  "Most recently visited buffer in which Hl-Line mode is enabled.")
-
-(defvar hl-line-overlay-priority -50
-  "Priority used on the overlay used by hl-line.")
-
 ;;;###autoload
 (define-minor-mode hl-line-mode
-  "Toggle highlighting of the current line (Hl-Line mode).
-
-Hl-Line mode is a buffer-local minor mode.  If
-`hl-line-sticky-flag' is non-nil, Hl-Line mode highlights the
-line about the buffer's point in all windows.  Caveat: the
-buffer's point might be different from the point of a
-non-selected window.  Hl-Line mode uses the function
-`hl-line-highlight' on `post-command-hook' in this case.
-
-When `hl-line-sticky-flag' is nil, Hl-Line mode highlights the
-line about point in the selected window only."
+  "Toggle highlighting of the current line."
   :group 'hl-line
   (if hl-line-mode
       (progn
-        ;; In case `kill-all-local-variables' is called.
-        (add-hook 'change-major-mode-hook #'hl-line-unhighlight nil t)
         (hl-line-highlight)
-        (setq hl-line-overlay-buffer (current-buffer))
+        (add-hook 'change-major-mode-hook #'hl-line-unhighlight nil t)
 	(add-hook 'post-command-hook #'hl-line-highlight nil t))
     (remove-hook 'post-command-hook #'hl-line-highlight t)
-    (hl-line-unhighlight)
-    (remove-hook 'change-major-mode-hook #'hl-line-unhighlight t)))
-
-(defun hl-line-make-overlay ()
-  (let ((ol (make-overlay (point) (point))))
-    (overlay-put ol 'priority hl-line-overlay-priority) ;(bug#16192)
-    (overlay-put ol 'face hl-line-face)
-    ol))
-
-(defun hl-line-highlight ()
-  "Activate the Hl-Line overlay on the current line."
-  (if hl-line-mode	; Might be changed outside the mode function.
-      (progn
-        (unless (overlayp hl-line-overlay)
-          (setq hl-line-overlay (hl-line-make-overlay))) ; To be moved.
-        (overlay-put hl-line-overlay
-                     'window (unless hl-line-sticky-flag (selected-window)))
-	(hl-line-move hl-line-overlay)
-        (hl-line-maybe-unhighlight))
-    (hl-line-unhighlight)))
+    (remove-hook 'change-major-mode-hook #'hl-line-unhighlight t)
+    (let (hl-line-sticky-flag)
+      (hl-line-unhighlight))))
 
 (defun hl-line-unhighlight ()
-  "Deactivate the Hl-Line overlay on the current line."
-  (when (overlayp hl-line-overlay)
-    (delete-overlay hl-line-overlay)
-    (setq hl-line-overlay nil)))
+  (unless hl-line-sticky-flag
+    (when hl-line--overlay
+      (delete-overlay hl-line--overlay)
+      (setq hl-line--overlay nil))))
 
-(defun hl-line-maybe-unhighlight ()
-  "Maybe deactivate the Hl-Line overlay on the current line.
-Specifically, when `hl-line-sticky-flag' is nil deactivate all
-such overlays in all buffers except the current one."
-  (let ((hlob hl-line-overlay-buffer)
-        (curbuf (current-buffer)))
-    (when (and (buffer-live-p hlob)
-               (not hl-line-sticky-flag)
-               (not (eq curbuf hlob))
-               (not (minibufferp)))
-      (with-current-buffer hlob
-        (hl-line-unhighlight)))
-    (when (and (overlayp hl-line-overlay)
-               (eq (overlay-buffer hl-line-overlay) curbuf))
-      (setq hl-line-overlay-buffer curbuf))))
+(defun hl-line-highlight ()
+  (unless (minibufferp)
+    (unless hl-line--overlay
+      (setq hl-line--overlay
+            (let ((ol (make-overlay (point) (point))))
+              (prog1 ol
+                (overlay-put ol 'priority hl-line-overlay-priority)
+                (overlay-put ol 'face 'hl-line-face)))))
+    (move-overlay hl-line--overlay
+                  (line-beginning-position)
+                  (line-beginning-position 2))
+    (run-hooks 'hl-line-highlight-hook)))
+
+(defun hl-line-turn-on ()
+  (unless (minibufferp)
+    (let (inhibit-quit)
+      (hl-line-mode 1))))
 
 ;;;###autoload
-(define-minor-mode global-hl-line-mode
-  "Toggle line highlighting in all buffers (Global Hl-Line mode).
-
-If `global-hl-line-sticky-flag' is non-nil, Global Hl-Line mode
-highlights the line about the current buffer's point in all live
-windows.
-
-Global-Hl-Line mode uses the function `global-hl-line-highlight'
-on `post-command-hook'."
-  :global t
+(define-globalized-minor-mode global-hl-line-mode
+  hl-line-mode hl-line-turn-on
   :group 'hl-line
-  (if global-hl-line-mode
-      (progn
-        ;; In case `kill-all-local-variables' is called.
-        (add-hook 'change-major-mode-hook #'global-hl-line-unhighlight)
-        (global-hl-line-highlight-all)
-	(add-hook 'post-command-hook #'global-hl-line-highlight))
-    (global-hl-line-unhighlight-all)
-    (remove-hook 'post-command-hook #'global-hl-line-highlight)
-    (remove-hook 'change-major-mode-hook #'global-hl-line-unhighlight)))
-
-(defun global-hl-line-highlight ()
-  "Highlight the current line in the current window."
-  (when global-hl-line-mode	; Might be changed outside the mode function.
-    (unless (window-minibuffer-p)
-      (unless (overlayp global-hl-line-overlay)
-        (setq global-hl-line-overlay (hl-line-make-overlay))) ; To be moved.
-      (unless (member global-hl-line-overlay global-hl-line-overlays)
-	(push global-hl-line-overlay global-hl-line-overlays))
-      (overlay-put global-hl-line-overlay 'window
-		   (unless global-hl-line-sticky-flag
-		     (selected-window)))
-      (hl-line-move global-hl-line-overlay)
-      (global-hl-line-maybe-unhighlight))))
-
-(defun global-hl-line-highlight-all ()
-  "Highlight the current line in all live windows."
-  (walk-windows (lambda (w)
-                  (with-current-buffer (window-buffer w)
-                    (global-hl-line-highlight)))
-                nil t))
-
-(defun global-hl-line-unhighlight ()
-  "Deactivate the Global-Hl-Line overlay on the current line."
-  (when (overlayp global-hl-line-overlay)
-    (delete-overlay global-hl-line-overlay)
-    (setq global-hl-line-overlay nil)))
-
-(defun global-hl-line-maybe-unhighlight ()
-  "Maybe deactivate the Global-Hl-Line overlay on the current line.
-Specifically, when `global-hl-line-sticky-flag' is nil deactivate
-all such overlays in all buffers except the current one."
-  (mapc (lambda (ov)
-	  (let ((ovb (overlay-buffer ov)))
-            (when (and (not global-hl-line-sticky-flag)
-                       (bufferp ovb)
-                       (not (eq ovb (current-buffer)))
-                       (not (minibufferp)))
-	      (with-current-buffer ovb
-                (global-hl-line-unhighlight)))))
-        global-hl-line-overlays))
-
-(defun global-hl-line-unhighlight-all ()
-  "Deactivate all Global-Hl-Line overlays."
-  (mapc (lambda (ov)
-	  (let ((ovb (overlay-buffer ov)))
-	    (when (bufferp ovb)
-		(with-current-buffer ovb
-		  (global-hl-line-unhighlight)))))
-	global-hl-line-overlays)
-  (setq global-hl-line-overlays nil))
-
-(defun hl-line-move (overlay)
-  "Move the Hl-Line overlay.
-If `hl-line-range-function' is non-nil, move the OVERLAY to the position
-where the function returns.  If `hl-line-range-function' is nil, fill
-the line including the point by OVERLAY."
-  (let (tmp b e)
-    (if hl-line-range-function
-	(setq tmp (funcall hl-line-range-function)
-	      b   (car tmp)
-	      e   (cdr tmp))
-      (setq tmp t
-	    b (line-beginning-position)
-	    e (line-beginning-position 2)))
-    (if tmp
-	(move-overlay overlay b e)
-      (move-overlay overlay 1 1))))
-
-(defun hl-line-unload-function ()
-  "Unload the Hl-Line library."
-  (global-hl-line-mode -1)
-  (save-current-buffer
-    (dolist (buffer (buffer-list))
-      (set-buffer buffer)
-      (when hl-line-mode (hl-line-mode -1))))
-  ;; continue standard unloading
-  nil)
+  :version "29.1")
 
 (provide 'hl-line)
 
diff --git a/test/lisp/calendar/todo-mode-tests.el b/test/lisp/calendar/todo-mode-tests.el
index 0102b62c10f..8715a32b883 100644
--- a/test/lisp/calendar/todo-mode-tests.el
+++ b/test/lisp/calendar/todo-mode-tests.el
@@ -130,8 +130,8 @@ todo-test-item-highlighting
    (todo-toggle-item-highlighting)
    (let ((end (1- (todo-item-end)))
          (beg (todo-item-start)))
-     (should (eq (get-char-property beg 'face) 'hl-line))
-     (should (eq (get-char-property end 'face) 'hl-line))
+     (should (eq (get-char-property beg 'face) 'hl-line-face))
+     (should (eq (get-char-property end 'face) 'hl-line-face))
      (should (> (count-lines beg end) 1))
      (should (eq (next-single-char-property-change beg 'face) (1+ end))))
    (todo-toggle-item-highlighting)))   ; Turn off highlighting (for test rerun).
@@ -736,7 +736,7 @@ todo-test-done-items-separator06-bol
    (todo-test--done-items-separator)
    (call-interactively #'todo-toggle-item-highlighting)
    (ert-simulate-command '(todo-previous-item))
-   (should (eq 'hl-line (get-char-property (point) 'face)))))
+   (should (eq 'hl-line-face (get-char-property (point) 'face)))))
 
 (ert-deftest todo-test-done-items-separator06-eol () ; bug#32343
   "Test enabling item highlighting at EOL of done items separator.
@@ -746,7 +746,7 @@ todo-test-done-items-separator06-eol
    (todo-toggle-item-highlighting)
    (forward-line -1)
    (ert-simulate-command '(todo-previous-item))
-   (should (eq 'hl-line (get-char-property (point) 'face)))))
+   (should (eq 'hl-line-face (get-char-property (point) 'face)))))
 
 (ert-deftest todo-test-done-items-separator07 () ; bug#32343
   "Test item highlighting when crossing done items separator.
@@ -758,7 +758,7 @@ todo-test-done-items-separator07
    (todo-next-item)               ; Now on empty line above separator.
    (forward-line)                 ; Now on separator.
    (ert-simulate-command '(forward-line)) ; Now on first done item.
-   (should (eq 'hl-line (get-char-property (point) 'face)))))
+   (should (eq 'hl-line-face (get-char-property (point) 'face)))))
 
 (ert-deftest todo-test-current-file-in-edit-mode () ; bug#32437
   "Test the value of todo-current-todo-file in todo-edit-mode."
diff --git a/test/lisp/hl-line-tests.el b/test/lisp/hl-line-tests.el
new file mode 100644
index 00000000000..422d4ddae7d
--- /dev/null
+++ b/test/lisp/hl-line-tests.el
@@ -0,0 +1,51 @@
+;;; hl-line-tests.el --- Test suite for hl-line. -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Code:
+(require 'ert)
+(require 'hl-line)
+
+(ert-deftest hl-line-sticky ()
+  (should hl-line-sticky-flag)
+  (with-temp-buffer
+    (let ((from-buffer (current-buffer)))
+      (hl-line-mode 1)
+      (save-excursion
+        (insert "foo"))
+      (hl-line-highlight)
+      (should (cl-some (apply-partially #'eq hl-line--overlay)
+                       (overlays-at (point))))
+      (switch-to-buffer (get-buffer-create "*scratch*"))
+      (hl-line-mode 1)
+      (save-excursion
+        (insert "bar"))
+      (hl-line-highlight)
+      (should (cl-some (apply-partially #'eq hl-line--overlay)
+                       (overlays-at (point))))
+      (should (buffer-local-value 'hl-line--overlay from-buffer))
+      (should-not (eq (buffer-local-value 'hl-line--overlay from-buffer)
+                      hl-line--overlay))
+      (customize-set-variable 'hl-line-sticky-flag nil)
+      (should hl-line--overlay)
+      (should (buffer-live-p from-buffer))
+      (should-not (buffer-local-value 'hl-line--overlay from-buffer)))))
+
+(provide 'hl-line-tests)
+
+;;; hl-line-tests.el ends here
-- 
2.26.2


[-- Attachment #2: Type: text/plain, Size: 12109 bytes --]




In Commercial Emacs 0.3.1snapshot 3de8c3d in master (upstream 29.0.50, x86_64-pc-linux-gnu) built on dick
Repository revision: 3de8c3da89e822c59ff7fd582cd454bd122e421f
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12013000
System Description: Ubuntu 20.04.3 LTS

Configured using:
 'configure --prefix=/home/dick/.local --with-tree-sitter
 --enable-dumping-overwrite 'CFLAGS=-g3 -O2
 -I/home/dick/.local/include/' LDFLAGS=-L/home/dick/.local/lib'

Configured features:
CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG JSON
TREE_SITTER LCMS2 LIBSELINUX LIBXML2 MODULES NOTIFY INOTIFY PDUMPER PNG
RSVG SECCOMP SOUND THREADS TIFF TOOLKIT_SCROLL_BARS WEBP X11 XDBE XIM
XPM GTK3 ZLIB

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Magit Log

Minor modes in effect:
  global-git-commit-mode: t
  magit-auto-revert-mode: t
  shell-dirtrack-mode: t
  global-hl-line-mode: t
  hl-line-mode: t
  global-auto-revert-mode: t
  projectile-mode: t
  flx-ido-mode: t
  override-global-mode: t
  winner-mode: t
  tooltip-mode: t
  show-paren-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  buffer-read-only: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/home/dick/gomacro-mode/gomacro-mode hides /home/dick/.emacs.d/elpa/gomacro-mode-20200326.1103/gomacro-mode
/home/dick/.emacs.d/elpa/magit-3.3.0snapshot/magit-section-pkg hides /home/dick/.emacs.d/elpa/magit-section-3.3.0snapshot/magit-section-pkg
/home/dick/org-gcal.el/org-gcal hides /home/dick/.emacs.d/elpa/org-gcal-0.3/org-gcal
/home/dick/.emacs.d/elpa/chess-2.0.5/_pkg hides /home/dick/.local/share/emacs/site-lisp/_pkg
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-pos hides /home/dick/.local/share/emacs/site-lisp/chess-pos
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-module hides /home/dick/.local/share/emacs/site-lisp/chess-module
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-ucb hides /home/dick/.local/share/emacs/site-lisp/chess-ucb
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-scid hides /home/dick/.local/share/emacs/site-lisp/chess-scid
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-puzzle hides /home/dick/.local/share/emacs/site-lisp/chess-puzzle
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-irc hides /home/dick/.local/share/emacs/site-lisp/chess-irc
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-network hides /home/dick/.local/share/emacs/site-lisp/chess-network
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-autosave hides /home/dick/.local/share/emacs/site-lisp/chess-autosave
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-engine hides /home/dick/.local/share/emacs/site-lisp/chess-engine
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-tutorial hides /home/dick/.local/share/emacs/site-lisp/chess-tutorial
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-german hides /home/dick/.local/share/emacs/site-lisp/chess-german
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-file hides /home/dick/.local/share/emacs/site-lisp/chess-file
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-random hides /home/dick/.local/share/emacs/site-lisp/chess-random
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-stockfish hides /home/dick/.local/share/emacs/site-lisp/chess-stockfish
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-pgn hides /home/dick/.local/share/emacs/site-lisp/chess-pgn
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-kibitz hides /home/dick/.local/share/emacs/site-lisp/chess-kibitz
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-eco hides /home/dick/.local/share/emacs/site-lisp/chess-eco
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-display hides /home/dick/.local/share/emacs/site-lisp/chess-display
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-var hides /home/dick/.local/share/emacs/site-lisp/chess-var
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-test hides /home/dick/.local/share/emacs/site-lisp/chess-test
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-ply hides /home/dick/.local/share/emacs/site-lisp/chess-ply
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-message hides /home/dick/.local/share/emacs/site-lisp/chess-message
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-ics1 hides /home/dick/.local/share/emacs/site-lisp/chess-ics1
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-phalanx hides /home/dick/.local/share/emacs/site-lisp/chess-phalanx
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-game hides /home/dick/.local/share/emacs/site-lisp/chess-game
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-log hides /home/dick/.local/share/emacs/site-lisp/chess-log
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-plain hides /home/dick/.local/share/emacs/site-lisp/chess-plain
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-perft hides /home/dick/.local/share/emacs/site-lisp/chess-perft
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-glaurung hides /home/dick/.local/share/emacs/site-lisp/chess-glaurung
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-ai hides /home/dick/.local/share/emacs/site-lisp/chess-ai
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-fruit hides /home/dick/.local/share/emacs/site-lisp/chess-fruit
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-uci hides /home/dick/.local/share/emacs/site-lisp/chess-uci
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-epd hides /home/dick/.local/share/emacs/site-lisp/chess-epd
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-database hides /home/dick/.local/share/emacs/site-lisp/chess-database
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-link hides /home/dick/.local/share/emacs/site-lisp/chess-link
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-transport hides /home/dick/.local/share/emacs/site-lisp/chess-transport
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-none hides /home/dick/.local/share/emacs/site-lisp/chess-none
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-polyglot hides /home/dick/.local/share/emacs/site-lisp/chess-polyglot
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-crafty hides /home/dick/.local/share/emacs/site-lisp/chess-crafty
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-chat hides /home/dick/.local/share/emacs/site-lisp/chess-chat
/home/dick/.emacs.d/elpa/chess-2.0.5/chess hides /home/dick/.local/share/emacs/site-lisp/chess
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-images hides /home/dick/.local/share/emacs/site-lisp/chess-images
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-gnuchess hides /home/dick/.local/share/emacs/site-lisp/chess-gnuchess
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-fen hides /home/dick/.local/share/emacs/site-lisp/chess-fen
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-ics hides /home/dick/.local/share/emacs/site-lisp/chess-ics
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-ics2 hides /home/dick/.local/share/emacs/site-lisp/chess-ics2
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-common hides /home/dick/.local/share/emacs/site-lisp/chess-common
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-input hides /home/dick/.local/share/emacs/site-lisp/chess-input
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-announce hides /home/dick/.local/share/emacs/site-lisp/chess-announce
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-clock hides /home/dick/.local/share/emacs/site-lisp/chess-clock
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-sound hides /home/dick/.local/share/emacs/site-lisp/chess-sound
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-sjeng hides /home/dick/.local/share/emacs/site-lisp/chess-sjeng
/home/dick/.emacs.d/elpa/chess-2.0.5/chess-algebraic hides /home/dick/.local/share/emacs/site-lisp/chess-algebraic
/home/dick/.emacs.d/elpa/transient-0.3.7snapshot/transient hides /home/dick/.local/share/emacs/0.3.1/lisp/transient

Features:
(shadow sort footnote mail-extr gnus-msg gnus-art mm-uu mml2015 mm-view
mml-smime smime dig gnus-sum shr pixel-fill kinsoku url-file url-dired
svg dom gnus-group mm-url gnus-undo gnus-start gnus-dbus gnus-cloud
nnimap nnmail mail-source utf7 netrc nnoo gnus-spec gnus-int gnus-range
gnus-win emacsbug git-rebase mule-util misearch multi-isearch
magit-extras blamer a benchmark face-remap magit-patch-changelog
magit-patch magit-submodule magit-obsolete magit-blame magit-stash
magit-reflog magit-bisect magit-push magit-pull magit-fetch magit-clone
magit-remote magit-commit magit-sequence magit-notes magit-worktree
magit-tag magit-merge magit-branch magit-reset magit-files magit-refs
magit-status magit magit-repos magit-apply magit-wip magit-log
which-func imenu magit-diff smerge-mode diff git-commit log-edit message
sendmail yank-media rmc puny dired-x dired dired-loaddefs rfc822 mml
mml-sec epa epg rfc6068 epg-config mm-decode mm-bodies mm-encode
mail-parse rfc2231 rfc2047 rfc2045 ietf-drums mailabbrev gmm-utils
mailheader pcvs-util add-log magit-core magit-autorevert magit-margin
magit-transient magit-process with-editor server magit-mode transient
magit-git magit-base magit-section crm dash tramp-archive tramp-gvfs
tramp-cache zeroconf dbus xml tramp tramp-loaddefs trampver
tramp-integration files-x tramp-compat shell pcomplete parse-time
iso8601 ls-lisp format-spec vc-git diff-mode vc-dispatcher bug-reference
cl-print help-fns radix-tree cus-start hl-line paredit-ext paredit
autorevert filenotify subed subed-vtt subed-srt subed-common subed-mpv
subed-debug subed-config inf-ruby ruby-mode smie company pcase
haskell-interactive-mode haskell-presentation-mode haskell-process
haskell-session haskell-compile haskell-mode haskell-cabal haskell-utils
haskell-font-lock haskell-indentation haskell-string
haskell-sort-imports haskell-lexeme rx haskell-align-imports
haskell-complete-module haskell-ghc-support noutline outline
flymake-proc flymake warnings etags fileloop generator xref project
dabbrev haskell-customize hydra lv use-package-ensure solarized-theme
solarized-definitions projectile lisp-mnt ibuf-ext ibuffer
ibuffer-loaddefs thingatpt grep compile comint ansi-color gnus nnheader
range mail-utils mm-util mail-prsvr gnus-util text-property-search
time-date flx-ido flx google-translate-default-ui
google-translate-core-ui facemenu color ido google-translate-core
google-translate-tk google-translate-backend use-package-bind-key
bind-key auto-complete easy-mmode advice edmacro kmacro popup cus-edit
pp cus-load wid-edit emms-player-mplayer emms-player-simple emms
emms-compat cl-extra help-mode use-package-core derived winner ring
json-reformat-autoloads json-snatcher-autoloads finder-inf
sml-mode-autoloads tornado-template-mode-autoloads info package
browse-url url url-proxy url-privacy url-expand url-methods url-history
url-cookie url-domsuf url-util mailcap url-handlers url-parse
auth-source cl-seq eieio eieio-core cl-macs eieio-loaddefs
password-cache json map url-vars seq gv subr-x byte-opt bytecomp
byte-compile cconv cldefs cl-loaddefs cl-lib iso-transl tooltip eldoc
paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode
mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image
regexp-opt fringe tree-sitter tabulated-list replace newcomment
text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow
isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax
font-core term/tty-colors frame minibuffer nadvice simple cl-generic
cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese composite emoji-zwj charscript
charprop case-table epa-hook jka-cmpr-hook help abbrev obarray
cl-preloaded button loaddefs faces cus-face macroexp files window
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget keymap hashtable-print-readable backquote threads dbusbind
inotify lcms2 dynamic-setting system-font-setting font-render-setting
cairo move-toolbar gtk x-toolkit x multi-tty make-network-process emacs)

Memory information:
((conses 16 523472 27767)
 (symbols 48 32537 8)
 (strings 32 135993 4809)
 (string-bytes 1 4138773)
 (vectors 16 61479)
 (vector-slots 8 948205 17573)
 (floats 8 455 1428)
 (intervals 56 5390 3902)
 (buffers 992 23))

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-20 15:52 bug#54481: 29.0.50; [PATCH] Rewrite hl-line dick
@ 2022-03-21 15:09 ` Lars Ingebrigtsen
  2022-03-22  0:25   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-03-22  3:13 ` Michael Heerdegen
  1 sibling, 1 reply; 23+ messages in thread
From: Lars Ingebrigtsen @ 2022-03-21 15:09 UTC (permalink / raw)
  To: dick; +Cc: 54481

dick <dick.r.chiang@gmail.com> writes:

> The fashion of dual global and minor modes, each managing a replica of
> state, has long been outmoded by globalized minor modes (nee
> easy-mmode-define-global-mode) around the turn of the century.

Makes sense to me, so I've applied the patch to Emacs 29.  The one thing
I was unsure about was things like this:

> -(defun hl-line-unload-function ()
> -  "Unload the Hl-Line library."

We normally don't remove functions like this, but just make them
obsolete.  But in this case it seems unlikely to me that anybody would
actually ever use these functions, so I didn't alter that part.  But if
anybody complains, we should take them the normal obsoletion route.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-21 15:09 ` Lars Ingebrigtsen
@ 2022-03-22  0:25   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-03-23  8:48     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 23+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-03-22  0:25 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 54481, dick

Lars Ingebrigtsen <larsi@gnus.org> writes:

> Makes sense to me, so I've applied the patch to Emacs 29.

Now, ironically, that patch introduced at least two incompatible changes
which are likely to affect users: `hl-line' is no longer a face, and
`hl-line-face' (a variable) has been replaced by the face.

Of course, with no updates to the version field, NEWS, or the
documentation.  I tried to fix it, but I might've missed something.

> The one thing I was unsure about was things like this:
>
>> -(defun hl-line-unload-function ()
>> -  "Unload the Hl-Line library."
>
> We normally don't remove functions like this, but just make them
> obsolete.  But in this case it seems unlikely to me that anybody would
> actually ever use these functions, so I didn't alter that part.  But if
> anybody complains, we should take them the normal obsoletion route.

With that change, unloading the hl-line feature leaves stray overlays
around.  Which I also fixed by restoring the old definition.

This function is called by Emacs automatically when hl-line is unloaded,
and is not for users to call anyway.

Thanks.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-20 15:52 bug#54481: 29.0.50; [PATCH] Rewrite hl-line dick
  2022-03-21 15:09 ` Lars Ingebrigtsen
@ 2022-03-22  3:13 ` Michael Heerdegen
  2022-03-22 14:12   ` dick
                     ` (2 more replies)
  1 sibling, 3 replies; 23+ messages in thread
From: Michael Heerdegen @ 2022-03-22  3:13 UTC (permalink / raw)
  To: dick; +Cc: 54481

dick <dick.r.chiang@gmail.com> writes:

>  (defcustom hl-line-sticky-flag t
> -  "Non-nil means the HL-Line mode highlight appears in all windows.
> -Otherwise Hl-Line mode will highlight only in the selected
> -window.  Setting this variable takes effect the next time you use
> -the command `hl-line-mode' to turn Hl-Line mode on.
> -
> -This variable has no effect in Global Highlight Line mode.
> -For that, use `global-hl-line-sticky-flag'."
> +  "Non-nil to preserve highlighting overlay when focus leaves window."
>    :type 'boolean
>    :version "22.1"
> +  :group 'hl-line
> +  :set (lambda (symbol value)
> +         (set-default symbol value)
> +         (unless value
> +           (let ((selected (window-buffer (selected-window))))
> +             (dolist (buffer (buffer-list))
> +               (unless (eq buffer selected)
> +                 (with-current-buffer buffer
> +                   (hl-line-unhighlight))))))))

That gives me

Debugger entered--Lisp error: (void-function hl-line-unhighlight)
  (hl-line-unhighlight)
  (#f(compiled-function (symbol value) #<bytecode -0xa62653aea4021f4>) hl-line-sticky-flag nil)
  (custom-initialize-reset hl-line-sticky-flag (funcall #'#f(compiled-function () #<bytecode 0x1dc00016fe5d4>)))
  (custom-declare-variable hl-line-sticky-flag (funcall #'#f(compiled-function () #<bytecode 0x1dc00016fe5d4>)) ...)
  (byte-code ...)
  (hl-line-mode nil)

Same error for (require 'hl-line).


Michael.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-22  3:13 ` Michael Heerdegen
@ 2022-03-22 14:12   ` dick
  2022-03-22 14:12   ` dick
  2022-03-22 14:14   ` Lars Ingebrigtsen
  2 siblings, 0 replies; 23+ messages in thread
From: dick @ 2022-03-22 14:12 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: 54481

[-- Attachment #1: Type: text/plain, Size: 63 bytes --]

I seem to have broken hl-line-sticky-flag.  Sorry about that.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-I-broke-hl-line-sticky-flag.patch --]
[-- Type: text/x-diff, Size: 11056 bytes --]

From 27d1629000236f036988a0cbc768e71846880775 Mon Sep 17 00:00:00 2001
From: dickmao <dick.r.chiang@gmail.com>
Date: Tue, 22 Mar 2022 09:58:09 -0400
Subject: [PATCH] I broke hl-line-sticky-flag

Turns out `hl-line--buffer` (nee `hl-line-overlay-buffer`) wasn't
cruft.  It was the poor man's previous-buffer tracker, of which the
rich man's version is some highly nontrivial inference from
`window-prev-buffers`, the details of which I've yet to elicit.

* lisp/hl-line.el (hl-line-overlay, hl-line-overlay-buffer):
Correct replacement variable.
(hl-line--overlay): Clearer doc.
(hl-line--buffer): Nee hl-line-overlay-buffer
(hl-line-sticky-flag): Custom initialization is unfathomable.
(hl-line-mode, hl-line-unhighlight): Orthogonalize sticky.
(hl-line-highlight): Remove highlight from previous buffer.
* test/lisp/calendar/todo-mode-tests.el (todo-test-item-highlighting,
todo-test-done-items-separator06-bol,
todo-test-done-items-separator06-eol,
todo-test-done-items-separator07): Fallout f36d929.
* test/lisp/hl-line-tests.el (hl-line-sticky, hl-line-tests-verify):
(hl-line-tests-sticky-across-frames, hl-line-tests-sticky):
Test.
---
 lisp/hl-line.el                       |  33 +++++---
 test/lisp/calendar/todo-mode-tests.el |  10 +--
 test/lisp/hl-line-tests.el            | 108 ++++++++++++++++++++------
 3 files changed, 113 insertions(+), 38 deletions(-)

diff --git a/lisp/hl-line.el b/lisp/hl-line.el
index 70ba0fcfc28..3faa2946115 100644
--- a/lisp/hl-line.el
+++ b/lisp/hl-line.el
@@ -24,17 +24,27 @@
 
 ;;; Commentary:
 
+;;  Proper scuttling of unsticky overlays relies on `post-command-hook`
+;;  being called on a buffer switch and the stationarity of
+;;  `hl-line--buffer` across switches.  One could easily imagine
+;;  programatically defeating unsticky overlays by bypassing
+;; `post-command-hook`.
+
 ;;; Code:
 
-(make-obsolete-variable 'hl-line-overlay nil "29.1")
+(make-obsolete-variable 'hl-line-overlay 'hl-line--overlay "29.1")
 (make-obsolete-variable 'global-hl-line-overlay nil "29.1")
 (make-obsolete-variable 'global-hl-line-overlays nil "29.1")
 (make-obsolete-variable 'global-hl-line-sticky-flag nil "29.1")
-(make-obsolete-variable 'hl-line-overlay-buffer nil "29.1")
+(make-obsolete-variable 'hl-line-overlay-buffer 'hl-line--buffer "29.1")
 (make-obsolete-variable 'hl-line-range-function nil "29.1")
 
 (defvar-local hl-line--overlay nil
-  "Keep state else scan entire buffer in `post-command-hook'.")
+  "The prevailing highlighting overlay per buffer.")
+
+(defvar hl-line--buffer nil
+  "Track last buffer in lieu of nontrivial inference from
+`window-prev-buffers`.")
 
 ;; 1. define-minor-mode creates buffer-local hl-line--overlay
 ;; 2. overlay wiped by kill-all-local-variables
@@ -68,6 +78,7 @@ hl-line-sticky-flag
   :type 'boolean
   :version "22.1"
   :group 'hl-line
+  :initialize #'custom-initialize-default
   :set (lambda (symbol value)
          (set-default symbol value)
          (unless value
@@ -100,14 +111,12 @@ hl-line-mode
 	(add-hook 'post-command-hook #'hl-line-highlight nil t))
     (remove-hook 'post-command-hook #'hl-line-highlight t)
     (remove-hook 'change-major-mode-hook #'hl-line-unhighlight t)
-    (let (hl-line-sticky-flag)
-      (hl-line-unhighlight))))
+    (hl-line-unhighlight)))
 
 (defun hl-line-unhighlight ()
-  (unless hl-line-sticky-flag
-    (when hl-line--overlay
-      (delete-overlay hl-line--overlay)
-      (setq hl-line--overlay nil))))
+  (when hl-line--overlay
+    (delete-overlay hl-line--overlay)
+    (setq hl-line--overlay nil)))
 
 (defun hl-line-highlight ()
   (unless (minibufferp)
@@ -120,6 +129,12 @@ hl-line-highlight
     (move-overlay hl-line--overlay
                   (line-beginning-position)
                   (line-beginning-position 2))
+    (when (and (not (eq hl-line--buffer (current-buffer)))
+               (not hl-line-sticky-flag)
+               (buffer-live-p hl-line--buffer))
+      (with-current-buffer hl-line--buffer
+        (hl-line-unhighlight)))
+    (setq hl-line--buffer (current-buffer))
     (run-hooks 'hl-line-highlight-hook)))
 
 (defun hl-line-turn-on ()
diff --git a/test/lisp/calendar/todo-mode-tests.el b/test/lisp/calendar/todo-mode-tests.el
index 8715a32b883..0102b62c10f 100644
--- a/test/lisp/calendar/todo-mode-tests.el
+++ b/test/lisp/calendar/todo-mode-tests.el
@@ -130,8 +130,8 @@ todo-test-item-highlighting
    (todo-toggle-item-highlighting)
    (let ((end (1- (todo-item-end)))
          (beg (todo-item-start)))
-     (should (eq (get-char-property beg 'face) 'hl-line-face))
-     (should (eq (get-char-property end 'face) 'hl-line-face))
+     (should (eq (get-char-property beg 'face) 'hl-line))
+     (should (eq (get-char-property end 'face) 'hl-line))
      (should (> (count-lines beg end) 1))
      (should (eq (next-single-char-property-change beg 'face) (1+ end))))
    (todo-toggle-item-highlighting)))   ; Turn off highlighting (for test rerun).
@@ -736,7 +736,7 @@ todo-test-done-items-separator06-bol
    (todo-test--done-items-separator)
    (call-interactively #'todo-toggle-item-highlighting)
    (ert-simulate-command '(todo-previous-item))
-   (should (eq 'hl-line-face (get-char-property (point) 'face)))))
+   (should (eq 'hl-line (get-char-property (point) 'face)))))
 
 (ert-deftest todo-test-done-items-separator06-eol () ; bug#32343
   "Test enabling item highlighting at EOL of done items separator.
@@ -746,7 +746,7 @@ todo-test-done-items-separator06-eol
    (todo-toggle-item-highlighting)
    (forward-line -1)
    (ert-simulate-command '(todo-previous-item))
-   (should (eq 'hl-line-face (get-char-property (point) 'face)))))
+   (should (eq 'hl-line (get-char-property (point) 'face)))))
 
 (ert-deftest todo-test-done-items-separator07 () ; bug#32343
   "Test item highlighting when crossing done items separator.
@@ -758,7 +758,7 @@ todo-test-done-items-separator07
    (todo-next-item)               ; Now on empty line above separator.
    (forward-line)                 ; Now on separator.
    (ert-simulate-command '(forward-line)) ; Now on first done item.
-   (should (eq 'hl-line-face (get-char-property (point) 'face)))))
+   (should (eq 'hl-line (get-char-property (point) 'face)))))
 
 (ert-deftest todo-test-current-file-in-edit-mode () ; bug#32437
   "Test the value of todo-current-todo-file in todo-edit-mode."
diff --git a/test/lisp/hl-line-tests.el b/test/lisp/hl-line-tests.el
index 422d4ddae7d..6bff09135b2 100644
--- a/test/lisp/hl-line-tests.el
+++ b/test/lisp/hl-line-tests.el
@@ -21,30 +21,90 @@
 (require 'ert)
 (require 'hl-line)
 
-(ert-deftest hl-line-sticky ()
-  (should hl-line-sticky-flag)
-  (with-temp-buffer
-    (let ((from-buffer (current-buffer)))
-      (hl-line-mode 1)
-      (save-excursion
-        (insert "foo"))
-      (hl-line-highlight)
-      (should (cl-some (apply-partially #'eq hl-line--overlay)
-                       (overlays-at (point))))
-      (switch-to-buffer (get-buffer-create "*scratch*"))
-      (hl-line-mode 1)
-      (save-excursion
-        (insert "bar"))
-      (hl-line-highlight)
-      (should (cl-some (apply-partially #'eq hl-line--overlay)
-                       (overlays-at (point))))
-      (should (buffer-local-value 'hl-line--overlay from-buffer))
-      (should-not (eq (buffer-local-value 'hl-line--overlay from-buffer)
-                      hl-line--overlay))
-      (customize-set-variable 'hl-line-sticky-flag nil)
-      (should hl-line--overlay)
-      (should (buffer-live-p from-buffer))
-      (should-not (buffer-local-value 'hl-line--overlay from-buffer)))))
+(defsubst hl-line-tests-verify (_label on-p)
+  (eq on-p (cl-some (apply-partially #'eq hl-line--overlay)
+                    (overlays-at (point)))))
+
+(ert-deftest hl-line-tests-sticky-across-frames ()
+  (skip-unless (display-graphic-p))
+  (customize-set-variable 'hl-line-sticky-flag t)
+  (call-interactively #'global-hl-line-mode)
+  (let ((first-frame (selected-frame))
+        (first-buffer "foo")
+        (second-buffer "bar")
+        second-frame)
+    (unwind-protect
+        (progn
+          (switch-to-buffer first-buffer)
+          (save-excursion
+            (insert (buffer-name)))
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 111 t))
+          (select-frame (setq second-frame (make-frame)))
+          (switch-to-buffer second-buffer)
+          (save-excursion
+            (insert (buffer-name)))
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 762 t))
+          (with-current-buffer first-buffer
+            (should (hl-line-tests-verify 534 t)))
+          (call-interactively #'global-hl-line-mode)
+          (should (hl-line-tests-verify 125 nil))
+          (with-current-buffer first-buffer
+            (should (hl-line-tests-verify 892 nil)))
+
+          ;; now do unsticky
+          (customize-set-variable 'hl-line-sticky-flag nil)
+          (call-interactively #'global-hl-line-mode)
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 467 t))
+          (with-current-buffer first-buffer
+            (should (hl-line-tests-verify 765 nil)))
+          (select-frame first-frame)
+          (should (equal (buffer-name) first-buffer))
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 423 t))
+          (with-current-buffer second-buffer
+            (should (hl-line-tests-verify 897 nil))))
+      (let (kill-buffer-query-functions)
+        (ignore-errors (kill-buffer first-buffer))
+        (ignore-errors (kill-buffer second-buffer))
+        (ignore-errors (delete-frame second-frame))))))
+
+(ert-deftest hl-line-tests-sticky ()
+  (customize-set-variable 'hl-line-sticky-flag t)
+  (let ((first-buffer "foo")
+        (second-buffer "bar"))
+    (unwind-protect
+        (progn
+          (switch-to-buffer first-buffer)
+          (hl-line-mode 1)
+          (save-excursion
+            (insert (buffer-name)))
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 123 t))
+          (switch-to-buffer second-buffer)
+          (hl-line-mode 1)
+          (save-excursion
+            (insert (buffer-name)))
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 56 t))
+          (with-current-buffer first-buffer
+            (should (hl-line-tests-verify 67 t)))
+
+          ;; now do unsticky
+          (customize-set-variable 'hl-line-sticky-flag nil)
+          (should (hl-line-tests-verify 234 t))
+          (with-current-buffer first-buffer
+            (should (hl-line-tests-verify 231 nil)))
+          (switch-to-buffer first-buffer)
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 257 t))
+          (with-current-buffer second-buffer
+            (should (hl-line-tests-verify 999 nil)))))
+    (let (kill-buffer-query-functions)
+      (ignore-errors (kill-buffer first-buffer))
+      (ignore-errors (kill-buffer second-buffer)))))
 
 (provide 'hl-line-tests)
 
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-22  3:13 ` Michael Heerdegen
  2022-03-22 14:12   ` dick
@ 2022-03-22 14:12   ` dick
  2022-03-22 14:59     ` Lars Ingebrigtsen
  2022-03-22 14:14   ` Lars Ingebrigtsen
  2 siblings, 1 reply; 23+ messages in thread
From: dick @ 2022-03-22 14:12 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: 54481

[-- Attachment #1: Type: text/plain, Size: 63 bytes --]

I seem to have broken hl-line-sticky-flag.  Sorry about that.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-I-broke-hl-line-sticky-flag.patch --]
[-- Type: text/x-diff, Size: 11056 bytes --]

From 27d1629000236f036988a0cbc768e71846880775 Mon Sep 17 00:00:00 2001
From: dickmao <dick.r.chiang@gmail.com>
Date: Tue, 22 Mar 2022 09:58:09 -0400
Subject: [PATCH] I broke hl-line-sticky-flag

Turns out `hl-line--buffer` (nee `hl-line-overlay-buffer`) wasn't
cruft.  It was the poor man's previous-buffer tracker, of which the
rich man's version is some highly nontrivial inference from
`window-prev-buffers`, the details of which I've yet to elicit.

* lisp/hl-line.el (hl-line-overlay, hl-line-overlay-buffer):
Correct replacement variable.
(hl-line--overlay): Clearer doc.
(hl-line--buffer): Nee hl-line-overlay-buffer
(hl-line-sticky-flag): Custom initialization is unfathomable.
(hl-line-mode, hl-line-unhighlight): Orthogonalize sticky.
(hl-line-highlight): Remove highlight from previous buffer.
* test/lisp/calendar/todo-mode-tests.el (todo-test-item-highlighting,
todo-test-done-items-separator06-bol,
todo-test-done-items-separator06-eol,
todo-test-done-items-separator07): Fallout f36d929.
* test/lisp/hl-line-tests.el (hl-line-sticky, hl-line-tests-verify):
(hl-line-tests-sticky-across-frames, hl-line-tests-sticky):
Test.
---
 lisp/hl-line.el                       |  33 +++++---
 test/lisp/calendar/todo-mode-tests.el |  10 +--
 test/lisp/hl-line-tests.el            | 108 ++++++++++++++++++++------
 3 files changed, 113 insertions(+), 38 deletions(-)

diff --git a/lisp/hl-line.el b/lisp/hl-line.el
index 70ba0fcfc28..3faa2946115 100644
--- a/lisp/hl-line.el
+++ b/lisp/hl-line.el
@@ -24,17 +24,27 @@
 
 ;;; Commentary:
 
+;;  Proper scuttling of unsticky overlays relies on `post-command-hook`
+;;  being called on a buffer switch and the stationarity of
+;;  `hl-line--buffer` across switches.  One could easily imagine
+;;  programatically defeating unsticky overlays by bypassing
+;; `post-command-hook`.
+
 ;;; Code:
 
-(make-obsolete-variable 'hl-line-overlay nil "29.1")
+(make-obsolete-variable 'hl-line-overlay 'hl-line--overlay "29.1")
 (make-obsolete-variable 'global-hl-line-overlay nil "29.1")
 (make-obsolete-variable 'global-hl-line-overlays nil "29.1")
 (make-obsolete-variable 'global-hl-line-sticky-flag nil "29.1")
-(make-obsolete-variable 'hl-line-overlay-buffer nil "29.1")
+(make-obsolete-variable 'hl-line-overlay-buffer 'hl-line--buffer "29.1")
 (make-obsolete-variable 'hl-line-range-function nil "29.1")
 
 (defvar-local hl-line--overlay nil
-  "Keep state else scan entire buffer in `post-command-hook'.")
+  "The prevailing highlighting overlay per buffer.")
+
+(defvar hl-line--buffer nil
+  "Track last buffer in lieu of nontrivial inference from
+`window-prev-buffers`.")
 
 ;; 1. define-minor-mode creates buffer-local hl-line--overlay
 ;; 2. overlay wiped by kill-all-local-variables
@@ -68,6 +78,7 @@ hl-line-sticky-flag
   :type 'boolean
   :version "22.1"
   :group 'hl-line
+  :initialize #'custom-initialize-default
   :set (lambda (symbol value)
          (set-default symbol value)
          (unless value
@@ -100,14 +111,12 @@ hl-line-mode
 	(add-hook 'post-command-hook #'hl-line-highlight nil t))
     (remove-hook 'post-command-hook #'hl-line-highlight t)
     (remove-hook 'change-major-mode-hook #'hl-line-unhighlight t)
-    (let (hl-line-sticky-flag)
-      (hl-line-unhighlight))))
+    (hl-line-unhighlight)))
 
 (defun hl-line-unhighlight ()
-  (unless hl-line-sticky-flag
-    (when hl-line--overlay
-      (delete-overlay hl-line--overlay)
-      (setq hl-line--overlay nil))))
+  (when hl-line--overlay
+    (delete-overlay hl-line--overlay)
+    (setq hl-line--overlay nil)))
 
 (defun hl-line-highlight ()
   (unless (minibufferp)
@@ -120,6 +129,12 @@ hl-line-highlight
     (move-overlay hl-line--overlay
                   (line-beginning-position)
                   (line-beginning-position 2))
+    (when (and (not (eq hl-line--buffer (current-buffer)))
+               (not hl-line-sticky-flag)
+               (buffer-live-p hl-line--buffer))
+      (with-current-buffer hl-line--buffer
+        (hl-line-unhighlight)))
+    (setq hl-line--buffer (current-buffer))
     (run-hooks 'hl-line-highlight-hook)))
 
 (defun hl-line-turn-on ()
diff --git a/test/lisp/calendar/todo-mode-tests.el b/test/lisp/calendar/todo-mode-tests.el
index 8715a32b883..0102b62c10f 100644
--- a/test/lisp/calendar/todo-mode-tests.el
+++ b/test/lisp/calendar/todo-mode-tests.el
@@ -130,8 +130,8 @@ todo-test-item-highlighting
    (todo-toggle-item-highlighting)
    (let ((end (1- (todo-item-end)))
          (beg (todo-item-start)))
-     (should (eq (get-char-property beg 'face) 'hl-line-face))
-     (should (eq (get-char-property end 'face) 'hl-line-face))
+     (should (eq (get-char-property beg 'face) 'hl-line))
+     (should (eq (get-char-property end 'face) 'hl-line))
      (should (> (count-lines beg end) 1))
      (should (eq (next-single-char-property-change beg 'face) (1+ end))))
    (todo-toggle-item-highlighting)))   ; Turn off highlighting (for test rerun).
@@ -736,7 +736,7 @@ todo-test-done-items-separator06-bol
    (todo-test--done-items-separator)
    (call-interactively #'todo-toggle-item-highlighting)
    (ert-simulate-command '(todo-previous-item))
-   (should (eq 'hl-line-face (get-char-property (point) 'face)))))
+   (should (eq 'hl-line (get-char-property (point) 'face)))))
 
 (ert-deftest todo-test-done-items-separator06-eol () ; bug#32343
   "Test enabling item highlighting at EOL of done items separator.
@@ -746,7 +746,7 @@ todo-test-done-items-separator06-eol
    (todo-toggle-item-highlighting)
    (forward-line -1)
    (ert-simulate-command '(todo-previous-item))
-   (should (eq 'hl-line-face (get-char-property (point) 'face)))))
+   (should (eq 'hl-line (get-char-property (point) 'face)))))
 
 (ert-deftest todo-test-done-items-separator07 () ; bug#32343
   "Test item highlighting when crossing done items separator.
@@ -758,7 +758,7 @@ todo-test-done-items-separator07
    (todo-next-item)               ; Now on empty line above separator.
    (forward-line)                 ; Now on separator.
    (ert-simulate-command '(forward-line)) ; Now on first done item.
-   (should (eq 'hl-line-face (get-char-property (point) 'face)))))
+   (should (eq 'hl-line (get-char-property (point) 'face)))))
 
 (ert-deftest todo-test-current-file-in-edit-mode () ; bug#32437
   "Test the value of todo-current-todo-file in todo-edit-mode."
diff --git a/test/lisp/hl-line-tests.el b/test/lisp/hl-line-tests.el
index 422d4ddae7d..6bff09135b2 100644
--- a/test/lisp/hl-line-tests.el
+++ b/test/lisp/hl-line-tests.el
@@ -21,30 +21,90 @@
 (require 'ert)
 (require 'hl-line)
 
-(ert-deftest hl-line-sticky ()
-  (should hl-line-sticky-flag)
-  (with-temp-buffer
-    (let ((from-buffer (current-buffer)))
-      (hl-line-mode 1)
-      (save-excursion
-        (insert "foo"))
-      (hl-line-highlight)
-      (should (cl-some (apply-partially #'eq hl-line--overlay)
-                       (overlays-at (point))))
-      (switch-to-buffer (get-buffer-create "*scratch*"))
-      (hl-line-mode 1)
-      (save-excursion
-        (insert "bar"))
-      (hl-line-highlight)
-      (should (cl-some (apply-partially #'eq hl-line--overlay)
-                       (overlays-at (point))))
-      (should (buffer-local-value 'hl-line--overlay from-buffer))
-      (should-not (eq (buffer-local-value 'hl-line--overlay from-buffer)
-                      hl-line--overlay))
-      (customize-set-variable 'hl-line-sticky-flag nil)
-      (should hl-line--overlay)
-      (should (buffer-live-p from-buffer))
-      (should-not (buffer-local-value 'hl-line--overlay from-buffer)))))
+(defsubst hl-line-tests-verify (_label on-p)
+  (eq on-p (cl-some (apply-partially #'eq hl-line--overlay)
+                    (overlays-at (point)))))
+
+(ert-deftest hl-line-tests-sticky-across-frames ()
+  (skip-unless (display-graphic-p))
+  (customize-set-variable 'hl-line-sticky-flag t)
+  (call-interactively #'global-hl-line-mode)
+  (let ((first-frame (selected-frame))
+        (first-buffer "foo")
+        (second-buffer "bar")
+        second-frame)
+    (unwind-protect
+        (progn
+          (switch-to-buffer first-buffer)
+          (save-excursion
+            (insert (buffer-name)))
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 111 t))
+          (select-frame (setq second-frame (make-frame)))
+          (switch-to-buffer second-buffer)
+          (save-excursion
+            (insert (buffer-name)))
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 762 t))
+          (with-current-buffer first-buffer
+            (should (hl-line-tests-verify 534 t)))
+          (call-interactively #'global-hl-line-mode)
+          (should (hl-line-tests-verify 125 nil))
+          (with-current-buffer first-buffer
+            (should (hl-line-tests-verify 892 nil)))
+
+          ;; now do unsticky
+          (customize-set-variable 'hl-line-sticky-flag nil)
+          (call-interactively #'global-hl-line-mode)
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 467 t))
+          (with-current-buffer first-buffer
+            (should (hl-line-tests-verify 765 nil)))
+          (select-frame first-frame)
+          (should (equal (buffer-name) first-buffer))
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 423 t))
+          (with-current-buffer second-buffer
+            (should (hl-line-tests-verify 897 nil))))
+      (let (kill-buffer-query-functions)
+        (ignore-errors (kill-buffer first-buffer))
+        (ignore-errors (kill-buffer second-buffer))
+        (ignore-errors (delete-frame second-frame))))))
+
+(ert-deftest hl-line-tests-sticky ()
+  (customize-set-variable 'hl-line-sticky-flag t)
+  (let ((first-buffer "foo")
+        (second-buffer "bar"))
+    (unwind-protect
+        (progn
+          (switch-to-buffer first-buffer)
+          (hl-line-mode 1)
+          (save-excursion
+            (insert (buffer-name)))
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 123 t))
+          (switch-to-buffer second-buffer)
+          (hl-line-mode 1)
+          (save-excursion
+            (insert (buffer-name)))
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 56 t))
+          (with-current-buffer first-buffer
+            (should (hl-line-tests-verify 67 t)))
+
+          ;; now do unsticky
+          (customize-set-variable 'hl-line-sticky-flag nil)
+          (should (hl-line-tests-verify 234 t))
+          (with-current-buffer first-buffer
+            (should (hl-line-tests-verify 231 nil)))
+          (switch-to-buffer first-buffer)
+          (run-hooks 'post-command-hook)
+          (should (hl-line-tests-verify 257 t))
+          (with-current-buffer second-buffer
+            (should (hl-line-tests-verify 999 nil)))))
+    (let (kill-buffer-query-functions)
+      (ignore-errors (kill-buffer first-buffer))
+      (ignore-errors (kill-buffer second-buffer)))))
 
 (provide 'hl-line-tests)
 
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-22  3:13 ` Michael Heerdegen
  2022-03-22 14:12   ` dick
  2022-03-22 14:12   ` dick
@ 2022-03-22 14:14   ` Lars Ingebrigtsen
  2022-03-22 14:24     ` dick
  2 siblings, 1 reply; 23+ messages in thread
From: Lars Ingebrigtsen @ 2022-03-22 14:14 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: 54481, dick

Michael Heerdegen <michael_heerdegen@web.de> writes:

> That gives me
>
> Debugger entered--Lisp error: (void-function hl-line-unhighlight)
>   (hl-line-unhighlight)
>   (#f(compiled-function (symbol value) #<bytecode -0xa62653aea4021f4>)
> hl-line-sticky-flag nil)
>   (custom-initialize-reset hl-line-sticky-flag (funcall
> #'#f(compiled-function () #<bytecode 0x1dc00016fe5d4>)))
>   (custom-declare-variable hl-line-sticky-flag (funcall
> #'#f(compiled-function () #<bytecode 0x1dc00016fe5d4>)) ...)
>   (byte-code ...)
>   (hl-line-mode nil)
>
> Same error for (require 'hl-line).

"emacs -Q" and (require 'hl-line) gives you an error?  I'm unable to
reproduce that on the current trunk.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-22 14:14   ` Lars Ingebrigtsen
@ 2022-03-22 14:24     ` dick
  2022-03-22 14:35       ` Lars Ingebrigtsen
  2022-03-23  2:21       ` Michael Heerdegen
  0 siblings, 2 replies; 23+ messages in thread
From: dick @ 2022-03-22 14:24 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: Michael Heerdegen, 54481

Reproduce via:

src/emacs -Q -nw  --eval "(setq debug-on-error t)" --eval "(custom-set-variables '(hl-line-sticky-flag nil))" -f global-hl-line-mode

Incidentally, I sent my previous mail twice, something bbdb always
tricks me into doing.

>>>>> "LI" == Lars Ingebrigtsen <larsi@gnus.org> writes:

LI> Michael Heerdegen <michael_heerdegen@web.de> writes:
>> That gives me
>> 
>> Debugger entered--Lisp error: (void-function hl-line-unhighlight)
>> (hl-line-unhighlight)
>> (#f(compiled-function (symbol value) #<bytecode -0xa62653aea4021f4>)
>> hl-line-sticky-flag nil)
>> (custom-initialize-reset hl-line-sticky-flag (funcall
>> #'#f(compiled-function () #<bytecode 0x1dc00016fe5d4>)))
>> (custom-declare-variable hl-line-sticky-flag (funcall
>> #'#f(compiled-function () #<bytecode 0x1dc00016fe5d4>)) ...)
>> (byte-code ...)
>> (hl-line-mode nil)
>> 
>> Same error for (require 'hl-line).

LI> "emacs -Q" and (require 'hl-line) gives you an error?  I'm unable to
LI> reproduce that on the current trunk.






^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-22 14:24     ` dick
@ 2022-03-22 14:35       ` Lars Ingebrigtsen
  2022-03-23  2:21       ` Michael Heerdegen
  1 sibling, 0 replies; 23+ messages in thread
From: Lars Ingebrigtsen @ 2022-03-22 14:35 UTC (permalink / raw)
  To: dick; +Cc: Michael Heerdegen, 54481

dick <dick.r.chiang@gmail.com> writes:

> Reproduce via:
>
> src/emacs -Q -nw  --eval "(setq debug-on-error t)" --eval "(custom-set-variables '(hl-line-sticky-flag nil))" -f global-hl-line-mode

Thanks; fixed now.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-22 14:12   ` dick
@ 2022-03-22 14:59     ` Lars Ingebrigtsen
  0 siblings, 0 replies; 23+ messages in thread
From: Lars Ingebrigtsen @ 2022-03-22 14:59 UTC (permalink / raw)
  To: dick; +Cc: Michael Heerdegen, 54481

dick <dick.r.chiang@gmail.com> writes:

> I seem to have broken hl-line-sticky-flag.  Sorry about that.

Thanks; pushed to Emacs 29.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-22 14:24     ` dick
  2022-03-22 14:35       ` Lars Ingebrigtsen
@ 2022-03-23  2:21       ` Michael Heerdegen
  2022-03-24  3:23         ` Michael Heerdegen
  1 sibling, 1 reply; 23+ messages in thread
From: Michael Heerdegen @ 2022-03-23  2:21 UTC (permalink / raw)
  To: dick; +Cc: Lars Ingebrigtsen, 54481

dick <dick.r.chiang@gmail.com> writes:

> Reproduce via:
>
> src/emacs -Q -nw --eval "(setq debug-on-error t)" --eval
> "(custom-set-variables '(hl-line-sticky-flag nil))" -f
> global-hl-line-mode

I'm sorry about the missing recipe, it had been very late when I had
discovered the problem.

Anyway, you were able to fix it nonetheless, thank you.

Michael.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-22  0:25   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-03-23  8:48     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-03-23 11:35       ` dick
                         ` (2 more replies)
  0 siblings, 3 replies; 23+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-03-23  8:48 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 54481, dick

Po Lu <luangruo@yahoo.com> writes:

> Now, ironically, that patch introduced at least two incompatible changes
> which are likely to affect users: `hl-line' is no longer a face, and
> `hl-line-face' (a variable) has been replaced by the face.
>
> Of course, with no updates to the version field, NEWS, or the
> documentation.  I tried to fix it, but I might've missed something.

And that was before I realized there's no way to set stickyness
separately for the global mode and minor mode anymore.

Not to mention the plethora of unwarranted (and undocumented)
obsoletions, especially that of `hl-line-range-function', which is
supposed to be used by packages to customize the position of the
highlight overlay.

So how about this to get us back to where we were, with the one real
improvement of `hl-line-overlay-priority' being made a defcustom?

diff --git a/lisp/hl-line.el b/lisp/hl-line.el
index f1c2e1ebf2..20b3f4160f 100644
--- a/lisp/hl-line.el
+++ b/lisp/hl-line.el
@@ -24,40 +24,58 @@
 
 ;;; Commentary:
 
-;;  Proper scuttling of unsticky overlays relies on `post-command-hook`
-;;  being called on a buffer switch and the stationarity of
-;;  `hl-line--buffer` across switches.  One could easily imagine
-;;  programatically defeating unsticky overlays by bypassing
-;; `post-command-hook`.
+;; Provides a local minor mode (toggled by M-x hl-line-mode) and
+;; a global minor mode (toggled by M-x global-hl-line-mode) to
+;; highlight, on a suitable terminal, the line on which point is.  The
+;; global mode highlights the current line in the selected window only
+;; (except when the minibuffer window is selected).  This was
+;; implemented to satisfy a request for a feature of Lesser Editors.
+;; The local mode is sticky: it highlights the line about the buffer's
+;; point even if the buffer's window is not selected.  Caveat: the
+;; buffer's point might be different from the point of a non-selected
+;; window.  Set the variable `hl-line-sticky-flag' to nil to make the
+;; local mode behave like the global mode.
 
-;;; Code:
+;; You probably don't really want to use the global mode; if the
+;; cursor is difficult to spot, try changing its color, relying on
+;; `blink-cursor-mode' or both.  The hookery used might affect
+;; response noticeably on a slow machine.  The local mode may be
+;; useful in non-editing buffers such as Gnus or PCL-CVS though.
+
+;; An overlay is used.  In the non-sticky cases, this overlay is
+;; active only on the selected window.  A hook is added to
+;; `post-command-hook' to activate the overlay and move it to the line
+;; about point.
+
+;; You could make variable `global-hl-line-mode' buffer-local and set
+;; it to nil to avoid highlighting specific buffers, when the global
+;; mode is used.
 
-(make-obsolete-variable 'hl-line-overlay 'hl-line--overlay "29.1")
-(make-obsolete-variable 'global-hl-line-overlay nil "29.1")
-(make-obsolete-variable 'global-hl-line-overlays nil "29.1")
-(make-obsolete-variable 'global-hl-line-sticky-flag nil "29.1")
-(make-obsolete-variable 'hl-line-overlay-buffer 'hl-line--buffer "29.1")
-(make-obsolete-variable 'hl-line-range-function nil "29.1")
+;; By default the whole line is highlighted.  The range of highlighting
+;; can be changed by defining an appropriate function as the
+;; buffer-local value of `hl-line-range-function'.
 
-(defvar-local hl-line--overlay nil
-  "The prevailing highlighting overlay per buffer.")
+;;; Code:
+
+(defvar-local hl-line-overlay nil
+  "Overlay used by Hl-Line mode to highlight the current line.")
 
-(defvar hl-line--buffer nil
-  "Used to track last buffer.")
+(defvar-local global-hl-line-overlay nil
+  "Overlay used by Global-Hl-Line mode to highlight the current line.")
 
-;; 1. define-minor-mode creates buffer-local hl-line--overlay
-;; 2. overlay wiped by kill-all-local-variables
-;; 3. post-command-hook dupes overlay
-;; Solution: prevent step 2.
-(put 'hl-line--overlay 'permanent-local t)
+(defvar global-hl-line-overlays nil
+  "Overlays used by Global-Hl-Line mode in various buffers.
+Global-Hl-Line keeps displaying one overlay in each buffer
+when `global-hl-line-sticky-flag' is non-nil.")
 
 (defgroup hl-line nil
   "Highlight the current line."
   :version "21.1"
   :group 'convenience)
 
-(defface hl-line '((t :inherit highlight :extend t))
-  "Default face for highlighting the current line in hl-line-mode."
+(defface hl-line
+  '((t :inherit highlight :extend t))
+  "Default face for highlighting the current line in Hl-Line mode."
   :version "22.1"
   :group 'hl-line)
 
@@ -69,77 +87,204 @@ hl-line-face
 	 (set symbol value)
 	 (dolist (buffer (buffer-list))
 	   (with-current-buffer buffer
-	     (when hl-line--overlay
-	       (overlay-put hl-line--overlay 'face hl-line-face))))))
+	     (when (overlayp hl-line-overlay)
+	       (overlay-put hl-line-overlay 'face hl-line-face))))
+	 (when (overlayp global-hl-line-overlay)
+	   (overlay-put global-hl-line-overlay 'face hl-line-face))))
 
 (defcustom hl-line-sticky-flag t
-  "Non-nil to preserve highlighting overlay when focus leaves window."
+  "Non-nil means the HL-Line mode highlight appears in all windows.
+Otherwise Hl-Line mode will highlight only in the selected
+window.  Setting this variable takes effect the next time you use
+the command `hl-line-mode' to turn Hl-Line mode on.
+
+This variable has no effect in Global Highlight Line mode.
+For that, use `global-hl-line-sticky-flag'."
   :type 'boolean
   :version "22.1"
-  :group 'hl-line
-  :initialize #'custom-initialize-default
-  :set (lambda (symbol value)
-         (set-default symbol value)
-         (unless value
-           (let ((selected (window-buffer (selected-window))))
-             (dolist (buffer (buffer-list))
-               (unless (eq buffer selected)
-                 (with-current-buffer buffer
-                   (hl-line-unhighlight))))))))
+  :group 'hl-line)
+
+(defcustom global-hl-line-sticky-flag nil
+  "Non-nil means the Global HL-Line mode highlight appears in all windows.
+Otherwise Global Hl-Line mode will highlight only in the selected
+window.  Setting this variable takes effect the next time you use
+the command `global-hl-line-mode' to turn Global Hl-Line mode on."
+  :type 'boolean
+  :version "24.1"
+  :group 'hl-line)
+
+(defvar hl-line-range-function nil
+  "If non-nil, function to call to return highlight range.
+The function of no args should return a cons cell; its car value
+is the beginning position of highlight and its cdr value is the
+end position of highlight in the buffer.
+It should return nil if there's no region to be highlighted.
+
+This variable is expected to be made buffer-local by modes.")
+
+(defvar hl-line-overlay-buffer nil
+  "Most recently visited buffer in which Hl-Line mode is enabled.")
 
 (defcustom hl-line-overlay-priority -50
   "Priority used on the overlay used by hl-line."
   :type 'integer
-  :version "22.1"
-  :group 'hl-line)
-
-(defcustom hl-line-highlight-hook nil
-  "After hook for `hl-line-highlight'.
-Currently used in calendar/todo-mode."
-  :type 'hook
+  :version "28.1"
   :group 'hl-line)
 
 ;;;###autoload
 (define-minor-mode hl-line-mode
-  "Toggle highlighting of the current line."
+  "Toggle highlighting of the current line (Hl-Line mode).
+
+Hl-Line mode is a buffer-local minor mode.  If
+`hl-line-sticky-flag' is non-nil, Hl-Line mode highlights the
+line about the buffer's point in all windows.  Caveat: the
+buffer's point might be different from the point of a
+non-selected window.  Hl-Line mode uses the function
+`hl-line-highlight' on `post-command-hook' in this case.
+
+When `hl-line-sticky-flag' is nil, Hl-Line mode highlights the
+line about point in the selected window only."
   :group 'hl-line
   (if hl-line-mode
       (progn
-        (hl-line-highlight)
+        ;; In case `kill-all-local-variables' is called.
         (add-hook 'change-major-mode-hook #'hl-line-unhighlight nil t)
+        (hl-line-highlight)
+        (setq hl-line-overlay-buffer (current-buffer))
 	(add-hook 'post-command-hook #'hl-line-highlight nil t))
     (remove-hook 'post-command-hook #'hl-line-highlight t)
-    (remove-hook 'change-major-mode-hook #'hl-line-unhighlight t)
+    (hl-line-unhighlight)
+    (remove-hook 'change-major-mode-hook #'hl-line-unhighlight t)))
+
+(defun hl-line-make-overlay ()
+  (let ((ol (make-overlay (point) (point))))
+    (overlay-put ol 'priority hl-line-overlay-priority) ;(bug#16192)
+    (overlay-put ol 'face hl-line-face)
+    ol))
+
+(defun hl-line-highlight ()
+  "Activate the Hl-Line overlay on the current line."
+  (if hl-line-mode	; Might be changed outside the mode function.
+      (progn
+        (unless (overlayp hl-line-overlay)
+          (setq hl-line-overlay (hl-line-make-overlay))) ; To be moved.
+        (overlay-put hl-line-overlay
+                     'window (unless hl-line-sticky-flag (selected-window)))
+	(hl-line-move hl-line-overlay)
+        (hl-line-maybe-unhighlight))
     (hl-line-unhighlight)))
 
 (defun hl-line-unhighlight ()
-  (when hl-line--overlay
-    (delete-overlay hl-line--overlay)
-    (setq hl-line--overlay nil)))
+  "Deactivate the Hl-Line overlay on the current line."
+  (when (overlayp hl-line-overlay)
+    (delete-overlay hl-line-overlay)
+    (setq hl-line-overlay nil)))
 
-(defun hl-line-highlight ()
-  (unless (minibufferp)
-    (unless hl-line--overlay
-      (setq hl-line--overlay
-            (let ((ol (make-overlay (point) (point))))
-              (prog1 ol
-                (overlay-put ol 'priority hl-line-overlay-priority)
-                (overlay-put ol 'face hl-line-face)))))
-    (move-overlay hl-line--overlay
-                  (line-beginning-position)
-                  (line-beginning-position 2))
-    (when (and (not (eq hl-line--buffer (current-buffer)))
+(defun hl-line-maybe-unhighlight ()
+  "Maybe deactivate the Hl-Line overlay on the current line.
+Specifically, when `hl-line-sticky-flag' is nil deactivate all
+such overlays in all buffers except the current one."
+  (let ((hlob hl-line-overlay-buffer)
+        (curbuf (current-buffer)))
+    (when (and (buffer-live-p hlob)
                (not hl-line-sticky-flag)
-               (buffer-live-p hl-line--buffer))
-      (with-current-buffer hl-line--buffer
+               (not (eq curbuf hlob))
+               (not (minibufferp)))
+      (with-current-buffer hlob
         (hl-line-unhighlight)))
-    (setq hl-line--buffer (current-buffer))
-    (run-hooks 'hl-line-highlight-hook)))
+    (when (and (overlayp hl-line-overlay)
+               (eq (overlay-buffer hl-line-overlay) curbuf))
+      (setq hl-line-overlay-buffer curbuf))))
+
+;;;###autoload
+(define-minor-mode global-hl-line-mode
+  "Toggle line highlighting in all buffers (Global Hl-Line mode).
+
+If `global-hl-line-sticky-flag' is non-nil, Global Hl-Line mode
+highlights the line about the current buffer's point in all live
+windows.
+
+Global-Hl-Line mode uses the function `global-hl-line-highlight'
+on `post-command-hook'."
+  :global t
+  :group 'hl-line
+  (if global-hl-line-mode
+      (progn
+        ;; In case `kill-all-local-variables' is called.
+        (add-hook 'change-major-mode-hook #'global-hl-line-unhighlight)
+        (global-hl-line-highlight-all)
+	(add-hook 'post-command-hook #'global-hl-line-highlight))
+    (global-hl-line-unhighlight-all)
+    (remove-hook 'post-command-hook #'global-hl-line-highlight)
+    (remove-hook 'change-major-mode-hook #'global-hl-line-unhighlight)))
+
+(defun global-hl-line-highlight ()
+  "Highlight the current line in the current window."
+  (when global-hl-line-mode	; Might be changed outside the mode function.
+    (unless (window-minibuffer-p)
+      (unless (overlayp global-hl-line-overlay)
+        (setq global-hl-line-overlay (hl-line-make-overlay))) ; To be moved.
+      (unless (member global-hl-line-overlay global-hl-line-overlays)
+	(push global-hl-line-overlay global-hl-line-overlays))
+      (overlay-put global-hl-line-overlay 'window
+		   (unless global-hl-line-sticky-flag
+		     (selected-window)))
+      (hl-line-move global-hl-line-overlay)
+      (global-hl-line-maybe-unhighlight))))
+
+(defun global-hl-line-highlight-all ()
+  "Highlight the current line in all live windows."
+  (walk-windows (lambda (w)
+                  (with-current-buffer (window-buffer w)
+                    (global-hl-line-highlight)))
+                nil t))
+
+(defun global-hl-line-unhighlight ()
+  "Deactivate the Global-Hl-Line overlay on the current line."
+  (when (overlayp global-hl-line-overlay)
+    (delete-overlay global-hl-line-overlay)
+    (setq global-hl-line-overlay nil)))
 
-(defun hl-line-turn-on ()
-  (unless (minibufferp)
-    (let (inhibit-quit)
-      (hl-line-mode 1))))
+(defun global-hl-line-maybe-unhighlight ()
+  "Maybe deactivate the Global-Hl-Line overlay on the current line.
+Specifically, when `global-hl-line-sticky-flag' is nil deactivate
+all such overlays in all buffers except the current one."
+  (mapc (lambda (ov)
+	  (let ((ovb (overlay-buffer ov)))
+            (when (and (not global-hl-line-sticky-flag)
+                       (bufferp ovb)
+                       (not (eq ovb (current-buffer)))
+                       (not (minibufferp)))
+	      (with-current-buffer ovb
+                (global-hl-line-unhighlight)))))
+        global-hl-line-overlays))
+
+(defun global-hl-line-unhighlight-all ()
+  "Deactivate all Global-Hl-Line overlays."
+  (mapc (lambda (ov)
+	  (let ((ovb (overlay-buffer ov)))
+	    (when (bufferp ovb)
+		(with-current-buffer ovb
+		  (global-hl-line-unhighlight)))))
+	global-hl-line-overlays)
+  (setq global-hl-line-overlays nil))
+
+(defun hl-line-move (overlay)
+  "Move the Hl-Line overlay.
+If `hl-line-range-function' is non-nil, move the OVERLAY to the position
+where the function returns.  If `hl-line-range-function' is nil, fill
+the line including the point by OVERLAY."
+  (let (tmp b e)
+    (if hl-line-range-function
+	(setq tmp (funcall hl-line-range-function)
+	      b   (car tmp)
+	      e   (cdr tmp))
+      (setq tmp t
+	    b (line-beginning-position)
+	    e (line-beginning-position 2)))
+    (if tmp
+	(move-overlay overlay b e)
+      (move-overlay overlay 1 1))))
 
 (defun hl-line-unload-function ()
   "Unload the Hl-Line library."
@@ -151,12 +296,6 @@ hl-line-unload-function
   ;; continue standard unloading
   nil)
 
-;;;###autoload
-(define-globalized-minor-mode global-hl-line-mode
-  hl-line-mode hl-line-turn-on
-  :group 'hl-line
-  :version "29.1")
-
 (provide 'hl-line)
 
 ;;; hl-line.el ends here





^ permalink raw reply related	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-23  8:48     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-03-23 11:35       ` dick
  2022-03-23 11:55       ` Lars Ingebrigtsen
  2022-03-23 13:02       ` Eli Zaretskii
  2 siblings, 0 replies; 23+ messages in thread
From: dick @ 2022-03-23 11:35 UTC (permalink / raw)
  To: Po Lu; +Cc: Lars Ingebrigtsen, 54481

> So how about this to get us back to where we were, with the one real
> improvement of `hl-line-overlay-priority' being made a defcustom?

You hold all the cards, sir.  Nothing in the past has prevented you from
unilaterally quashing my changes.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-23  8:48     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-03-23 11:35       ` dick
@ 2022-03-23 11:55       ` Lars Ingebrigtsen
  2022-03-23 13:02       ` Eli Zaretskii
  2 siblings, 0 replies; 23+ messages in thread
From: Lars Ingebrigtsen @ 2022-03-23 11:55 UTC (permalink / raw)
  To: Po Lu; +Cc: 54481, dick

Po Lu <luangruo@yahoo.com> writes:

> So how about this to get us back to where we were, with the one real
> improvement of `hl-line-overlay-priority' being made a defcustom?

Yeah, I guess so.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-23  8:48     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-03-23 11:35       ` dick
  2022-03-23 11:55       ` Lars Ingebrigtsen
@ 2022-03-23 13:02       ` Eli Zaretskii
  2 siblings, 0 replies; 23+ messages in thread
From: Eli Zaretskii @ 2022-03-23 13:02 UTC (permalink / raw)
  To: Po Lu; +Cc: larsi, 54481, dick.r.chiang

> Cc: 54481@debbugs.gnu.org, dick <dick.r.chiang@gmail.com>
> Date: Wed, 23 Mar 2022 16:48:21 +0800
> From:  Po Lu via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
> 
> +(defun hl-line-move (overlay)
> +  "Move the Hl-Line overlay.
> +If `hl-line-range-function' is non-nil, move the OVERLAY to the position
> +where the function returns.  If `hl-line-range-function' is nil, fill
   ^^^^^
Not "where", "which".  "Position where the function returns" might be
easily misinterpreted.

Thanks.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-23  2:21       ` Michael Heerdegen
@ 2022-03-24  3:23         ` Michael Heerdegen
  2022-03-24  3:39           ` Michael Heerdegen
  0 siblings, 1 reply; 23+ messages in thread
From: Michael Heerdegen @ 2022-03-24  3:23 UTC (permalink / raw)
  To: dick; +Cc: Lars Ingebrigtsen, 54481

Michael Heerdegen <michael_heerdegen@web.de> writes:

> Anyway, you were able to fix it nonetheless, thank you.

Seems it is broken again.  Who was it this time?


TIA,

Michael.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-24  3:23         ` Michael Heerdegen
@ 2022-03-24  3:39           ` Michael Heerdegen
  2022-03-24  3:53             ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 23+ messages in thread
From: Michael Heerdegen @ 2022-03-24  3:39 UTC (permalink / raw)
  To: luangruo; +Cc: Lars Ingebrigtsen, 54481, dick

Michael Heerdegen <michael_heerdegen@web.de> writes:

> Seems it is broken again.  Who was it this time?

I think it was:

5811741eda "Fix hl-line tests", Po Lu <luangruo@yahoo.com> 2022-03-23

Michael.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-24  3:39           ` Michael Heerdegen
@ 2022-03-24  3:53             ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-03-24  4:42               ` Michael Heerdegen
  0 siblings, 1 reply; 23+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-03-24  3:53 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: Lars Ingebrigtsen, 54481, dick

Michael Heerdegen <michael_heerdegen@web.de> writes:

>> Seems it is broken again.  Who was it this time?

I think the context got lost in the spam filter.
Could you please forward a copy of the message you replied to?





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-24  3:53             ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-03-24  4:42               ` Michael Heerdegen
  2022-03-24  4:55                 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 23+ messages in thread
From: Michael Heerdegen @ 2022-03-24  4:42 UTC (permalink / raw)
  To: 54481; +Cc: luangruo, larsi, dick.r.chiang

Po Lu via "Bug reports for GNU Emacs, the Swiss army knife of text
editors" <bug-gnu-emacs@gnu.org> writes:

> I think the context got lost in the spam filter.
> Could you please forward a copy of the message you replied to?

Your commit 5811741eda "Fix hl-line tests" reintroduced the "void
function hl-line-unhighlight" bug for me.  You restored the problematic
setter.  What we have now is not really the original state.  Was this
intended?

Michael.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-24  4:42               ` Michael Heerdegen
@ 2022-03-24  4:55                 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-03-24  5:13                   ` Michael Heerdegen
  0 siblings, 1 reply; 23+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-03-24  4:55 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: Lars Ingebrigtsen, 54481, dick

Michael Heerdegen <michael_heerdegen@web.de> writes:

> Your commit 5811741eda "Fix hl-line tests" reintroduced the "void
> function hl-line-unhighlight" bug for me.  You restored the problematic
> setter.  What we have now is not really the original state.  Was this
> intended?

I put it in to fix the hl-line tests.  That setter did not exist in the
Emacs 28 hl-line code.  Can you show me how to reproduce the bug you're
experiencing?

Thanks.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-24  4:55                 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-03-24  5:13                   ` Michael Heerdegen
  2022-03-24  5:51                     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 23+ messages in thread
From: Michael Heerdegen @ 2022-03-24  5:13 UTC (permalink / raw)
  To: 54481; +Cc: luangruo, larsi, dick.r.chiang

Po Lu via "Bug reports for GNU Emacs, the Swiss army knife of text
editors" <bug-gnu-emacs@gnu.org> writes:

> I put it in to fix the hl-line tests.  That setter did not exist in the
> Emacs 28 hl-line code.  Can you show me how to reproduce the bug you're
> experiencing?

Same recipe as the last time (from dick) works again:

src/emacs -Q -nw --eval "(setq debug-on-error t)" --eval
"(custom-set-variables '(hl-line-sticky-flag nil))" -f
global-hl-line-mode

Michael.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-24  5:13                   ` Michael Heerdegen
@ 2022-03-24  5:51                     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-03-25  3:45                       ` Michael Heerdegen
  0 siblings, 1 reply; 23+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-03-24  5:51 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: Lars Ingebrigtsen, 54481, dick

Michael Heerdegen <michael_heerdegen@web.de> writes:

> Po Lu via "Bug reports for GNU Emacs, the Swiss army knife of text
> editors" <bug-gnu-emacs@gnu.org> writes:
>
>> I put it in to fix the hl-line tests.  That setter did not exist in the
>> Emacs 28 hl-line code.  Can you show me how to reproduce the bug you're
>> experiencing?
>
> Same recipe as the last time (from dick) works again:
>
> src/emacs -Q -nw --eval "(setq debug-on-error t)" --eval
> "(custom-set-variables '(hl-line-sticky-flag nil))" -f
> global-hl-line-mode
>
> Michael.

Should be fixed now.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#54481: 29.0.50; [PATCH] Rewrite hl-line
  2022-03-24  5:51                     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-03-25  3:45                       ` Michael Heerdegen
  0 siblings, 0 replies; 23+ messages in thread
From: Michael Heerdegen @ 2022-03-25  3:45 UTC (permalink / raw)
  To: Po Lu; +Cc: Lars Ingebrigtsen, 54481, dick

Po Lu <luangruo@yahoo.com> writes:

> Should be fixed now.

Confirmed - thanks.

Michael.





^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2022-03-25  3:45 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-03-20 15:52 bug#54481: 29.0.50; [PATCH] Rewrite hl-line dick
2022-03-21 15:09 ` Lars Ingebrigtsen
2022-03-22  0:25   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-03-23  8:48     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-03-23 11:35       ` dick
2022-03-23 11:55       ` Lars Ingebrigtsen
2022-03-23 13:02       ` Eli Zaretskii
2022-03-22  3:13 ` Michael Heerdegen
2022-03-22 14:12   ` dick
2022-03-22 14:12   ` dick
2022-03-22 14:59     ` Lars Ingebrigtsen
2022-03-22 14:14   ` Lars Ingebrigtsen
2022-03-22 14:24     ` dick
2022-03-22 14:35       ` Lars Ingebrigtsen
2022-03-23  2:21       ` Michael Heerdegen
2022-03-24  3:23         ` Michael Heerdegen
2022-03-24  3:39           ` Michael Heerdegen
2022-03-24  3:53             ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-03-24  4:42               ` Michael Heerdegen
2022-03-24  4:55                 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-03-24  5:13                   ` Michael Heerdegen
2022-03-24  5:51                     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-03-25  3:45                       ` Michael Heerdegen

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).