Function: vundo--refresh-buffer
vundo--refresh-buffer is a natively compiled function defined in
vundo.el.
Signature
(vundo--refresh-buffer ORIG-BUFFER VUNDO-BUFFER &optional INCREMENTAL)
Documentation
Refresh VUNDO-BUFFER with the undo history of ORIG-BUFFER.
If INCREMENTAL non-nil, reuse existing mod-list and mod-hash. INCREMENTAL is only applicable when entries are either added or removed from undo-list. On the other hand, if some entries are removed and some added, do not use INCREMENTAL.
This function modifies vundo--prev-mod-list,
vundo--prev-mod-hash, vundo--prev-undo-list,
vundo--orig-buffer.
Source Code
;; Defined in /nix/store/386w2ds6bdh3gcz9k23jssw4cni4lfr2-emacs-packages-deps/share/emacs/site-lisp/elpa/vundo-2.4.0/vundo.el
(defun vundo--refresh-buffer
(orig-buffer vundo-buffer &optional incremental)
"Refresh VUNDO-BUFFER with the undo history of ORIG-BUFFER.
If INCREMENTAL non-nil, reuse existing mod-list and mod-hash.
INCREMENTAL is only applicable when entries are either added or
removed from undo-list. On the other hand, if some entries are
removed and some added, do not use INCREMENTAL.
This function modifies `vundo--prev-mod-list',
`vundo--prev-mod-hash', `vundo--prev-undo-list',
`vundo--orig-buffer'."
(with-current-buffer vundo-buffer
;; 1. Setting these to nil makes `vundo--mod-list-from',
;; `vundo--update-mapping' and `vundo--build-tree' starts from
;; scratch.
(when (not incremental)
(setq vundo--prev-undo-list nil
vundo--prev-mod-list nil
vundo--prev-mod-hash nil)
;; Give the garbage collector a chance to release
;; `buffer-undo-list': GC cannot release cons cells when all
;; these stuff are referring to it.
(garbage-collect))
(let ((undo-list (buffer-local-value
'buffer-undo-list orig-buffer))
mod-list
mod-hash
(latest-state (and vundo--prev-mod-list
(vundo--latest-buffer-state
vundo--prev-mod-list)))
(inhibit-read-only t))
;; 2. Here we consider two cases, adding more nodes (or starting
;; from scratch) or removing nodes. In both cases, we update and
;; set MOD-LIST and MOD-HASH. We don't need to worry about the
;; garbage collector trimming the end of `buffer-undo-list': if
;; we are generating MOD-LIST from scratch, it will work as
;; normal, if we are generating incrementally,
;; `vundo--prev-undo-list' holds the untrimmed undo list.
(if-let ((new-tail (and vundo--prev-mod-hash
(gethash (vundo--sans-nil undo-list)
vundo--prev-mod-hash))))
;; a) Removing.
(setq mod-list (vundo--mod-list-trim vundo--prev-mod-list
(vundo-m-idx new-tail))
mod-hash vundo--prev-mod-hash)
;; b) Adding.
(let ((diff (- (length undo-list)
(length vundo--prev-undo-list))))
(cl-assert (eq vundo--prev-undo-list (nthcdr diff undo-list)))
(setq mod-list (vundo--mod-list-from
undo-list diff vundo--prev-mod-list)
mod-hash (vundo--update-mapping
mod-list vundo--prev-mod-hash
(length vundo--prev-mod-list)))
;; Build tree.
(vundo--build-tree mod-list mod-hash
(length vundo--prev-mod-list))))
;; Update cache.
(setq vundo--prev-mod-list mod-list
vundo--prev-mod-hash mod-hash
vundo--prev-undo-list undo-list
vundo--orig-buffer orig-buffer)
;; Record timestamps
(setq vundo--timestamps (vundo--record-timestamps mod-list))
;; 3. Render buffer. We don't need to redraw the tree if there
;; is no change to the nodes.
(unless (eq (vundo--latest-buffer-state mod-list) latest-state)
(vundo--draw-tree mod-list))
;; Highlight current node.
(vundo--highlight-node (vundo--current-node mod-list))
(goto-char (vundo-m-point (vundo--current-node mod-list)))
;; Highlight the last saved node extra specially
(when vundo-highlight-saved-nodes
(vundo--highlight-last-saved-node mod-list vundo--timestamps))
;; Call out truncated undo tree.
(let ((first-undo (buffer-local-value
'vundo--first-undo orig-buffer))
(current-first-undo
;; We actually use the second vundo-m, because the
;; ‘undo-list’ of the first vundo-m is always nil.
(vundo-m-undo-list (aref mod-list 1))))
(when (and first-undo (not (eq first-undo current-first-undo)))
(message "⚠️ The undo-list of this buffer is truncated by garbage collection, to prevent this from happening again, consider increasing ‘undo-limit’"))
(when (or (not first-undo)
(and first-undo (not (eq first-undo
current-first-undo))))
(with-current-buffer orig-buffer
(setq vundo--first-undo
(vundo-m-undo-list (aref mod-list 1)))))))))