From 84139db9a8869b31f831fb154bdc209e06db5ab3 Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Thu, 6 Jan 2022 15:47:09 -0600 Subject: Add user-save-mode --- lisp/user-save.el | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 lisp/user-save.el (limited to 'lisp/user-save.el') diff --git a/lisp/user-save.el b/lisp/user-save.el new file mode 100644 index 0000000..01adc22 --- /dev/null +++ b/lisp/user-save.el @@ -0,0 +1,45 @@ +;;; user-save.el -*- lexical-binding: t; -*- + +;; Because `super-save-mode' automatically saves every time we move away from a +;; buffer, it tends to run a lot of `before-save-hook's that don't need to be +;; run that often. For that reason, I'm writing a mode where C-x C-s saves +;; /and/ runs all the "real" before-save-hooks, so that super-save won't +;; automatically do things like format the buffer all the time. + +;;; Code: + +(defvar user-save-hook nil + "Hook to run when the user, not Emacs, saves the buffer.") + +(defvar user-save-mode-map (let ((map (make-sparse-keymap))) + (define-key map (kbd "C-x C-s") #'user-save-buffer) + map) + "Keymap for `user-save-mode'. +This map shadows the default map for `save-buffer'.") + +(defun user-save-buffer (&optional arg) + "Save current buffer in visited file if modified. +This function is precisely the same as `save-buffer', but with +one modification: it also runs functions in `user-save-hook'. +This means that if you have some functionality in Emacs to +automatically save buffers periodically, but have hooks you want +to automatically run when the buffer saves that are +computationally expensive or just aren't something you want to +run all the time, put them in `user-save-hook'. + +ARG is passed directly to `save-buffer'." + (interactive '(called-interactively)) + (message "Saving the buffer...") + (with-demoted-errors (run-hooks 'user-save-hook)) + (save-buffer arg) + (message "Saving the buffer...Done.")) + +;;;###autoload +(define-minor-mode user-save-mode + "Mode to enable an an extra user-save hook." + :lighter " US" + :global t + :keymap 'user-save-mode-map) + +(provide 'user-save) +;;; user-save.el ends here -- cgit 1.4.1-21-gabe81 From 13cbd6644a1798ef643d63dbb2784602a5fff4b5 Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Thu, 6 Jan 2022 16:43:16 -0600 Subject: Add option to user-save buffers when quitting Emacs --- lisp/user-save.el | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'lisp/user-save.el') diff --git a/lisp/user-save.el b/lisp/user-save.el index 01adc22..63fe424 100644 --- a/lisp/user-save.el +++ b/lisp/user-save.el @@ -8,6 +8,17 @@ ;;; Code: +(defgroup user-save nil + "Group for `user-save-mode' customizations." + :group 'emacs + :prefix "user-save-") + +(defcustom user-save-hook-into-kill-emacs nil + "Add a hook to perform `user-save' to `kill-emacs-hook'. +This option is only useful is `user-save-mode' is active when +Emacs is killed." + :type 'boolean) + (defvar user-save-hook nil "Hook to run when the user, not Emacs, saves the buffer.") @@ -34,12 +45,34 @@ ARG is passed directly to `save-buffer'." (save-buffer arg) (message "Saving the buffer...Done.")) +(defun user-save-some-buffers (&optional pred) + "Save some buffers as though the user saved them. +This function does not ask the user about each buffer, but PRED +is used in almost the same way as `save-some-buffers': if it's +nil or t, it will save all file-visiting modified buffers; if +it's a zero-argument function, that will be called to determine +whether the buffer needs to be saved." + ;; This could maybe be much better. + (interactive "P") + (unless pred (setq pred save-some-buffers-default-predicate)) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (when (and (buffer-modified-p) + (buffer-file-name) + (or (null pred) + (if (functionp pred) (funcall pred) pred))) + (user-save-buffer))))) + ;;;###autoload (define-minor-mode user-save-mode "Mode to enable an an extra user-save hook." :lighter " US" :global t - :keymap 'user-save-mode-map) + :keymap 'user-save-mode-map + (if user-save-mode + (when user-save-hook-into-kill-emacs + (add-hook 'kill-emacs-hook #'user-save-some-buffers)) + (remove-hook 'kill-emacs-hook #'user-save-some-buffers))) (provide 'user-save) ;;; user-save.el ends here -- cgit 1.4.1-21-gabe81