;;; diff-hl-margin.el --- Highlight buffer changes on margins -*- lexical-binding: t -*-
-;; Copyright (C) 2012-2013 Free Software Foundation, Inc.
+;; Copyright (C) 2012-2015 Free Software Foundation, Inc.
;; This file is part of GNU Emacs.
;;; Commentary:
-;; This is a global mode, it modified `diff-hl-mode' to use the margin
+;; This is a global mode, it modifies `diff-hl-mode' to use the margin
;; instead of the fringe. To toggle, type `M-x diff-hl-margin-mode'.
;;
;; Compared to the default behavior, this makes `diff-hl-mode'
;;
;; (unless (window-system) (diff-hl-margin-mode))
+(require 'cl-lib)
(require 'diff-hl)
(require 'diff-hl-dired)
"Highlight buffer changes on margin"
:group 'diff-hl)
-(defcustom diff-hl-margin-side 'left
- "Which margin to use for indicators."
- :type '(choice (const left)
- (const right))
- :set (lambda (var value)
- (let ((on diff-hl-margin-mode))
- (when on (diff-hl-margin-mode -1))
- (set-default var value)
- (when on (diff-hl-margin-mode 1)))))
-
;;;###autoload
(define-minor-mode diff-hl-margin-mode
"Toggle displaying `diff-hl-mode' highlights on the margin."
:lighter "" :global t
- (let ((width-var (intern (format "%s-margin-width" diff-hl-margin-side))))
- (if diff-hl-margin-mode
- (progn
- (setq diff-hl-margin-old-highlight-function diff-hl-highlight-function
- diff-hl-highlight-function 'diff-hl-highlight-on-margin)
- (set-default width-var 1))
- (setq diff-hl-highlight-function diff-hl-margin-old-highlight-function
- diff-hl-margin-old-highlight-function nil)
- (set-default width-var 0)))
- (dolist (buffer (buffer-list))
- (with-current-buffer buffer
+ (if diff-hl-margin-mode
+ (progn
+ (add-hook 'diff-hl-mode-on-hook 'diff-hl-margin-minor-mode)
+ (add-hook 'diff-hl-mode-off-hook 'diff-hl-margin-minor-mode-off)
+ (add-hook 'diff-hl-dired-mode-on-hook 'diff-hl-margin-minor-mode)
+ (add-hook 'diff-hl-dired-mode-off-hook 'diff-hl-margin-minor-mode-off))
+ (remove-hook 'diff-hl-mode-on-hook 'diff-hl-margin-minor-mode)
+ (remove-hook 'diff-hl-mode-off-hook 'diff-hl-margin-minor-mode-off)
+ (remove-hook 'diff-hl-dired-mode-on-hook 'diff-hl-margin-minor-mode)
+ (remove-hook 'diff-hl-dired-mode-off-hook 'diff-hl-margin-minor-mode-off))
+ (dolist (buf (buffer-list))
+ (with-current-buffer buf
(cond
(diff-hl-mode
+ (diff-hl-margin-minor-mode (if diff-hl-margin-mode 1 -1))
(diff-hl-update))
(diff-hl-dired-mode
- (diff-hl-dired-update)))))
- (walk-windows (lambda (win) (set-window-buffer win (window-buffer win)))))
+ (diff-hl-margin-minor-mode (if diff-hl-margin-mode 1 -1))
+ (diff-hl-dired-update))))))
+
+(define-minor-mode diff-hl-margin-minor-mode
+ "Toggle displaying `diff-hl-mode' highlights on the margin locally.
+You probably shouldn't use this function directly."
+ :lighter ""
+ (let ((width-var (intern (format "%s-margin-width" diff-hl-side))))
+ (if diff-hl-margin-minor-mode
+ (progn
+ (set (make-local-variable 'diff-hl-margin-old-highlight-function)
+ diff-hl-highlight-function)
+ (set (make-local-variable 'diff-hl-highlight-function)
+ 'diff-hl-highlight-on-margin)
+ (set width-var 1))
+ (setq diff-hl-highlight-function diff-hl-margin-old-highlight-function
+ diff-hl-margin-old-highlight-function nil)
+ (set width-var 0)))
+ (dolist (win (get-buffer-window-list))
+ (set-window-buffer win (current-buffer))))
+
+(define-obsolete-variable-alias 'diff-hl-margin-side 'diff-hl-side "1.7.1")
+
+(defun diff-hl-margin-minor-mode-off ()
+ (diff-hl-margin-minor-mode -1))
(defvar diff-hl-margin-spec-cache
- (loop for (type . char) in '((insert . "+") (delete . "-")
- (change . "|") (unknown . "?"))
+ (cl-loop for (type . char) in '((insert . "+") (delete . "-")
+ (change . "!") (unknown . "?")
+ (ignored . "i"))
nconc
- (loop for side in '(left right)
- collect
- (cons (cons type side)
- (propertize
- " " 'display
- `((margin ,(intern (format "%s-margin" side)))
- ,(propertize char 'face
- (intern (format "diff-hl-%s" type)))))))))
+ (cl-loop for side in '(left right)
+ collect
+ (cons (cons type side)
+ (propertize
+ " " 'display
+ `((margin ,(intern (format "%s-margin" side)))
+ ,(propertize char 'face
+ (intern (format "diff-hl-%s" type)))))))))
(defun diff-hl-highlight-on-margin (ovl type _shape)
- (let ((spec (cdr (assoc (cons type diff-hl-margin-side)
+ (let ((spec (cdr (assoc (cons type diff-hl-side)
diff-hl-margin-spec-cache))))
(overlay-put ovl 'before-string spec)))