Come salvare automaticamente i buffer quando Emacs perde lo stato attivo?


26

Recentemente ho avuto un utente di Sublime Text che ha provato Emacs per un po ', ed era interessato a ottenere lo stesso comportamento di salvataggio automatico in Emacs.

Fondamentalmente, voleva che tutti i buffer fossero salvati ogni volta che il frame perdeva la messa a fuoco (veramente salvato, non solo il backup). Ciò include il passaggio da Windows a un'applicazione completamente diversa.

Non è stato possibile trovare alcun evento attivato quando si passa a un'altra applicazione. Esiste un evento del genere o esiste un altro modo per ottenere lo stesso comportamento?

Notare che una soluzione basata sul tempo non era soddisfacente, né lo era il comportamento di backup automatico predefinito. Voleva specificamente salvare i buffer (come in save-buffer) per tutti i file.

Risposte:


29

Sfortunatamente, questo comportamento esatto non è possibile in Emacs <= 24.3, ma puoi salvare sulla modifica della finestra / buffer usando defadvice(come dettagliato sul blog di 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)))

In Emacs 24.4, sarai anche in grado di risparmiare sulla perdita di messa a fuoco del frame grazie ai nuovi hook di messa a fuoco : (add-hook 'focus-out-hook 'save-buffer)(per salvare il buffer attivo) o (add-hook 'focus-out-hook (lambda () (save-some-buffers t)))(per salvare tutti i buffer aperti).


1
Potresti espandere un po 'la defadviceversione, nel caso in cui il post del blog non funzionasse o qualcosa del genere? Grazie!
Tikhon Jelvis,

Sfortunatamente, quella soluzione attiva salva il buffer attualmente visibile, non tutti i buffer.
b4hand,

1
@ b4hand: mi dispiace, non ho capito che era quello che volevi. Risposta aggiornata
shosti,

1
@shosti A proposito, grazie per avermi trovato quel link al blog di bbatsov. In realtà avevo già trovato quella soluzione, ma non riuscivo a trovarla di nuovo. Lo avrei incluso come una delle soluzioni non funzionanti nella mia domanda.
b4hand,

2
Mi piace farlo in questo modo per evitare di distruggere il minibuffer (scusate la formattazione): (add-hook 'focus-out-hook (lambda () (flet ((message (format &rest args) nil)) (save-some-buffers t))))
Andreas,

6

C'è focus-autosave-modeadesso. È disponibile tramite MELPA. Perché non dargli la possibilità di fare l'hacking per te?


Ciao come funziona? L'ho installato ma non sembra funzionare.
Asme Solo l'

@AsmeJust, al momento non lo uso, provate a chiedere sul tracker dei problemi qui: github.com/vifon/focus-autosave-mode.el/issues
Mark Karpov

Attualmente usi un'alternativa o qualcosa del genere?
Asme Solo il

No, non uso niente del genere in questo momento.
Mark Karpov,

Ma usi ancora Emacs, giusto?
Asme Solo il

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

Ciò salverà tutti i buffer non salvati che visitano il file, su emacs 24.4


2
Non utilizzare add-to-listsu un gancio, utilizzare add-hook. La risposta di shosti contiene già la forma corretta di questo frammento.
Gilles 'SO- smetti di essere malvagio' il

1

Per i vagabondi che si imbattono in questo, io uso questo modulo:

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

L'uso di cl-letfimpedisce ai fastidiosi (No files need saving)messaggi di intasare la tua area di eco.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.