(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"
(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
(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
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))))
(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."
(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
(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)