Работая над проектом под управлением версиями с помощью git, я часто хочу сделать некоторые вещи в оболочке, которые влияют на многие мои открытые файлы, а затем отменить каждый открытый мной буфер, чтобы убедиться, что я случайно не забил новую версию с тем, что у меня было открыто. Я знаю, magit
что здесь может быть полезно, но я привык к своему рабочему процессу в оболочке, и я бы хотел сохранить его сейчас. Поэтому вместо этого я хотел бы отменить все открытые буферы и, возможно, закрыть все, которые перестали существовать (например, из- git checkout
за ветви, у которой больше нет этого файла).
У меня есть следующий фрагмент elisp, который я взял из поиска 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"))
Но это ломается , если он попадет ошибку в одном из моих открытых файлов, то есть , когда возвращаясь B1
, B2
, B3
, ..., Bn
ошибка при попытке восстановить B2
предотвращает B3
- Bn
от того Откачена.
Как я могу сказать emacs игнорировать любые ошибки, которые появляются в этом случае? Я не хочу использовать, global-auto-revert-mode
потому что каждый возврат вызывает некоторые тяжелые вещи, такие как мой автозаполнение и средство проверки синтаксиса, повторный синтаксический анализ файла, зависание emacs на секунду или около того.
C-x s
"file no longer exists"
.. ага! моя версия исправляет это :) Будет опубликовано в ближайшее время.
B2
буфера в вашем примере. Я использую очень похожую функцию (скорее всего, полученную из этого фрагмента), и она работала нормально.