Полагаю, очевидным подходом будет функция, которая убивает текущее содержимое буфера, а затем вызывает insert-file
для чтения текущего содержимого из файла.
Если изменения в файле включали изменения в кодировку символов, могут быть проблемы? Я не проверял это.
Вот моя текущая попытка. Это немного волосатое ИМО, но работает нормально.
;; Allow buffer reverts to be undone
(defun my-revert-buffer (&optional ignore-auto noconfirm preserve-modes)
"Revert buffer from file in an undo-able manner."
(interactive)
(when (buffer-file-name)
;; Based upon `delphi-save-state':
;; Ensure that any buffer modifications do not have any side
;; effects beyond the actual content changes.
(let ((buffer-read-only nil)
(inhibit-read-only t)
(before-change-functions nil)
(after-change-functions nil))
(unwind-protect
(progn
;; Prevent triggering `ask-user-about-supersession-threat'
(set-visited-file-modtime)
;; Kill buffer contents and insert from associated file.
(widen)
(kill-region (point-min) (point-max))
(insert-file-contents (buffer-file-name))
;; Mark buffer as unmodified.
(set-buffer-modified-p nil))))))
(defadvice ask-user-about-supersession-threat
(around my-supersession-revert-buffer)
"Use my-revert-buffer in place of revert-buffer."
(let ((real-revert-buffer (symbol-function 'revert-buffer)))
(fset 'revert-buffer 'my-revert-buffer)
;; Note that `ask-user-about-supersession-threat' calls
;; (signal 'file-supersession ...), so we need to handle
;; the error in order to restore revert-buffer.
(unwind-protect
ad-do-it
(fset 'revert-buffer real-revert-buffer))))
(ad-activate 'ask-user-about-supersession-threat)
Досадно, я только что заметил всю соответствующую информацию в revert-buffer
документах, так что, вероятно, есть намного более простой способ сделать это.
Если значение revert-buffer-function
не равно нулю, оно вызывается
сделать всю работу для этой команды. В противном случае крючки
before-revert-hook
и after-revert-hook
запускаются в начале
и конец, и если revert-buffer-insert-file-contents-function
не ноль, он вызывается вместо перечитывания содержимого посещенного файла.