]> code.delx.au - gnu-emacs-elpa/commitdiff
DTRT after undo
authorDmitry Gutov <dgutov@yandex.ru>
Mon, 25 Jun 2012 12:15:53 +0000 (16:15 +0400)
committerDmitry Gutov <dgutov@yandex.ru>
Mon, 25 Jun 2012 12:15:53 +0000 (16:15 +0400)
diff-hl.el

index 187abcc3199b603bf6eb431095d6d0ced7fc0e55..57608843a7ce971ae4554460246642efe0db5c9f 100644 (file)
             (decf len)))))))\r
 \r
 (defun diff-hl-overlay-modified (ov after-p beg end &optional length)\r
+  ;; Do the simplest possible thing for now.\r
   (when after-p (delete-overlay ov)))\r
 \r
+(defvar diff-hl-timer nil)\r
+\r
+(defun diff-hl-edit (beg end len)\r
+  ;; DTRT when we've `undo'-ed the buffer into unmodified state.\r
+  (when undo-in-progress\r
+    (when diff-hl-timer\r
+      (cancel-timer diff-hl-timer))\r
+    (setq diff-hl-timer\r
+          (run-with-idle-timer 0.01 nil #'diff-hl-after-undo (current-buffer)))))\r
+\r
+(defun diff-hl-after-undo (buffer)\r
+  (with-current-buffer buffer\r
+    (unless (buffer-modified-p)\r
+      (diff-hl-update))))\r
+\r
 ;;;###autoload\r
 (define-minor-mode diff-hl-mode\r
   "Toggle display of vc diff indicators in the left margin."\r
   :after-hook (diff-hl-update)\r
   (if diff-hl-mode\r
-      (add-hook 'after-save-hook 'diff-hl-update nil t)\r
-    (remove-hook 'after-save-hook 'diff-hl-update t)))\r
+      (progn\r
+        (add-hook 'after-save-hook 'diff-hl-update nil t)\r
+        (add-hook 'after-change-functions 'diff-hl-edit nil t))\r
+    (remove-hook 'after-save-hook 'diff-hl-update t)\r
+    (remove-hook 'after-change-functions 'diff-hl-edit t)))\r
 \r
 (defun turn-on-diff-hl-mode ()\r
   (when (buffer-file-name)\r