George Jones il y a 1 an
Parent
commit
6903cf77cd
1 fichiers modifiés avec 52 ajouts et 93 suppressions
  1. 52 93
      elisp-public/gmjWhoShurnkTheOrgFiles.org

+ 52 - 93
elisp-public/gmjWhoShurnkTheOrgFiles.org

@@ -1,17 +1,54 @@
-#+begin_src emacs-lisp
+My .org files usually only grow. If one shrinks much, I want to know/confirming
+it before saving. The code below accomplishes it this.
 
-;; 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)
+ I tried doing this by hand and ran into issues.
+ ChatGPT got me going in the right direction:
 
+ ChatGPT prompt:
+
+#+begin_quote
+in emacs lisp how do I write a before-save-hook that aborts the save
+based on a yes no question?
+#+end_quote
+
+Chat GPT answer
+
+#+begin_example
+(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)
+#+end_example
+
+
+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:
+
+#+begin_src emacs-lisp :exports code
+
+  ;; ;; 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")
@@ -20,94 +57,16 @@
 (defvar check-buffer-shrinkage-name "org$"
   "Warn user before saving files matching this pattern that have shurnk")
 
-(defun my-before-save-hook ()
+(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 "Buffer shrunk, save changes? "))
           (set-buffer-modified-p nil)
           (error "Save Aborted"))))))
-(add-hook 'before-save-hook 'my-before-save-hook)
-
-  ;; Chat GPT answer
-  ;; (defun my-before-save-hook ()
-  ;;   (if (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 "Buffer shrunk, save changes? "))
-  ;;           (set-buffer-modified-p nil)
-  ;;           (error "Save Aborted"))))))
-
-  (add-hook 'before-save-hook 'my-before-save-hook)
-
-
-  ;; ; Warn and ask user before saving buffers that have shurnk too much
-  ;; ;
-  ;; ; My .org files usually only grow.   If one shrinks much,
-  ;; ; I want to know/confirming it before saving.
-  ;; ; The code below accomplishes it this.
-  ;; ;
-  ;; ; There is a hack.  before-save-hook provides no way for a hook
-  ;; ; function to abort the write (e.g. if the user answers "no").
-  ;; ; The only solution I could come up with to throw an "error"
-  ;; ; is to set the file read-only and let the rest of the write
-  ;; ; process complain.  This is not elegant.   Suggestions for
-  ;; ; improvment solicited.
-
-  ;; ; Maybe do this instead.  Or in addition
-  ;; ; https://karl-voit.at/2014/08/20/org-losses-determining-post-commit/
-
-  ;; ;; Copyright © 2023 by George Jones
+(add-hook 'before-save-hook 'check-buffer-shrinkage-save-hook)
 
-  ;; ;; Author: George Jones (http://port111.com/george)
-  ;; ;; Version:
-  ;; ;; Package-Version:
-  ;; ;; Package-Commit:
-  ;; ;; Created: 2023-01-15
-  ;; ;; Package-Requires:
-  ;; ;; Keywords:
-  ;; ;; License: GPL v3
-  ;; ;; URL: http://ergoemacs.org/emacs/xah-lookup.html
-
-  ;; ;; License: GPL v3
-
-  ;; (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-size-on-save ()
-  ;;   "Warn user before writing if buffer has shrunk too much since last save.
-  ;;    Check for shrinkage large than CHECK-BUFFER-SHRINKAGE-DELTA bytes.
-  ;;    Match file names matching CHECK-BUFFER-SHRINKAGE-NAME"
-
-  ;;   (if (string-match check-buffer-shrinkage-name (buffer-file-name))
-  ;;     (let ((delta (- buffer-saved-size (buffer-size))))
-  ;;       (when (> delta check-buffer-shrinkage-delta)
-  ;;         (unless (y-or-n-p (format "WARNING: Buffer has shurnk by %d bytes since last save?" delta))
-  ;;           (progn
-  ;;             ; This is a hack.   There appears to be no way to have
-  ;;             ; a before-save-hook abort.  I've tried user-error, throw,
-  ;;             ; and debug-on-error. It ignores them all, so here once
-  ;;             ; I've determined that I DON'T want the write to succeed
-  ;;             ; I will set mode to read-only.
-  ;;             (message (format "Setting %s to mode 444 to keep write from succeeding" (buffer-file-name)))
-  ;;             (set-file-modes (buffer-file-name) #o444 'nofollow)
-  ;;             ; This should abort, but is being ignored when hooks run.
-  ;;             (user-error "Error: %s" "Not saved. User aborted.")
-  ;;           ) ; progn
-  ;;           ) ; unless
-  ;;       ) ; when
-  ;;     ) ; let
-  ;; ) ; if
-  ;; ) ; defun
-
-  ;; ;; This debug is NOT being honored.  No way to abort save
-  ;; ;; (setq debug-on-error t)
-  ;; (add-hook 'before-save-hook 'check-buffer-size-on-save)
 #+end_src
 
 #+RESULTS:
-| time-stamp | whitespace-cleanup | my-before-save-hook | gmj-update-date-save-hook |
+| check-buffer-shrinkage-save-hook | time-stamp | whitespace-cleanup | my-before-save-hook | gmj-update-date-save-hook |