Працюючи над проектом під контролем версій з 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
буфера у вашому прикладі. Я використовую дуже схожу функцію (швидше за все, отримана з цього фрагмента), і вона спрацювала чудово.