From 6ac1f8ca0304a4856fa6223ff6f6b6fa73e0cfd3 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Tue, 11 Dec 2012 13:51:27 -0500 Subject: [PATCH] * lisp/hilit-chg.el (highlight-save-buffer-state): Delete. Use with-silent-modifications instead. (hilit-chg-set-face-on-change): Only fixup the text that's modified. --- lisp/ChangeLog | 4 +++ lisp/hilit-chg.el | 88 +++++++++++++++++++++++-------------------------------- 2 files changed, 40 insertions(+), 52 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index af21ab68606..b78aad8baff 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,9 @@ 2012-12-11 Stefan Monnier + * hilit-chg.el (highlight-save-buffer-state): Delete. + Use with-silent-modifications instead. + (hilit-chg-set-face-on-change): Only fixup the text that's modified. + * button.el: Handle buttons in display text-properties. (button--area-button-p, button--area-button-string): Use (STRING . STRING-POS) representation instead of just STRING. diff --git a/lisp/hilit-chg.el b/lisp/hilit-chg.el index 7b5e2b54300..8660f876bfa 100644 --- a/lisp/hilit-chg.el +++ b/lisp/hilit-chg.el @@ -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,40 +552,40 @@ 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 - (if (and (= beg end) (> leng-before 0)) - ;; deletion - (progn - ;; The eolp and bolp tests are a kludge! But they prevent - ;; rather nasty looking displays when deleting text at the end - ;; of line, such as normal corrections as one is typing and - ;; immediately makes a correction, and when deleting first - ;; character of a line. - ;; (if (= leng-before 1) - ;; (if (eolp) - ;; (setq beg-decr 0 end-incr 0) - ;; (if (bolp) - ;; (setq beg-decr 0)))) - ;; (setq beg (max (- beg beg-decr) (point-min))) - (setq end (min (+ end end-incr) (point-max))) - (setq type 'hilit-chg-delete)) - ;; 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 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 beg (+ end 1)))))) - (unless no-property-change - (put-text-property beg end 'hilit-chg type)) - (if (or highlight-changes-visible-mode no-property-change) - (hilit-chg-make-ov type beg end))))))) + (with-silent-modifications + (if (and (= beg end) (> leng-before 0)) + ;; deletion + (progn + ;; The eolp and bolp tests are a kludge! But they prevent + ;; rather nasty looking displays when deleting text at the end + ;; of line, such as normal corrections as one is typing and + ;; immediately makes a correction, and when deleting first + ;; character of a line. + ;; (if (= leng-before 1) + ;; (if (eolp) + ;; (setq beg-decr 0 end-incr 0) + ;; (if (bolp) + ;; (setq beg-decr 0)))) + ;; (setq beg (max (- beg beg-decr) (point-min))) + (setq end (min (+ end end-incr) (point-max))) + (setq type 'hilit-chg-delete)) + ;; 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 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) + (hilit-chg-make-ov type beg end))))))) (defun hilit-chg-update () "Update a buffer's highlight changes when visibility changed." @@ -635,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) -- 2.11.4.GIT