From 8210921aa94430b651c9813acb1c12448db00fb8 Mon Sep 17 00:00:00 2001 From: Martin Kampas Date: Mon, 12 Feb 2024 13:24:54 +0100 Subject: [PATCH] org-bibtex-yank: Allow to populate existing item Align with `org-bibtex-create'. * lisp/ol-bibtex.el (org-bibtex-write): New optional argument `nonew', similar to the existing `nonew' argument of `org-bibtex-create'. * lisp/ol-bibtex.el (org-bibtex-yank): New optional argument `nonew', similar to the existing `nonew' argument of `org-bibtex-create'. --- etc/ORG-NEWS | 10 ++++++++++ lisp/ol-bibtex.el | 42 ++++++++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 7d2f70ab6..4751deaaa 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -812,6 +812,11 @@ propagating the value for this variable to ~org-agenda-archives-mode~. For acceptable values and their meaning, see the value of that variable. ** New features +*** ~org-bibtex-yank~ accepts a prefix argument + +When called with a prefix argument, ~org-bibtex-yank~ adds data to the +headline of the entry at point instead of creating a new one. + *** =ob-plantuml.el=: Support tikz file format output =ob-plantuml.el= now output =tikz= :file format via @@ -1011,6 +1016,11 @@ The same can be done via startup options: : #+STARTUP: fnanon ** New functions and changes in function arguments +*** New optional argument =NONEW= for ~org-bibtex-yank~ + +When the new argument is non-nil, add data to the headline of the +entry at point. + *** New API functions to store data within ~org-element-cache~ Elisp programs can now store data inside Org element cache. diff --git a/lisp/ol-bibtex.el b/lisp/ol-bibtex.el index c5a950e2d..4ec4dc958 100644 --- a/lisp/ol-bibtex.el +++ b/lisp/ol-bibtex.el @@ -642,8 +642,8 @@ With prefix argument OPTIONAL also prompt for optional fields." (defun org-bibtex-create (&optional arg nonew) "Create a new entry at the given level. -With a prefix arg, query for optional fields as well. -If nonew is t, add data to the headline of the entry at point." +With a prefix ARG, query for optional fields as well. +If NONEW is non-nil, add data to the headline of the entry at point." (interactive "P") (let* ((type (completing-read "Type: " (mapcar (lambda (type) @@ -722,29 +722,32 @@ Return the number of saved entries." (interactive "fFile: ") (org-bibtex-read-buffer (find-file-noselect file 'nowarn 'rawfile))) -(defun org-bibtex-write (&optional noindent) +(defun org-bibtex-write (&optional noindent nonew) "Insert a heading built from the first element of `org-bibtex-entries'. When optional argument NOINDENT is non-nil, do not indent the properties -drawer." +drawer. If NONEW is non-nil, add data to the headline of the entry at +point." (interactive) (unless org-bibtex-entries (error "No entries in `org-bibtex-entries'")) (let* ((entry (pop org-bibtex-entries)) (org-special-properties nil) ; avoids errors with `org-entry-put' (val (lambda (field) (cdr (assoc field entry)))) - (togtag (lambda (tag) (org-toggle-tag tag 'on)))) - (org-insert-heading) - (insert (funcall org-bibtex-headline-format-function entry)) - (insert "\n:PROPERTIES:\n") - (org-bibtex-put "TITLE" (funcall val :title) 'insert) + (togtag (lambda (tag) (org-toggle-tag tag 'on))) + (insert-raw (not nonew))) + (unless nonew + (org-insert-heading) + (insert (funcall org-bibtex-headline-format-function entry)) + (insert "\n:PROPERTIES:\n")) + (org-bibtex-put "TITLE" (funcall val :title) insert-raw) (org-bibtex-put org-bibtex-type-property-name (downcase (funcall val :type)) - 'insert) + insert-raw) (dolist (pair entry) (pcase (car pair) (:title nil) (:type nil) - (:key (org-bibtex-put org-bibtex-key-property (cdr pair) 'insert)) + (:key (org-bibtex-put org-bibtex-key-property (cdr pair) insert-raw)) (:keywords (if org-bibtex-tags-are-keywords (dolist (kw (split-string (cdr pair) ", *")) (funcall @@ -752,25 +755,28 @@ drawer." (replace-regexp-in-string "[^[:alnum:]_@#%]" "" (replace-regexp-in-string "[ \t]+" "_" kw)))) - (org-bibtex-put (car pair) (cdr pair) 'insert))) - (_ (org-bibtex-put (car pair) (cdr pair) 'insert)))) - (insert ":END:\n") + (org-bibtex-put (car pair) (cdr pair) insert-raw))) + (_ (org-bibtex-put (car pair) (cdr pair) insert-raw)))) + (unless nonew + (insert ":END:\n")) (mapc togtag org-bibtex-tags) (unless noindent (org-indent-region (save-excursion (org-back-to-heading t) (point)) (point))))) -(defun org-bibtex-yank () - "If kill ring holds a bibtex entry yank it as an Org headline." - (interactive) +(defun org-bibtex-yank (&optional nonew) + "If kill ring holds a bibtex entry yank it as an Org headline. +When called with non-nil prefix argument NONEW, add data to the +headline of the entry at point." + (interactive "P") (let (entry) (with-temp-buffer (yank 1) (bibtex-mode) (setf entry (org-bibtex-read))) (if entry - (org-bibtex-write) + (org-bibtex-write nil nonew) (error "Yanked text does not appear to contain a BibTeX entry")))) (defun org-bibtex-import-from-file (file) -- 2.43.0