branch: externals/transient commit 8db5f0fd4469f3b2af34e07a283372ca273fa685 Author: Jonas Bernoulli <jo...@bernoul.li> Commit: Jonas Bernoulli <jo...@bernoul.li>
transient--refresh-transient: Preserve value The value of the prefix's `value' slot is used during the setup of its suffixes. After that it is not updated, when the value of a suffix changes (and `transient-get-value' has to be used instead). Since `transient--refresh-transient' redoes part of the setup, it has to make sure it uses the updated value. As a special-case, if a suffix actually does set the prefix's `value', then it has to signal that, so we can avoid discarding it here. Add a new function `transient-prefix-set' to handle that situation. --- lisp/transient.el | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/lisp/transient.el b/lisp/transient.el index 9f5bcebeeb..754f941a78 100644 --- a/lisp/transient.el +++ b/lisp/transient.el @@ -2281,6 +2281,12 @@ value. Otherwise return CHILDREN as is." (transient--pop-keymap 'transient--predicate-map) (transient--pop-keymap 'transient--transient-map) (transient--pop-keymap 'transient--redisplay-map) + (if (eq transient--refreshp 'updated-value) + ;; Preserve the prefix value this once, because the + ;; invoked suffix indicates that it has updated that. + (setq transient--refreshp (oref transient--prefix refresh-suffixes)) + ;; Otherwise update the prefix value from suffix values. + (oset transient--prefix value (transient-get-value))) (transient--init-objects) (transient--init-keymaps) (transient--push-keymap 'transient--transient-map) @@ -3444,8 +3450,16 @@ prompt." (member arg incomp))))) (transient-infix-set obj nil))))) +(defun transient-prefix-set (value) + "Set the value of the active transient prefix to VALUE. +Intended for use by transient suffix commands." + (oset transient--prefix value value) + (setq transient--refreshp 'updated-value)) + (cl-defgeneric transient-set-value (obj) - "Set the value of the transient prefix OBJ.") + "Persist the value of the transient prefix OBJ. +Only intended for use by `transient-set'. +Also see `transient-prefix-set'.") (cl-defmethod transient-set-value ((obj transient-prefix)) (oset (oref obj prototype) value (transient-get-value)) @@ -3501,7 +3515,7 @@ the set, saved or default value for PREFIX." (and (or (not (slot-exists-p obj 'unsavable)) (not (oref obj unsavable))) (transient--get-wrapped-value obj))) - transient-current-suffixes))) + (or transient--suffixes transient-current-suffixes)))) (defun transient--get-wrapped-value (obj) (and-let* ((value (transient-infix-value obj)))