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

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

[nongnu] elpa/undo-fu ad8a60f979 28/82: Lazy initialize checkpoint lengt


From: ELPA Syncer
Subject: [nongnu] elpa/undo-fu ad8a60f979 28/82: Lazy initialize checkpoint length (minor speedup for linear redo)
Date: Thu, 7 Jul 2022 12:04:51 -0400 (EDT)

branch: elpa/undo-fu
commit ad8a60f9796c180230ff0a7fef17c3811aec18df
Author: Campbell Barton <ideasman42@gmail.com>
Commit: Campbell Barton <ideasman42@gmail.com>

    Lazy initialize checkpoint length (minor speedup for linear redo)
---
 undo-fu.el | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/undo-fu.el b/undo-fu.el
index 9f3de862ef..b221bdf2e2 100644
--- a/undo-fu.el
+++ b/undo-fu.el
@@ -57,6 +57,8 @@ causing undo-fu to work with reduced functionality when a 
selection exists."
 
 ;; First undo step in the chain, don't redo past this.
 (defvar-local undo-fu--checkpoint nil)
+;; The length of 'undo-fu--checkpoint' (lazy initialize).
+(defvar-local undo-fu--checkpoint-length nil)
 ;; We have reached the checkpoint, don't redo.
 (defvar-local undo-fu--checkpoint-is-blocking nil)
 ;; Apply undo/redo constraints to stop redo from undoing or
@@ -74,7 +76,8 @@ causing undo-fu to work with reduced functionality when a 
selection exists."
   (setq undo-fu--respect nil)
   (setq undo-fu--in-region nil)
   (setq undo-fu--checkpoint-is-blocking nil)
-  (setq undo-fu--checkpoint nil))
+  (setq undo-fu--checkpoint nil)
+  (setq undo-fu--checkpoint-length nil))
 
 
 (defmacro undo-fu--with-message-suffix (suffix &rest body)
@@ -221,15 +224,16 @@ Optional argument ARG The number of steps to redo."
           ;; any (unlikely) issues here would error.
           (not (null undo-fu--checkpoint)))
 
+        ;; Lazy initialize checkpoint length, avoids calculating for every 
redo.
+        (unless undo-fu--checkpoint-length
+          (setq undo-fu--checkpoint-length (length undo-fu--checkpoint)))
+
         ;; Skip to the last matching redo step before the checkpoint.
-        (let
-          (
-            (list pending-undo-list)
-            (checkpoint-length (length undo-fu--checkpoint)))
+        (let ((list pending-undo-list))
           (while
             (and
               (setq list (gethash list undo-equiv-table))
-              (eq (last list checkpoint-length) undo-fu--checkpoint))
+              (eq (last list undo-fu--checkpoint-length) undo-fu--checkpoint))
             (setq pending-undo-list list)))))
 
     (let*
@@ -294,7 +298,8 @@ Optional argument ARG the number of steps to undo."
         (setq undo-fu--respect t)))
 
     (when (or undo-fu--checkpoint-is-blocking (not was-undo-or-redo))
-      (setq undo-fu--checkpoint (cdr buffer-undo-list)))
+      (setq undo-fu--checkpoint (cdr buffer-undo-list))
+      (setq undo-fu--checkpoint-length nil))
 
     (when (region-active-p)
       (if undo-fu-allow-undo-in-region



reply via email to

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