List Unsaved Buffers Before Exiting Emacs

When you hit C-x C-c to exit Emacs but there are unsaved buffers, Emacs asks you whether to save each buffer. The problem is, more often than not, I don’t remember why there is an outstanding change, and all I can do is to nervously say “yes”, hoping that it isn’t a typo I accidentally typed into that buffer.

Wouldn’t it be nice if Emacs can show me a list of unsaved buffers, and let me examine them and save/kill them? The function below does just that: bind it to C-x C-c and you will always exit Emacs with peace in your mind.

(defun clean-exit ()
  "Exit Emacs cleanly.
If there are unsaved buffer, pop up a list for them to be saved
before existing. Replaces ‘save-buffers-kill-terminal’."
  (interactive)
  (if (frame-parameter nil 'client)
      (server-save-buffers-kill-terminal arg)
    (if-let ((buf-list (seq-filter (lambda (buf)
                                     (and (buffer-modified-p buf)
                                          (buffer-file-name buf)))
                                   (buffer-list))))
        (progn
          (pop-to-buffer (list-buffers-noselect t buf-list))
          (message "s to save, C-k to kill, x to execute"))
      (save-buffers-kill-emacs))))