Wie speichere ich automatisch Puffer, wenn Emacs den Fokus verliert?


26

Ich hatte kürzlich einen Sublime Text-Benutzer, der Emacs eine Weile ausprobierte, und er war daran interessiert, dasselbe Verhalten beim automatischen Speichern in Emacs zu erzielen.

Grundsätzlich wollte er, dass alle Puffer gespeichert werden, wenn der Frame den Fokus verliert (wirklich gespeichert, nicht nur gesichert). Dies gilt auch, wenn Sie Windows auf eine völlig andere Anwendung umschalten.

Ich konnte kein Ereignis finden, das beim Wechsel zu einer anderen Anwendung ausgelöst wurde. Gibt es ein solches Ereignis oder gibt es einen anderen Weg, um dasselbe Verhalten zu erreichen?

Beachten Sie, dass eine zeitbasierte Lösung nicht zufriedenstellend war und auch nicht das Standardverhalten für die automatische Sicherung. Er wollte ausdrücklich, dass die Puffer (wie in save-buffer) für alle Dateien gespeichert werden.

Antworten:


29

Leider ist dieses genaue Verhalten in Emacs <= 24.3 nicht möglich, aber Sie können die Fenster- / Pufferänderung mit defadvice(wie im Blog von bbatsov beschrieben ) speichern :

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

In Emacs 24.4 können Sie dank der neuen Fokus-Hooks auch den Frame-Fokusverlust einsparen : (add-hook 'focus-out-hook 'save-buffer)(um den aktiven Puffer (add-hook 'focus-out-hook (lambda () (save-some-buffers t)))zu speichern ) oder (um alle offenen Puffer zu speichern).


1
Könnten Sie die defadviceVersion etwas erweitern, falls der Blog-Beitrag ausfällt oder so? Vielen Dank!
Tikhon Jelvis

Leider speichert diese Lösung den aktuell sichtbaren Puffer, nicht alle Puffer.
b4hand

1
@ b4hand: Sorry, hab nicht gemerkt, was du wolltest. Antwort aktualisiert.
Shosti

1
@shosti Übrigens, danke, dass du diesen Link zu bbatsovs Blog für mich gefunden hast. Ich hatte diese Lösung schon einmal gefunden, konnte sie aber nicht wiederfinden. Ich würde das als eine der nicht funktionierenden Lösungen in meine Frage aufnehmen.
b4hand

2
Ich mache es gerne so, um den Minipuffer nicht zu zerstören (verzeihen Sie die Formatierung):(add-hook 'focus-out-hook (lambda () (flet ((message (format &rest args) nil)) (save-some-buffers t))))
Andreas

6

Da ist focus-autosave-modejetzt. Es ist über MELPA erhältlich. Warum nicht die Chance geben, das Hacken für dich zu erledigen?


Hallo, wie geht das? Ich habe es installiert, aber es scheint nicht zu funktionieren.
Asme Nur

@AsmeJust, ich benutze es momentan nicht, versuche hier nach dem Issue Tracker zu fragen: github.com/vifon/focus-autosave-mode.el/issues
Mark Karpov

Verwenden Sie derzeit eine Alternative oder ähnliches?
Asme Nur

Nein, so etwas verwende ich gerade nicht.
Mark Karpov

Aber Sie benutzen immer noch Emacs, oder?
Asme Nur

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

Dadurch werden alle ungespeicherten Puffer, die die Datei besuchen, auf dem Emacs 24.4 gespeichert


2
Nicht add-to-listan einem Haken verwenden, verwenden add-hook. Die Antwort von shosti enthält bereits die richtige Form dieses Snippets.
Gilles 'SO - hör auf böse zu sein'

1

Für Wanderer, die darüber stolpern, benutze ich dieses Formular:

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

Die Verwendung von verhindert, dass cl-letfdie lästigen (No files need saving)Nachrichten Ihren Echobereich verstopfen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.