gmjWhoShurnkTheOrgFiles.org 2.1 KB

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)