1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042 |
- (require 'wid-edit)
- (defgroup highlight-changes nil
- "Highlight Changes mode."
- :version "20.4"
- :group 'faces)
- (defface highlight-changes
- '((((min-colors 88) (class color)) (:foreground "red1"))
- (((class color)) (:foreground "red" ))
- (t (:inverse-video t)))
- "Face used for highlighting changes."
- :group 'highlight-changes)
- (define-obsolete-face-alias 'highlight-changes-face
- 'highlight-changes "22.1")
- (defface highlight-changes-delete
- '((((min-colors 88) (class color)) (:foreground "red1" :underline t))
- (((class color)) (:foreground "red" :underline t))
- (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")
- (define-obsolete-variable-alias 'highlight-changes-colours
- 'highlight-changes-colors "22.1")
- (defcustom highlight-changes-colors
- (if (eq (frame-parameter nil 'background-mode) 'light)
-
- '( "magenta" "blue" "darkgreen" "chocolate" "sienna4" "NavyBlue")
-
- '("yellow" "magenta" "blue" "maroon" "firebrick" "green4" "DarkOrchid"))
- "Colors used by `highlight-changes-rotate-faces'.
- The newest rotated change will be displayed in the first element of this list,
- the next older will be in the second element etc.
- This list is used if `highlight-changes-face-list' is nil, otherwise that
- variable overrides this list. If you only care about foreground
- colors then use this, if you want fancier faces then set
- `highlight-changes-face-list'."
- :type '(repeat color)
- :group 'highlight-changes)
- (define-obsolete-variable-alias 'highlight-changes-initial-state
- 'highlight-changes-visibility-initial-state "23.1")
- (defcustom highlight-changes-visibility-initial-state t
- "Controls whether changes are initially visible in Highlight Changes mode.
- This controls the initial value of `highlight-changes-visible-mode'.
- When a buffer is in Highlight Changes mode the function
- `highlight-changes-visible-mode' is used to toggle the mode on or off."
- :type 'boolean
- :group 'highlight-changes)
- (define-obsolete-variable-alias 'highlight-changes-active-string
- 'highlight-changes-visible-string "23.1")
- (defcustom highlight-changes-visible-string " +Chg"
- "The string used when in Highlight Changes mode and changes are visible.
- This should be set to nil if no indication is desired, or to
- a string with a leading space."
- :type '(choice string
- (const :tag "None" nil))
- :group 'highlight-changes)
- (define-obsolete-variable-alias 'highlight-changes-passive-string
- 'highlight-changes-invisible-string "23.1")
- (defcustom highlight-changes-invisible-string " -Chg"
- "The string used when in Highlight Changes mode and changes are hidden.
- This should be set to nil if no indication is desired, or to
- a string with a leading space."
- :type '(choice string
- (const :tag "None" nil))
- :group 'highlight-changes)
- (defcustom highlight-changes-global-modes t
- "Determine whether a buffer is suitable for global Highlight Changes mode.
- A function means call that function to decide: if it returns non-nil,
- the buffer is suitable.
- A list means the elements are major modes suitable for Highlight
- Changes mode, or a list whose first element is `not' followed by major
- modes which are not suitable.
- A value of t means the buffer is suitable if it is visiting a file and
- its name does not begin with ` ' or `*'.
- A value of nil means no buffers are suitable for `global-highlight-changes-mode'
- \(effectively disabling the mode).
- Example:
- (c-mode c++-mode)
- means that Highlight Changes mode is turned on for buffers in C and C++
- modes only."
- :type '(choice
- (const :tag "all non-special buffers visiting files" t)
- (set :menu-tag "specific modes" :tag "modes"
- :value (not)
- (const :tag "All except these" not)
- (repeat :tag "Modes" :inline t (symbol :tag "mode")))
- (function :menu-tag "determined by function"
- :value buffer-file-name)
- (const :tag "none" nil)
- )
- :group 'highlight-changes)
- (defcustom highlight-changes-global-changes-existing-buffers nil
- "If non-nil, toggling global Highlight Changes mode affects existing buffers.
- Normally, `global-highlight-changes' affects only new buffers (to be
- created). However, if `highlight-changes-global-changes-existing-buffers'
- is non-nil, then turning on `global-highlight-changes' will turn on
- Highlight Changes mode in suitable buffers, and turning the mode off will
- remove it from existing buffers."
- :type 'boolean
- :group 'highlight-changes)
- (defvar hilit-chg-list nil)
- (defvar hilit-chg-string " ??")
- (make-variable-buffer-local 'hilit-chg-string)
- (define-minor-mode highlight-changes-mode
- "Toggle highlighting changes in this buffer (Highlight Changes mode).
- With a prefix argument ARG, enable Highlight Changes mode if ARG
- is positive, and disable it otherwise. If called from Lisp,
- 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
- this on and off.
- Other functions for buffers in this mode include:
- \\[highlight-changes-next-change] - move point to beginning of next change
- \\[highlight-changes-previous-change] - move to beginning of previous change
- \\[highlight-changes-remove-highlight] - remove the change face from the region
- \\[highlight-changes-rotate-faces] - rotate different \"ages\" of changes
- through various faces.
- \\[highlight-compare-with-file] - mark text as changed by comparing this
- buffer with the contents of a file
- \\[highlight-compare-buffers] highlights differences between two buffers."
- nil
- hilit-chg-string
- nil
- (if (or (display-color-p)
- (and (fboundp 'x-display-grayscale-p) (x-display-grayscale-p)))
- (progn
- (if (and (eq this-command 'global-highlight-changes-mode)
- (not highlight-changes-global-changes-existing-buffers))
-
-
-
- (setq highlight-changes-mode (not highlight-changes-mode)))
- (if highlight-changes-mode
-
- (hilit-chg-set)
-
- (hilit-chg-clear)))
- (message "Highlight Changes mode requires color or grayscale display")))
- (define-minor-mode highlight-changes-visible-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.
- Highlight Changes Visible mode only has an effect when Highlight
- Changes mode is on. When enabled, the changed text is displayed
- 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."
- t
- nil
- nil
- (hilit-chg-update)
- )
- (defun hilit-chg-cust-fix-changes-face-list (w _wc &optional event)
-
-
-
-
-
-
-
- (let ((old-list (widget-value w)))
- (if (member 'default old-list)
- (let
- ((p (reverse old-list))
- (n (length old-list))
- new-name old-name
- (new-list nil)
- )
- (while p
- (setq old-name (car p))
- (setq new-name (intern (format "highlight-changes-%d" n)))
- (if (eq old-name new-name)
- nil
-
-
-
-
- (if (eq old-name 'default)
- (copy-face 'highlight-changes new-name)
- (copy-face old-name new-name)
- ))
- (setq new-list (append (list new-name) new-list))
- (setq n (1- n))
- (setq p (cdr p)))
- (if (equal new-list (widget-value w))
- nil
- (widget-value-set w new-list)
- (widget-setup)
- )
- )
-
- ))
- (let ((parent (widget-get w :parent)))
- (when parent
- (widget-apply parent :notify w event))))
- (defcustom highlight-changes-face-list nil
- "A list of faces used when rotating changes.
- Normally the variable is initialized to nil and the list is created from
- `highlight-changes-colors' when needed. However, you can set this variable
- to any list of faces. You will have to do this if you want faces which
- don't just differ from the `highlight-changes' face by the foreground color.
- Otherwise, this list will be constructed when needed from
- `highlight-changes-colors'."
- :type '(choice
- (repeat
- :notify hilit-chg-cust-fix-changes-face-list
- face )
- (const :tag "Derive from highlight-changes-colors" nil)
- )
- :group 'highlight-changes)
- (defun hilit-chg-map-changes (func &optional start-position end-position)
- "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."
- (let ((start (or start-position (point-min)))
- (limit (or end-position (point-max)))
- prop end)
- (while (and start (< start limit))
- (setq prop (get-text-property start 'hilit-chg))
- (setq end (text-property-not-all start limit 'hilit-chg prop))
- (if prop
- (funcall func prop start (or end limit)))
- (setq start 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'.
- 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"))
-
-
- (let ((ov (make-overlay start end))
- (face (if (eq prop 'hilit-chg-delete)
- 'highlight-changes-delete
- (nth 1 (member prop hilit-chg-list)))))
- (if face
- (progn
-
- (overlay-put ov 'face face)
-
-
- (overlay-put ov 'evaporate t)
-
-
- (overlay-put ov 'hilit-chg t)
- )
- (error "hilit-chg-make-ov: no face for prop: %s" prop))))
- (defun hilit-chg-hide-changes (&optional beg end)
- "Remove face information for Highlight Changes mode.
- The overlay containing the face is removed, but the text property
- containing the change information is retained.
- This is the opposite of `hilit-chg-display-changes'."
- (let ((start (or beg (point-min)))
- (limit (or end (point-max))))
- (dolist (p (overlays-in start limit))
-
- (if (overlay-get p 'hilit-chg)
- (delete-overlay p)))))
- (defun hilit-chg-fixup (beg end)
- "Fix change overlays in region between BEG and END.
- Ensure the overlays agree with the changes as determined from
- the text properties of type `hilit-chg'."
-
- (remove-overlays beg end 'hilit-chg t)
- (hilit-chg-display-changes beg end))
- (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
-
- buffer-file-name
- buffer-file-truename)
- (progn
- ,@body)
- (unless ,modified
- (restore-buffer-modified-p nil)))))
- (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
- (remove-text-properties beg end '(hilit-chg nil))
- (hilit-chg-fixup beg end)))
- (defun hilit-chg-set-face-on-change (beg end leng-before
- &optional no-property-change)
- "Record changes and optionally display them in a distinctive face.
- `hilit-chg-set' adds this function to the `after-change-functions' hook."
-
-
-
-
-
-
-
-
- (save-match-data
- (let (
- (end-incr 1)
- (type 'hilit-chg))
- (if undo-in-progress
- (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))
-
- (progn
-
-
-
-
-
-
-
-
-
-
-
- (setq end (min (+ end end-incr) (point-max)))
- (setq type 'hilit-chg-delete))
-
-
-
-
-
-
- (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))))))
- (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."
- (if highlight-changes-visible-mode
-
- (progn
- (setq hilit-chg-string highlight-changes-visible-string)
- (or buffer-read-only
- (hilit-chg-display-changes)))
-
- (setq hilit-chg-string highlight-changes-invisible-string)
- (or buffer-read-only
- (hilit-chg-hide-changes))))
- (defun hilit-chg-set ()
- "Turn on Highlight Changes mode for this buffer."
- (remove-hook 'after-change-functions 'hilit-chg-set-face-on-change t)
- (hilit-chg-make-list)
- (setq highlight-changes-mode t)
- (setq highlight-changes-visible-mode highlight-changes-visibility-initial-state)
- (hilit-chg-update)
- (force-mode-line-update)
- (add-hook 'after-change-functions 'hilit-chg-set-face-on-change nil t))
- (defun hilit-chg-clear ()
- "Remove Highlight Changes mode for this buffer.
- This removes all saved change information."
- (if buffer-read-only
-
-
- (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
- (hilit-chg-hide-changes)
- (hilit-chg-map-changes
- (lambda (_prop start stop)
- (remove-text-properties start stop '(hilit-chg nil)))))
- (setq highlight-changes-mode nil)
- (force-mode-line-update)))
- (defun highlight-changes-next-change ()
- "Move to the beginning of the next change, if in Highlight Changes mode."
- (interactive)
- (if highlight-changes-mode
- (let ((start (point))
- prop)
- (setq prop (get-text-property (point) 'hilit-chg))
- (if prop
-
- (setq start (next-single-property-change (point) 'hilit-chg)))
- (if start
- (setq start (next-single-property-change start 'hilit-chg)))
- (if start
- (goto-char start)
- (message "no next change")))
- (message "This buffer is not in Highlight Changes mode.")))
- (defun highlight-changes-previous-change ()
- "Move to the beginning of the previous change, if in Highlight Changes mode."
- (interactive)
- (if highlight-changes-mode
- (let ( (start (point)) (prop nil) )
- (or (bobp)
- (setq prop (get-text-property (1- (point)) 'hilit-chg)))
- (if prop
-
- (setq start (previous-single-property-change (point) 'hilit-chg)))
- (if start
- (setq start (previous-single-property-change start 'hilit-chg)))
-
- (if start
- (setq start (or (previous-single-property-change start 'hilit-chg)
- (if (get-text-property (point-min) 'hilit-chg)
- (point-min)))))
- (if start
- (goto-char start)
- (message "no previous change")))
- (message "This buffer is not in Highlight Changes mode.")))
- (defun hilit-chg-make-list (&optional force)
- "Construct `hilit-chg-list' and `highlight-changes-face-list'."
-
-
-
-
- (if (or (null highlight-changes-face-list)
- force)
- (let ((p highlight-changes-colors)
- (n 1) name)
- (setq highlight-changes-face-list nil)
- (while p
- (setq name (intern (format "highlight-changes-%d" n)))
- (copy-face 'highlight-changes name)
- (set-face-foreground name (car p))
- (setq highlight-changes-face-list
- (append highlight-changes-face-list (list name)))
- (setq p (cdr p))
- (setq n (1+ n)))))
- (setq hilit-chg-list (list 'hilit-chg 'highlight-changes))
- (let ((p highlight-changes-face-list)
- (n 1)
- last-category last-face)
- (while p
- (setq last-category (intern (format "change-%d" n)))
-
- (setq last-face (car p))
- (setq hilit-chg-list
- (append hilit-chg-list
- (list last-category last-face)))
- (setq p (cdr p))
- (setq n (1+ n)))
- (setq hilit-chg-list
- (append hilit-chg-list
- (list last-category last-face)))))
- (defun hilit-chg-bump-change (prop start end)
- "Increment (age) the Highlight Changes mode text property."
- (let ( new-prop )
- (if (eq prop 'hilit-chg-delete)
- (setq new-prop (nth 2 hilit-chg-list))
- (setq new-prop (nth 2 (member prop hilit-chg-list))))
- (if prop
- (put-text-property start end 'hilit-chg new-prop)
- (message "%d-%d unknown property %s not changed" start end prop))))
- (defun highlight-changes-rotate-faces ()
- "Rotate the faces if in Highlight Changes mode and the changes are visible.
- Current changes are displayed in the face described by the first element
- of `highlight-changes-face-list', one level older changes are shown in
- face described by the second element, and so on. Very old changes remain
- shown in the last face in the list.
- 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)"
- (interactive)
- (when (and highlight-changes-mode highlight-changes-visible-mode)
- (let ((modified (buffer-modified-p))
- (inhibit-modification-hooks t))
-
-
-
-
-
-
-
-
-
-
-
- (unwind-protect
- (progn
-
- (hilit-chg-make-list)
-
- (hilit-chg-hide-changes)
-
- (hilit-chg-map-changes 'hilit-chg-bump-change)
-
- (hilit-chg-display-changes))
- (unless modified
-
-
- (restore-buffer-modified-p nil)))))
-
- nil)
- (defun highlight-markup-buffers
- (buf-a file-a buf-b file-b &optional markup-a-only)
- "Get differences between two buffers and set highlight changes.
- Both buffers are done unless optional parameter MARKUP-A-ONLY
- is non-nil."
- (eval-and-compile
- (require 'ediff-util))
- (save-window-excursion
- (let* (change-info
- change-a change-b
- 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))
- (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)
- (if (and file-a bufa-modified)
- (if (y-or-n-p (format "Save buffer %s? " buf-a))
- (with-current-buffer buf-a
- (save-buffer)
- (setq bufa-modified (buffer-modified-p buf-a)))
- (setq file-a nil)))
- (or file-a
- (setq temp-a (setq file-a (ediff-make-temp-file buf-a nil))))
- (if (and file-b bufb-modified)
- (if (y-or-n-p (format "Save buffer %s? " buf-b))
- (with-current-buffer buf-b
- (save-buffer)
- (setq bufb-modified (buffer-modified-p buf-b)))
- (setq file-b nil)))
- (or file-b
- (setq temp-b (setq file-b (ediff-make-temp-file buf-b nil))))
- (set-buffer buf-a)
- (highlight-changes-mode 1)
- (or markup-a-only (with-current-buffer buf-b
- (highlight-changes-mode 1)))
- (setq change-info (hilit-chg-get-diff-info buf-a file-a buf-b file-b))
- (setq change-a (car change-info))
- (setq change-b (car (cdr change-info)))
- (hilit-chg-make-list)
- (while change-a
- (setq a-start (nth 0 (car change-a)))
- (setq a-end (nth 1 (car change-a)))
- (setq b-start (nth 0 (car change-b)))
- (setq b-end (nth 1 (car change-b)))
- (setq len-a (- a-end a-start))
- (setq len-b (- b-end b-start))
- (set-buffer buf-a)
- (hilit-chg-set-face-on-change a-start a-end len-b buf-a-read-only)
- (or markup-a-only
- (with-current-buffer buf-b
- (hilit-chg-set-face-on-change b-start b-end len-a
- buf-b-read-only)
- ))
- (setq change-a (cdr change-a))
- (setq change-b (cdr change-b)))
- (or bufa-modified
- (with-current-buffer buf-a (set-buffer-modified-p nil)))
- (or bufb-modified
- (with-current-buffer buf-b (set-buffer-modified-p nil)))
- (if temp-a
- (delete-file temp-a))
- (if temp-b
- (delete-file temp-b)))
- ))
- (defun highlight-compare-buffers (buf-a buf-b)
- "Compare two buffers and highlight the differences.
- The default is the current buffer and the one in the next window.
- If either buffer is modified and is visiting a file, you are prompted
- to save the file.
- Unless the buffer is unmodified and visiting a file, the buffer is
- written to a temporary file for comparison.
- If a buffer is read-only, differences will be highlighted but no property
- changes are made, so \\[highlight-changes-next-change] and
- \\[highlight-changes-previous-change] will not work."
- (interactive
- (list
- (get-buffer (read-buffer "buffer-a " (current-buffer) t))
- (get-buffer
- (read-buffer "buffer-b "
- (window-buffer (next-window (selected-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)
- ))
- (defun highlight-compare-with-file (file-b)
- "Compare this buffer with a file, and highlight differences.
- If the buffer has a backup filename, it is used as the default when
- this function is called interactively.
- If the current buffer is visiting the file being compared against, it
- also will have its differences highlighted. Otherwise, the file is
- read in temporarily but the buffer is deleted.
- If the buffer is read-only, differences will be highlighted but no property
- changes are made, so \\[highlight-changes-next-change] and
- \\[highlight-changes-previous-change] will not work."
- (interactive
- (let ((file buffer-file-name)
- (file-name nil)
- (file-dir nil))
- (and file
- (setq file-name (file-name-nondirectory file)
- file-dir (file-name-directory file)))
- (setq file-name (make-backup-file-name file-name))
- (unless (file-exists-p file-name)
- (setq file-name nil))
- (list (read-file-name
- "Find to compare with: "
- file-dir
- nil
- nil
- file-name)
- )))
- (let* ((buf-a (current-buffer))
- (file-a (buffer-file-name))
- (existing-buf (get-file-buffer file-b))
- (buf-b (or existing-buf
- (find-file-noselect file-b))))
- (highlight-markup-buffers buf-a file-a buf-b file-b (not existing-buf))
- (unless existing-buf
- (kill-buffer buf-b))
- ))
- (defun hilit-chg-get-diff-info (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
- 'hilit-chg-get-diff-list-hk
- (list (cons 'ediff-job-name 'something))
- )
- (ediff-with-current-buffer hilit-e (ediff-really-quit nil))
- (list hilit-x hilit-y)))
- (defun hilit-chg-get-diff-list-hk ()
-
-
- (defvar hilit-x)
- (defvar hilit-y)
- (defvar hilit-e)
- (setq hilit-e (current-buffer))
- (let ((n 0) extent p va vb a b)
- (setq hilit-x nil hilit-y nil)
- (while (< n ediff-number-of-differences)
- (ediff-make-fine-diffs n)
- (setq va (ediff-get-fine-diff-vector n 'A))
-
- (if va
- (setq a (append va nil))
-
- (setq va (ediff-get-difference n 'A))
- (setq a (list (elt va 0))))
-
- (setq p a)
- (while p
- (setq extent (list (overlay-start (car p))
- (overlay-end (car p))))
- (setq p (cdr p))
- (setq hilit-x (append hilit-x (list extent) )))
-
- (setq vb (ediff-get-fine-diff-vector n 'B))
-
- (if vb
- (setq b (append vb nil))
-
- (setq vb (ediff-get-difference n 'B))
- (setq b (list (elt vb 0))))
-
- (setq p b)
- (while p
- (setq extent (list (overlay-start (car p))
- (overlay-end (car p))))
- (setq p (cdr p))
- (setq hilit-y (append hilit-y (list extent) )))
- (setq n (1+ n)))
-
-
- ))
- (define-globalized-minor-mode global-highlight-changes-mode
- highlight-changes-mode highlight-changes-mode-turn-on)
- (define-obsolete-function-alias
- 'global-highlight-changes
- 'global-highlight-changes-mode "23.1")
- (defun highlight-changes-mode-turn-on ()
- "See if Highlight Changes mode should be turned on for this buffer.
- This is called when `global-highlight-changes-mode' is turned on."
- (or highlight-changes-mode
- (if
- (cond
- ((null highlight-changes-global-modes)
- nil)
- ((functionp highlight-changes-global-modes)
- (funcall highlight-changes-global-modes))
- ((listp highlight-changes-global-modes)
- (if (eq (car-safe highlight-changes-global-modes) 'not)
- (not (memq major-mode (cdr highlight-changes-global-modes)))
- (memq major-mode highlight-changes-global-modes)))
- (t
- (and
- (not (string-match "^[ *]" (buffer-name)))
- (buffer-file-name))))
- (highlight-changes-mode 1))
- ))
- (defun hilit-chg-desktop-restore (desktop-buffer-locals)
- (highlight-changes-mode
- (or (cdr (assq 'highlight-changes-mode desktop-buffer-locals)) 1)))
- (add-to-list 'desktop-minor-mode-handlers
- '(highlight-changes-mode . hilit-chg-desktop-restore))
- (add-to-list 'desktop-locals-to-save 'highlight-changes-mode)
- (provide 'hilit-chg)
|