The following is a proto-type implementation of an approximation of what you want. It exploits the fact that new branches in the undo-tree are added at the left-hand side of the current node. The key-sequence <kbd>C-M-_</kbd> is bound to `undo-tree-walk` which walks the right-upper part of the undo tree starting at the current node. The behavior differs from what you want if the active branch of some sub-tree on the right-hand side of the current node is not the left-most branch in that sub-tree. You can get in such a state by non-trival undo/redo-sequences. Just try it for yourself to see whether that is sufficient for your application. <!-- language: lang-el --> (defvar-local undo-tree-walk "Possible values: nil: not in undo/redo-chain undo: traversing undo tree upwards redo: traversing undo tree downwards ") (setq undo-tree-walk nil) (defun undo-tree-walk () "Walk the right-upper part of the undo-tree starting at the current node." (interactive) (set-transient-map undo-tree-walk-map t #'undo-tree-walk-off) (let ((num-branches (undo-tree-num-branches))) (cond ((= num-branches 0) ; arrived at leaf (setq undo-tree-walk 'undo)) ((> num-branches 1) ; (let ((branch (undo-tree-node-branch (undo-tree-current buffer-undo-tree)))) (setf (undo-tree-node-branch (undo-tree-current buffer-undo-tree)) (if (>= (1+ branch) (undo-tree-num-branches)) (progn (setq undo-tree-walk 'undo) (1- (undo-tree-num-branches))) (setq undo-tree-walk 'redo) (1+ branch)))) ;; no state change for (= num-branches 1) ) )) (case undo-tree-walk (undo (undo-tree-undo-1)) (redo (undo-tree-redo-1)) (t (setq undo-tree-walk 'undo) (undo-tree-undo-1))) (let ((curbuf (current-buffer))) (undo-tree-visualize) (switch-to-buffer-other-window curbuf))) (defun undo-tree-walk-off () "Switch `undo-tree-walk' off." (setq undo-tree-walk nil)) (defvar undo-tree-walk-map (make-sparse-keymap) "Keymap active while `undo-tree-walk'.") (define-key undo-tree-walk-map (kbd "C-M-_") #'undo-tree-walk) (global-set-key (kbd "C-M-_") #'undo-tree-walk) Note, that I added `undo-tree-visualize` to the end of `undo-tree-walk` to display the consequences of walking the undo-tree with `undo-tree-walk`. Feel free to modify the code to your likings.