branch: master commit 0f547279c4fdb77a017c66443876d4797d56f397 Author: Toby S. Cubitt <ts...@cantab.net> Commit: Toby S. Cubitt <ts...@cantab.net>
Undo-tree point release. --- packages/undo-tree/undo-tree.el | 299 +++++++++++++++++++++------------------- 1 file changed, 155 insertions(+), 144 deletions(-) diff --git a/packages/undo-tree/undo-tree.el b/packages/undo-tree/undo-tree.el index 3a28796..9e51b03 100644 --- a/packages/undo-tree/undo-tree.el +++ b/packages/undo-tree/undo-tree.el @@ -4,7 +4,7 @@ ;; Author: Toby Cubitt <toby-undo-t...@dr-qubit.org> ;; Maintainer: Toby Cubitt <toby-undo-t...@dr-qubit.org> -;; Version: 0.7.2 +;; Version: 0.7.3 ;; Keywords: convenience, files, undo, redo, history, tree ;; URL: http://www.dr-qubit.org/emacs.php ;; Repository: http://www.dr-qubit.org/git/undo-tree.git @@ -754,8 +754,9 @@ ;;; Code: -(eval-when-compile (require 'cl)) +(require 'cl-lib) (require 'diff) +(require 'gv) @@ -1146,11 +1147,6 @@ in visualizer." (defconst undo-tree-visualizer-buffer-name " *undo-tree*") (defconst undo-tree-diff-buffer-name "*undo-tree Diff*") -;; install history-auto-save hooks -(add-hook 'write-file-functions 'undo-tree-save-history-from-hook) -(add-hook 'kill-buffer-hook 'undo-tree-save-history-from-hook) -(add-hook 'find-file-hook 'undo-tree-load-history-from-hook) - @@ -1286,50 +1282,12 @@ in visualizer." (setq undo-tree-visualizer-selection-mode-map map))) -(defvar undo-tree-old-undo-menu-item nil) - -(defun undo-tree-update-menu-bar () - "Update `undo-tree-mode' Edit menu items." - (if undo-tree-mode - (progn - ;; save old undo menu item, and install undo/redo menu items - (setq undo-tree-old-undo-menu-item - (cdr (assq 'undo (lookup-key global-map [menu-bar edit])))) - (define-key (lookup-key global-map [menu-bar edit]) - [undo] '(menu-item "Undo" undo-tree-undo - :enable (and undo-tree-mode - (not buffer-read-only) - (not (eq t buffer-undo-list)) - (not (eq nil buffer-undo-tree)) - (undo-tree-node-previous - (undo-tree-current buffer-undo-tree))) - :help "Undo last operation")) - (define-key-after (lookup-key global-map [menu-bar edit]) - [redo] '(menu-item "Redo" undo-tree-redo - :enable (and undo-tree-mode - (not buffer-read-only) - (not (eq t buffer-undo-list)) - (not (eq nil buffer-undo-tree)) - (undo-tree-node-next - (undo-tree-current buffer-undo-tree))) - :help "Redo last operation") - 'undo)) - ;; uninstall undo/redo menu items - (define-key (lookup-key global-map [menu-bar edit]) - [undo] undo-tree-old-undo-menu-item) - (define-key (lookup-key global-map [menu-bar edit]) - [redo] nil))) - -(add-hook 'menu-bar-update-hook 'undo-tree-update-menu-bar) - - - ;;; ===================================================================== ;;; Undo-tree data structure -(defstruct +(cl-defstruct (undo-tree :named (:constructor nil) @@ -1364,7 +1322,7 @@ in visualizer." (undo-tree-recircle tree))) -(defstruct +(cl-defstruct (undo-tree-node (:type vector) ; create unnamed struct (:constructor nil) @@ -1420,7 +1378,7 @@ in visualizer." new)) -(defstruct +(cl-defstruct (undo-tree-region-data (:type vector) ; create unnamed struct (:constructor nil) @@ -1468,7 +1426,7 @@ in visualizer." (undo-tree-region-data-redo-end r)))) -(defsetf undo-tree-node-undo-beginning (node) (val) +(gv-define-setter undo-tree-node-undo-beginning (node val) `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region))) (unless (undo-tree-region-data-p r) (setf (undo-tree-node-meta-data ,node) @@ -1476,7 +1434,7 @@ in visualizer." (setq r (undo-tree-make-region-data))))) (setf (undo-tree-region-data-undo-beginning r) ,val))) -(defsetf undo-tree-node-undo-end (node) (val) +(gv-define-setter undo-tree-node-undo-end (node val) `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region))) (unless (undo-tree-region-data-p r) (setf (undo-tree-node-meta-data ,node) @@ -1484,7 +1442,7 @@ in visualizer." (setq r (undo-tree-make-region-data))))) (setf (undo-tree-region-data-undo-end r) ,val))) -(defsetf undo-tree-node-redo-beginning (node) (val) +(gv-define-setter undo-tree-node-redo-beginning (node val) `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region))) (unless (undo-tree-region-data-p r) (setf (undo-tree-node-meta-data ,node) @@ -1492,7 +1450,7 @@ in visualizer." (setq r (undo-tree-make-region-data))))) (setf (undo-tree-region-data-redo-beginning r) ,val))) -(defsetf undo-tree-node-redo-end (node) (val) +(gv-define-setter undo-tree-node-redo-end (node val) `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region))) (unless (undo-tree-region-data-p r) (setf (undo-tree-node-meta-data ,node) @@ -1502,7 +1460,7 @@ in visualizer." -(defstruct +(cl-defstruct (undo-tree-visualizer-data (:type vector) ; create unnamed struct (:constructor nil) @@ -1545,7 +1503,7 @@ in visualizer." (undo-tree-visualizer-data-marker v)))) -(defsetf undo-tree-node-lwidth (node) (val) +(gv-define-setter undo-tree-node-lwidth (node val) `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer))) (unless (undo-tree-visualizer-data-p v) (setf (undo-tree-node-meta-data ,node) @@ -1553,7 +1511,7 @@ in visualizer." (setq v (undo-tree-make-visualizer-data))))) (setf (undo-tree-visualizer-data-lwidth v) ,val))) -(defsetf undo-tree-node-cwidth (node) (val) +(gv-define-setter undo-tree-node-cwidth (node val) `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer))) (unless (undo-tree-visualizer-data-p v) (setf (undo-tree-node-meta-data ,node) @@ -1561,7 +1519,7 @@ in visualizer." (setq v (undo-tree-make-visualizer-data))))) (setf (undo-tree-visualizer-data-cwidth v) ,val))) -(defsetf undo-tree-node-rwidth (node) (val) +(gv-define-setter undo-tree-node-rwidth (node val) `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer))) (unless (undo-tree-visualizer-data-p v) (setf (undo-tree-node-meta-data ,node) @@ -1569,7 +1527,7 @@ in visualizer." (setq v (undo-tree-make-visualizer-data))))) (setf (undo-tree-visualizer-data-rwidth v) ,val))) -(defsetf undo-tree-node-marker (node) (val) +(gv-define-setter undo-tree-node-marker (node val) `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer))) (unless (undo-tree-visualizer-data-p v) (setf (undo-tree-node-meta-data ,node) @@ -1579,7 +1537,7 @@ in visualizer." -(defstruct +(cl-defstruct (undo-tree-register-data (:type vector) (:constructor nil) @@ -1598,7 +1556,7 @@ in visualizer." (defmacro undo-tree-node-register (node) `(plist-get (undo-tree-node-meta-data ,node) :register)) -(defsetf undo-tree-node-register (node) (val) +(gv-define-setter undo-tree-node-register (node val) `(setf (undo-tree-node-meta-data ,node) (plist-put (undo-tree-node-meta-data ,node) :register ,val))) @@ -1659,8 +1617,8 @@ that are already part of `buffer-undo-tree'." ;; if active branch didn't go via NODE, update parent's branch to point ;; to same node as before ((> (undo-tree-node-branch parent) position) - (incf (undo-tree-node-branch parent) - (1- (length (undo-tree-node-next node)))))) + (cl-incf (undo-tree-node-branch parent) + (1- (length (undo-tree-node-next node)))))) ;; replace NODE in parent's next list with NODE's entire next list (if (= position 0) (setf (undo-tree-node-next parent) @@ -1695,7 +1653,7 @@ Comparison is done with `eq'." (catch 'found (while (progn (when (eq node (car list)) (throw 'found i)) - (incf i) + (cl-incf i) (setq list (cdr list)))) nil))) @@ -1707,7 +1665,8 @@ Comparison is done with `eq'." ;; Generate a new, unique id (uninterned symbol). ;; The name is made by appending a number to "undo-tree-id". ;; (Copied from CL package `gensym'.) - `(let ((num (prog1 *undo-tree-id-counter* (incf *undo-tree-id-counter*)))) + `(let ((num (prog1 *undo-tree-id-counter* + (cl-incf *undo-tree-id-counter*)))) (make-symbol (format "undo-tree-id%d" num)))) @@ -1850,7 +1809,7 @@ Comparison is done with `eq'." ;; `undo-list-transfer-to-tree' should never be called when undo is disabled ;; (i.e. `buffer-undo-tree' is t) - (assert (not (eq buffer-undo-tree t))) + (cl-assert (not (eq buffer-undo-tree t))) ;; if `buffer-undo-tree' is empty, create initial undo-tree (when (null buffer-undo-tree) (setq buffer-undo-tree (make-undo-tree))) @@ -1879,8 +1838,8 @@ Comparison is done with `eq'." ;; grow tree fragment backwards using `undo-list' changesets (while (setq changeset (undo-list-pop-changeset undo-list)) (setq node (undo-tree-grow-backwards node changeset)) - (incf size (undo-list-byte-size (undo-tree-node-undo node))) - (incf count)) + (cl-incf size (undo-list-byte-size (undo-tree-node-undo node))) + (cl-incf count)) ;; if no undo history has been discarded from `undo-list' since last ;; transfer, splice new tree fragment onto end of old @@ -1890,8 +1849,8 @@ Comparison is done with `eq'." (setf (undo-tree-node-previous node) splice) (push node (undo-tree-node-next splice)) (setf (undo-tree-node-branch splice) 0) - (incf (undo-tree-size buffer-undo-tree) size) - (incf (undo-tree-count buffer-undo-tree) count)) + (cl-incf (undo-tree-size buffer-undo-tree) size) + (cl-incf (undo-tree-count buffer-undo-tree) count)) ;; if undo history has been discarded, replace entire ;; `buffer-undo-tree' with new tree fragment @@ -1911,9 +1870,9 @@ Comparison is done with `eq'." ;; Return size (in bytes) of UNDO-LIST (let ((size 0)) (dolist (elt undo-list) - (incf size 8) ; cons cells use up 8 bytes + (cl-incf size 8) ; cons cells use up 8 bytes (when (stringp (car-safe elt)) - (incf size (string-bytes (car elt))))) + (cl-incf size (string-bytes (car elt))))) size)) @@ -1999,10 +1958,10 @@ Comparison is done with `eq'." (setq node (setf (undo-tree-root buffer-undo-tree) (car (undo-tree-node-next node)))) ;; update undo-tree size - (decf (undo-tree-size buffer-undo-tree) - (+ (undo-list-byte-size (undo-tree-node-undo node)) - (undo-list-byte-size (undo-tree-node-redo node)))) - (decf (undo-tree-count buffer-undo-tree)) + (cl-decf (undo-tree-size buffer-undo-tree) + (+ (undo-list-byte-size (undo-tree-node-undo node)) + (undo-list-byte-size (undo-tree-node-redo node)))) + (cl-decf (undo-tree-count buffer-undo-tree)) ;; discard new root's undo data and PREVIOUS link (setf (undo-tree-node-undo node) nil (undo-tree-node-redo node) nil @@ -2024,10 +1983,10 @@ Comparison is done with `eq'." (when (and r (eq (get-register r) node)) (set-register r nil))) ;; update undo-tree size - (decf (undo-tree-size buffer-undo-tree) - (+ (undo-list-byte-size (undo-tree-node-undo node)) - (undo-list-byte-size (undo-tree-node-redo node)))) - (decf (undo-tree-count buffer-undo-tree)) + (cl-decf (undo-tree-size buffer-undo-tree) + (+ (undo-list-byte-size (undo-tree-node-undo node)) + (undo-list-byte-size (undo-tree-node-redo node)))) + (cl-decf (undo-tree-count buffer-undo-tree)) ;; discard leaf (setf (undo-tree-node-next parent) (delq node (undo-tree-node-next parent)) @@ -2187,23 +2146,23 @@ which is defined in the `warnings' library.\n") ;; compute left-width (dotimes (_ (/ num-children 2)) (if (undo-tree-node-lwidth (car p)) - (incf lwidth (+ (undo-tree-node-lwidth (car p)) + (cl-incf lwidth (+ (undo-tree-node-lwidth (car p)) (undo-tree-node-cwidth (car p)) (undo-tree-node-rwidth (car p)))) ;; if child's widths haven't been computed, return that child (throw 'need-widths (car p))) (setq p (cdr p))) (if (undo-tree-node-lwidth (car p)) - (incf lwidth (undo-tree-node-lwidth (car p))) + (cl-incf lwidth (undo-tree-node-lwidth (car p))) (throw 'need-widths (car p))) ;; centre-width is inherited from middle child (setf cwidth (undo-tree-node-cwidth (car p))) ;; compute right-width - (incf rwidth (undo-tree-node-rwidth (car p))) + (cl-incf rwidth (undo-tree-node-rwidth (car p))) (setq p (cdr p)) (dotimes (_ (/ num-children 2)) (if (undo-tree-node-lwidth (car p)) - (incf rwidth (+ (undo-tree-node-lwidth (car p)) + (cl-incf rwidth (+ (undo-tree-node-lwidth (car p)) (undo-tree-node-cwidth (car p)) (undo-tree-node-rwidth (car p)))) (throw 'need-widths (car p))) @@ -2215,7 +2174,7 @@ which is defined in the `warnings' library.\n") ;; compute left-width (dotimes (_ (/ num-children 2)) (if (undo-tree-node-lwidth (car p)) - (incf lwidth (+ (undo-tree-node-lwidth (car p)) + (cl-incf lwidth (+ (undo-tree-node-lwidth (car p)) (undo-tree-node-cwidth (car p)) (undo-tree-node-rwidth (car p)))) (throw 'need-widths (car p))) @@ -2225,7 +2184,7 @@ which is defined in the `warnings' library.\n") ;; compute right-width (dotimes (_ (/ num-children 2)) (if (undo-tree-node-lwidth (car p)) - (incf rwidth (+ (undo-tree-node-lwidth (car p)) + (cl-incf rwidth (+ (undo-tree-node-lwidth (car p)) (undo-tree-node-cwidth (car p)) (undo-tree-node-rwidth (car p)))) (throw 'need-widths (car p))) @@ -2500,10 +2459,10 @@ which is defined in the `warnings' library.\n") (while (progn (and (setq node (car (undo-tree-node-next node))) (not (eq node original-fragment)) - (incf (undo-tree-count buffer-undo-tree)) - (incf (undo-tree-size buffer-undo-tree) - (+ (undo-list-byte-size (undo-tree-node-undo node)) - (undo-list-byte-size (undo-tree-node-redo node))))))) + (cl-incf (undo-tree-count buffer-undo-tree)) + (cl-incf (undo-tree-size buffer-undo-tree) + (+ (undo-list-byte-size (undo-tree-node-undo node)) + (undo-list-byte-size (undo-tree-node-redo node))))))) t) ; indicate undo-in-region branch was successfully pulled ))) @@ -2660,12 +2619,12 @@ which is defined in the `warnings' library.\n") (unless repeated-redo-in-region (setq node fragment) (while (and (setq node (car (undo-tree-node-next node))) - (incf (undo-tree-count buffer-undo-tree)) - (incf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size - (undo-tree-node-redo node)))))) - (incf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size (undo-tree-node-redo fragment))) + (cl-incf (undo-tree-count buffer-undo-tree)) + (cl-incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size + (undo-tree-node-redo node)))))) + (cl-incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo fragment))) t) ; indicate redo-in-region branch was successfully pulled ))) @@ -2923,12 +2882,12 @@ changes within the current region." ;; remove any GC'd elements from node's undo list (setq current (undo-tree-current buffer-undo-tree)) - (decf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size (undo-tree-node-undo current))) + (cl-decf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-undo current))) (setf (undo-tree-node-undo current) (undo-list-clean-GCd-elts (undo-tree-node-undo current))) - (incf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size (undo-tree-node-undo current))) + (cl-incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-undo current))) ;; undo one record from undo tree (when undo-in-region (setq pos (set-marker (make-marker) (point))) @@ -2942,21 +2901,21 @@ changes within the current region." (if preserve-redo (progn (undo-list-pop-changeset buffer-undo-list) - (decf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size (undo-tree-node-redo current))) + (cl-decf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo current))) (setf (undo-tree-node-redo current) (undo-list-clean-GCd-elts (undo-tree-node-redo current))) - (incf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size (undo-tree-node-redo current)))) + (cl-incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo current)))) ;; otherwise, record redo entries that `primitive-undo' has added to ;; `buffer-undo-list' in current node's redo record, replacing ;; existing entry if one already exists - (decf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size (undo-tree-node-redo current))) + (cl-decf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo current))) (setf (undo-tree-node-redo current) (undo-list-pop-changeset buffer-undo-list 'discard-pos)) - (incf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size (undo-tree-node-redo current)))) + (cl-incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo current)))) ;; rewind current node and update timestamp (setf (undo-tree-current buffer-undo-tree) @@ -3036,12 +2995,12 @@ changes within the current region." current (nth (undo-tree-node-branch current) (undo-tree-node-next current))) ;; remove any GC'd elements from node's redo list - (decf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size (undo-tree-node-redo current))) + (cl-decf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo current))) (setf (undo-tree-node-redo current) (undo-list-clean-GCd-elts (undo-tree-node-redo current))) - (incf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size (undo-tree-node-redo current))) + (cl-incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo current))) ;; redo one record from undo tree (when redo-in-region (setq pos (set-marker (make-marker) (point))) @@ -3057,21 +3016,21 @@ changes within the current region." (if preserve-undo (progn (undo-list-pop-changeset buffer-undo-list) - (decf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size (undo-tree-node-undo current))) + (cl-decf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-undo current))) (setf (undo-tree-node-undo current) (undo-list-clean-GCd-elts (undo-tree-node-undo current))) - (incf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size (undo-tree-node-undo current)))) + (cl-incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-undo current)))) ;; otherwise, record undo entries that `primitive-undo' has added to ;; `buffer-undo-list' in current node's undo record, replacing ;; existing entry if one already exists - (decf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size (undo-tree-node-undo current))) + (cl-decf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-undo current))) (setf (undo-tree-node-undo current) (undo-list-pop-changeset buffer-undo-list 'discard-pos)) - (incf (undo-tree-size buffer-undo-tree) - (undo-list-byte-size (undo-tree-node-undo current)))) + (cl-incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-undo current)))) ;; update timestamp (unless preserve-timestamps @@ -3214,6 +3173,48 @@ Argument is a character, naming the register." ;;; ===================================================================== +;;; Undo-tree menu bar + +(defvar undo-tree-old-undo-menu-item nil) + +(defun undo-tree-update-menu-bar () + "Update `undo-tree-mode' Edit menu items." + (if undo-tree-mode + (progn + ;; save old undo menu item, and install undo/redo menu items + (setq undo-tree-old-undo-menu-item + (cdr (assq 'undo (lookup-key global-map [menu-bar edit])))) + (define-key (lookup-key global-map [menu-bar edit]) + [undo] '(menu-item "Undo" undo-tree-undo + :enable (and undo-tree-mode + (not buffer-read-only) + (not (eq t buffer-undo-list)) + (not (eq nil buffer-undo-tree)) + (undo-tree-node-previous + (undo-tree-current buffer-undo-tree))) + :help "Undo last operation")) + (define-key-after (lookup-key global-map [menu-bar edit]) + [redo] '(menu-item "Redo" undo-tree-redo + :enable (and undo-tree-mode + (not buffer-read-only) + (not (eq t buffer-undo-list)) + (not (eq nil buffer-undo-tree)) + (undo-tree-node-next + (undo-tree-current buffer-undo-tree))) + :help "Redo last operation") + 'undo)) + ;; uninstall undo/redo menu items + (define-key (lookup-key global-map [menu-bar edit]) + [undo] undo-tree-old-undo-menu-item) + (define-key (lookup-key global-map [menu-bar edit]) + [redo] nil))) + +(add-hook 'menu-bar-update-hook 'undo-tree-update-menu-bar) + + + + +;;; ===================================================================== ;;; Persistent storage commands (defun undo-tree-make-history-save-file-name (file) @@ -3408,6 +3409,12 @@ Note this will overwrite any existing undo history." version 0.6.6. Use `undo-tree-load-history-from-hook' instead.") +;; install history-auto-save hooks +(add-hook 'write-file-functions #'undo-tree-save-history-from-hook) +(add-hook 'kill-buffer-hook #'undo-tree-save-history-from-hook) +(add-hook 'find-file-hook #'undo-tree-load-history-from-hook) + + ;;; ===================================================================== @@ -4057,7 +4064,7 @@ Note this will overwrite any existing undo history." ;;; ===================================================================== -;;; Visualizer commands +;;; Visualizer modes (define-derived-mode undo-tree-visualizer-mode special-mode "undo-tree-visualizer" @@ -4079,6 +4086,34 @@ Within the undo-tree visualizer, the following keys are available: (setq undo-tree-visualizer-selected-node nil)) +(define-minor-mode undo-tree-visualizer-selection-mode + "Toggle mode to select nodes in undo-tree visualizer." + :lighter "Select" + :keymap undo-tree-visualizer-selection-mode-map + :group undo-tree + (cond + ;; enable selection mode + (undo-tree-visualizer-selection-mode + (setq cursor-type 'box) + (setq undo-tree-visualizer-selected-node + (undo-tree-current buffer-undo-tree)) + ;; erase diff (if any), as initially selected node is identical to current + (when undo-tree-visualizer-diff + (let ((buff (get-buffer undo-tree-diff-buffer-name)) + (inhibit-read-only t)) + (when buff (with-current-buffer buff (erase-buffer)))))) + (t ;; disable selection mode + (setq cursor-type nil) + (setq undo-tree-visualizer-selected-node nil) + (goto-char (undo-tree-node-marker (undo-tree-current buffer-undo-tree))) + (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff))) + )) + + + + +;;; ===================================================================== +;;; Visualizer commands (defun undo-tree-visualize-undo (&optional arg) "Undo changes. A numeric ARG serves as a repeat count." @@ -4409,31 +4444,7 @@ specifies `saved', and a negative prefix argument specifies ;;; ===================================================================== -;;; Visualizer selection mode - -(define-minor-mode undo-tree-visualizer-selection-mode - "Toggle mode to select nodes in undo-tree visualizer." - :lighter "Select" - :keymap undo-tree-visualizer-selection-mode-map - :group undo-tree - (cond - ;; enable selection mode - (undo-tree-visualizer-selection-mode - (setq cursor-type 'box) - (setq undo-tree-visualizer-selected-node - (undo-tree-current buffer-undo-tree)) - ;; erase diff (if any), as initially selected node is identical to current - (when undo-tree-visualizer-diff - (let ((buff (get-buffer undo-tree-diff-buffer-name)) - (inhibit-read-only t)) - (when buff (with-current-buffer buff (erase-buffer)))))) - (t ;; disable selection mode - (setq cursor-type nil) - (setq undo-tree-visualizer-selected-node nil) - (goto-char (undo-tree-node-marker (undo-tree-current buffer-undo-tree))) - (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff))) - )) - +;;; Visualizer selection mode commands (defun undo-tree-visualizer-select-previous (&optional arg) "Move to previous node."