> (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