By default, Emacs automatically saves your changes to a file intermittently. If anything should happen, you can recover a file with ‘M-x recover-file’. Auto-saving can be turned on globally or on a per-buffer basis with ‘M-x auto-save-mode’ (users of Emacs 26.1 and later may prefer ‘M-x auto-save-visited-mode’). Note that auto-saving and backing up are different concepts and serve different purposes.
See also the Auto Save Emacs manual entry.
By default, auto-save files are stored in the current directory with a file name on the form #file#. If you don’t want to clutter up your file tree with Emacs’ backup files, you can save them to a dedicated directory:
(setq backup-directory-alist
`(("." . ,(concat user-emacs-directory "backups"))))Saving to the system’s “temp” directory is also an option, though a dangerous one, since in regular Linux setups there’s no guarantee that you will see those backups again:
(setq backup-directory-alist
`((".*" . ,temporary-file-directory)))
(setq auto-save-file-name-transforms
`((".*" ,temporary-file-directory t)))This will place all auto-saves and backups in the directory pointed to by temporary-file-directory (e.g., C:/Temp/ on Windows, /tmp/ on Linux).
Or even more dramatic:
;; Save all tempfiles in $TMPDIR/emacs$UID/ (defconst emacs-tmp-dir (expand-file-name (format "emacs%d" (user-uid)) temporary-file-directory)) (setq backup-directory-alist `((".*" . ,emacs-tmp-dir))) (setq auto-save-file-name-transforms `((".*" ,emacs-tmp-dir t))) (setq auto-save-list-file-prefix emacs-tmp-dir)
‘x’ to delete them. find -name "#*#" -print -deleteBe aware that symbolic links of the form “.#*” are not auto-save files but interlocks to prevent the simultaneous editing of the same file. See Interlocking in the EmacsManual for details.
For Emacs 26.1 and later:
As written in Auto Save Files:
If you want auto-saving to be done in the visited file rather than in a separate auto-save file, enable the global minor mode
‘auto-save-visited-mode’. In this mode, auto-saving is identical to explicit saving.
For older versions of Emacs, or for greater flexibility you can use a 3rd-party package:
https://github.com/ChillarAnand/real-auto-save - Automatically save your all your buffers/files at regular intervals in Emacs!
I like using ‘auto-save-hook’, and that seems to work well, but I want to save all the buffers, because if I switch away from a buffer before it autosaves, I want it to get saved when things next get saved after that. So I combined parts of the two above solutions (this is the first elisp code I’ve written, could have glaring problems):
(defun full-auto-save () (interactive) (save-excursion (dolist (buf (buffer-list)) (set-buffer buf) (if (and (buffer-file-name) (buffer-modified-p)) (basic-save-buffer))))) (add-hook 'auto-save-hook 'full-auto-save)
New hooks for gain/loss of focus were added in Gnu Emacs 24.4: focus-in-hook and focus-out-hook.
If you are running a version of Emacs with these hooks, you can add
(defun save-all () (interactive) (save-some-buffers t)) (add-hook 'focus-out-hook 'save-all)
to your .emacs file and it should save all files on loss of focus.
Two things to note:
These hooks fire when any Emacs frame gains or loses focus. This means that if you Alt-Tab or Alt-` between Emacs frames, the focus-out-hook and focus-in-hook will run. (MacOS and Windows have a concept of application-level focus, but X apparently does not. These hooks apply at the frame level so they can work on all three platforms.)
These hooks are intended for use by the end-user, not for use in packages. If you set these hooks for other people, they’re likely to be annoyed. (Particularly if they are debugging Emacs itself or working in a “focus follows mouse” environment where merely mousing over a window switches focus to it.)
Another approach is tell emacs to do ‘full-auto-save’ (defined above) when it receives the USR1 signal.
(define-key special-event-map [sigusr1] #'full-auto-save)
Create a shell script to send the signal to emacs.
#!/usr/bin/env sh pkill -USR1 emacs
And tell your window manager to run the script whenever you switch windows. I use sawfish and so:
;;.sawfish/rc code (defun save-emacs () (system "save-emacs &")) (add-hook 'leave-workspace-hook save-emacs)