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 magit
può 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 checkout
di 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
, ..., Bn
un errore durante il tentativo di tornare B2
impedisce B3
- Bn
di essere ripristinato.
Come posso dire a emacs di ignorare gli errori che compaiono in questo caso? Non voglio usarlo global-auto-revert-mode
perché 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.
B2
buffer nel tuo esempio. Uso una funzione molto simile (molto probabilmente derivata da questo frammento) e ha funzionato bene.