Use lexical-binding in hilit-chg.el

* lisp/hilit-chg.el: Use lexical-binding.  Remove redundant :group
args.  Doc and formatting fixes.
(highlight-changes-mode, highlight-changes-visible-mode):
Use keyword arguments.
(hilit-chg-display-changes, highlight-changes-rotate-faces):
Quote function symbols as such.
(hilit-x, hilit-y, hilit-e): Define variables on top-level to
silence the byte-compiler.
(highlight-markup-buffers): Improve message format.
This commit is contained in:
Stefan Kangas 2021-04-04 13:23:40 +02:00
parent 4865ded551
commit 523fb9b550

View file

@ -1,4 +1,4 @@
;;; hilit-chg.el --- minor mode displaying buffer changes with special face
;;; hilit-chg.el --- minor mode displaying buffer changes with special face -*- lexical-binding: t -*-
;; Copyright (C) 1998, 2000-2021 Free Software Foundation, Inc.
@ -68,8 +68,7 @@
;; (defun my-highlight-changes-mode-hook ()
;; (if highlight-changes-mode
;; (add-hook 'write-file-functions 'highlight-changes-rotate-faces nil t)
;; (remove-hook 'write-file-functions 'highlight-changes-rotate-faces t)
;; ))
;; (remove-hook 'write-file-functions 'highlight-changes-rotate-faces t)))
;; Automatically enabling Highlight Changes mode
@ -114,16 +113,16 @@
;; Possible bindings:
;; (global-set-key '[C-right] 'highlight-changes-next-change)
;; (global-set-key '[C-left] 'highlight-changes-previous-change)
;; (global-set-key '[C-right] #'highlight-changes-next-change)
;; (global-set-key '[C-left] #'highlight-changes-previous-change)
;;
;; Other interactive functions (that could be bound if desired):
;; highlight-changes-mode
;; highlight-changes-toggle-visibility
;; highlight-changes-remove-highlight
;; highlight-compare-with-file
;; highlight-compare-buffers
;; highlight-changes-rotate-faces
;; `highlight-changes-mode'
;; `highlight-changes-toggle-visibility'
;; `highlight-changes-remove-highlight'
;; `highlight-compare-with-file'
;; `highlight-compare-buffers'
;; `highlight-changes-rotate-faces'
;;; Bugs:
@ -179,7 +178,6 @@
:version "20.4"
:group 'faces)
;; Face information: How the changes appear.
;; Defaults for face: red foreground, no change to background,
@ -192,22 +190,20 @@
'((((min-colors 88) (class color)) (:foreground "red1"))
(((class color)) (:foreground "red" ))
(t (:inverse-video t)))
"Face used for highlighting changes."
:group 'highlight-changes)
"Face used for highlighting changes.")
;; This looks pretty ugly, actually. Maybe the underline should be removed.
(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)
"Face used for highlighting deletions.")
;; A (not very good) default list of colors to rotate through.
(defcustom highlight-changes-colors
(if (eq (frame-parameter nil 'background-mode) 'light)
;; defaults for light background:
'( "magenta" "blue" "darkgreen" "chocolate" "sienna4" "NavyBlue")
'("magenta" "blue" "darkgreen" "chocolate" "sienna4" "NavyBlue")
;; defaults for dark background:
'("yellow" "magenta" "blue" "maroon" "firebrick" "green4" "DarkOrchid"))
"Colors used by `highlight-changes-rotate-faces'.
@ -218,8 +214,7 @@ 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)
:type '(repeat color))
;; When you invoke highlight-changes-mode, should highlight-changes-visible-mode
;; be on or off?
@ -230,8 +225,7 @@ colors then use this, if you want fancier faces then set
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)
:type 'boolean)
;; These are the strings displayed in the mode-line for the minor mode:
@ -240,16 +234,14 @@ When a buffer is in Highlight Changes mode the function
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)
(const :tag "None" nil)))
(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)
(const :tag "None" nil)))
(defcustom highlight-changes-global-modes t
"Determine whether a buffer is suitable for global Highlight Changes mode.
@ -279,9 +271,7 @@ modes only."
(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)
(const :tag "none" nil)))
(defcustom highlight-changes-global-changes-existing-buffers nil
"If non-nil, toggling global Highlight Changes mode affects existing buffers.
@ -290,8 +280,7 @@ created). However, if `highlight-changes-global-changes-existing-buffers'
is non-nil, then turning on `global-highlight-changes-mode' 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)
:type 'boolean)
;; These are for internal use.
@ -320,9 +309,7 @@ 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 ;; init-value
hilit-chg-string ;; lighter
nil ;; keymap
:lighter hilit-chg-string
(if (or (display-color-p)
(and (fboundp 'x-display-grayscale-p) (x-display-grayscale-p)))
(progn
@ -352,13 +339,8 @@ The default value can be customized with variable
`highlight-changes-visibility-initial-state'.
This command does not itself set Highlight Changes mode."
t ;; init-value
nil ;; lighter
nil ;; keymap
(hilit-chg-update)
)
:init-value t
(hilit-chg-update))
(defun hilit-chg-cust-fix-changes-face-list (w _wc &optional event)
@ -371,12 +353,10 @@ This command does not itself set Highlight Changes mode."
;; faces are saved but not to the actual list itself.
(let ((old-list (widget-value w)))
(if (member 'default old-list)
(let
((p (reverse old-list))
(let ((p (reverse old-list))
(n (length old-list))
new-name old-name
(new-list nil)
)
(new-list nil))
(while p
(setq old-name (car p))
(setq new-name (intern (format "highlight-changes-%d" n)))
@ -396,9 +376,7 @@ This command does not itself set Highlight Changes mode."
(if (equal new-list (widget-value w))
nil ;; (message "notify: no change!")
(widget-value-set w new-list)
(widget-setup)
)
)
(widget-setup)))
;; (message "notify: no default here!")
))
(let ((parent (widget-get w :parent)))
@ -417,10 +395,8 @@ Otherwise, this list will be constructed when needed from
:type '(choice
(repeat
:notify hilit-chg-cust-fix-changes-face-list
face )
(const :tag "Derive from highlight-changes-colors" nil)
)
:group 'highlight-changes)
face)
(const :tag "Derive from highlight-changes-colors" nil)))
(defun hilit-chg-map-changes (func &optional start-position end-position)
@ -446,7 +422,7 @@ 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))
(hilit-chg-map-changes #'hilit-chg-make-ov beg end))
(defun hilit-chg-make-ov (prop start end)
@ -467,8 +443,7 @@ This is the opposite of `hilit-chg-hide-changes'."
(overlay-put ov 'evaporate t)
;; We set the change property so we can tell this is one
;; of our overlays (so we don't delete someone else's).
(overlay-put ov 'hilit-chg 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)
@ -726,7 +701,7 @@ this, eval the following in the buffer to be saved:
;; remove our existing overlays
(hilit-chg-hide-changes)
;; for each change text property, increment it
(hilit-chg-map-changes 'hilit-chg-bump-change)
(hilit-chg-map-changes #'hilit-chg-bump-change)
;; and display them
(hilit-chg-display-changes))
(unless modified
@ -759,7 +734,7 @@ is non-nil."
(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))
(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)))
@ -768,7 +743,7 @@ is non-nil."
(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))
(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)))
@ -809,12 +784,11 @@ is non-nil."
(if temp-a
(delete-file temp-a))
(if temp-b
(delete-file temp-b)))
))
(delete-file temp-b)))))
;;;###autoload
(defun highlight-compare-buffers (buf-a buf-b)
"Compare two buffers and highlight the differences.
"Compare two buffers and highlight the differences.
The default is the current buffer and the one in the next window.
@ -835,8 +809,7 @@ changes are made, so \\[highlight-changes-next-change] and
(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)
))
(highlight-markup-buffers buf-a file-a buf-b file-b)))
;;;###autoload
(defun highlight-compare-with-file (file-b)
@ -876,9 +849,11 @@ changes are made, so \\[highlight-changes-next-change] and
(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))
))
(kill-buffer buf-b))))
(defvar hilit-x) ; placate the byte-compiler
(defvar hilit-y)
(defvar hilit-e)
(defun hilit-chg-get-diff-info (buf-a file-a buf-b file-b)
;; hilit-e,x,y are set by function hilit-chg-get-diff-list-hk.
@ -886,8 +861,7 @@ changes are made, so \\[highlight-changes-next-change] and
(ediff-setup buf-a file-a buf-b file-b
nil nil ; buf-c file-C
'(hilit-chg-get-diff-list-hk)
(list (cons 'ediff-job-name 'something))
)
(list (cons 'ediff-job-name 'something)))
(ediff-with-current-buffer hilit-e (ediff-really-quit nil))
(list hilit-x hilit-y)))
@ -895,9 +869,6 @@ changes are made, so \\[highlight-changes-next-change] and
(defun hilit-chg-get-diff-list-hk ()
;; hilit-e/x/y are dynamically bound by hilit-chg-get-diff-info
;; which calls this function as a hook.
(defvar hilit-x) ; placate the byte-compiler
(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)
@ -931,7 +902,7 @@ changes are made, so \\[highlight-changes-next-change] and
(setq extent (list (overlay-start (car p))
(overlay-end (car p))))
(setq p (cdr p))
(setq hilit-y (append hilit-y (list extent) )))
(setq hilit-y (append hilit-y (list extent))))
(setq n (1+ n)));; while
;; ediff-quit doesn't work here.
;; No point in returning a value, since this is a hook function.
@ -961,8 +932,7 @@ This is called when `global-highlight-changes-mode' is turned on."
(and
(not (string-match "^[ *]" (buffer-name)))
(buffer-file-name))))
(highlight-changes-mode 1))
))
(highlight-changes-mode 1))))
;;;; Desktop support.
@ -985,8 +955,7 @@ This is called when `global-highlight-changes-mode' is turned on."
;; (message "--- hilit-chg-debug-show ---")
;; (hilit-chg-map-changes (lambda (prop start end)
;; (message "%d-%d: %s" start end prop))
;; beg end
;; ))
;; beg end))
;;
;; ================== end of debug ===============