Работая над проектом под управлением версиями с помощью 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 на секунду или около того.
источник
B2
буфера в вашем примере. Я использую очень похожую функцию (скорее всего, полученную из этого фрагмента), и она работала нормально.C-x s
"file no longer exists"
.. ага! моя версия исправляет это :) Будет опубликовано в ближайшее время.Ответы:
оригинал
Вот моя слегка улучшенная версия фрагмента в вопросе. Просматривая историю VC, я подтверждаю, что приведенный ниже фрагмент начинался как фрагмент, отправленный OP. Так что я приписываю это.
Вот код, который был стабильным для меня:
Обновить
Вот улучшенный и лучше документированы версия выше, посмотрев на @ Дрю решения .
Ссылка
источник
Другая:
источник
dolist
стиль, чтобы заменитьcar
иpop
. Забавно, как ты можешь продолжать улучшать свой конфиг, когда узнаешь больше elisp :)Я принял ответ Каусала, так как он был наиболее близок к тому, что я хотел, но я тоже взял часть решения Дрю. Я завернул
revert-buffer
вwith-demoted-errors
и уронил:preserve-modes
параметр так , что мой синтаксис проверка будет повторно анализировать все мои открытые файлы. Я также позволил ему убивать измененные и не измененные файлы, так как я часто попадаю в неприятности, случайноC-x s
выбирая послеgit checkout
открытия измененного файла.Финальная версия:
источник
Я бы исправил это с помощью
condition-case
илиignore-errors
(документы здесь ). Я не знаю точно, что вы от этого хотите ; если вы хотите что-то сделать с ошибками, если вы можете использовать,condition-case
чтобы указать результат, или вы можете использовать,ignore-errors
чтобы просто продолжить. Что-то вроде:источник
На основании ответа @ Дрю, с дополнениями:
источник