X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/6e9ddbb313cf7db66550f93a74cbba12e39e93c0..455700d69a1a6861dc8c9b2ba19733429727d3c3:/lisp/hilit-chg.el diff --git a/lisp/hilit-chg.el b/lisp/hilit-chg.el index 0970ece944..1e4deb9353 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-2012 Free Software Foundation, Inc. +;; Copyright (C) 1998, 2000-2016 Free Software Foundation, Inc. ;; Author: Richard Sharman ;; Keywords: faces @@ -194,8 +194,6 @@ (t (:inverse-video t))) "Face used for highlighting changes." :group 'highlight-changes) -(define-obsolete-face-alias 'highlight-changes-face - 'highlight-changes "22.1") ;; This looks pretty ugly, actually. Maybe the underline should be removed. (defface highlight-changes-delete @@ -204,9 +202,6 @@ (t (:inverse-video t))) "Face used for highlighting deletions." :group 'highlight-changes) -(define-obsolete-face-alias 'highlight-changes-delete-face - 'highlight-changes-delete "22.1") - ;; A (not very good) default list of colors to rotate through. (define-obsolete-variable-alias 'highlight-changes-colours @@ -333,7 +328,7 @@ enable the mode if ARG is omitted or nil. When Highlight Changes is enabled, changes are marked with a text property. Normally they are displayed in a distinctive face, but -command \\[highlight-changes-visible-mode] can be used to toggles +command \\[highlight-changes-visible-mode] can be used to toggle this on and off. Other functions for buffers in this mode include: @@ -379,7 +374,7 @@ in a distinctive face. The default value can be customized with variable `highlight-changes-visibility-initial-state'. -This command does not itself set highlight-changes mode." +This command does not itself set Highlight Changes mode." t ;; init-value nil ;; lighter @@ -455,7 +450,7 @@ Otherwise, this list will be constructed when needed from "Call function FUNC for each region used by Highlight Changes mode. If START-POSITION is nil, (point-min) is used. If END-POSITION is nil, (point-max) is used. -FUNC is called with 3 params: PROPERTY START STOP." +FUNC is called with three params: PROPERTY START STOP." (let ((start (or start-position (point-min))) (limit (or end-position (point-max))) prop end) @@ -470,8 +465,8 @@ FUNC is called with 3 params: PROPERTY START STOP." (defun hilit-chg-display-changes (&optional beg end) "Display face information for Highlight Changes mode. -An overlay from BEG to END containing a change face is added from the -information in the text property of type `hilit-chg'. +An overlay from BEG to END containing a change face is added +from the information in the text property of type `hilit-chg'. This is the opposite of `hilit-chg-hide-changes'." (hilit-chg-map-changes 'hilit-chg-make-ov beg end)) @@ -523,28 +518,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 +547,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 +567,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 +614,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) @@ -745,7 +726,7 @@ You can automatically rotate colors when the buffer is saved by adding this function to `write-file-functions' as a buffer-local value. To do this, eval the following in the buffer to be saved: - \(add-hook 'write-file-functions 'highlight-changes-rotate-faces nil t)" + (add-hook \\='write-file-functions \\='highlight-changes-rotate-faces nil t)" (interactive) (when (and highlight-changes-mode highlight-changes-visible-mode) (let ((modified (buffer-modified-p)) @@ -796,7 +777,7 @@ is non-nil." a-start a-end len-a b-start b-end len-b (bufa-modified (buffer-modified-p buf-a)) - (bufb-modified (buffer-modified-p buf-b)) + (bufb-modified (and (not (eq buf-a buf-b)) (buffer-modified-p buf-b))) (buf-a-read-only (with-current-buffer buf-a buffer-read-only)) (buf-b-read-only (with-current-buffer buf-b buffer-read-only)) temp-a temp-b) @@ -874,7 +855,7 @@ changes are made, so \\[highlight-changes-next-change] and (get-buffer (read-buffer "buffer-a " (current-buffer) t)) (get-buffer (read-buffer "buffer-b " - (window-buffer (next-window (selected-window))) t)))) + (window-buffer (next-window)) t)))) (let ((file-a (buffer-file-name buf-a)) (file-b (buffer-file-name buf-b))) (highlight-markup-buffers buf-a file-a buf-b file-b) @@ -927,7 +908,7 @@ changes are made, so \\[highlight-changes-next-change] and (let (hilit-e hilit-x hilit-y) (ediff-setup buf-a file-a buf-b file-b nil nil ; buf-c file-C - 'hilit-chg-get-diff-list-hk + '(hilit-chg-get-diff-list-hk) (list (cons 'ediff-job-name 'something)) ) (ediff-with-current-buffer hilit-e (ediff-really-quit nil)) @@ -1036,6 +1017,12 @@ This is called when `global-highlight-changes-mode' is turned on." ;; ;; ================== end of debug =============== +(defun hilit-chg-unload-function () + "Unload the Highlight Changes library." + (global-hi-lock-mode -1) + ;; continue standard unloading + nil) + (provide 'hilit-chg) ;;; hilit-chg.el ends here