]> code.delx.au - gnu-emacs/blobdiff - lisp/hilit-chg.el
Merge from emacs-24; up to 2012-12-06T01:39:03Z!monnier@iro.umontreal.ca
[gnu-emacs] / lisp / hilit-chg.el
index 0970ece9446a9a549722259b86da4e8953d41eb9..17b91245d609c9965d536d553841af75957b5b93 100644 (file)
@@ -1,6 +1,6 @@
 ;;; hilit-chg.el --- minor mode displaying buffer changes with special face
 
-;; Copyright (C) 1998, 2000-201 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 2000-2013 Free Software Foundation, Inc.
 
 ;; Author: Richard Sharman <rsharman@pobox.com>
 ;; Keywords: faces
@@ -523,28 +523,12 @@ the text properties of type `hilit-chg'."
   (remove-overlays beg end 'hilit-chg t)
   (hilit-chg-display-changes beg end))
 
-;; Inspired by font-lock.  Something like this should be moved to subr.el.
-(defmacro highlight-save-buffer-state (&rest body)
-  "Bind variables according to VARLIST and eval BODY restoring buffer state."
-  (declare (indent 0) (debug t))
-  (let ((modified (make-symbol "modified")))
-    `(let* ((,modified (buffer-modified-p))
-            (inhibit-modification-hooks t)
-            deactivate-mark
-            ;; So we don't check the file's mtime.
-            buffer-file-name
-            buffer-file-truename)
-       (progn
-         ,@body)
-       (unless ,modified
-         (restore-buffer-modified-p nil)))))
-
 ;;;###autoload
 (defun highlight-changes-remove-highlight (beg end)
   "Remove the change face from the region between BEG and END.
 This allows you to manually remove highlighting from uninteresting changes."
   (interactive "r")
-  (highlight-save-buffer-state
+  (with-silent-modifications
     (remove-text-properties beg end '(hilit-chg nil))
     (hilit-chg-fixup beg end)))
 
@@ -568,7 +552,7 @@ This allows you to manually remove highlighting from uninteresting changes."
          (if (and highlight-changes-mode
                   highlight-changes-visible-mode)
              (hilit-chg-fixup beg end))
-        (highlight-save-buffer-state
+        (with-silent-modifications
           (if (and (= beg end) (> leng-before 0))
               ;; deletion
               (progn
@@ -588,14 +572,16 @@ This allows you to manually remove highlighting from uninteresting changes."
             ;; Not a deletion.
             ;; Most of the time the following is not necessary, but
             ;; if the current text was marked as a deletion then
-            ;; the old overlay is still in effect, so if we add some
-            ;; text then remove the deletion marking, but set it to
-         ;; changed otherwise its highlighting disappears.
-         (if (eq (get-text-property end 'hilit-chg) 'hilit-chg-delete)
-             (progn
-               (put-text-property end (+ end 1) 'hilit-chg 'hilit-chg)
-               (if highlight-changes-visible-mode
-                   (hilit-chg-fixup beg (+ end 1))))))
+            ;; the old overlay is still in effect.  So if the user adds some
+            ;; text where she earlier deleted text, we have to remove the
+            ;; deletion marking, and replace it explicitly with a `changed'
+            ;; marking, otherwise its highlighting would disappear.
+            (if (eq (get-text-property end 'hilit-chg) 'hilit-chg-delete)
+                (save-restriction
+                  (widen)
+                  (put-text-property end (+ end 1) 'hilit-chg 'hilit-chg)
+                  (if highlight-changes-visible-mode
+                      (hilit-chg-fixup end (+ end 1))))))
           (unless no-property-change
             (put-text-property beg end 'hilit-chg type))
           (if (or highlight-changes-visible-mode no-property-change)
@@ -633,7 +619,7 @@ This removes all saved change information."
       (message "Cannot remove highlighting from read-only mode buffer %s"
               (buffer-name))
     (remove-hook 'after-change-functions 'hilit-chg-set-face-on-change t)
-    (highlight-save-buffer-state
+    (with-silent-modifications
       (hilit-chg-hide-changes)
       (hilit-chg-map-changes
        (lambda (_prop start stop)