;;; hilit-chg.el --- minor mode displaying buffer changes with special face
-;; Copyright (C) 1998, 2000-2011 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 2000-2016 Free Software Foundation, Inc.
;; Author: Richard Sharman <rsharman@pobox.com>
;; Keywords: faces
(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
(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
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:
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
"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)
(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))
(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)))
(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
;; 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)
(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)
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))
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)
(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)
(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))
;;
;; ================== 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