> (defcustom org-cite-basic-follow-actions
> '[["Open"
> ("b" "bibliography entry" org-cite-basic-follow.open-bibliography)]
> ["Copy"
> ("d" "DOI" org-cite-basic-follow.copy-doi)]
> ["Browse"
> ("u" "url" org-cite-basic-follow.browse-url)]]
> "Contents of the org-cite-basic-follow transient menu.
>
> This can be customized directly using the customization
> interface. Use setopt instead of setq if you change this option
> in elisp, to ensure that the transient is rebuilt.
>
> Further actions can be added using transient-define-suffix."
> :group 'org-cite
> :type 'sexp
> :set (lambda (option-name new-value)
> (eval
> `(transient-define-prefix org-cite-basic-follow (citation &optional
> prefix)
> "Follow a citation reference.
>
> The contents of this transient menu is set in org-cite-basic-follow-actions."
> ,new-value
> (interactive)
> (if (or org-cite-basic-follow-ask prefix)
> (transient-setup 'org-cite-basic-follow nil nil :scope (list
> citation prefix))
> (org-cite-basic-goto citation prefix))))
> (set-default-toplevel-value option-name new-value)))
(defcustom org-cite-basic-follow-actions
'[["Open"
("b" "bibliography entry" org-cite-basic-follow.open-bibliography)]
["Copy"
("d" "DOI" org-cite-basic-follow.copy-doi)]
["Browse"
("u" "url" org-cite-basic-follow.browse-url)]]
...)
(transient-define-prefix org-cite-basic-follow (citation &optional prefix)
[org-cite-basic-follow-actions]
(interactive)
(if (or org-cite-basic-follow-ask prefix)
(transient-setup 'org-cite-basic-follow nil nil
;; (off-topic) Add \n here ---^
:scope (list citation prefix))
(org-cite-basic-goto citation prefix))))
I use something similar in Forge (forge--lists-group et al.), but
there the purpose is to share groups between different prefixes, not
to make them customizable.
To let users choose what commands to offer in the menu, I would
recommend directing users towards Transient's "layer" mechanism instead
of adding an option.
See [[info:transient#Enabling and Disabling Suffixes]]. To try it enter
any prefix (magit-diff would do) and type "C-x l". Usage information is
displayed after that.
> :scope (list citation prefix)
Shouldn't that be just be
:scope citation
and then
(interactive (list (magit-scope)))
to access it?
>> It feels a bit too complex to demand knowledge of these transient
>> details (how to get the arglist) from users.
>>
>> I am wondering if we can somehow plug the existing commands passing the
>> arguments without any extra setup on the user side.
>
> The lambda form is much neater with your (transient-scope) suggestion:
> (lambda (citation prefix)
> (interactive (transient-scope))
> ...)
>
> Is this simple enough? I don't feel a macro would improve the
> situation.
Yes, obviously you have to call transient-scope somewhere.
I haven't seen enough of the commands you want to add as suffixes to
know whether it would make sense, and is even possible, to add an
abstraction, and the few examples I have seen already contain
non-commands and "find as pdf" doesn't even exist as a named function.
That being said, if there are multiple commands like
(defun do-something-with-citation (citation)
(interactive (list (read-citation "Do something with citation: ")))
...)
it might make sense to change read-citation like this
(defun read-citation (prompt)
(if (eq transient-current-prefix 'org-cite-basic-follow)
(org-element-property :key (transient-scope))
...old body here...))
Cheers,
Jonas