|
@@ -241,6 +241,31 @@ IDs must be unique."
|
|
|
:group 'org-bibtex
|
|
|
:type 'string)
|
|
|
|
|
|
+(defcustom org-bibtex-tags nil
|
|
|
+ "List of tag(s) that should be added to new bib entries."
|
|
|
+ :group 'org-bibtex
|
|
|
+ :type '(repeat :tag "Tag" (string)))
|
|
|
+
|
|
|
+(defcustom org-bibtex-tags-are-keywords nil
|
|
|
+ "Convert the value of the keywords field to tags and vice versa.
|
|
|
+If set to t, comma-separated entries in a bibtex entry's keywords
|
|
|
+field will be converted to org tags. Note: spaces will be escaped
|
|
|
+with underscores, and characters that are not permitted in org
|
|
|
+tags will be removed.
|
|
|
+
|
|
|
+If t, local tags in an org entry will be exported as a
|
|
|
+comma-separated string of keywords when exported to bibtex. Tags
|
|
|
+defined in `org-bibtex-tags' or `org-bibtex-no-export-tags' will
|
|
|
+not be exported."
|
|
|
+ :group 'org-bibtex
|
|
|
+ :type 'boolean)
|
|
|
+
|
|
|
+(defcustom org-bibtex-no-export-tags nil
|
|
|
+ "List of tag(s) that should not be converted to keywords.
|
|
|
+This variable is relevant only if `org-bibtex-export-tags-as-keywords` is t."
|
|
|
+ :group 'org-bibtex
|
|
|
+ :type '(repeat :tag "Tag" (string)))
|
|
|
+
|
|
|
|
|
|
;;; Utility functions
|
|
|
(defun org-bibtex-get (property)
|
|
@@ -268,7 +293,16 @@ IDs must be unique."
|
|
|
lsts))))
|
|
|
(let ((notes (buffer-string))
|
|
|
(id (org-bibtex-get org-bibtex-key-property))
|
|
|
- (type (org-bibtex-get "type")))
|
|
|
+ (type (org-bibtex-get "type"))
|
|
|
+ (tags (when org-bibtex-tags-are-keywords
|
|
|
+ (delq nil
|
|
|
+ (mapcar
|
|
|
+ (lambda (tag)
|
|
|
+ (unless (member tag
|
|
|
+ (append org-bibtex-tags
|
|
|
+ org-bibtex-no-export-tags))
|
|
|
+ tag))
|
|
|
+ (org-get-local-tags-at))))))
|
|
|
(when type
|
|
|
(let ((entry (format
|
|
|
"@%s{%s,\n%s\n}\n" type id
|
|
@@ -297,6 +331,12 @@ IDs must be unique."
|
|
|
",\n"))))
|
|
|
(with-temp-buffer
|
|
|
(insert entry)
|
|
|
+ (when tags
|
|
|
+ (bibtex-beginning-of-entry)
|
|
|
+ (if (re-search-forward "keywords.*=.*{\\(.*\\)}" nil t)
|
|
|
+ (progn (goto-char (match-end 1)) (insert ", "))
|
|
|
+ (bibtex-make-field "keywords" t t))
|
|
|
+ (insert (mapconcat #'identity tags ", ")))
|
|
|
(bibtex-reformat) (buffer-string)))))))
|
|
|
|
|
|
(defun org-bibtex-ask (field)
|
|
@@ -483,7 +523,8 @@ With prefix argument OPTIONAL also prompt for optional fields."
|
|
|
(let ((title (org-bibtex-ask :title)))
|
|
|
(insert title) (org-bibtex-put "TITLE" title))
|
|
|
(org-bibtex-put "TYPE" (substring (symbol-name type) 1))
|
|
|
- (org-bibtex-fleshout type arg)))
|
|
|
+ (org-bibtex-fleshout type arg)
|
|
|
+ (mapc (lambda (tag) (org-toggle-tag tag t)) org-bibtex-tags)))
|
|
|
|
|
|
(defun org-bibtex-read ()
|
|
|
"Read a bibtex entry and save to `*org-bibtex-entries*'.
|
|
@@ -515,7 +556,8 @@ This uses `bibtex-parse-entry'."
|
|
|
(error "No entries in `*org-bibtex-entries*'."))
|
|
|
(let ((entry (pop *org-bibtex-entries*))
|
|
|
(org-special-properties nil)) ; avoids errors with `org-entry-put'
|
|
|
- (flet ((val (field) (cdr (assoc field entry))))
|
|
|
+ (flet ((val (field) (cdr (assoc field entry)))
|
|
|
+ (togtag (tag) (org-toggle-tag tag t)))
|
|
|
(org-insert-heading)
|
|
|
(insert (val :title))
|
|
|
(org-bibtex-put "TITLE" (val :title))
|
|
@@ -525,7 +567,17 @@ This uses `bibtex-parse-entry'."
|
|
|
(:title nil)
|
|
|
(:type nil)
|
|
|
(:key (org-bibtex-put org-bibtex-key-property (cdr pair)))
|
|
|
- (otherwise (org-bibtex-put (car pair) (cdr pair))))))))
|
|
|
+ (:keywords (if org-bibtex-tags-are-keywords
|
|
|
+ (mapc
|
|
|
+ (lambda (kw)
|
|
|
+ (togtag
|
|
|
+ (replace-regexp-in-string
|
|
|
+ "[^[:alnum:]_@#%]" ""
|
|
|
+ (replace-regexp-in-string "[ \t]+" "_" kw))))
|
|
|
+ (split-string (cdr pair) ", *"))
|
|
|
+ (org-bibtex-put (car pair) (cdr pair))))
|
|
|
+ (otherwise (org-bibtex-put (car pair) (cdr pair)))))
|
|
|
+ (mapc #'togtag org-bibtex-tags))))
|
|
|
|
|
|
(defun org-bibtex-yank ()
|
|
|
"If kill ring holds a bibtex entry yank it as an Org-mode headline."
|