From 7c9277e8ff3786fba4d15ba5bc819d221a99c892 Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Sat, 19 Oct 2024 14:20:52 +0200 Subject: [PATCH] hl-line.el: Simplify --- lisp/hl-line.el | 177 ++++++++---------------------------------------- 1 file changed, 28 insertions(+), 149 deletions(-) diff --git a/lisp/hl-line.el b/lisp/hl-line.el index 2826477c7ca..87a750e8325 100644 --- a/lisp/hl-line.el +++ b/lisp/hl-line.el @@ -60,14 +60,6 @@ (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) -- 2.39.2