Emacs auto-save em tampão interruptor
Pergunta
Chamada me coxo, mas eu estou cansado da minha C-x C-s
subconsciente tique nervoso. Eu estou passando buffers com bastante frequência e eu acho que eu gostaria de salvar um determinado buffer assim que eu mudar para outra. Eu não tive ainda o tempo para aprender noções básicas de Emacs-Lisp.
Qualquer dicas sobre como fazer isso, ou melhores soluções?
(Em uma nota relacionada, eu encontrei um autosave solução que pode salvar o buffer atual como assim que estiver inactivo durante um determinado período de tempo.)
Solução
Para expandir a Seth 's resposta , eu faria isso:
(defadvice switch-to-buffer (before save-buffer-now activate)
(when buffer-file-name (save-buffer)))
(defadvice other-window (before other-window-now activate)
(when buffer-file-name (save-buffer)))
(defadvice other-frame (before other-frame-now activate)
(when buffer-file-name (save-buffer)))
A verificação para evita buffer-file-name
poupança buffers w / out arquivos. Você precisa descobrir todos os pontos de entrada que você usa para alternar buffers que você se preocupa (eu também aconselhar other-window
).
Outras dicas
Eu sou uma espécie de novo para Emacs Lisp mim, mas isso funciona no meu teste:
(defadvice switch-to-buffer (before save-buffer-now)
(save-buffer))
(ad-activate 'switch-to-buffer)
É meio chato, porque embora ele seja chamado após o tampão CADA (como zero ). Então, considere esta resposta uma dica.
Quando você quiser desativá-lo, você precisa chamar:
(ad-disable-advice 'switch-to-buffer 'before 'save-buffer-now)
(ad-activate 'switch-to-buffer)
Um par de ideias.
Primeiro, se você encontrar-se invocando um comando como salvar com uma frequência suficientemente elevada, você pode considerar um menor de ligação para o comando chave. Por exemplo, eu também encontrei-me ter o mesmo "contração", então agora eu uso f2
vez de C-x C-s
para salvar as edições.
A função que eu ligar para f2
salva cada tampão não salvos incondicionalmente. Você pode achar útil:
(defun force-save-all ()
"Unconditionally saves all unsaved buffers."
(interactive)
(save-some-buffers t))
(global-set-key [f2] 'force-save-all)
Agora, sobre a questão principal. Você poderia tentar algo como isto (note que force-save-all
é chamado):
(defun my-switch-to-buffer (buffer)
(interactive (list (read-buffer "Switch to buffer: " (cadr buffer-name-history) nil)))
(force-save-all)
(switch-to-buffer buffer))
(global-set-key "\C-xb" 'my-switch-to-buffer)
É claro, você também pode vincular a funcionalidade tampão mudança para outra chave, como uma tecla de função, de modo que é uma operação de uma prensa.
Eu pensei que @seth teve uma grande idéia sobre o uso de conselhos, mas eu notei que o manual Elisp sugere que < a href = "http://www.gnu.org/software/emacs/manual/html_mono/elisp.html.gz#Advising-Functions" rel = "nofollow noreferrer"> conselho não ser usado para teclas . Não estou muito certo porque este é o caso, mas é o que o manual sugere FYI.