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.
fonte
B2
buffer no seu exemplo. Uso uma função muito semelhante (provavelmente derivada desse trecho) e funcionou bem.C-x s
"file no longer exists"
.. aha! minha versão corrige isso :) Em breve.Respostas:
Original
Aqui está minha versão ligeiramente aprimorada do snippet na pergunta. Revendo meu histórico de VC, confirmo que o snippet abaixo começou como o snippet publicado pelo OP. Então, eu pago atributo a isso.
Aqui está o código que foi estável para mim:
Atualizar
Aqui está uma versão melhorada e melhor documentada acima, depois de analisar a solução da @ Drew .
Referência
fonte
Outro:
fonte
dolist
estilo para substituircar
epop
. Engraçado como você pode continuar a melhorar sua configuração como você aprende mais elisp :)Aceitei a resposta de Kausal, uma vez que era o mais próximo do que eu queria, mas peguei parte da solução de Drew também. Eu envolvi
revert-buffer
emwith-demoted-errors
e deixou cair o:preserve-modes
parâmetro para que o meu verificador de sintaxe seria re-analisar todos os meus arquivos abertos. Eu também o deixei matar arquivos modificados e não modificados, já que geralmente encontro problemas aoC-x s
digitar acidentalmentegit checkout
um arquivo modificado aberto.A versão final é:
fonte
Eu consertaria isso com um
condition-case
ouignore-errors
(documentos aqui ). Não sei exatamente o que você deseja que faça ; se você quiser fazer algo com erros, se pode usarcondition-case
para especificar o resultado ou se podeignore-errors
continuar apenas. Algo como:fonte
Com base na resposta de @ Drew, com adições:
fonte