branch: externals/transient
commit d88cacfc6919c5642be7f3c343e12861f7e683b7
Author: Jonas Bernoulli <[email protected]>
Commit: Jonas Bernoulli <[email protected]>
Fix setting up return to outer prefix
We need a separate prefix slot, `return', to store the return behavior;
re-purposing the `transient-suffix' slot, as we did before, was
ambiguous.
When the `transient-suffix' prefix slot is t, that means that suffixes,
that do not specify their own transient behavior, should be called
without the prefix being exited.
In [1: 784887b7] we tried to overload that meaning of that value in the
case of sub-prefixes:
> When the prefix's `transient-suffix' is t, and the current prefix
> is a sub-prefix, then suffixes have to use `transient--do-return',
> to exit the sub-prefix but not the outer prefix.
If a suffixes `transient' slot is nil, that works, but merely because
the ambiguous value t of `transient-suffix' does not enter the picture.
However if a suffix leaves `transient' undefined, then we relied on the
same boolean to encode the three possible behaviors `call', `exit' and
`return'. I.e., it was not possible to chose between `exit' and
`return', and we always used `exit'.
Closes #352.
1: 2023-10-31 784887b78160e0c820b44924d12b2e2e0bf90ef0
Account for t as transient-suffix for nested prefixes
---
lisp/transient.el | 37 ++++++++++++++++++++-----------------
1 file changed, 20 insertions(+), 17 deletions(-)
diff --git a/lisp/transient.el b/lisp/transient.el
index 6f1d5f3331..846890b7a2 100644
--- a/lisp/transient.el
+++ b/lisp/transient.el
@@ -736,6 +736,7 @@ If `transient-save-history' is nil, then do nothing."
(level :initarg :level)
(init-value :initarg :init-value)
(value) (default-value :initarg :value)
+ (return :initarg :return :initform nil)
(scope :initarg :scope :initform nil)
(history :initarg :history :initform nil)
(history-pos :initarg :history-pos :initform 0)
@@ -2097,7 +2098,7 @@ of the corresponding object."
(defun transient--make-predicate-map ()
(let* ((default (transient--resolve-pre-command
(oref transient--prefix transient-suffix)))
- (return (and transient--stack (eq default t)))
+ (return (and transient--stack (oref transient--prefix return)))
(map (make-sparse-keymap)))
(set-keymap-parent map transient-predicate-map)
(when (or (and (slot-boundp transient--prefix 'transient-switch-frame)
@@ -2274,9 +2275,9 @@ value. Otherwise return CHILDREN as is.")
:level (or (alist-get t (alist-get name
transient-levels))
transient-default-level)
params))))
- (transient--setup-recursion obj)
- (transient-init-scope obj)
- (transient-init-value obj)
+ (transient-init-value obj)
+ (transient-init-return obj)
+ (transient-init-scope obj)
obj))
(defun transient--init-suffixes (name)
@@ -2828,9 +2829,9 @@ value. Otherwise return CHILDREN as is.")
(push (list (oref transient--prefix command)
transient--layout
transient--editp
- :transient-suffix (oref transient--prefix transient-suffix)
- :scope (oref transient--prefix scope)
- :value (transient-get-value))
+ :value (transient-get-value)
+ :return (oref transient--prefix return)
+ :scope (oref transient--prefix scope))
transient--stack))
(defun transient--stack-pop ()
@@ -3010,16 +3011,6 @@ Use that command's pre-command to determine transient
behavior."
If there is no parent prefix, then just call the command."
(transient--do-stack))
-(defun transient--setup-recursion (prefix-obj)
- (when-let* ((transient--stack)
- (command (oref prefix-obj command))
- (suffix-obj (transient-suffix-object command))
- ((memq (if (slot-boundp suffix-obj 'transient)
- (oref suffix-obj transient)
- (oref transient-current-prefix transient-suffix))
- (list t 'recurse #'transient--do-recurse))))
- (oset prefix-obj transient-suffix t)))
-
(defun transient--do-stack ()
"Call the transient prefix command, stacking the active transient.
Push the active transient to the transient stack."
@@ -3932,6 +3923,18 @@ Append \"=\ to ARG to indicate that it is an option."
(or (match-string 1 match) "")))
(and (member arg args) t)))
+;;; Return
+
+(defun transient-init-return (obj)
+ (when-let* ((transient--stack)
+ (command (oref obj command))
+ (suffix-obj (transient-suffix-object command))
+ ((memq (if (slot-boundp suffix-obj 'transient)
+ (oref suffix-obj transient)
+ (oref transient-current-prefix transient-suffix))
+ (list t 'recurse #'transient--do-recurse))))
+ (oset obj return t)))
+
;;; Scope
;;;; Init