(defvar hl-line-overlay nil
"Overlay used by Hl-Line mode to highlight the current line.")
(make-variable-buffer-local 'hl-line-overlay)
(defvar global-hl-line-overlay nil
"Overlay used by Global-Hl-Line mode to highlight the current line.")
(defgroup hl-line nil
"Highlight the current line."
:version "21.1"
:group 'editing)
(defface hl-line
'((t :inherit highlight))
"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 hl-line-overlay
(overlay-put hl-line-overlay 'face hl-line-face))))
(when global-hl-line-overlay
(overlay-put global-hl-line-overlay 'face hl-line-face))))
(defcustom hl-line-sticky-flag t
"*Non-nil means highlight the current line 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."
:type 'boolean
:version "22.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.")
(define-minor-mode hl-line-mode
"Buffer-local minor mode to highlight the line about point.
With ARG, turn Hl-Line mode on if ARG is positive, off otherwise.
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. In this case, it
uses the function `hl-line-unhighlight' on `pre-command-hook' in
addition to `hl-line-highlight' on `post-command-hook'."
:group 'hl-line
(if hl-line-mode
(progn
(add-hook 'change-major-mode-hook #'hl-line-unhighlight nil t)
(if hl-line-sticky-flag
(remove-hook 'pre-command-hook #'hl-line-unhighlight t)
(add-hook 'pre-command-hook #'hl-line-unhighlight nil t))
(hl-line-highlight)
(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)
(remove-hook 'pre-command-hook #'hl-line-unhighlight t)))
(defun hl-line-highlight ()
"Activate the Hl-Line overlay on the current line."
(if hl-line-mode (progn
(unless hl-line-overlay
(setq hl-line-overlay (make-overlay 1 1)) (overlay-put hl-line-overlay 'face hl-line-face))
(overlay-put hl-line-overlay
'window (unless hl-line-sticky-flag (selected-window)))
(hl-line-move hl-line-overlay))
(hl-line-unhighlight)))
(defun hl-line-unhighlight ()
"Deactivate the Hl-Line overlay on the current line."
(if hl-line-overlay
(delete-overlay hl-line-overlay)))
(define-minor-mode global-hl-line-mode
"Global minor mode to highlight the line about point in the current window.
With ARG, turn Global-Hl-Line mode on if ARG is positive, off otherwise.
Global-Hl-Line mode uses the functions `global-hl-line-unhighlight' and
`global-hl-line-highlight' on `pre-command-hook' and `post-command-hook'."
:global t
:group 'hl-line
(if global-hl-line-mode
(progn
(add-hook 'pre-command-hook #'global-hl-line-unhighlight)
(add-hook 'post-command-hook #'global-hl-line-highlight))
(global-hl-line-unhighlight)
(remove-hook 'pre-command-hook #'global-hl-line-unhighlight)
(remove-hook 'post-command-hook #'global-hl-line-highlight)))
(defun global-hl-line-highlight ()
"Active the Global-Hl-Line overlay on the current line in the current window."
(when global-hl-line-mode (unless (window-minibuffer-p (selected-window))
(unless global-hl-line-overlay
(setq global-hl-line-overlay (make-overlay 1 1)) (overlay-put global-hl-line-overlay 'face hl-line-face))
(overlay-put global-hl-line-overlay 'window (selected-window))
(hl-line-move global-hl-line-overlay))))
(defun global-hl-line-unhighlight ()
"Deactivate the Global-Hl-Line overlay on the current line."
(if global-hl-line-overlay
(delete-overlay global-hl-line-overlay)))
(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))))
(provide 'hl-line)