aboutsummaryrefslogtreecommitdiff
path: root/dot_emacs
diff options
context:
space:
mode:
authorRyan Kavanagh <rak@rak.ac>2022-08-01 17:36:53 -0400
committerRyan Kavanagh <rak@rak.ac>2022-08-01 17:36:53 -0400
commitfd2bb1afe16487c909674c989de60b54083d1f3c (patch)
tree0b77f7ef5b8f6783fb4340c4b40c5e08befe2dc1 /dot_emacs
parentupdate systemd config (diff)
Customize whitespace-cleanup to not clobber '-- ' signature separators in message mode
Diffstat (limited to 'dot_emacs')
-rw-r--r--dot_emacs43
1 files changed, 43 insertions, 0 deletions
diff --git a/dot_emacs b/dot_emacs
index bd649d2..bbb1bd2 100644
--- a/dot_emacs
+++ b/dot_emacs
@@ -468,6 +468,49 @@ Otherwise split the current paragraph into one sentence per line."
;; ocaml assistant
:ensure t)
+(use-package message
+ :config
+ (defun whitespace-cleanup-mail ()
+ "Kill the whitespace in a buffer while preserving the last instance of '-- '."
+ (interactive)
+ (save-excursion
+ (save-restriction
+ (widen)
+ (let ((signature-delimiter
+ (progn
+ ;; Find the last occurence of "-- " in the buffer
+ ;; and set signature-delimiter to the position of the first -
+ ;; This means we must subtract 2, because re-search-backward
+ ;; returns the end of the occurence found
+ (goto-char (point-max))
+ (- (re-search-backward "^-- $" nil t) 2))))
+ (when signature-delimiter
+ (progn
+ ;; Run whitespace-cleanup on the region
+ ;; [start, signature-delimiter]. Include the first dash
+ ;; to avoid deleting any empty lines leading up to the
+ ;; delimiter.
+ (narrow-to-region (point-min) signature-delimiter)
+ (whitespace-cleanup)
+ (widen)
+ ;; Run it on the region [signature-delimiter, end).
+ ;; We include the signature delimiter so that we do not
+ ;; delete any empty lines immediately following it.
+ ;; A side-effect is that the first line might become "^--$".
+ ;; This means that we must re-add the space at the end of
+ ;; the first line. Easiest just replace the first line of the
+ ;; buffer by "^-- $".
+ (narrow-to-region signature-delimiter (point-max))
+ (whitespace-cleanup)
+ (goto-char (point-min))
+ (kill-whole-line 0)
+ (insert "-- ")))))))
+ :hook
+ ((message-mode . (lambda () (remove-hook 'before-save-hook 'whitespace-cleanup t)))
+ (before-save . whitespace-cleanup-mail))
+ :custom
+ (message-send-mail-function 'message-send-mail-with-sendmail))
+
(use-package mingus
;; mpd client
:ensure t)