-;;; diff-hl.el --- Highlight uncommitted changes -*- lexical-binding: t -*-
+;;; diff-hl.el --- Highlight uncommitted changes using VC -*- lexical-binding: t -*-
-;; Copyright (C) 2012-2015 Free Software Foundation, Inc.
+;; Copyright (C) 2012-2016 Free Software Foundation, Inc.
;; Author: Dmitry Gutov <dgutov@yandex.ru>
;; URL: https://github.com/dgutov/diff-hl
;; Keywords: vc, diff
-;; Version: 1.7.1
+;; Version: 1.8.2
;; Package-Requires: ((cl-lib "0.2"))
;; This file is part of GNU Emacs.
'((vc-disable-async-diff t))))
,body))
+(defun diff-hl-modified-p (state)
+ (or (eq state 'edited)
+ (and (eq state 'up-to-date)
+ ;; VC state is stale in after-revert-hook.
+ (or revert-buffer-in-progress-p
+ ;; Diffing against an older revision.
+ diff-hl-reference-revision))))
+
+(defun diff-hl-changes-buffer (file backend)
+ (let ((buf-name " *diff-hl* "))
+ (diff-hl-with-diff-switches
+ (vc-call-backend backend 'diff (list file)
+ diff-hl-reference-revision nil
+ buf-name))
+ buf-name))
+
(defun diff-hl-changes ()
(let* ((file buffer-file-name)
(backend (vc-backend file)))
(when backend
(let ((state (vc-state file backend)))
(cond
- ((or (eq state 'edited)
- (and (eq state 'up-to-date)
- ;; VC state is stale in after-revert-hook.
- (or revert-buffer-in-progress-p
- ;; Diffing against an older revision.
- diff-hl-reference-revision)))
- (let* ((buf-name " *diff-hl* ")
- diff-auto-refine-mode
- res)
- (diff-hl-with-diff-switches
- (vc-call-backend backend 'diff (list file)
- diff-hl-reference-revision nil
- buf-name))
- (with-current-buffer buf-name
+ ((diff-hl-modified-p state)
+ (let* (diff-auto-refine-mode res)
+ (with-current-buffer (diff-hl-changes-buffer file backend)
(goto-char (point-min))
(unless (eobp)
(ignore-errors
(let ((hunk-beg (point)))
(while (cl-plusp len)
(diff-hl-add-highlighting
- type
+ type
(cond
((not diff-hl-draw-borders) 'empty)
((and (= len 1) (= line current-line)) 'single)
(when (eobp)
(with-current-buffer ,buffer (diff-hl-remove-overlays))
(error "Buffer is up-to-date"))
- (diff-hl-diff-skip-to ,line)
+ (let (diff-auto-refine-mode)
+ (diff-hl-diff-skip-to ,line))
(save-excursion
(while (looking-at "[-+]") (forward-line 1))
(setq end-line (line-number-at-pos (point)))
(if (>= wbh (- end-line beg-line))
(recenter (/ (+ wbh (- beg-line end-line) 2) 2))
(recenter 1)))
+ (when diff-auto-refine-mode
+ (diff-refine-hunk))
(unless (yes-or-no-p (format "Revert current hunk in %s?"
,(cl-caadr fileset)))
(error "Revert canceled"))
(with-current-buffer ,buffer
(save-buffer))
(message "Hunk reverted"))))
- (quit-windows-on diff-buffer))))
+ (quit-windows-on diff-buffer t))))
(defun diff-hl-hunk-overlay-at (pos)
(cl-loop for o in (overlays-in pos (1+ pos))
(interactive)
(diff-hl-next-hunk t))
-(define-prefix-command 'diff-hl-command-map)
-
-(let ((map diff-hl-command-map))
- (define-key map "n" 'diff-hl-revert-hunk)
- (define-key map "[" 'diff-hl-previous-hunk)
- (define-key map "]" 'diff-hl-next-hunk)
- map)
+(defvar diff-hl-command-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map "n" 'diff-hl-revert-hunk)
+ (define-key map "[" 'diff-hl-previous-hunk)
+ (define-key map "]" 'diff-hl-next-hunk)
+ map))
+(fset 'diff-hl-command-map diff-hl-command-map)
;;;###autoload
(define-minor-mode diff-hl-mode