Ao trabalhar em um projeto sob controle de versão com o git, geralmente quero fazer algumas coisas em um shell que afetam muitos dos meus arquivos abertos, e depois reverter todos os buffers que tenho aberto para garantir que não derrube acidentalmente a nova versão com o que eu tinha aberto. Sei que magit
pode ser útil aqui, mas estou acostumado com meu fluxo de trabalho no shell e gostaria de mantê-lo por enquanto. Então, em vez disso, eu gostaria de reverter todos os buffers abertos e talvez fechar todos os que pararam de existir (por exemplo, devido a git checkout
uma ramificação que não possui mais esse arquivo).
Eu tenho o seguinte trecho de elisp que peguei em uma pesquisa no Google:
(defun revert-all-buffers ()
"Refreshes all open buffers from their respective files"
(interactive)
(let* ((list (buffer-list))
(buffer (car list)))
(while buffer
(when (and (buffer-file-name buffer)
(not (buffer-modified-p buffer)))
(set-buffer buffer)
(revert-buffer t t t))
(setq list (cdr list))
(setq buffer (car list))))
(message "Refreshed open files"))
Mas esta quebra se ela atinge um erro em um dos meus arquivos abertos, ou seja, quando revertendo B1
, B2
, B3
, ..., Bn
um erro ao tentar reverter B2
previne B3
- Bn
de ser revertido.
Como posso dizer ao emacs para ignorar os erros que aparecerem neste caso? Eu não quero usar global-auto-revert-mode
porque cada reversão aciona algumas coisas pesadas, como o meu auto-complete e o verificador de sintaxe, analisando novamente o arquivo, suspendendo o emacs por mais ou menos um segundo.
C-x s
"file no longer exists"
.. aha! minha versão corrige isso :) Em breve.
B2
buffer no seu exemplo. Uso uma função muito semelhante (provavelmente derivada desse trecho) e funcionou bem.