Emacsがフォーカスを失ったときにバッファを自動保存する方法は?


26

私は最近、Sublime TextユーザーにしばらくEmacsを試してもらいましたが、彼はEmacsで同じ自動保存動作を取得することに興味がありました。

基本的に、彼はフレームがフォーカスを失ったときはいつでもすべてのバッファを保存したかった(バックアップだけでなく、本当に保存された)。これには、ウィンドウを完全に異なるアプリケーションに切り替える場合が含まれます。

別のアプリケーションに切り替えたときにトリガーされるイベントを見つけることができませんでした。そのようなイベントがありますか、または同じ動作を達成する別の方法がありますか?

時間ベースのソリューションは満足のいくものではなく、デフォルトの自動バックアップ動作でもないことに注意してください。彼は、save-bufferすべてのファイルのバッファを(のように)保存することを特に望んでいました。

回答:


29

残念ながら、この正確な動作はEmacs <= 24.3では不可能ですが、defadvicebbatsovのブログで詳しく説明されているように)ウィンドウ/バッファの変更を保存できます:

(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 14

1
@ b4hand:申し訳ありませんが、それがあなたの望んでいることに気づいていませんでした。回答が更新されました。
shosti 14

1
@shostiところで、私のためにbbatsovのブログへのリンクを見つけてくれてありがとう。私は以前にその解決策を実際に見つけましたが、それを再び見つけることができませんでした。私の質問には、それを非機能的なソリューションの1つとして含めるつもりでした。
b4hand

2
私はこの方法でミニバッファーを破壊しないようにしています(フォーマットをご容赦ください): (add-hook 'focus-out-hook (lambda () (flet ((message (format &rest args) nil)) (save-some-buffers t))))
アンドレアス14年

6

あるfocus-autosave-mode今。MELPA経由で入手できます。ハッキングを行う機会を与えてみませんか‽


こんにちは、どのように機能しますか?私はそれをインストールしましたが、うまくいかないようです。
ASMEちょうど

@AsmeJust、私はここでその課題追跡に依頼してみてください、今は使用しないでください:github.com/vifon/focus-autosave-mode.el/issues
マーク・カルポフ

現在、そのような代替または何かを使用していますか?
Asme

いいえ、私は今そのようなものを使用していません。
マークカルポフ

しかし、まだEmacsを使用していますよね?
ASMEただ、

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

これにより、emacs 24.4でファイルにアクセスするすべての未保存バッファが保存されます。


2
add-to-listフックには使用しないでくださいadd-hook。shostiの答えには、すでにこのスニペットの正しい形式が含まれています。
ジル「SO-悪であるのをやめる」14年

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)メッセージがエコー領域を詰まらせないようにします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.