emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/ws-butler 8e441f8778 01/64: initial commit


From: Stefan Kangas
Subject: [nongnu] elpa/ws-butler 8e441f8778 01/64: initial commit
Date: Fri, 31 Dec 2021 11:09:27 -0500 (EST)

branch: elpa/ws-butler
commit 8e441f8778ce09f2e5ac9197dbeb8cc643cbc3e6
Author: Le Wang <le.wang@agworld.com.au>
Commit: Le Wang <le.wang@agworld.com.au>

    initial commit
---
 ws-butler.el | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/ws-butler.el b/ws-butler.el
new file mode 100644
index 0000000000..4ef7bd65ce
--- /dev/null
+++ b/ws-butler.el
@@ -0,0 +1,96 @@
+(defun ws-butler-trim-region (beg end)
+  "Delete trailing blanks in region BEG END."
+  (interactive "*r")
+  (save-excursion
+    (save-restriction
+      (narrow-to-region beg end)
+      ;;  _much slower would be:       (replace-regexp "[ \t]+$" "")
+      (goto-char (point-min))
+      (while (not (eobp))
+        (end-of-line)
+        (delete-horizontal-space)
+        (forward-line 1))))
+  nil)                                  ;for possible hook
+
+
+(defvar ws-butler-saved-ws nil)
+(make-variable-buffer-local 'ws-butler-saved-ws)
+
+(defun ws-butler-map-map-changes (func &optional start-position end-position)
+  "See `hilit-chg-map-changes'.  This simply uses an end marker
+  since we are modifying the buffer in place."
+
+  (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))
+      (if prop
+          (funcall func prop start (or end limit)))
+      (setq start end))))
+
+(defun ws-butler-before-save ()
+  "Trim white space before save.
+
+This will also ensure point doesn't jump due to white space
+trimming.  (i.e. keep whitespace after EOL text but before
+point."
+  (setq ws-butler-saved-ws nil)
+  (ws-butler-map-map-changes
+   (lambda (_prop beg end)
+     (save-excursion
+       (setq beg (progn (goto-char beg)
+                        (point-at-bol))
+             end (progn (goto-char end)
+                        (point-at-eol))))
+     (message (format "-----------point is %s" (point)))
+     (when (and (>= (point) beg)
+                (<= (point) end))
+       (setq ws-butler-saved-ws (when (and (looking-at-p "\\s-*$")
+                                           (looking-back "\\s-+" 
(line-beginning-position) t))
+                                   (match-string 0))))
+     (ws-butler-trim-region beg end))))
+
+(defun ws-butler-after-save ()
+  "Restore trimmed whitespace before point."
+
+  ;; reset text properties
+  (highlight-changes-mode 0)
+  (highlight-changes-mode 1)
+  (when ws-butler-saved-ws
+    (insert ws-butler-saved-ws))
+  (set-buffer-modified-p nil))
+
+(defun ws-butler-before-revert ()
+  "Clear `ws-butler-saved-ws'"
+  (setq ws-butler-saved-ws nil))
+
+(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.
+
+Change visibility can be toggled with
+`highlight-changes-visible-mode', but changes get reset on every
+save."
+  :lighter " tr"
+  :group 'ws-butler
+  (if ws-butler-mode
+      (progn
+        (require 'hilit-chg)
+        (setq highlight-changes-visibility-initial-state nil)
+        (highlight-changes-mode 1)
+        (add-hook 'before-save-hook 'ws-butler-before-save t t)
+        (add-hook 'after-save-hook 'ws-butler-after-save t t)
+        (add-hook 'after-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 'before-save-hook 'ws-butler-before-save t)
+    (remove-hook 'after-save-hook 'ws-butler-after-save t)
+    (remove-hook 'after-revert-hook 'ws-butler-before-revert t)
+    (remove-hook 'after-revert-hook 'ws-butler-after-save t)
+    (remove-hook 'edit-server-done-hook 'ws-butler-before-save t)))
+



reply via email to

[Prev in Thread] Current Thread [Next in Thread]