如何在Emacs中自动保存失去焦点的文件

时间:2009-08-04 22:33:30

标签: emacs focus elisp autosave

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

5 个答案:

答案 0 :(得分:25)

我为Gnu Emacs 24.4添加了焦点钩子。

他们被称为focus-in-hookfocus-out-hook

您可以添加

(defun save-all ()
  (interactive)
  (save-some-buffers t))

(add-hook 'focus-out-hook 'save-all)

到你的.emacs文件,它应该保存失去焦点的所有文件。

答案 1 :(得分:10)

我使用它,它只有在emacs在X下运行时才有效(就像在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))

答案 2 :(得分:2)

不确定这是否是你想要的。

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

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

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

编辑:它似乎只适用于XEmacs

答案 3 :(得分:2)

  

[...]我正在谈论的功能来自   文士。这时非常方便   编辑HTML等等,你没有   你不得不再按C-x C-s了   只需更改窗口并检查您的   浏览器。

在这种情况下,不要切换到浏览器应用程序,而是命令Emacs加载浏览器应用程序(C-c C-vM-x browse-url-of-buffer)。使用此方法,您可以编写自己的函数来保存缓冲区,然后然后启动浏览器,例如:

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

将它挂钩到一个方便的绑定。

或者您仍然可以使用每次保存缓冲区时html-autoview-mode,自动将文件加载到您喜欢的浏览器中。

答案 4 :(得分:1)

您可以使用`auto-save-interval'保存您键入的每n个字符。我的设置为100左右。那么大概每2-3行代码呢?

  

auto-save-interval是一个变量   在“C源代码”中定义。它的价值   是100

     

文档:   *自动保存之间的输入事件数。零表示禁用   由于字符数而自动保存   键入。

     

您可以自定义此变量。

这不能回答你原来的问题;这只是实现类似目标的一种方式。