Tôi đoán phương pháp hiển nhiên sẽ là một chức năng mà giết chết nội dung đệm hiện nay, và sau đó gọi insert-file
để đọc nội dung hiện tại từ tệp.
Nếu thay đổi đối với tệp bao gồm các thay đổi đối với mã hóa ký tự, có thể có sự cố? Tôi chưa thử nghiệm điều đó.
Đây là nỗ lực hiện tại của tôi. Đó là một chút IMO lông, nhưng nó hoạt động được.
;; 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)
Khó chịu, tôi chỉ mới nhận thấy tất cả các thông tin liên quan-tìm kiếm trong revert-buffer
tài liệu, do đó có thể là một nhiều cách đơn giản hơn để làm điều này.
Nếu giá trị revert-buffer-function
không phải là không, nó được gọi là làm tất cả công việc cho lệnh này. Nếu không, các móc before-revert-hook
và after-revert-hook
được chạy ở đầu và kết thúc, và nếu revert-buffer-insert-file-contents-function
là không phải là nil, nó được gọi thay vì đọc lại nội dung tệp đã truy cập.
Tôi nghĩ đây là một cách tiếp cận rất tốt. Tôi sẽ có một tinh chỉnh mà bản thân mình. Cảm ơn! – Sarah
Bạn được chào đón. Tôi đã tìm ra giải pháp cho một số vấn đề với mã đó, và đã cập nhật câu trả lời: nó bây giờ thiết lập bộ đệm cập nhật là chưa sửa đổi, và tôi thấy rằng '(set-visited-file-modtime)' là cách để ngăn chặn nó khỏi vấn đề. Điều này có nghĩa là nếu bạn hoàn tác việc hoàn nguyên, nó sẽ không còn hỏi bạn câu hỏi nữa nếu bạn cố chỉnh sửa lại tệp, điều này chắc chắn sẽ phù hợp hơn với chức năng ban đầu. Nếu bạn đưa ra giải pháp cải tiến, vui lòng đăng câu trả lời mới tại đây. – phils