branch: elpa/undo-fu
commit ad8a60f9796c180230ff0a7fef17c3811aec18df
Author: Campbell Barton <[email protected]>
Commit: Campbell Barton <[email protected]>
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