branch: elpa/undo-fu
commit cad12914a4556faa116aca1701c381c4e85c38e2
Author: Campbell Barton <[email protected]>
Commit: Campbell Barton <[email protected]>
Add 'undo-fu-allow-undo-in-region' option
---
readme.rst | 13 ++++++++++++-
undo-fu.el | 47 +++++++++++++++++++++++++++++++++++++++--------
2 files changed, 51 insertions(+), 9 deletions(-)
diff --git a/readme.rst b/readme.rst
index 36417f1fe7..1e35085c9a 100644
--- a/readme.rst
+++ b/readme.rst
@@ -74,10 +74,21 @@ Details
until a new chain of undo/redo events is started.
+Customization
+-------------
+
+``undo-fu-allow-undo-in-region``
+ This option exists for users who prefer to trade-off undo/redo functionality
+ with the ability to limit undo to a region.
+
+ When this boolean is ``t``, undoing with a selection
+ will use undo within this region.
+
+
Limitations
===========
-The feature ``undo-in-region`` is currently unsupported.
+The feature ``undo-in-region`` is disabled by default.
Installation
diff --git a/undo-fu.el b/undo-fu.el
index ce4af3270b..83db225c5e 100644
--- a/undo-fu.el
+++ b/undo-fu.el
@@ -43,6 +43,16 @@
;;; Code:
+;; Custom variables.
+
+(defcustom undo-fu-allow-undo-in-region nil
+ "When t, use `undo-in-region' when a selection is present.
+Otherwise `undo-in-region' is never used, since it doesn't support `undo-only',
+causing undo-fu to work with reduced functionality when a selection exists."
+ :group 'undo-fu
+ :type 'boolean)
+
+
;; Internal variables.
;; First undo step in the chain, don't redo past this.
@@ -52,6 +62,9 @@
;; Apply undo/redo constraints to stop redo from undoing or
;; passing the initial undo checkpoint.
(defvar-local undo-fu--respect t)
+;; Initiated an undo-in region (don't use `undo-only').
+;; Only use when `undo-fu-allow-undo-in-region' is true.
+(defvar-local undo-fu--in-region nil)
;; Internal functions/macros.
@@ -59,6 +72,7 @@
(defun undo-fu--checkpoint-disable ()
"Disable check to prevent crossing the initial boundary when redoing."
(setq undo-fu--respect nil)
+ (setq undo-fu--in-region nil)
(setq undo-fu--checkpoint-is-blocking nil)
(setq undo-fu--checkpoint nil))
@@ -152,8 +166,19 @@ Optional argument ARG The number of steps to redo."
;; after running non-undo related commands.
(unless undo-fu--respect
(unless was-undo-or-redo
+ (when undo-fu-allow-undo-in-region
+ (setq undo-fu--in-region nil))
(setq undo-fu--respect t)))
+ (when (region-active-p)
+ (if undo-fu-allow-undo-in-region
+ (progn
+ (message "Undo in region in use. Undo end-point ignored!")
+ (undo-fu--checkpoint-disable)
+ (setq undo-fu--in-region t))
+ ;; Default behavior, just remove selection.
+ (deactivate-mark)))
+
;; Allow crossing the boundary, if we press [keyboard-quit].
;; This allows explicitly over-stepping the boundary, in cases where it's
needed.
(when undo-fu--respect
@@ -197,9 +222,6 @@ Optional argument ARG The number of steps to redo."
(success
(condition-case err
(progn
- ;; 'undo-in-region' unsupported.
- (when transient-mark-mode
- (deactivate-mark))
(undo-fu--with-message-suffix
(if undo-fu--respect
""
@@ -233,11 +255,22 @@ Optional argument ARG the number of steps to undo."
;; after running non-undo related commands.
(unless undo-fu--respect
(unless was-undo-or-redo
+ (when undo-fu-allow-undo-in-region
+ (setq undo-fu--in-region nil))
(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)))
+ (when (region-active-p)
+ (if undo-fu-allow-undo-in-region
+ (progn
+ (message "Undo in region in use. Undo end-point ignored!")
+ (undo-fu--checkpoint-disable)
+ (setq undo-fu--in-region t))
+ ;; Default behavior, just remove selection.
+ (deactivate-mark)))
+
;; Allow crossing the boundary, if we press [keyboard-quit].
;; This allows explicitly over-stepping the boundary, in cases where it's
needed.
(when undo-fu--respect
@@ -261,15 +294,13 @@ Optional argument ARG the number of steps to undo."
(success
(condition-case err
(progn
- ;; 'undo-in-region' unsupported.
- (when transient-mark-mode
- (deactivate-mark))
-
(undo-fu--with-message-suffix
(if undo-fu--respect
""
" (unconstrained)")
- (undo-only steps))
+ (if undo-fu--in-region
+ (undo steps)
+ (undo-only steps)))
t)
(error (message "%s" (error-message-string err))))))
(when success