branch: scratch/editorconfig
commit 5e25a51e2591ca19d034347dafaa3f32cce9367e
Author: Stefan Monnier <[email protected]>
Commit: Stefan Monnier <[email protected]>
Don't hook into `read-only-mode-hook`
Don'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.
* lisp/editorconfig.el (editorconfig--delete-trailing-whitespace):
New function.
(editorconfig-set-trailing-ws): Use it. Use `pcase`.
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-tests.el (test-trim-trailing-ws): Adjust the
test accordingly.
---
editorconfig.el | 34 ++++++++++++++++------------------
ert-tests/editorconfig-tests.el | 16 ++++++++++------
2 files changed, 26 insertions(+), 24 deletions(-)
diff --git a/editorconfig.el b/editorconfig.el
index 6e215ce23d..029f99e148 100644
--- a/editorconfig.el
+++ b/editorconfig.el
@@ -596,24 +596,23 @@ 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 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)
- ;; 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))))
+ (pcase trim-trailing-ws
+ ("true"
+ (if editorconfig-trim-whitespaces-mode
+ (funcall editorconfig-trim-whitespaces-mode 1)
+ (add-hook 'before-save-hook
+ #'editorconfig--delete-trailing-whitespace nil t)))
+ ("false"
+ (when editorconfig-trim-whitespaces-mode
+ (funcall editorconfig-trim-whitespaces-mode 0))
+ (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."
@@ -851,7 +850,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-tests.el b/ert-tests/editorconfig-tests.el
index 75da5ebade..82577f8518 100644
--- a/ert-tests/editorconfig-tests.el
+++ b/ert-tests/editorconfig-tests.el
@@ -102,12 +102,16 @@
(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)))
+ ;; FIXME: We don't hook into `read-only-mode', so instead we should
+ ;; make a more thorough test that saves the file after making the buffer
+ ;; read-only and makes sure it does not trim the trailing-ws of the
+ ;; buffer/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