Also inhibit user-save-mode with predicates

This commit is contained in:
Case Duckworth 2022-04-27 08:35:48 -05:00
parent 340c8583cc
commit 8edc3aa615
1 changed files with 19 additions and 5 deletions

View File

@ -29,10 +29,16 @@ This option is only useful is `user-save-mode' is active when
Emacs is killed." Emacs is killed."
:type 'boolean) :type 'boolean)
(defcustom user-save-inhibit '(special-mode) (defcustom user-save-inhibit-modes '(special-mode)
"List of modes to inhibit `user-save-mode' from activation in." "List of modes to inhibit `user-save-mode' from activation in."
:type '(repeat symbol)) :type '(repeat symbol))
(defcustom user-save-inhibit-predicates '(user-save-non-file-buffer-p)
"List of predicates to inhibit `user-save-mode' from activation.
Each predicate will be called with no arguments, and if it
returns t, will inhibit `user-save-mode' from activating."
:type '(repeat function))
(defvar user-save-hook nil (defvar user-save-hook nil
"Hook to run when the user, not Emacs, saves the buffer.") "Hook to run when the user, not Emacs, saves the buffer.")
@ -47,7 +53,13 @@ This map shadows the default map for `save-buffer'.")
"Run the hooks in `user-save-hook'. "Run the hooks in `user-save-hook'.
This does /not/ also save the buffer." This does /not/ also save the buffer."
(with-demoted-errors "User-save-hook error: %S" (with-demoted-errors "User-save-hook error: %S"
(run-hooks 'user-save-hook))) (run-hooks 'user-save-hook)))
(defun user-save-non-file-buffer-p (&optional buffer-or-name)
"Return whether BUFFER-OR-NAME is a non-file buffer.
BUFFER-OR-NAME, if omitted, defaults to the current buffer."
(with-current-buffer (or buffer-or-name (current-buffer))
(not (buffer-file-name))))
(defun user-save-buffer (&optional arg) (defun user-save-buffer (&optional arg)
"Save current buffer in visited file if modified. "Save current buffer in visited file if modified.
@ -99,9 +111,11 @@ whether the buffer needs to be saved."
(defun user-save-mode-in-some-buffers () (defun user-save-mode-in-some-buffers ()
"Enable `user-save-mode', but only in some buffers. "Enable `user-save-mode', but only in some buffers.
The mode will not be enabled in buffers derived from modes in The mode will not be enabled in buffers derived from modes in
`user-save-inhibit', or in the minibuffer." `user-save-inhibit-modes', those for which
(unless (or (cl-some #'derived-mode-p user-save-inhibit) `user-save-inhibit-predicates' return t, or in the minibuffer."
(minibufferp)) (unless (or (minibufferp)
(cl-some #'derived-mode-p user-save-inhibit-modes)
(run-hook-with-args-until-failure 'user-save-inhibit-predicates))
(user-save-mode +1))) (user-save-mode +1)))
;;;###autoload ;;;###autoload