;;; 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
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:
;;;###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.
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))
(defun hilit-chg-make-ov (prop start end)
(or prop
(error "hilit-chg-make-ov: prop is nil"))
- ;; For the region create overlays with a distincive face
+ ;; For the region create overlays with a distinctive face
;; and the text property 'hilit-chg.
(let ((ov (make-overlay start end))
(face (if (eq prop 'hilit-chg-delete)
(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))
(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)
;;
;; ================== 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