Skip to content

Commit

Permalink
transient-scope: Fix recent regression
Browse files Browse the repository at this point in the history
[1: d0cba15] failed to take into account that this function is also
useful when setting up a prefix, in which case it should be called
without an argument.

Also clarify that the argument should be used when this function is
called from a suffix command.

1: 2024-11-22 d0cba15
   transient-scope: Add PREFIX argument
  • Loading branch information
tarsius committed Nov 24, 2024
1 parent 7e50a8f commit 4de5812
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 15 deletions.
4 changes: 3 additions & 1 deletion CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
- Added documentation for ~inapt-if*~ slots to manual. 179545a6

- ~transient-args~ and ~transient-scope~ now both take a prefix command or
a list of prefix commands as argument.
a list of prefix commands as argument. ~transient-scope~ can still be
called without an argument, but that should only be done in functions
that take part in setting up a menu, not in a suffix command.

- Added new generic function ~transient-prefix-value~, giving finer
control over how the value returned by ~transient-args~ is determined.
Expand Down
31 changes: 17 additions & 14 deletions lisp/transient.el
Original file line number Diff line number Diff line change
Expand Up @@ -3728,24 +3728,27 @@ a default implementation, which is a noop.")
;;;; Get

(defun transient-scope (&optional prefix)
"Return the scope of the transient prefix command PREFIX, or nil.
"Return the scope of the active or current transient prefix command.
If the current command wasn't invoked from any prefix, return nil.
If optional PREFIX is nil, return the scope of the active prefix; the
prefix whose menu is active or being setup. In suffix commands it is
rarely, if ever, appropriate to call this function like this.
If PREFIX is non-nil, it must a single prefix or a list of prefixes.
If, and only if, the current prefix is one of these prefixes, return
its scope, otherwise return nil.
If PREFIX is nil (for backward compatibility it may also be omitted),
return the scope of the current prefix, regardless of which prefix it
is. This usage is rarely appropriate; it is better to be explicit.
If PREFIX is a prefix command or a list of such commands, then return
its scope, if, and only if, either the active prefix or the prefix from
which the current suffix command was invoked, is one of these prefixes.
Otherwise return nil.
Return the value of the corresponding object's `scope' slot."
(declare (advertised-calling-convention (prefix) "0.8.0"))
(and transient-current-command
(or (not prefix)
(memq transient-current-command (ensure-list prefix)))
(oref (transient-prefix-object) scope)))
(if prefix
;; Prefer the current over the active prefix. If the opposite is
;; appropriate, one should call this function without an argument.
(and-let* ((obj (or transient-current-prefix transient--prefix)))
(and (memq (oref obj command)
(ensure-list prefix))
(oref obj scope)))
(and transient--prefix
(oref transient--prefix scope))))

;;; History

Expand Down

0 comments on commit 4de5812

Please sign in to comment.