branch: scratch/editorconfig
commit 964747660cacf01799512e28c8999afea345203e
Author: Stefan Monnier <monn...@iro.umontreal.ca>
Commit: Stefan Monnier <monn...@iro.umontreal.ca>

    Don't hook into `read-only-mode-hook`
    
    We shouldn't re-set variables just because `read-only-mode` is 
(de)activated,
    and with Emacs-30's hooks it would be even less natural to do.
    Also `buffer-read-only` can change without calling `read-only-mode`,
    so better test it dynamically when we try to trim whitespace.
    
    * editorconfig.el (editorconfig--delete-trailing-whitespace): New function.
    (editorconfig-set-trailing-ws): Use it.
    Also prefer `before-save-hook` and use `add/remove-hook` to
    manipulate hooks, like god intended.
    Don't test `buffer-read-only` any more.
    (editorconfig-mode): Don't hook into `read-only-mode-hook` any more.
    
    * ert-tests/editorconfig.el (test-trim-trailing-ws): Adjust
    test accordingly.
---
 editorconfig.el           | 19 ++++++++++---------
 ert-tests/editorconfig.el | 15 +++++++++------
 2 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/editorconfig.el b/editorconfig.el
index cf6c03249a..66e99c4185 100644
--- a/editorconfig.el
+++ b/editorconfig.el
@@ -612,24 +612,26 @@ to non-nil when FINAL-NEWLINE is true."
      (setq-local require-final-newline      nil)
      (setq-local mode-require-final-newline nil))))
 
+(defun editorconfig--delete-trailing-whitespace ()
+  "Call `delete-trailing-whitespace' unless the buffer is read-only."
+  (unless buffer-read-only (delete-trailing-whitespace)))
+
 (defun editorconfig-set-trailing-ws (trim-trailing-ws)
   "Set up trimming of trailing whitespace at end of lines by TRIM-TRAILING-WS."
-  (make-local-variable 'write-file-functions) ;; just current buffer
-  (when (and (equal trim-trailing-ws "true")
-             (not buffer-read-only))
+  (when (equal trim-trailing-ws "true")
     ;; when true we push delete-trailing-whitespace (emacs > 21)
     ;; to write-file-functions
     (if editorconfig-trim-whitespaces-mode
         (funcall editorconfig-trim-whitespaces-mode 1)
-      (add-to-list 'write-file-functions 'delete-trailing-whitespace)))
-  (when (or (equal trim-trailing-ws "false")
-            buffer-read-only)
+      (add-hook 'before-save-hook
+                #'editorconfig--delete-trailing-whitespace nil t)))
+  (when (equal trim-trailing-ws "false")
     ;; when false we remove every delete-trailing-whitespace
     ;; from write-file-functions
     (when editorconfig-trim-whitespaces-mode
       (funcall editorconfig-trim-whitespaces-mode 0))
-    (setq write-file-functions
-          (remove 'delete-trailing-whitespace write-file-functions))))
+    (remove-hook 'before-save-hook
+                 #'editorconfig--delete-trailing-whitespace t)))
 
 (defun editorconfig-set-line-length (length)
   "Set the max line length (`fill-column') to LENGTH."
@@ -867,7 +869,6 @@ To disable EditorConfig in some buffers, modify
   :lighter editorconfig-mode-lighter
   (let ((modehooks '(prog-mode-hook
                      text-mode-hook
-                     read-only-mode-hook
                      ;; Some modes call `kill-all-local-variables' in their 
init
                      ;; code, which clears some values set by editorconfig.
                      ;; For those modes, editorconfig-apply need to be called
diff --git a/ert-tests/editorconfig.el b/ert-tests/editorconfig.el
index 4fcfe13f4e..92a2dbd4f5 100644
--- a/ert-tests/editorconfig.el
+++ b/ert-tests/editorconfig.el
@@ -102,12 +102,15 @@
 (ert-deftest test-trim-trailing-ws nil
   (editorconfig-mode 1)
   (with-visit-file (concat editorconfig-ert-dir "trim.txt")
-    (should (memq 'delete-trailing-whitespace
-                  write-file-functions)))
-  (with-visit-file (concat editorconfig-ert-dir "trim.txt")
-    (read-only-mode 1)
-    (should (not (memq 'delete-trailing-whitespace
-                       write-file-functions))))
+    (should (memq #'editorconfig--delete-trailing-whitespace
+                  before-save-hook)))
+  ;; We used to re-apply the vars when switching `read-only-mode',
+  ;; but now instead we use a hook function that checks `buffer-read-only'
+  ;; every time we save the file.
+  ;;(with-visit-file (concat editorconfig-ert-dir "trim.txt")
+  ;;  (read-only-mode 1)
+  ;;  (should (not (memq #'editorconfig--delete-trailing-whitespace
+  ;;                     before-save-hook))))
   (editorconfig-mode -1))
 
 (ert-deftest test-charset nil

Reply via email to