简体   繁体   中英

How to automatically save files on lose focus in Emacs

是否可以配置Emacs,以便在emacs窗口失去焦点时保存所有文件?

I added focus hooks to Gnu Emacs 24.4.

They are called focus-in-hook and focus-out-hook .

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.

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))

Not sure if this is what you want.

(defun dld-deselect-frame-hook ()
  (save-some-buffers 1))

(add-hook 'deselect-frame-hook 'dld-deselect-frame-hook)

From: http://www.dribin.org/dave/blog/archives/2003/09/10/emacs/

EDIT: It only seems to work in XEmacs

[…] the feature I am talking about is from Scribes. It is very convient when editing html and the like, you don't have to press Cx Cs anymore, you just change the window and check your browser.

In that case, instead of switching to the browser application, order Emacs to load the browser application ( Cc Cv or Mx browse-url-of-buffer ). With this method, you can write your own function that saves the buffer and then brings the browser up, like:

(defun my-browse-url-of-buffer ()
  "Save current buffer and view its content in browser."
  (interactive)
  (save-buffer)
  (browse-url-of-buffer))

And hook it to a convenient binding.

Or you can still use the html-autoview-mode that each time you saves the buffer, automatically loads the file into your favorite browser.

You can use `auto-save-interval' to save every n characters you type. Mine is set to 100. So about every 2-3 lines of code, maybe?

auto-save-interval is a variable defined in `C source code'. Its value is 100

Documentation: *Number of input events between auto-saves. Zero means disable autosaving due to number of characters typed.

You can customize this variable.

This doesn't answer your original question; it's just a way to achieve something similar.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM