summary refs log tree commit diff stats
path: root/lisp/user-save.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/user-save.el')
-rw-r--r--lisp/user-save.el78
1 files changed, 78 insertions, 0 deletions
diff --git a/lisp/user-save.el b/lisp/user-save.el new file mode 100644 index 0000000..63fe424 --- /dev/null +++ b/lisp/user-save.el
@@ -0,0 +1,78 @@
1;;; user-save.el -*- lexical-binding: t; -*-
2
3;; Because `super-save-mode' automatically saves every time we move away from a
4;; buffer, it tends to run a lot of `before-save-hook's that don't need to be
5;; run that often. For that reason, I'm writing a mode where C-x C-s saves
6;; /and/ runs all the "real" before-save-hooks, so that super-save won't
7;; automatically do things like format the buffer all the time.
8
9;;; Code:
10
11(defgroup user-save nil
12 "Group for `user-save-mode' customizations."
13 :group 'emacs
14 :prefix "user-save-")
15
16(defcustom user-save-hook-into-kill-emacs nil
17 "Add a hook to perform `user-save' to `kill-emacs-hook'.
18This option is only useful is `user-save-mode' is active when
19Emacs is killed."
20 :type 'boolean)
21
22(defvar user-save-hook nil
23 "Hook to run when the user, not Emacs, saves the buffer.")
24
25(defvar user-save-mode-map (let ((map (make-sparse-keymap)))
26 (define-key map (kbd "C-x C-s") #'user-save-buffer)
27 map)
28 "Keymap for `user-save-mode'.
29This map shadows the default map for `save-buffer'.")
30
31(defun user-save-buffer (&optional arg)
32 "Save current buffer in visited file if modified.
33This function is precisely the same as `save-buffer', but with
34one modification: it also runs functions in `user-save-hook'.
35This means that if you have some functionality in Emacs to
36automatically save buffers periodically, but have hooks you want
37to automatically run when the buffer saves that are
38computationally expensive or just aren't something you want to
39run all the time, put them in `user-save-hook'.
40
41ARG is passed directly to `save-buffer'."
42 (interactive '(called-interactively))
43 (message "Saving the buffer...")
44 (with-demoted-errors (run-hooks 'user-save-hook))
45 (save-buffer arg)
46 (message "Saving the buffer...Done."))
47
48(defun user-save-some-buffers (&optional pred)
49 "Save some buffers as though the user saved them.
50This function does not ask the user about each buffer, but PRED
51is used in almost the same way as `save-some-buffers': if it's
52nil or t, it will save all file-visiting modified buffers; if
53it's a zero-argument function, that will be called to determine
54whether the buffer needs to be saved."
55 ;; This could maybe be much better.
56 (interactive "P")
57 (unless pred (setq pred save-some-buffers-default-predicate))
58 (dolist (buf (buffer-list))
59 (with-current-buffer buf
60 (when (and (buffer-modified-p)
61 (buffer-file-name)
62 (or (null pred)
63 (if (functionp pred) (funcall pred) pred)))
64 (user-save-buffer)))))
65
66;;;###autoload
67(define-minor-mode user-save-mode
68 "Mode to enable an an extra user-save hook."
69 :lighter " US"
70 :global t
71 :keymap 'user-save-mode-map
72 (if user-save-mode
73 (when user-save-hook-into-kill-emacs
74 (add-hook 'kill-emacs-hook #'user-save-some-buffers))
75 (remove-hook 'kill-emacs-hook #'user-save-some-buffers)))
76
77(provide 'user-save)
78;;; user-save.el ends here