Como salvar automaticamente os buffers quando o Emacs perde o foco?

26

Recentemente, um usuário do Sublime Text experimentou o Emacs por um tempo e estava interessado em obter o mesmo comportamento de salvamento automático no Emacs.

Basicamente, ele queria que todos os buffers fossem salvos sempre que o quadro perdesse o foco (realmente salvo, não apenas o backup). Isso inclui ao alternar janelas para um aplicativo completamente diferente.

Não foi possível encontrar nenhum evento que foi acionado ao alternar para um aplicativo diferente. Existe um evento desse tipo ou existe outra maneira de obter o mesmo comportamento?

Observe que uma solução baseada no tempo não foi satisfatória e o comportamento padrão de backup automático também não. Ele queria especificamente que os buffers fossem salvos (como em save-buffer) para todos os arquivos.

b4hand
fonte

Respostas:

29

Infelizmente, esse comportamento exato não é possível no Emacs <= 24.3, mas você pode salvar as alterações na janela / buffer usando defadvice(conforme detalhado no blog do 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)))

No Emacs 24.4, você também poderá economizar na perda de foco do quadro, graças aos novos ganchos de foco : (add-hook 'focus-out-hook 'save-buffer)(para salvar o buffer ativo) ou (add-hook 'focus-out-hook (lambda () (save-some-buffers t)))(para salvar todos os buffers abertos).

shosti
fonte
11
Você poderia expandir um pouco a defadviceversão, caso a postagem do blog caia ou algo assim? Obrigado!
Tikhon Jelvis
Infelizmente, essa solução salva o buffer atualmente visível, nem todos os buffers.
precisa saber é
11
@ b4hand: Desculpe, não sabia que era isso que você queria. Resposta atualizada.
shosti
11
@shosti A propósito, obrigado por encontrar esse link para o blog do bbatsov para mim. Eu já havia encontrado essa solução antes, mas não consegui encontrá-la novamente. Eu incluiria isso como uma das soluções não úteis na minha pergunta.
precisa saber é o seguinte
2
Eu gosto de fazê-lo desta maneira para evitar destruir o minibuffer (perdoe a formatação): (add-hook 'focus-out-hook (lambda () (flet ((message (format &rest args) nil)) (save-some-buffers t))))
Andreas
6

Existe focus-autosave-modeagora. Está disponível via MELPA. Por que não dar a chance de fazer o hacking para você‽

Mark Karpov
fonte
Olá, como funciona? Eu instalei, mas parece não funcionar.
Asme Apenas
@AsmeJust, eu não usar agora, tentar pedir em seu issue tracker aqui: github.com/vifon/focus-autosave-mode.el/issues
Mark Karpov
Atualmente, você usa uma alternativa ou algo assim?
Asme Apenas
Não, eu não uso nada parecido agora.
Mark Karpov
Mas você ainda usa o Emacs, certo?
Asme Apenas
3
(add-to-list 'focus-out-hook (lambda () (save-some-buffers t nil)))

Isso salvará todos os buffers não salvos que visitam o arquivo, no emacs 24.4

Łukasz Gruner
fonte
2
Não use add-to-listno gancho, use add-hook. A resposta do shosti já contém a forma correta deste trecho.
Gilles 'SO- stop be evil'
1

Para andarilhos que tropeçam nisso, eu uso este formulário:

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

O uso de cl-letfevita que as (No files need saving)mensagens irritantes obstruam sua área de eco.

PythonNut
fonte