It’s been a while since the last super-save release. The last time I wrote about it was back in 2018, when I boldly proclaimed:

It seems that now super-save is beyond perfect, so don’t expect the next release any time soon!

Famous last words. There was a 0.4 release in 2023 (adding a predicate system, buffer exclusions, silent saving, and trailing whitespace cleanup), but I never got around to writing about it. The package has been rock solid for years and I just didn’t pay it much attention – it quietly did its job, which is kind of the whole point of an auto-save package.

A Bit of History

The idea behind super-save goes all the way back to a blog post I wrote in 2012 about auto-saving buffers on buffer and window switches. I had been using IntelliJ IDEA for Java development and loved that it would save your files automatically whenever the editor lost focus. No manual C-x C-s, no thinking about it. I wanted the same behavior in Emacs.

Back then, the implementation was crude – defadvice on switch-to-buffer, other-window, and the windmove commands. That code lived in Emacs Prelude for a few years before I extracted it into a standalone package in 2015. super-save was born.

What Prompted This Release

Yesterday I stumbled upon buffer-guardian.el, a package with very similar goals to super-save. Its README has a comparison with super-save that highlighted some valid points – mainly that super-save was still relying on advising specific commands for buffer-switch detection, while newer Emacs hooks like window-buffer-change-functions and window-selection-change-functions could do the job more reliably.

The thing is, those hooks didn’t exist when super-save was created, and I didn’t rush to adopt them while Emacs 27 was still new and I wanted to support older Emacsen. But it’s 2026 now – Emacs 27.1 is ancient history. Time to modernize!

What’s New in 0.5

This is the biggest super-save release in years! Here are the highlights:

Modern buffer/window switch detection

Buffer and window switches are now detected via window-buffer-change-functions and window-selection-change-functions, controlled by the new super-save-when-buffer-switched option (enabled by default). This catches all buffer switches – keyboard commands, mouse clicks, custom functions – unlike the old approach of advising individual (yet central) commands.

Modern focus handling

Frame focus loss is now detected via after-focus-change-function instead of the obsolete focus-out-hook, controlled by super-save-when-focus-lost (also enabled by default).

Soft-deprecated trigger system

With the new hooks in place, both super-save-triggers and super-save-hook-triggers now default to nil. You can still use them for edge cases, but for the vast majority of users, the built-in hooks cover everything.

org-src and edit-indirect support

super-save now knows how to save org-src edit buffers (via org-edit-src-save) and edit-indirect buffers (via edit-indirect--commit). Both are enabled by default and controlled by super-save-handle-org-src and super-save-handle-edit-indirect.

Safer predicates

Two new default predicates prevent data loss: verify-visited-file-modtime avoids overwriting files modified outside Emacs, and a directory existence check prevents errors when a file’s parent directory has been removed. Predicate evaluation is also wrapped in condition-case now, so a broken custom predicate logs a warning instead of silently disabling all auto-saving.

Emacs 27.1 required

This allowed cleaning up the code and relying on modern APIs.

Upgrading

For most users, upgrading is seamless – the new defaults just work. If you had a custom super-save-triggers list for buffer-switching commands, you can probably remove it entirely:

;; Before: manually listing every command that switches buffers
(setq super-save-triggers
      '(switch-to-buffer other-window windmove-up windmove-down
        windmove-left windmove-right next-buffer previous-buffer))

;; After: the window-system hooks catch all of these automatically
;; Just delete the above and use the defaults!

If you need to add triggers for commands that don’t involve a buffer switch (like ace-window), super-save-triggers is still available for that.

A clean 0.5 setup looks something like this:

(use-package super-save
  :ensure t
  :config
  ;; Save buffers automatically when Emacs is idle
  (setq super-save-auto-save-when-idle t)
  ;; Don't display "Wrote file..." messages in the echo area
  (setq super-save-silent t)
  ;; Disable the built-in auto-save (backup files) since super-save handles it
  (setq auto-save-default nil)
  (super-save-mode +1))

It’s also worth noting that Emacs 26.1 introduced auto-save-visited-mode, which saves file-visiting buffers to their actual files after an idle delay. This overlaps with super-save-auto-save-when-idle, so if you prefer using the built-in for idle saves, you can combine the two:

(use-package super-save
  :ensure t
  :config
  ;; Don't display "Wrote file..." messages in the echo area
  (setq super-save-silent t)
  ;; Disable the built-in auto-save (backup files)
  (setq auto-save-default nil)
  (super-save-mode +1))

;; Let the built-in auto-save-visited-mode handle idle saves
(auto-save-visited-mode +1)

Burst-Driven Development Strikes Again

Most of my Emacs packages are a fine example of what I like to call burst-driven development – long periods of stability punctuated by short intense bursts of activity. I hadn’t touched super-save in years, then spent a few hours modernizing the internals, adding a test suite, improving the documentation, and cutting a release. It was fun to revisit the package after all this time and bring it up to 2026 standards.

If you’ve been using super-save, update to 0.5 and enjoy the improvements. If you haven’t tried it yet – give it a shot. Your poor fingers might thanks for you this, as pressing C-x C-s non-stop is hard work!

That’s all I have for you today. Keep hacking!