]> git.eshelyaron.com Git - emacs.git/commitdiff
hl-line.el: Simplify
authorEshel Yaron <me@eshelyaron.com>
Sat, 19 Oct 2024 12:20:52 +0000 (14:20 +0200)
committerEshel Yaron <me@eshelyaron.com>
Sat, 19 Oct 2024 12:21:26 +0000 (14:21 +0200)
lisp/hl-line.el

index 2826477c7cadaa2242e7c698aa0a84a40acd40d1..87a750e8325d677fcbb7d1fed53431c078d2a176 100644 (file)
 (defvar-local hl-line-overlay nil
   "Overlay used by Hl-Line mode to highlight the current line.")
 
-(defvar-local global-hl-line-overlay nil
-  "Overlay used by Global-Hl-Line mode to highlight the current line.")
-
-(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"
@@ -88,18 +80,13 @@ when `global-hl-line-sticky-flag' is non-nil.")
         (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))))
+              (overlay-put 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'."
+the command `hl-line-mode' to turn Hl-Line mode on."
   :type 'boolean
   :version "22.1"
   :group 'hl-line
@@ -113,15 +100,6 @@ For that, use `global-hl-line-sticky-flag'."
                    (with-current-buffer buffer
                      (hl-line-unhighlight)))))))))
 
-(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
@@ -153,24 +131,14 @@ non-selected window.  Hl-Line mode uses the function
 
 When `hl-line-sticky-flag' is nil, Hl-Line mode highlights the
 line about point in the selected window only."
-  :group 'hl-line
-  ;; If the global mode is switched on, then `M-x hl-line-mode' should
-  ;; switch the mode off in this buffer.
-  (when (and global-hl-line-mode
-             (eq arg 'toggle))
-    (setq hl-line-mode nil)
-    (setq-local global-hl-line-mode nil)
-    (global-hl-line-unhighlight))
-  (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 '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)))
+  :lighter nil
+  :on
+  (setq hl-line-overlay-buffer (current-buffer))
+  (hl-line-highlight)
+  (add-hook 'post-command-hook #'hl-line-highlight nil t)
+  :off
+  (remove-hook 'post-command-hook #'hl-line-highlight t)
+  (hl-line-unhighlight))
 
 (defun hl-line-make-overlay ()
   (let ((ol (make-overlay (point) (point))))
@@ -180,15 +148,11 @@ line about point in the selected window only."
 
 (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)))
+  (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))
 
 (defun hl-line-unhighlight ()
   "Deactivate the Hl-Line overlay on the current line."
@@ -196,95 +160,6 @@ line about point in the selected window only."
     (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))))
-
-;;;###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 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
@@ -302,15 +177,19 @@ the line including the point by OVERLAY."
        (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)
+;;;###autoload
+(define-globalized-minor-mode global-hl-line-mode
+  hl-line-mode hl-line-mode
+  :predicate '(archive-mode
+               dired-mode
+               grep-mode
+               ibuffer-mode
+               log-view-mode
+               occur-mode
+               org-agenda-mode
+               proced-mode
+               tabulated-list-mode
+               tar-mode))
 
 (provide 'hl-line)