From: "Tor-björn Claesson" <tclaesson@gmail.com>
To: Ihor Radchenko <yantar92@posteo.net>
Cc: emacs-orgmode@gnu.org
Subject: Re: Fwd: Org-cite: Replace basic follow-processor with transient menu?
Date: Wed, 11 Dec 2024 12:05:23 +0200 [thread overview]
Message-ID: <87wmg6edr0.fsf@gmail.com> (raw)
In-Reply-To: <87o71jwdxz.fsf@localhost> (Ihor Radchenko's message of "Tue, 10 Dec 2024 19:11:36 +0000")
[-- Attachment #1: Type: text/plain, Size: 366 bytes --]
> Two comments here:
> 1. It should not be a lambda. Better have a function or even command
> 2. The logic is not right. You should better follow
> `org-cite-basic--key-completion-table':
> `org-cite-basic--parse-bibliography', `org-cite-basic--get-entry',
> and `org-cite-basic--get-field'.
And this time with a patch, apologies.
/Tor-björn
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Patch version 5 --]
[-- Type: text/x-diff, Size: 9808 bytes --]
From 7e9e0c64fbda2dcb67d8c8421d1c9923ca93e8b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tor-bj=C3=B6rn=20Claesson?= <torb@barbar.claesson.fi>
Date: Tue, 12 Nov 2024 11:09:16 +0200
Subject: [PATCH] lisp/oc-basic.el: Transient menu for following citations
* lisp/oc-basic.el (require 'transient): Pull in transient.
(require 'org-element): Pull in org-element.
(org-cite-basic-follow-ask): New customization option. should
`org-cite-basic-follow' prompt the user for an action?
(org-cite-basic-follow-actions): New customization option, that
specifies the contents of the transient menu.
(org-cite-basic--get-key): New function. Get citation key from
citation or citation reference.
(org-cite-basic-follow): New function. Displays a menu asking how to
follow a citation if `org-cite-basic-follow-ask' is
non-nil. Otherwise, it retains the default behaviour of opening the
bibliography entry. This can be inversed with a negative prefix argument.
(org-cite-basic-follow--parse-suffix-specification and
org-cite-basic-follow--setup): Helper functions for
`org-cite-basic-follow'.
(org-cite-register-processor 'basic): Update the basic citation
processor to follow citations using `org-cite-basic-follow'.
* etc/ORG_NEWS (Menu for choosing how to follow citations): Describe
the new feature
(New option ~org-cite-basic-follow-ask~): Describe this new
customization option.
(New option ~org-cite-basic-follow-actions~): Describe this new
customization option, which specifies the layout of the
`org-cite-basic-follow' transient menu.
This change was co-authored with much support from Ihor Radchenko and
Jonas Bernoulli, thanks!
---
etc/ORG-NEWS | 22 +++++++++
lisp/oc-basic.el | 115 +++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 128 insertions(+), 9 deletions(-)
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index de4f11b25..bacc38be2 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -114,6 +114,15 @@ The keybindings in the repeat-maps can be changed by customizing
See the new [[info:org#Repeating commands]["Repeating commands"]] section in Org mode manual.
+*** New transient menu when following citations
+
+Following citations with the org-cite-basic citation backend can now present a
+transient menu. To show this menu, set ~org-cite-basic-follow-ask~ to non-nil.
+This behaviour can be reversed with a -4 prefix.
+
+The contents of this menu can be customized in
+~org-cite-basic-follow-actions~.
+
** New and changed options
# Chanes deadling with changing default values of customizations,
@@ -158,6 +167,19 @@ English. The default value is ~t~ as the CSL standard assumes that
English titles are specified in sentence-case but the bibtex
bibliography format requires them to be written in title-case.
+*** New option ~org-cite-basic-follow-ask~
+
+When this option is non-nil, following a citation with the basic citation
+backend will present a transient menu with choices for how to follow the
+citation.
+If nil, following a citation will open its bibliography entry.
+
+This behaviour can be reversed with a -4 prefix argument.
+
+*** New option ~org-cite-basic-follow-actions~
+
+This option specifies the options presented by ~org-cite-basic-follow~.
+
** New functions and changes in function arguments
# This also includes changes in function behavior from Elisp perspective.
diff --git a/lisp/oc-basic.el b/lisp/oc-basic.el
index e207a1997..fc55d3a32 100644
--- a/lisp/oc-basic.el
+++ b/lisp/oc-basic.el
@@ -74,6 +74,8 @@
(require 'map)
(require 'oc)
(require 'seq)
+(require 'transient)
+(require 'org-element)
(declare-function org-open-at-point "org" (&optional arg))
(declare-function org-open-file "org" (path &optional in-emacs line search))
@@ -140,6 +142,39 @@
:type 'face
:safe #'facep)
+(defcustom org-cite-basic-follow-ask nil
+ "Should `org-cite-basic' ask how to follow citations?
+
+When this option is nil, `org-cite-basic-follow' opens the bibliography entry.
+Otherwise, `org-cite-basic-follow' will display a transient menu prompting the
+user for an action. The contents of this menu can be customized in
+`org-cite-basic-follow-actions'."
+ :group 'org-cite
+ :package-version '(Org . "9.8")
+ :type 'boolean)
+
+(defcustom org-cite-basic-follow-actions
+ '[["Open"
+ ("b" "bibliography entry" (org-cite-basic-goto !citation !prefix))]
+ ["Copy"
+ ("d" "DOI"
+ (kill-new
+ (org-cite-basic--get-field
+ 'doi
+ (org-cite-basic--get-key !citation))))]]
+ "Actions in the `org-cite-basic-follow' transient menu.
+
+This option uses the same syntax as `transient-define-prefix', see Info node
+`(transient)Binding Suffix and Infix Commands'. In addition, it is possible
+to specify a function call for the COMMAND part, where !citation (the citation
+object to be followed) and !prefix (any prefix argument to the follower) can be
+used to access those values. For example:
+(org-cite-basic-goto !citation !prefix) or
+(lambda () (message (org-element-property :key !citation)))"
+ :group 'org-cite
+ :package-version '(Org . "9.8")
+ :type 'sexp)
+
\f
;;; Internal variables
(defvar org-cite-basic--bibliography-cache nil
@@ -326,6 +361,16 @@ INFO is the export state, as a property list."
(map-keys entries))
(org-cite-basic--parse-bibliography)))
+(defun org-cite-basic--get-key (citation-or-citation-reference)
+ "Return citation key for CITATION."
+ (if (org-element-type-p citation-or-citation-reference 'citation-reference)
+ (org-element-property :key citation-or-citation-reference)
+ (pcase (org-cite-get-references citation-or-citation-reference t)
+ (`(,key) key)
+ (keys
+ (or (completing-read "Select citation key: " keys nil t)
+ (user-error "Aborted"))))))
+
(defun org-cite-basic--get-entry (key &optional info)
"Return BibTeX entry for KEY, as an association list.
When non-nil, INFO is the export state, as a property list."
@@ -805,14 +850,7 @@ export state, as a property list."
When DATUM is a citation reference, open bibliography entry referencing
the citation key. Otherwise, select which key to follow among all keys
present in the citation."
- (let* ((key
- (if (org-element-type-p datum 'citation-reference)
- (org-element-property :key datum)
- (pcase (org-cite-get-references datum t)
- (`(,key) key)
- (keys
- (or (completing-read "Select citation key: " keys nil t)
- (user-error "Aborted"))))))
+ (let* ((key (org-cite-basic--get-key datum))
(file
(pcase (seq-find (pcase-lambda (`(,_ . ,entries))
(gethash key entries))
@@ -832,6 +870,65 @@ present in the citation."
(bibtex-set-dialect)
(bibtex-search-entry key)))))
+(transient-define-prefix org-cite-basic-follow (citation-object &optional prefix)
+ "Follow citation.
+
+If `org-cite-basic-follow-ask' is non-nil, this transient will present
+a menu prompting the user for an action.
+Otherwise, it will open the bibliography entry for the citation at point.
+This behaviour is inverted when the transient is called with a -4 prefix
+argument.
+
+The contents of the menu are defined in the variable
+`org-cite-basic-follow-actions'."
+ [:class transient-columns
+ :setup-children org-cite-basic-follow--setup
+ :pad-keys t]
+ (interactive
+ (list (let ((obj (org-element-context)))
+ (pcase (org-element-type obj)
+ ((or 'citation 'citation-reference) obj)
+ (_ (user-error "No citation at point"))))))
+ (if (xor org-cite-basic-follow-ask
+ (equal prefix '(-4)))
+ (transient-setup 'org-cite-basic-follow nil nil
+ :scope (list :citation citation-object :prefix prefix))
+ (org-cite-basic-goto citation-object prefix)))
+
+(defun org-cite-basic-follow--parse-suffix-specification (specification)
+ "Handle special syntax for `org-cite-basic-follow-actions'."
+ (pcase specification
+ (`(,key ,desc (lambda ,args . ,fn-args) . ,other)
+ `(,key ,desc
+ (lambda ,args
+ ,(unless (and (listp (car fn-args))
+ (equal (caar fn-args)
+ 'interactive))
+ '(interactive))
+ (let ((!citation (plist-get (transient-scope) :citation))
+ (!prefix (plist-get (transient-scope) :prefix)))
+ ,@fn-args))
+ ,@other))
+ (`(,key ,desc (,fn . ,fn-args) . ,other)
+ `(,key ,desc
+ (lambda ()
+ (interactive)
+ (let ((!citation (plist-get (transient-scope) :citation))
+ (!prefix (plist-get (transient-scope) :prefix)))
+ (,fn ,@fn-args)))
+ ,@other))
+ (other other)))
+
+(defun org-cite-basic-follow--setup (_)
+ "Update `org-cite-basic-follow' when `org-cite-basic-follow-actions' changes."
+ (transient-parse-suffixes
+ 'org-cite-basic-follow
+ (cl-map 'vector
+ (lambda (group)
+ (cl-map 'vector #'org-cite-basic-follow--parse-suffix-specification
+ group))
+ org-cite-basic-follow-actions)))
+
\f
;;; "Insert" capability
(defun org-cite-basic--complete-style (_)
@@ -920,7 +1017,7 @@ Raise an error when no bibliography is set in the buffer."
:activate #'org-cite-basic-activate
:export-citation #'org-cite-basic-export-citation
:export-bibliography #'org-cite-basic-export-bibliography
- :follow #'org-cite-basic-goto
+ :follow #'org-cite-basic-follow
:insert (org-cite-make-insert-processor #'org-cite-basic--complete-key
#'org-cite-basic--complete-style)
:cite-styles
--
2.46.0
prev parent reply other threads:[~2024-12-11 10:31 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-14 12:36 Org-cite: Replace basic follow-processor with transient menu? Tor-björn Claesson
2024-09-15 14:36 ` Ihor Radchenko
2024-09-17 12:18 ` Tor-björn Claesson
2024-09-22 12:50 ` Ihor Radchenko
2024-09-24 10:07 ` Tor-björn Claesson
2024-10-12 17:31 ` Ihor Radchenko
2024-10-22 7:23 ` Tor-björn Claesson
2024-10-22 17:58 ` Ihor Radchenko
2024-10-24 14:18 ` Jonas Bernoulli
2024-10-24 17:32 ` Ihor Radchenko
2024-10-26 11:45 ` Jonas Bernoulli
2024-10-27 8:09 ` Ihor Radchenko
2024-10-27 9:17 ` Tor-björn Claesson
2024-10-29 4:58 ` Tor-björn Claesson
2024-10-29 18:55 ` Ihor Radchenko
2024-10-30 5:37 ` Tor-björn Claesson
2024-10-30 18:43 ` Ihor Radchenko
2024-10-31 18:55 ` Tor-björn Claesson
2024-10-31 19:05 ` Ihor Radchenko
2024-10-31 20:47 ` Tor-björn Claesson
2024-11-01 8:27 ` Tor-björn Claesson
2024-11-01 17:08 ` Ihor Radchenko
2024-11-02 19:04 ` Tor-björn Claesson
2024-11-02 19:21 ` Ihor Radchenko
2024-11-02 21:37 ` Tor-björn Claesson
2024-11-03 7:40 ` Ihor Radchenko
2024-11-05 10:07 ` Tor-björn Claesson
2024-11-09 14:08 ` Ihor Radchenko
2024-11-10 16:33 ` Tor-björn Claesson
2024-11-10 16:41 ` Ihor Radchenko
2024-11-11 10:03 ` Tor-björn Claesson
2024-11-11 15:52 ` Ihor Radchenko
2024-11-12 9:26 ` Tor-björn Claesson
2024-11-12 18:03 ` Ihor Radchenko
[not found] ` <CAO0k703a5SCv4Eaogjs-14zgmTi-pK5qqG=8VzB8+7h-kcC8yg@mail.gmail.com>
[not found] ` <87wmh8s358.fsf@localhost>
[not found] ` <87y11nwp9z.fsf@gmail.com>
2024-11-17 9:30 ` Fwd: " Tor-björn Claesson
2024-11-23 16:41 ` Ihor Radchenko
2024-11-25 17:49 ` Tor-björn Claesson
2024-12-10 19:11 ` Ihor Radchenko
2024-12-11 9:57 ` Tor-björn Claesson
2024-12-11 10:05 ` Tor-björn Claesson [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87wmg6edr0.fsf@gmail.com \
--to=tclaesson@gmail.com \
--cc=emacs-orgmode@gnu.org \
--cc=yantar92@posteo.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).