[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)))
+
- [nongnu] branch elpa/ws-butler created (now e3a38d93e0), Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler 8c495cfca3 16/64: explain meaning of "unobtrusiveness", Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler fb5d5fd35e 11/64: clean up leading tabs when "indent-tabs-mode" is nil, Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler de6936dd55 29/64: Bump version, run checkdoc., Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler e6c6454c16 05/64: readme update, Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler 00e9ca4ace 03/64: commentary update, Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler 8e441f8778 01/64: initial commit,
Stefan Kangas <=
- [nongnu] elpa/ws-butler 90f7cbd14f 02/64: add README, Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler a7f62dcb00 17/64: fix bug when point is after a tab at save time, Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler bb70ff8fe3 14/64: fix saving what point is at EOB, Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler 8c4cb5485a 28/64: Use (1- end) to hack around highlight-changes bug., Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler c5b920b6b6 32/64: Merge pull request #10 from DarwinAwardWinner/patch-1, Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler 631db62b31 40/64: README.md typo., Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler 0fbba548ff 38/64: Bump to 0.3, Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler 88b4570b31 15/64: add autoload cookies and global minor-mode, Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler c906d77aee 10/64: provide feature #1, Stefan Kangas, 2021/12/31
- [nongnu] elpa/ws-butler ec4172bb7a 22/64: Add debug declaration to macro., Stefan Kangas, 2021/12/31