Quando lavoro su un progetto sotto controllo di versione con git, spesso voglio fare alcune cose in una shell che interessano molti dei miei file aperti, quindi ripristinare tutti i buffer che ho aperto per assicurarmi di non bloccare accidentalmente la nuova versione con tutto ciò che avevo aperto. So che magitpuò essere utile qui, ma sono abituato al mio flusso di lavoro nella shell e per ora vorrei mantenerlo. Quindi, invece, vorrei ripristinare tutti i buffer aperti e forse chiudere quelli che hanno smesso di esistere (ad esempio a causa git checkoutdi un ramo di un file che non ha più quel file).
Ho il seguente frammento di elisp che ho preso da una ricerca su 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"))
Ma questo si rompe se colpisce un errore in uno dei miei file aperti, cioè quando tornando B1, B2, B3, ..., Bnun errore durante il tentativo di tornare B2impedisce B3- Bndi essere ripristinato.
Come posso dire a emacs di ignorare gli errori che compaiono in questo caso? Non voglio usarlo global-auto-revert-modeperché ogni ripristino innesca alcune cose pesanti come il mio controllo automatico e il sintassi che ri-analizza il file, sospendendo emacs per un secondo circa.
C-x s
"file no longer exists".. aha! la mia versione lo risolve :) Lo pubblicherò a breve.
B2buffer nel tuo esempio. Uso una funzione molto simile (molto probabilmente derivata da questo frammento) e ha funzionato bene.