当Emacs失去焦点时,如何自动保存缓冲区?


26

最近,我有一个Sublime Text用户试用了一段时间的Emacs,他对在Emacs中获得相同的自动保存行为感兴趣。

基本上,他希望每当帧失去焦点时都保存所有缓冲区(真正保存,而不仅仅是备份)。这包括将窗口切换到完全不同的应用程序时。

我找不到切换到其他应用程序时触发的任何事件。是否有这样的事件或有另一种方式来实现相同的行为?

请注意,基于时间的解决方案并不令人满意,默认的自动备份行为也不尽如人意。他特别希望save-buffer为所有文件保存缓冲区(如中所述)。

Answers:


29

不幸的是,这种精确的行为在Emacs <= 24.3中是不可能的,但是您可以使用来保存窗口/缓冲区的更改defadvice(如bbatsov的博客中所述):

(defadvice switch-to-buffer (before save-buffer-now activate)
  (when (and buffer-file-name (buffer-modified-p)) (save-buffer)))
(defadvice other-window (before other-window-now activate)
  (when (and buffer-file-name (buffer-modified-p)) (save-buffer)))

在Emacs 24.4中,由于有了新的聚焦钩子,您还可以节省帧聚焦损失:((add-hook 'focus-out-hook 'save-buffer)保存活动缓冲区)或(add-hook 'focus-out-hook (lambda () (save-some-buffers t)))(保存所有打开的缓冲区)。


1
defadvice如果博客文章出现问题,您可以在版本上进行扩展吗?谢谢!
Tikhon Jelvis

不幸的是,该解决方案仅保存当前可见的缓冲区,而不是所有缓冲区。
b4hand

1
@ b4hand:对不起,没有意识到这就是您想要的。答案已更新。
shosti

1
@shosti顺便说一句,感谢您为我找到bbatsov博客的链接。我实际上已经找到了该解决方案,但是再也找不到了。我打算将其作为我的问题中不起作用的解决方案之一。
b4hand 2014年

2
我喜欢这样做,以避免浪费minibuffer(原谅格式): (add-hook 'focus-out-hook (lambda () (flet ((message (format &rest args) nil)) (save-some-buffers t))))
Andreas


3
(add-to-list 'focus-out-hook (lambda () (save-some-buffers t nil)))

这将在emacs 24.4上保存所有未保存的缓冲区访问文件


2
不要add-to-list在挂钩上使用,请使用add-hook。shosti的答案已经包含此片段的正确形式。
吉尔斯(Gilles)'所以

1

对于迷迷于此的流浪者,我使用以下形式:

(eval-when-compile (require 'cl-lib))
;; [...]
(add-hook 'focus-out-hook
  (lambda ()
    (cl-letf (((symbol-function 'message) #'format))
      (save-some-buffers t))))

使用cl-letf可以避免使烦人的(No files need saving)消息阻塞回波区域。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.