+2014-01-06 Bastien Guerry <bzg@gnu.org>
+
+ * hl-line.el (global-hl-line-overlay): Make a local variable.
+ (global-hl-line-overlays): New variable to store all overlays.
+ (global-hl-line-mode): Don't delete overlays from the current
+ buffer when `global-hl-line-sticky-flag' is non-nil.
+ (global-hl-line-highlight): Add new overlays to
+ `global-hl-line-overlays'.
+ (global-hl-line-unhighlight-all): New function to delete all
+ overlays when turning off `global-hl-line-mode'.
+ This fixes Bug#16183.
+
2014-01-06 Stefan Monnier <monnier@iro.umontreal.ca>
* subr.el (set-transient-map): Fix nested case and docstring.
(defvar-local hl-line-overlay nil
"Overlay used by Hl-Line mode to highlight the current line.")
-(defvar global-hl-line-overlay nil
+(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"
:group 'hl-line
(if global-hl-line-mode
(progn
- (add-hook 'pre-command-hook #'global-hl-line-unhighlight)
+ ;; In case `kill-all-local-variables' is called.
+ (add-hook 'change-major-mode-hook #'global-hl-line-unhighlight)
+ (if global-hl-line-sticky-flag
+ (remove-hook 'pre-command-hook #'global-hl-line-unhighlight)
+ (add-hook 'pre-command-hook #'global-hl-line-unhighlight))
+ (global-hl-line-highlight)
(add-hook 'post-command-hook #'global-hl-line-highlight))
- (global-hl-line-unhighlight)
+ (global-hl-line-unhighlight-all)
(remove-hook 'pre-command-hook #'global-hl-line-unhighlight)
(remove-hook 'post-command-hook #'global-hl-line-highlight)))
(unless (window-minibuffer-p)
(unless 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)))
(when global-hl-line-overlay
(delete-overlay global-hl-line-overlay)))
+(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