1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 06:20:55 -08:00

Update to Transient v0.7.2-1-gf273c0c8

This fixes two bugs, one of them restoring compatibility with the
version that ships with Emacs 29, making emoji-insert usable again.
The other changes are of cosmetic nature.  The only exception is a new
command, whose creation lead to the discovery of one of the bugs, and
remains unused until a package author actually binds it in a prefix.
I.e., unless someone actually uses this, the risk of a regression is
close to zero, and even if it is used, it can only affect the prefix
that binds it.
This commit is contained in:
Jonas Bernoulli 2024-06-24 13:38:35 +02:00
parent b7d5ca3a8f
commit 4fcc38966b
No known key found for this signature in database
GPG key ID: 230C2EFBB326D927
2 changed files with 56 additions and 10 deletions

View file

@ -31,7 +31,7 @@ General Public License for more details.
@finalout @finalout
@titlepage @titlepage
@title Transient User and Developer Manual @title Transient User and Developer Manual
@subtitle for version 0.7.0 @subtitle for version 0.7.2
@author Jonas Bernoulli @author Jonas Bernoulli
@page @page
@vskip 0pt plus 1filll @vskip 0pt plus 1filll
@ -53,7 +53,7 @@ resource to get over that hurdle is Psionic K's interactive tutorial,
available at @uref{https://github.com/positron-solutions/transient-showcase}. available at @uref{https://github.com/positron-solutions/transient-showcase}.
@noindent @noindent
This manual is for Transient version 0.7.0. This manual is for Transient version 0.7.2.
@insertcopying @insertcopying
@end ifnottex @end ifnottex

View file

@ -5,7 +5,7 @@
;; Author: Jonas Bernoulli <jonas@bernoul.li> ;; Author: Jonas Bernoulli <jonas@bernoul.li>
;; URL: https://github.com/magit/transient ;; URL: https://github.com/magit/transient
;; Keywords: extensions ;; Keywords: extensions
;; Version: 0.7.0 ;; Version: 0.7.2
;; SPDX-License-Identifier: GPL-3.0-or-later ;; SPDX-License-Identifier: GPL-3.0-or-later
@ -835,6 +835,11 @@ Technically a suffix object with no associated command.")
All remaining arguments are treated as files. All remaining arguments are treated as files.
They become the value of this argument.") They become the value of this argument.")
(defclass transient-value-preset (transient-suffix)
((transient :initform t)
(set :initarg := :initform nil))
"Class used by the `transient-preset' suffix command.")
;;;; Group ;;;; Group
(defclass transient-group (transient-child) (defclass transient-group (transient-child)
@ -1075,7 +1080,10 @@ commands are aliases for."
(and val (not (eq val 'transient--default-infix-command)) val))) (and val (not (eq val 'transient--default-infix-command)) val)))
(eval-and-compile ;transient--expand-define-args (eval-and-compile ;transient--expand-define-args
(defun transient--expand-define-args (args arglist form &optional nobody) (defun transient--expand-define-args (args &optional arglist form nobody)
;; ARGLIST and FORM are only optional for backward compatibility.
;; This is necessary because "emoji.el" from Emacs 29 calls this
;; function directly, with just one argument.
(unless (listp arglist) (unless (listp arglist)
(error "Mandatory ARGLIST is missing")) (error "Mandatory ARGLIST is missing"))
(let (class keys suffixes docstr declare (interactive-only t)) (let (class keys suffixes docstr declare (interactive-only t))
@ -2020,7 +2028,7 @@ transient. In that case NAME is mandatory, LAYOUT and EDIT must
be nil and PARAMS may be (but usually is not) used to set, e.g., be nil and PARAMS may be (but usually is not) used to set, e.g.,
the \"scope\" of the transient (see `transient-define-prefix'). the \"scope\" of the transient (see `transient-define-prefix').
This function is also called internally in which case LAYOUT and This function is also called internally, in which case LAYOUT and
EDIT may be non-nil." EDIT may be non-nil."
(transient--debug 'setup) (transient--debug 'setup)
(transient--with-emergency-exit :setup (transient--with-emergency-exit :setup
@ -2275,6 +2283,12 @@ value. Otherwise return CHILDREN as is."
(transient--pop-keymap 'transient--predicate-map) (transient--pop-keymap 'transient--predicate-map)
(transient--pop-keymap 'transient--transient-map) (transient--pop-keymap 'transient--transient-map)
(transient--pop-keymap 'transient--redisplay-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-objects)
(transient--init-keymaps) (transient--init-keymaps)
(transient--push-keymap 'transient--transient-map) (transient--push-keymap 'transient--transient-map)
@ -3081,6 +3095,12 @@ transient is active."
(oset obj value (nth pos hst)) (oset obj value (nth pos hst))
(mapc #'transient-init-value transient--suffixes)))) (mapc #'transient-init-value transient--suffixes))))
(transient-define-suffix transient-preset ()
"Put this preset into action."
:class transient-value-preset
(interactive)
(transient-prefix-set (oref (transient-suffix-object) set)))
;;;; Auxiliary ;;;; Auxiliary
(defun transient-toggle-common () (defun transient-toggle-common ()
@ -3258,7 +3278,7 @@ it\", in which case it is pointless to preserve history.)"
(reader (oref obj reader)) (reader (oref obj reader))
(choices (if (functionp choices) (funcall choices) choices)) (choices (if (functionp choices) (funcall choices) choices))
(prompt (transient-prompt obj)) (prompt (transient-prompt obj))
(value (if multi-value (mapconcat #'identity value ",") value)) (value (if multi-value (string-join value ",") value))
(history-key (or (oref obj history-key) (history-key (or (oref obj history-key)
(oref obj command))) (oref obj command)))
(transient--history (alist-get history-key transient-history)) (transient--history (alist-get history-key transient-history))
@ -3405,10 +3425,10 @@ prompt."
;;;; Set ;;;; Set
(cl-defgeneric transient-infix-set (obj value) (cl-defgeneric transient-infix-set (obj value)
"Set the value of infix object OBJ to value.") "Set the value of infix object OBJ to VALUE.")
(cl-defmethod transient-infix-set ((obj transient-infix) value) (cl-defmethod transient-infix-set ((obj transient-infix) value)
"Set the value of infix object OBJ to value." "Set the value of infix object OBJ to VALUE."
(oset obj value value)) (oset obj value value))
(cl-defmethod transient-infix-set :after ((obj transient-argument) value) (cl-defmethod transient-infix-set :after ((obj transient-argument) value)
@ -3438,8 +3458,16 @@ prompt."
(member arg incomp))))) (member arg incomp)))))
(transient-infix-set obj nil))))) (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) (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)) (cl-defmethod transient-set-value ((obj transient-prefix))
(oset (oref obj prototype) value (transient-get-value)) (oset (oref obj prototype) value (transient-get-value))
@ -3495,7 +3523,7 @@ the set, saved or default value for PREFIX."
(and (or (not (slot-exists-p obj 'unsavable)) (and (or (not (slot-exists-p obj 'unsavable))
(not (oref obj unsavable))) (not (oref obj unsavable)))
(transient--get-wrapped-value obj))) (transient--get-wrapped-value obj)))
transient-current-suffixes))) (or transient--suffixes transient-current-suffixes))))
(defun transient--get-wrapped-value (obj) (defun transient--get-wrapped-value (obj)
(and-let* ((value (transient-infix-value obj))) (and-let* ((value (transient-infix-value obj)))
@ -3954,6 +3982,24 @@ called inside the correct buffer (see `transient--insert-group')
and its value is returned to the caller." and its value is returned to the caller."
(transient--get-description obj)) (transient--get-description obj))
(cl-defmethod transient-format-description ((obj transient-value-preset))
(pcase-let* (((eieio description key set) obj)
((eieio value) transient--prefix)
(active (seq-set-equal-p set value)))
(format
"%s %s"
(propertize (or description (format "Preset %s" key))
'face (and active 'transient-argument))
(format (propertize "(%s)" 'face 'transient-delimiter)
(mapconcat (lambda (arg)
(propertize
arg 'face (cond (active 'transient-argument)
((member arg value)
'((:weight demibold)
transient-inactive-argument))
('transient-inactive-argument))))
set " ")))))
(cl-defmethod transient-format-description ((obj transient-group)) (cl-defmethod transient-format-description ((obj transient-group))
"Format the description by calling the next method. If the result "Format the description by calling the next method. If the result
doesn't use the `face' property at all, then apply the face doesn't use the `face' property at all, then apply the face