23

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

4

5 回答 5

32

我在 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 文件,它应该保存所有失去焦点的文件。

于 2013-11-20T19:38:24.993 回答
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))
于 2012-12-17T15:51:27.817 回答
2

[…] 我所说的功能来自 Scribes。编辑html之类的时候很方便,不用再按Cx Cs,换个窗口检查一下浏览器就行了。

在这种情况下,不要切换到浏览器应用程序,而是命令 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每次保存缓冲区时使用它,自动将文件加载到您喜欢的浏览器中。

于 2009-08-10T15:41:02.097 回答
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

于 2009-08-05T09:50:07.633 回答
1

您可以使用 `auto-save-interval' 保存您键入的每 n 个字符。我的设置为 100。所以大约每 2-3 行代码,也许?

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

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

您可以自定义此变量。

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

于 2009-08-07T23:45:33.077 回答