Lorsque je travaille sur un projet sous contrôle de version avec git, je veux souvent faire certaines choses dans un shell qui affectent un grand nombre de mes fichiers ouverts, puis rétablir tous les tampons que j'ai ouverts pour m'assurer que je n'encombre pas accidentellement la nouvelle version avec tout ce que j'avais ouvert. Je sais que cela magit
peut être utile ici, mais je suis habitué à mon flux de travail dans le shell et je voudrais le garder pour l'instant. Donc, à la place, j'aimerais rétablir tous les tampons ouverts, et peut-être fermer ceux qui ont cessé d'exister (par exemple à cause git checkout
d'une branche qui n'a plus ce fichier).
J'ai l'extrait de code Elisp suivant que j'ai extrait d'une recherche 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"))
Mais cette pause si elle frappe une erreur dans l' un de mes fichiers ouverts, à savoir quand revenir B1
, B2
, B3
, ..., Bn
une erreur en essayant de revenir B2
empêche B3
- Bn
d'être inversé.
Comment puis-je dire à emacs d'ignorer les erreurs qui apparaissent dans ce cas? Je ne veux pas l'utiliser global-auto-revert-mode
parce que chaque retour déclenche des tâches lourdes comme mon vérificateur de saisie automatique et de syntaxe réanalysant le fichier, suspendant emacs pendant une seconde environ.
la source
B2
tampon dans votre exemple. J'utilise une fonction très similaire (très probablement dérivée de cet extrait) et cela a bien fonctionné.C-x s
"file no longer exists"
.. aha! ma version corrige cela :) Je le publierai sous peu.Réponses:
Original
Voici ma version légèrement améliorée de l'extrait de code dans la question. En examinant mon historique VC, je confirme que l'extrait ci-dessous a commencé comme l'extrait publié par l'OP. Je paie donc cet attribut.
Voici le code qui a été stable pour moi:
Mise à jour
Voici une version améliorée et mieux documentée de ce qui précède après avoir examiné la solution de @ Drew .
Référence
la source
Un autre:
la source
dolist
style à remplacercar
etpop
. Amusant comment vous pouvez continuer à améliorer votre configuration à mesure que vous en apprenez plus. :)J'ai accepté la réponse de Kausal car elle était la plus proche de ce que je voulais, mais j'ai également saisi une partie de la solution de Drew. J'ai enveloppé
revert-buffer
danswith-demoted-errors
et laissé tomber le:preserve-modes
paramètre pour que mon vérificateur de syntaxe réanalysera tous mes fichiers ouverts. Je le laisse également tuer les fichiers modifiés ainsi que les non modifiés, car j'ai souvent des problèmes en accidentellement-C-x s
après ungit checkout
fichier ouvert modifié.La version finale est:
la source
Je corrigerais cela avec un
condition-case
ouignore-errors
(docs ici ). Je ne sais pas exactement ce que vous voudrez qu'il fasse ; si vous voulez faire quelque chose avec des erreurs, si vous pouvez utilisercondition-case
pour spécifier le résultat, ou vous pouvez utiliserignore-errors
pour continuer. Quelque chose comme:la source
Basé sur la réponse de @ Drew, avec des ajouts:
la source