Search code examples
emacsfocuselispautosave

How to automatically save files on lose focus in Emacs


Is it possible to configure Emacs, so that it saves all files when the emacs window loses focus?


Solution

  • I use this, it will only work if emacs is running under X (like it probably would in something like ubuntu).

    (when
       (and (featurep 'x) window-system)
     (defvar on-blur--saved-window-id 0 "Last known focused window.")
     (defvar on-blur--timer nil "Timer refreshing known focused window.")
     (defun on-blur--refresh ()
       "Runs on-blur-hook if emacs has lost focus."
       (let* ((active-window (x-window-property
                              "_NET_ACTIVE_WINDOW" nil "WINDOW" 0 nil t))
              (active-window-id (if (numberp active-window)
                                    active-window
                                  (string-to-number
                                   (format "%x00%x"
                                           (car active-window)
                                           (cdr active-window)) 16)))
              (emacs-window-id (string-to-number
                                (frame-parameter nil 'outer-window-id))))
         (when (and
                (= emacs-window-id on-blur--saved-window-id)
                (not (= active-window-id on-blur--saved-window-id)))
           (run-hooks 'on-blur-hook))
         (setq on-blur--saved-window-id active-window-id)
         (run-with-timer 1 nil 'on-blur--refresh)))
     (add-hook 'on-blur-hook #'(lambda () (save-some-buffers t)))
     (on-blur--refresh))