emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master 0f54727: Undo-tree point release.


From: Toby Cubitt
Subject: [elpa] master 0f54727: Undo-tree point release.
Date: Sun, 26 Jan 2020 11:58:14 -0500 (EST)

branch: master
commit 0f547279c4fdb77a017c66443876d4797d56f397
Author: Toby S. Cubitt <address@hidden>
Commit: Toby S. Cubitt <address@hidden>

    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 <address@hidden>
 ;; Maintainer: Toby Cubitt <address@hidden>
-;; 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."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]