X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/9898bd0e5b0e51ce9040e11ae25c9a07ec08eb4f..6ac1f8ca0304a4856fa6223ff6f6b6fa73e0cfd3:/lisp/hilit-chg.el diff --git a/lisp/hilit-chg.el b/lisp/hilit-chg.el index 0dee4157d7..8660f876bf 100644 --- a/lisp/hilit-chg.el +++ b/lisp/hilit-chg.el @@ -1,6 +1,6 @@ ;;; hilit-chg.el --- minor mode displaying buffer changes with special face -;; Copyright (C) 1998, 2000-2011 Free Software Foundation, Inc. +;; Copyright (C) 1998, 2000-2012 Free Software Foundation, Inc. ;; Author: Richard Sharman ;; Keywords: faces @@ -367,7 +367,7 @@ buffer with the contents of a file ;;;###autoload (define-minor-mode highlight-changes-visible-mode - "Toggle visiblility of highlighting due to Highlight Changes mode. + "Toggle visibility of highlighting due to Highlight Changes mode. With a prefix argument ARG, enable Highlight Changes Visible mode if ARG is positive, and disable it otherwise. If called from Lisp, enable the mode if ARG is omitted or nil. @@ -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)