I am working on my own new feature request for undo-tree linear undo/redo: How to make undo-tree linear -- undo-tree-undo/redo
I have successfully added two additional gizmos (?) to
cl-defstruct ... undo-tree-node at the bottom and very end of the definition --
linear-history. The new functions are called like this:
(undo-tree-node-connect-dots (undo-tree-current buffer-undo-tree)) or
(undo-tree-node-history (undo-tree-current buffer-undo-tree)).
I am adding a list of time-stamps to each node when they are imported from the
undo-list-transfer-to-tree, and also to the final current node when using
undo-tree-redo. The result should be that every node has a list of one or more time-stamps that never change -- i.e., I just keep pushing new time-stamps onto whichever node is current.
undo-tree creates the visualizer buffer by starting from the
root and following the branch until a branch-point is reached, at which time it branches into 2 or more, etc. In a nutshell, the parent knows who it siblings are, and the siblings know who the parent is. I can create a function that does not use a visualizer buffer, which follows the above tree-structure until the very end, but that seems like an inefficient manner to map through all of the nodes. [I envision this linear undo/redo new feature as being usable irrespective of whether the visualizer buffer has been generated.]
Q: Absent following the tree structure programmatically, is there a more efficient manner to map through each node of the
(dolist (node buffer-undo-tree) (when node ...))
In case anyone was wondering about
connect-dots, at this time it is just an interesting way of seeing each branch with a different letter and each node is consecutively numbered between root and branch-point, and between each branch-point and leaf. I may consolidate that feature with the linear visualization, but each node may have more than one time-stamp, so I'll need to think about how to visually represent that.
Thanks to the helpful answer by @Tobias below, I came up with the following function that generates a list of all nodes.
undo-tree-mapc is designed to apply a function to each node, which is also useful.
(defun undo-tree-node-list (&optional transfer-to-tree) "See also `undo-tree-mapc'." (when transfer-to-tree (undo-list-transfer-to-tree)) (let* ((beginning-node (undo-tree-root buffer-undo-tree)) (stack (list beginning-node)) n res) (while stack (setq n (pop stack)) (push n res) (setq stack (append (undo-tree-node-next n) stack))) res))