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 magitpode 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 checkoutuma 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, ..., Bnum erro ao tentar reverter B2previne B3- Bnde ser revertido.
Como posso dizer ao emacs para ignorar os erros que aparecerem neste caso? Eu não quero usar global-auto-revert-modeporque 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.
B2buffer no seu exemplo. Uso uma função muito semelhante (provavelmente derivada desse trecho) e funcionou bem.