On Tue, Sep 19, 2017 at 2:14 PM Eric Abrahamsen <eric@ericabrahamsen.net> wrote:

I've played with this a bit, and am getting hung up on the (and pred...
part above. "pred" is nil unless someone's customized
`save-some-buffers-default-predicate', so in the majority of cases the
check won't even reach `buffer-offer-save'.

Wow! That (and pred.. ) section has been there since the genesis of files.el in 1991 by Roland McGrath: http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=b4da00e92a09a2ee2cfb5df2ec111636c66e1597

(Thanks to vc-region-history.)

It was named exiting.. and at some point got renamed to pred. So it looks like, by design buffer-offer-save was checked only at the time of exiting emacs i.e. during the call to save-some-buffers within save-buffer-kill-emacs.

>  I don't really know why that (and pred... is in there, and don't feel comfortable just yanking it out.

Yes, given that it had always been there.

The pred will be true automatically at the time of quitting emacs (aptly because earlier that var was called 'exiting').. but not when you call C-x s.

So looks like along with setting buffer-offer-save to t, you would also need to set save-some-buffers-default-predicate to t locally for the special buffers you need saving.

How about this as a solution? With this, you only need to set buffer-over-save.

diff --git a/lisp/files.el b/lisp/files.el
index 0c30d40c13..5c05e3168b 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -5188,15 +5188,15 @@ save-some-buffers
        (and (buffer-live-p buffer)
     (buffer-modified-p buffer)
                     (not (buffer-base-buffer buffer))
-                    (not (eq (aref (buffer-name buffer) 0) ?\s))
                     (or
                      (buffer-file-name buffer)
                      (and pred
                           (progn
                             (set-buffer buffer)
                             (and buffer-offer-save (> (buffer-size) 0))))
-                     (buffer-local-value
-                      'write-contents-functions buffer))
+                     (and buffer-offer-save
+                          (buffer-local-value
+                           'write-contents-functions buffer)))
                     (or (not (functionp pred))
                         (with-current-buffer buffer (funcall pred)))
                     (if arg

Stefan? Eli?
--

Kaushal Modi