My .org files usually only grow. If one shrinks much, I want to know/confirming it before saving. The code below accomplishes it this.
I tried doing this by hand and ran into issues. ChatGPT got me going in the right direction:
ChatGPT prompt:
in emacs lisp how do I write a before-save-hook that aborts the save based on a yes no question?
Chat GPT answer
(defun my-before-save-hook () (when (not (yes-or-no-p "Save changes? ")) (set-buffer-modified-p nil) (error "Save Aborted"))) (add-hook 'before-save-hook 'my-before-save-hook)
Maybe do this as well: https://karl-voit.at/2014/08/20/org-losses-determining-post-commit/
With some help from Xah Lee (http://xahlee.info/emacs/emacs/elisp_basics.html), here's the final version that works:
;; ;; Copyright © 2023 by George Jones ;; Author: George Jones (http://port111.com/george) ;; Version: ;; Package-Version: ;; Package-Commit: ;; Created: 2023-01-15 ;; Package-Requires: ;; Keywords: ;; License: GPL v3 ;; URL: (defvar check-buffer-shrinkage-delta (* 1 1000) "Warn the user before saving is the buffer shrinks more than this many bytes") (setq check-buffer-shrinkage-delta 100) (defvar check-buffer-shrinkage-name "org$" "Warn user before saving files matching this pattern that have shurnk") (defvar check-buffer-shrinkage-delta (* 1 1000) "Warn the user before saving is the buffer shrinks more than this many bytes") (setq check-buffer-shrinkage-delta 100) (defvar check-buffer-shrinkage-name "org$" "Warn user before saving files matching this pattern that have shurnk") (defun check-buffer-shrinkage-save-hook () (when (string-match check-buffer-shrinkage-name (buffer-file-name)) (let ((delta (- buffer-saved-size (buffer-size)))) (when (> delta check-buffer-shrinkage-delta) (when (not (yes-or-no-p (format "%s Buffer shrunk %d bytes, save changes? " (buffer-file-name) delta))) (set-buffer-modified-p nil) (error "Save Aborted")))))) (add-hook 'before-save-hook 'check-buffer-shrinkage-save-hook)