branch: elpa/ws-butler
commit 75deadecb96dda8344bb92ba313bae3a1f06c498
Author: Le Wang <[email protected]>
Commit: Le Wang <[email protected]>
Remove dependency on highlight-changes-mode.
---
ws-butler.el | 47 +++++++++++++++++++++++++----------------------
1 file changed, 25 insertions(+), 22 deletions(-)
diff --git a/ws-butler.el b/ws-butler.el
index 404cf3ae56..6ff1bbe726 100644
--- a/ws-butler.el
+++ b/ws-butler.el
@@ -54,8 +54,7 @@
;;; Code:
(eval-when-compile
- (require 'cl)
- (require 'hilit-chg))
+ (require 'cl))
(defgroup ws-butler nil
"Unobtrusively whitespace deletion like a butler."
@@ -162,19 +161,17 @@ This is the key to the virtual spaces preserving
indentation mechanism.")
(make-variable-buffer-local 'ws-butler-presave-coord)
(defun ws-butler-map-changes (func &optional start-position end-position)
- "See `hilit-chg-map-changes'.
-
-Call FUNC with each changed region (START-POSITION END-POSITION).
+ "Call FUNC with each changed region (START-POSITION END-POSITION).
This simply uses an end marker since we are modifying the buffer
in place."
-
+ ;; See `hilit-chg-map-changes'.
(let ((start (or start-position (point-min)))
(limit (copy-marker (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))
+ (setq prop (get-text-property start 'ws-butler-chg))
+ (setq end (text-property-not-all start limit 'ws-butler-chg prop))
(if prop
(funcall func prop start (or end limit)))
(setq start end))
@@ -206,12 +203,24 @@ ensure point doesn't jump due to white space trimming."
(setq last-end end)))
(ws-butler-maybe-trim-eob-lines last-end)))
+(defun ws-butler-clear-properties ()
+ "Clear all ws-butler text properties in buffer."
+ (with-silent-modifications
+ (ws-butler-map-changes (lambda (_prop start end)
+ (remove-list-of-text-properties start end
'(ws-butler-chg))))))
+
+(defun ws-butler-after-change (beg end leng-before &optional)
+ (unless undo-in-progress
+ (with-silent-modifications
+ (when (and (= beg end) (> leng-before 0))
+ ;; deletion
+ (setq end (min (+ end 1) (point-max))))
+ (put-text-property beg end 'ws-butler-chg t))))
+
(defun ws-butler-after-save ()
"Restore trimmed whitespace before point."
- ;; reset text properties
- (highlight-changes-mode 0)
- (highlight-changes-mode 1)
+ (ws-butler-clear-properties)
;; go to saved line+col
(when ws-butler-presave-coord
(let (remaining-lines)
@@ -230,27 +239,21 @@ ensure point doesn't jump due to white space trimming."
;;;###autoload
(define-minor-mode ws-butler-mode
- "White space cleanup mode implemented on top of `highlight-changes-mode'.
-
-With this mode in operation, it's not possible to rotate changes,
-etc.
+ "White space cleanup, without obtrusive white space removal.
-Change visibility can be toggled with
-`highlight-changes-visible-mode', but changes get reset on every
-save."
+Whitespaces at EOL and EOF are trimmed upon file save, and only
+for lines modified by you."
:lighter " wb"
:group 'ws-butler
(if ws-butler-mode
(progn
- (require 'hilit-chg)
- (setq highlight-changes-visibility-initial-state nil)
- (highlight-changes-mode 1)
+ (add-hook 'after-change-functions 'ws-butler-after-change t t)
(add-hook 'before-save-hook 'ws-butler-before-save t t)
(add-hook 'after-save-hook 'ws-butler-after-save t t)
(add-hook 'before-revert-hook 'ws-butler-before-revert t t)
(add-hook 'after-revert-hook 'ws-butler-after-save t t)
(add-hook 'edit-server-done-hook 'ws-butler-before-save t t))
- (highlight-changes-mode 0)
+ (remove-hook 'after-change-functions 'ws-butler-after-change t)
(remove-hook 'before-save-hook 'ws-butler-before-save t)
(remove-hook 'after-save-hook 'ws-butler-after-save t)
(remove-hook 'before-revert-hook 'ws-butler-before-revert t)