X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=inline;f=org-ref.el;h=6905efe9cad4855405032ff614f5ebd1553bafa8;hb=d00ef12e4990669ff7c925e9385d586cedae5bad;hp=240adda8562d2f43b4a055d4a11727d33e289c3b;hpb=678da471c68827a2d58c6c1de6a044782e36fbac;p=org-ref.git
diff --git a/org-ref.el b/org-ref.el
index 240adda..6905efe 100644
--- a/org-ref.el
+++ b/org-ref.el
@@ -41,6 +41,7 @@
(require 'helm-config)
(require 'helm-bibtex)
(require 'org)
+(require 'org-element)
;; * Custom variables
(defgroup org-ref nil
@@ -81,15 +82,19 @@ You should use full-paths for each file."
'(("article" . "%a, %t, %j, %v(%n), %p (%y). link. doi.")
("book" . "%a, %t, %u (%y).")
-
+ ("techreport" . "%a, %t, %i, %u (%y).")
("proceedings" . "%e, %t in %S, %u (%y).")
-
("inproceedings" . "%a, %t, %p, in %b, edited by %e, %u (%y)"))
-
"String to format an entry. Just the reference, no numbering at the beginning, etc... see the `org-ref-reftex-format-citation' docstring for the escape codes."
:type 'string
:group 'org-ref)
+(defcustom org-ref-note-title-format
+ "** TODO %y - %t"
+ "String to format the title of a note. See the `org-ref-reftex-format-citation' docstring for the escape codes."
+ :type 'string
+ :group 'org-ref)
+
(defcustom org-ref-open-notes-function
(lambda ()
(org-show-entry)
@@ -326,15 +331,15 @@ You will see a message in the minibuffer when on a cite, ref or label link."
(replace-regexp-in-string "\*" "\\\\*" x)
)
org-ref-cite-types "\\|") "\\)"
- ":\\([a-zA-Z0-9-_:]*,?\\)*"))
+ ":\\([a-zA-Z0-9-_:\\./]*,?\\)*"))
-(setq org-ref-label-re
- "label:\\([a-zA-Z0-9-_:]*,?\\)*")
+(defvar org-ref-label-re
+ "label:\\([a-zA-Z0-9-_:]*,?\\)*")
-(setq org-ref-ref-re
- "\\(eq\\)?ref:\\([a-zA-Z0-9-_:]*,?\\)*")
+(defvar org-ref-ref-re
+ "\\(eq\\)?ref:\\([a-zA-Z0-9-_:]*,?\\)*")
(defface org-ref-cite-face
@@ -423,7 +428,6 @@ Beware that all this only works with BibTeX database files. When
citations are made from the \bibitems in an explicit thebibliography
environment, only %l is available."
;; Format a citation from the info in the BibTeX ENTRY
-
(unless (stringp format) (setq format "\\cite{%l}"))
(if (and reftex-comment-citations
@@ -444,10 +448,14 @@ environment, only %l is available."
(if reftex-comment-citations
reftex-cite-comment-format
"")))
- ((= l ?a) (reftex-format-names
- (reftex-get-bib-names "author" entry)
- (or n 2)))
- ((= l ?A) (car (reftex-get-bib-names "author" entry)))
+ ((= l ?a) (replace-regexp-in-string
+ "\n\\|\t\\|\s+" " "
+ (reftex-format-names
+ (reftex-get-bib-names "author" entry)
+ (or n 2))))
+ ((= l ?A) (replace-regexp-in-string
+ "\n\\|\t\\|\s+" " "
+ (car (reftex-get-bib-names "author" entry))))
((= l ?b) (org-ref-reftex-get-bib-field "booktitle" entry "in: %s"))
((= l ?B) (reftex-abbreviate-title
(org-ref-reftex-get-bib-field "booktitle" entry "in: %s")))
@@ -460,8 +468,11 @@ environment, only %l is available."
((= l ?E) (car (reftex-get-bib-names "editor" entry)))
((= l ?h) (org-ref-reftex-get-bib-field "howpublished" entry))
((= l ?i) (org-ref-reftex-get-bib-field "institution" entry))
- ((= l ?j) (org-ref-reftex-get-bib-field "journal" entry))
- ((= l ?k) (org-ref-reftex-get-bib-field "key" entry))
+ ((= l ?j) (let ((jt (reftex-get-bib-field "journal" entry)))
+ (if (string= "" jt)
+ (reftex-get-bib-field "journaltitle" entry)
+ jt)))
+ ((= l ?k) (org-ref-reftex-get-bib-field "=key=" entry))
((= l ?m) (org-ref-reftex-get-bib-field "month" entry))
((= l ?n) (org-ref-reftex-get-bib-field "number" entry))
((= l ?o) (org-ref-reftex-get-bib-field "organization" entry))
@@ -475,9 +486,13 @@ environment, only %l is available."
((= l ?U) (org-ref-reftex-get-bib-field "url" entry))
((= l ?r) (org-ref-reftex-get-bib-field "address" entry))
;; strip enclosing brackets from title if they are there
- ((= l ?t) (org-ref-reftex-get-bib-field "title" entry))
- ((= l ?T) (reftex-abbreviate-title
+ ((= l ?t) (replace-regexp-in-string
+ "\n\\|\t\\|\s+" " "
(org-ref-reftex-get-bib-field "title" entry)))
+ ((= l ?T) (reftex-abbreviate-title
+ ((replace-regexp-in-string
+ "\n\\|\t\\|\s+" " "
+ (org-ref-reftex-get-bib-field "title" entry)))))
((= l ?v) (org-ref-reftex-get-bib-field "volume" entry))
((= l ?y) (org-ref-reftex-get-bib-field "year" entry)))))
@@ -489,8 +504,6 @@ environment, only %l is available."
(setq format (replace-match "%" t t format)))
(while (string-match "[ ,.;:]*%<" format)
(setq format (replace-match "" t t format)))
- ;; also replace carriage returns, tabs, and multiple whitespaces
- (setq format (replace-regexp-in-string "\n\\|\t\\|\s+" " " format))
format)
(defun org-ref-get-bibtex-entry-citation (key)
@@ -501,19 +514,25 @@ Format according to the type in `org-ref-bibliography-entry-format'."
(file) (entry) (bibtex-entry) (entry-type) (format))
(setq file (catch 'result
- (loop for file in org-ref-bibliography-files do
- (if (org-ref-key-in-file-p key (file-truename file))
- (throw 'result file)
- (message "%s not found in %s" key (file-truename file))))))
+ (cl-loop for file in org-ref-bibliography-files do
+ (if (org-ref-key-in-file-p key (file-truename file))
+ (throw 'result file)
+ (message "%s not found in %s"
+ key (file-truename file))))))
(with-temp-buffer
(insert-file-contents file)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key nil 0)
(setq bibtex-entry (bibtex-parse-entry))
+ ;; downcase field names so they work in the format-citation code
+ (dolist (cons-cell bibtex-entry)
+ (setf (car cons-cell) (downcase (car cons-cell))))
(setq entry-type (downcase (cdr (assoc "=type=" bibtex-entry))))
(setq format (cdr (assoc entry-type org-ref-bibliography-entry-format)))
(if format
(setq entry (org-ref-reftex-format-citation bibtex-entry format))
+ ;; if no format, we use the bibtex entry itself as a fallback
(save-restriction
(bibtex-narrow-to-entry)
(setq entry (buffer-string)))))
@@ -539,8 +558,22 @@ Format according to the type in `org-ref-bibliography-entry-format'."
(defun org-ref-get-bibtex-entry-html (key)
"Return an html string for the bibliography entry corresponding to KEY."
-
- (format "
" keyword))
((eq format 'latex)
(format "\\label{%s}" keyword)))))
@@ -992,10 +1034,8 @@ ARG does nothing."
"on clicking goto the label. Navigate back with C-c &"
(org-mark-ring-push)
;; next search from beginning of the buffer
-
;; it is possible you would not find the label if narrowing is in effect
(widen)
-
(unless
(or
;; our label links
@@ -1011,12 +1051,14 @@ ARG does nothing."
;; #+label: name org-definition
(progn
(goto-char (point-min))
- (re-search-forward (format "^#\\+label:\\s-*\\(%s\\)\\b" label) nil t))
+ (re-search-forward
+ (format "^#\\+label:\\s-*\\(%s\\)\\b" label) nil t))
;; org tblname
(progn
(goto-char (point-min))
- (re-search-forward (format "^#\\+tblname:\\s-*\\(%s\\)\\b" label) nil t))
+ (re-search-forward
+ (format "^#\\+tblname:\\s-*\\(%s\\)\\b" label) nil t)))
;; we did not find anything, so go back to where we came
(org-mark-ring-goto)
@@ -1026,7 +1068,7 @@ ARG does nothing."
;formatting
(lambda (keyword desc format)
(cond
- ((eq format 'html) (format "(
[%s])" path))
+ ((eq format 'html) (format "
%s" keyword keyword))
((eq format 'latex)
(format "\\ref{%s}" keyword)))))
@@ -1201,19 +1243,19 @@ Use C-u C-u to insert a [[#custom-id]] link"
(helm :input (thing-at-point 'word)
:sources `(((name . "Available labels to ref")
- (candidates . ,(loop for label in labels
- for context in contexts
- ;; we do some kludgy adding spaces
- ;; and bars to make it "easier" to
- ;; see in helm.
- collect (cons (concat
- label "\n"
- (mapconcat
- (lambda (x)
- (concat " |" x))
- (split-string context "\n")
- "\n"
- ) "\n\n") label)))
+ (candidates . ,(cl-loop for label in labels
+ for context in contexts
+ ;; we do some kludgy adding spaces
+ ;; and bars to make it "easier" to
+ ;; see in helm.
+ collect (cons (concat
+ label "\n"
+ (mapconcat
+ (lambda (x)
+ (concat " |" x))
+ (split-string context "\n")
+ "\n"
+ ) "\n\n") label)))
;; default action to replace or insert ref link.
(action . (lambda (label)
(switch-to-buffer ,cb)
@@ -1397,28 +1439,30 @@ keyword we clicked on. We also strip the text properties."
;; this means no description in the link
(progn
;; we need the link path start and end
- (save-excursion
- (goto-char (org-element-property :begin object))
- (search-forward link-string nil nil 1)
- (setq link-string-beginning (match-beginning 0))
- (setq link-string-end (match-end 0)))
+ (let (link-string-beginning link-string-end)
+ (save-excursion
+ (goto-char (org-element-property :begin object))
+ (search-forward link-string nil nil 1)
+ (setq link-string-beginning (match-beginning 0))
+ (setq link-string-end (match-end 0)))
- ;; The key is the text between commas, or the link boundaries
- (save-excursion
- (if (search-forward "," link-string-end t 1)
- (setq key-end (- (match-end 0) 1)) ; we found a match
- (setq key-end link-string-end))) ; no comma found so take the end
- ;; and backward to previous comma from point which defines the start character
- (save-excursion
- (if (search-backward "," link-string-beginning 1 1)
- (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match
- (setq key-beginning link-string-beginning))) ; no match found
- ;; save the key we clicked on.
- (setq bibtex-key
- (org-ref-strip-string
- (buffer-substring key-beginning key-end)))
- (set-text-properties 0 (length bibtex-key) nil bibtex-key)
- bibtex-key)
+ (let (key-beginning key-end)
+ ;; The key is the text between commas, or the link boundaries
+ (save-excursion
+ (if (search-forward "," link-string-end t 1)
+ (setq key-end (- (match-end 0) 1)) ; we found a match
+ (setq key-end link-string-end))) ; no comma found so take the end
+ ;; and backward to previous comma from point which defines the start character
+ (save-excursion
+ (if (search-backward "," link-string-beginning 1 1)
+ (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match
+ (setq key-beginning link-string-beginning))) ; no match found
+ ;; save the key we clicked on.
+ (let ((bibtex-key
+ (org-ref-strip-string
+ (buffer-substring key-beginning key-end))))
+ (set-text-properties 0 (length bibtex-key) nil bibtex-key)
+ bibtex-key))))
;; link with description. assume only one key
link-string)))
@@ -1485,9 +1529,9 @@ falling back to what the user has set in `org-ref-default-bibliography'"
(unless key
(setq key (org-ref-get-bibtex-key-under-cursor)))
(setq file (catch 'result
- (loop for file in org-ref-bibliography-files do
- (if (org-ref-key-in-file-p key (file-truename file))
- (throw 'result file)))))
+ (cl-loop for file in org-ref-bibliography-files do
+ (if (org-ref-key-in-file-p key (file-truename file))
+ (throw 'result file)))))
(cons key file)))
;; *** key at point functions
@@ -1512,6 +1556,7 @@ falling back to what the user has set in `org-ref-default-bibliography'"
(save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
;; I like this better than bibtex-url which does not always find
;; the urls
@@ -1538,6 +1583,7 @@ falling back to what the user has set in `org-ref-default-bibliography'"
(save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(org-ref-open-bibtex-notes)))))
@@ -1552,6 +1598,7 @@ falling back to what the user has set in `org-ref-default-bibliography'"
(message "%s" (progn
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(org-ref-bib-citation))))))
@@ -1624,6 +1671,7 @@ Prompt for NEW-FILE includes bib files in `org-ref-default-bibliography', and bi
(save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(setq doi (bibtex-autokey-get-field "doi"))
;; in case doi is a url, remove the url part.
@@ -1681,11 +1729,13 @@ get a lot of options. LINK-STRING is used by the link function."
(url (save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(bibtex-autokey-get-field "url"))))
(doi (save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
;; I like this better than bibtex-url which does not always find
;; the urls
@@ -1762,6 +1812,7 @@ get a lot of options. LINK-STRING is used by the link function."
(save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(org-ref-bib-citation))))
"\n"
@@ -2066,17 +2117,20 @@ arg (ALTERNATIVE-CITE) to get a menu of citation types."
(defun org-ref-bib-citation ()
"From a bibtex entry, create and return a simple citation string.
This assumes you are in an article."
-
+ (bibtex-set-dialect nil t)
(bibtex-beginning-of-entry)
(let* ((cb (current-buffer))
(bibtex-expand-strings t)
- (entry (loop for (key . value) in (bibtex-parse-entry t)
- collect (cons (downcase key) value)))
+ (entry (cl-loop for (key . value) in (bibtex-parse-entry t)
+ collect (cons (downcase key) value)))
(title (replace-regexp-in-string "\n\\|\t\\|\s+" " " (reftex-get-bib-field "title" entry)))
(year (reftex-get-bib-field "year" entry))
(author (replace-regexp-in-string "\n\\|\t\\|\s+" " " (reftex-get-bib-field "author" entry)))
(key (reftex-get-bib-field "=key=" entry))
- (journal (reftex-get-bib-field "journal" entry))
+ (journal (let ((jt (reftex-get-bib-field "journal" entry)))
+ (if (string= "" jt)
+ (reftex-get-bib-field "journaltitle" entry)
+ jt)))
(volume (reftex-get-bib-field "volume" entry))
(pages (reftex-get-bib-field "pages" entry))
(doi (reftex-get-bib-field "doi" entry))
@@ -2088,12 +2142,11 @@ This assumes you are in an article."
(defun org-ref-bib-html-citation ()
"From a bibtex entry, create and return a simple citation with html links."
-
(bibtex-beginning-of-entry)
(let* ((cb (current-buffer))
(bibtex-expand-strings t)
- (entry (loop for (key . value) in (bibtex-parse-entry t)
- collect (cons (downcase key) value)))
+ (entry (cl-loop for (key . value) in (bibtex-parse-entry t)
+ collect (cons (downcase key) value)))
(title (replace-regexp-in-string "\n\\|\t\\|\s+" " " (reftex-get-bib-field "title" entry)))
(year (reftex-get-bib-field "year" entry))
(author (replace-regexp-in-string "\n\\|\t\\|\s+" " " (reftex-get-bib-field "author" entry)))
@@ -2102,14 +2155,13 @@ This assumes you are in an article."
(volume (reftex-get-bib-field "volume" entry))
(pages (reftex-get-bib-field "pages" entry))
(doi (reftex-get-bib-field "doi" entry))
- (url (reftex-get-bib-field "url" entry))
- )
+ (url (reftex-get-bib-field "url" entry)))
;;authors, "title", Journal, vol(iss):pages (year).
(concat (format "%s, \"%s\", %s, %s:%s (%s)."
author title journal volume pages year)
(when url (format "
link" url))
- (when doi (format "
doi" doi)))
- ))
+ (when doi
+ (format "
doi" doi)))))
;; ** Open pdf in bibtex entry
(defun org-ref-open-bibtex-pdf ()
@@ -2144,18 +2196,9 @@ construct the heading by hand."
(bibtex-beginning-of-entry)
(let* ((cb (current-buffer))
(bibtex-expand-strings t)
- (entry (loop for (key . value) in (bibtex-parse-entry t)
- collect (cons (downcase key) value)))
- (title (replace-regexp-in-string "\n\\|\t\\|\s+" " " (reftex-get-bib-field "title" entry)))
- (year (reftex-get-bib-field "year" entry))
- (author (replace-regexp-in-string "\n\\|\t\\|\s+" " " (reftex-get-bib-field "author" entry)))
- (key (reftex-get-bib-field "=key=" entry))
- (journal (reftex-get-bib-field "journal" entry))
- (volume (reftex-get-bib-field "volume" entry))
- (pages (reftex-get-bib-field "pages" entry))
- (doi (reftex-get-bib-field "doi" entry))
- (url (reftex-get-bib-field "url" entry))
- )
+ (entry (cl-loop for (key . value) in (bibtex-parse-entry t)
+ collect (cons (downcase key) value)))
+ (key (reftex-get-bib-field "=key=" entry)))
;; save key to clipboard to make saving pdf later easier by pasting.
(with-temp-buffer
@@ -2172,38 +2215,41 @@ construct the heading by hand."
(if (re-search-forward (format ":Custom_ID: %s$" key) nil 'end)
(funcall org-ref-open-notes-function)
;; no entry found, so add one
- (insert (format "\n** TODO %s - %s" year title))
- (insert (format"
+ (insert (org-ref-reftex-format-citation entry (concat "\n" org-ref-note-title-format)))
+ (insert (org-ref-reftex-format-citation
+ entry
+ (concat "
:PROPERTIES:
- :Custom_ID: %s
- :AUTHOR: %s
- :JOURNAL: %s
- :YEAR: %s
- :VOLUME: %s
- :PAGES: %s
- :DOI: %s
- :URL: %s
+ :Custom_ID: %k
+ :AUTHOR: %9a
+ :JOURNAL: %j
+ :YEAR: %y
+ :VOLUME: %v
+ :PAGES: %p
+ :DOI: %D
+ :URL: %U
:END:
-[[cite:%s]] [[file:%s/%s.pdf][pdf]]\n\n"
-key author journal year volume pages doi url key org-ref-pdf-directory key))
-(save-buffer))))
+"
+ (format "[[cite:%s]] [[file:%s/%s.pdf][pdf]]\n\n"
+ key org-ref-pdf-directory key))))
+ (save-buffer))))
(defun org-ref-open-notes-from-reftex ()
"Call reftex, and open notes for selected entry."
(interactive)
(let ((bibtex-key )))
- ;; now look for entry in the notes file
- (if org-ref-bibliography-notes
- (find-file-other-window org-ref-bibliography-notes)
- (error "Org-ref-bib-bibliography-notes is not set to anything"))
+ ;; now look for entry in the notes file
+ (if org-ref-bibliography-notes
+ (find-file-other-window org-ref-bibliography-notes)
+ (error "Org-ref-bib-bibliography-notes is not set to anything"))
- (goto-char (point-min))
+ (goto-char (point-min))
- (re-search-forward (format
- ":Custom_ID: %s$"
- (first (reftex-citation t)) nil 'end))
- (funcall org-ref-open-notes-function))
+ (re-search-forward (format
+ ":Custom_ID: %s$"
+ (cl-first (reftex-citation t)) nil 'end))
+ (funcall org-ref-open-notes-function))
;; ** Open bibtex entry in browser
(defun org-ref-open-in-browser ()
@@ -2394,7 +2440,7 @@ Makes a new buffer with clickable links."
(kill-buffer "*Missing citations*"))
(message "No bad cite links found"))))
-;; ** helm interface to bad citations, labels, refs in orgfile
+;; ** helm interface to bad citations, labels, refs and files in orgfile
(defun org-ref-bad-cite-candidates ()
"Return a list of conses (key . marker) where key does not exist in the known bibliography files, and marker points to the key."
(let* ((cp (point)) ; save to return to later
@@ -2481,6 +2527,29 @@ Makes a new buffer with clickable links."
(goto-char cp)))))
multiple-labels))
+(defun org-ref-bad-file-link-candidates ()
+ "Return list of conses (link . marker) wehre the file in the link does not exist."
+ (let* ((bad-files '()))
+ (org-element-map (org-element-parse-buffer) 'link
+ (lambda (link)
+ (let ((type (org-element-property :type link)))
+ (when (or (string= "file" type)
+ (string= "attachfile" type))
+ (unless (file-exists-p (org-element-property :path link))
+ (add-to-list 'bad-files
+ (cons (org-element-property :path link)
+ (save-excursion
+ (goto-char
+ (org-element-property :begin link))
+ (point-marker)))))))))
+ ;; Let us also check \attachfile{fname}
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "\\attachfile{\\(.*\\)}" nil t)
+ (unless (file-exists-p (match-string 1))
+ (add-to-list 'bad-files (cons (match-string 1) (point-marker))))))
+ bad-files))
+
;;;###autoload
(defun org-ref ()
"Opens a helm interface to actions for org-ref.
@@ -2489,7 +2558,8 @@ Shows bad citations, ref links and labels"
(let ((cb (current-buffer))
(bad-citations (org-ref-bad-cite-candidates))
(bad-refs (org-ref-bad-ref-candidates))
- (bad-labels (org-ref-bad-label-candidates)))
+ (bad-labels (org-ref-bad-label-candidates))
+ (bad-files (org-ref-bad-file-link-candidates)))
(helm :sources `(((name . "Bad citations")
(candidates . ,bad-citations)
@@ -2509,6 +2579,12 @@ Shows bad citations, ref links and labels"
(switch-to-buffer (marker-buffer marker))
(goto-char marker))))
;;
+ ((name . "Bad file links")
+ (candidates . ,bad-files)
+ (lambda (marker)
+ (switch-to-buffer (marker-buffer marker))
+ (goto-char marker)))
+ ;;
((name . "Utilities")
(candidates . (("Check buffer again" . org-ref)
("Insert citation" . helm-bibtex)
@@ -2533,8 +2609,7 @@ Shows bad citations, ref links and labels"
))
(action . (lambda (x)
(switch-to-buffer ,cb)
- (funcall x))))
- ))))
+ (funcall x))))))))
;; ** Find non-ascii charaters
(defun org-ref-find-non-ascii-characters ()
@@ -2686,6 +2761,7 @@ Shows bad citations, ref links and labels"
(bibfile (cdr results)))
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key nil 0)
(prog1 (reftex-get-bib-field "year" (bibtex-parse-entry t))
))))
@@ -2703,7 +2779,7 @@ Shows bad citations, ref links and labels"
(setq keys (org-ref-split-and-strip-string link-string))
(setq years (mapcar 'org-ref-get-citation-year keys))
(setq data (mapcar* (lambda (a b) `(,a . ,b)) years keys))
- (setq data (cl-sort data (lambda (x y) (< (string-to-int (car x)) (string-to-int (car y))))))
+ (setq data (cl-sort data (lambda (x y) (< (string-to-number (car x)) (string-to-number (car y))))))
;; now get the keys separated by commas
(setq keys (mapconcat (lambda (x) (cdr x)) data ","))
;; and replace the link with the sorted keys
@@ -2815,87 +2891,89 @@ Shows bad citations, ref links and labels"
(defun org-ref-link-message ()
"Print a minibuffer message about the link that point is on."
(interactive)
- (when (eq major-mode 'org-mode)
- (let* ((object (org-element-context))
- (type (org-element-property :type object)))
- (save-excursion
- (cond
- ;; cite links
- ((-contains? org-ref-cite-types type)
- (message (org-ref-get-citation-string-at-point)))
-
- ;; message some context about the label we are referring to
- ((string= type "ref")
- (message "%scount: %s"
- (org-ref-get-label-context
- (org-element-property :path object))
- (org-ref-count-labels
- (org-element-property :path object))))
-
- ((string= type "eqref")
- (message "%scount: %s"
- (org-ref-get-label-context
- (org-element-property :path object))
- (org-ref-count-labels
- (org-element-property :path object))))
-
- ;; message the count
- ((string= type "label")
- (let ((count (org-ref-count-labels
- (org-element-property :path object))))
- ;; get plurality on occurrence correct
- (message (concat
- (number-to-string count)
- " occurence"
- (when (or (= count 0)
- (> count 1))
- "s")))))
-
- ((string= type "custom-id")
- (save-excursion
- (org-open-link-from-string
- (format "[[#%s]]" (org-element-property :path object)))
- (message "%s" (org-get-heading))))
-
- ;; check if the bibliography files exist.
- ((string= type "bibliography")
- (let* ((bibfile)
- ;; object is the link you clicked on
- (object (org-element-context))
- (link-string (org-element-property :path object))
- (link-string-beginning)
- (link-string-end))
- (save-excursion
- (goto-char (org-element-property :begin object))
- (search-forward link-string nil nil 1)
- (setq link-string-beginning (match-beginning 0))
- (setq link-string-end (match-end 0)))
-
- ;; make sure we are in link and not before the :
- (when (> link-string-beginning (point))
- (goto-char link-string-beginning))
-
- ;; now if we have comma separated bibliographies
- ;; we find the one clicked on. we want to
- ;; search forward to next comma from point
+ (save-restriction
+ (widen)
+ (when (eq major-mode 'org-mode)
+ (let* ((object (org-element-context))
+ (type (org-element-property :type object)))
+ (save-excursion
+ (cond
+ ;; cite links
+ ((-contains? org-ref-cite-types type)
+ (message (org-ref-get-citation-string-at-point)))
+
+ ;; message some context about the label we are referring to
+ ((string= type "ref")
+ (message "%scount: %s"
+ (org-ref-get-label-context
+ (org-element-property :path object))
+ (org-ref-count-labels
+ (org-element-property :path object))))
+
+ ((string= type "eqref")
+ (message "%scount: %s"
+ (org-ref-get-label-context
+ (org-element-property :path object))
+ (org-ref-count-labels
+ (org-element-property :path object))))
+
+ ;; message the count
+ ((string= type "label")
+ (let ((count (org-ref-count-labels
+ (org-element-property :path object))))
+ ;; get plurality on occurrence correct
+ (message (concat
+ (number-to-string count)
+ " occurence"
+ (when (or (= count 0)
+ (> count 1))
+ "s")))))
+
+ ((string= type "custom-id")
(save-excursion
- (if (search-forward "," link-string-end 1 1)
- (setq key-end (- (match-end 0) 1)) ; we found a match
- (setq key-end (point)))) ; no comma found so take the point
+ (org-open-link-from-string
+ (format "[[#%s]]" (org-element-property :path object)))
+ (message "%s" (org-get-heading))))
+
+ ;; check if the bibliography files exist.
+ ((string= type "bibliography")
+ (let* ((bibfile)
+ ;; object is the link you clicked on
+ (object (org-element-context))
+ (link-string (org-element-property :path object))
+ (link-string-beginning)
+ (link-string-end))
+ (save-excursion
+ (goto-char (org-element-property :begin object))
+ (search-forward link-string nil nil 1)
+ (setq link-string-beginning (match-beginning 0))
+ (setq link-string-end (match-end 0)))
+
+ ;; make sure we are in link and not before the :
+ (when (> link-string-beginning (point))
+ (goto-char link-string-beginning))
+
+ (let (key-beginning key-end)
+ ;; now if we have comma separated bibliographies
+ ;; we find the one clicked on. we want to
+ ;; search forward to next comma from point
+ (save-excursion
+ (if (search-forward "," link-string-end 1 1)
+ (setq key-end (- (match-end 0) 1)) ; we found a match
+ (setq key-end (point)))) ; no comma found so take the point
- ;; and backward to previous comma from point
- (save-excursion
- (if (search-backward "," link-string-beginning 1 1)
- (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match
- (setq key-beginning (point)))) ; no match found
- ;; save the key we clicked on.
- (setq bibfile
- (org-ref-strip-string
- (buffer-substring key-beginning key-end)))
- (if (file-exists-p bibfile)
- (message "%s exists." bibfile)
- (message "!!! %s NOT FOUND !!!" bibfile))))
- )))))
+ ;; and backward to previous comma from point
+ (save-excursion
+ (if (search-backward "," link-string-beginning 1 1)
+ (setq key-beginning (+ (match-beginning 0) 1)) ; we found a match
+ (setq key-beginning (point)))) ; no match found
+ ;; save the key we clicked on.
+ (setq bibfile
+ (org-ref-strip-string
+ (buffer-substring key-beginning key-end)))
+ (if (file-exists-p bibfile)
+ (message "%s exists." bibfile)
+ (message "!!! %s NOT FOUND !!!" bibfile)))))))))))
;; ** aliases
(defalias 'oro 'org-ref-open-citation-at-point)
@@ -3030,17 +3108,17 @@ first key that partially matches. This version avoids that."
User is prompted for tags. This function is called from `helm-bibtex'.
Argument CANDIDATES helm candidates."
(message "")
- (let ((keywords (read-input "Keywords (comma separated): ")))
- (loop for key in (helm-marked-candidates)
- do
- (save-window-excursion
- (helm-bibtex-show-entry key)
- (bibtex-set-field
- "keywords"
- (concat
- keywords
- ", " (bibtex-autokey-get-field "keywords")))
- (save-buffer)))))
+ (let ((keywords (read-string "Keywords (comma separated): ")))
+ (cl-loop for key in (helm-marked-candidates)
+ do
+ (save-window-excursion
+ (helm-bibtex-show-entry key)
+ (bibtex-set-field
+ "keywords"
+ (concat
+ keywords
+ ", " (bibtex-autokey-get-field "keywords")))
+ (save-buffer)))))
(setq helm-source-bibtex
'((name . "BibTeX entries")
@@ -3068,11 +3146,13 @@ In the helm-bibtex buffer, C-u will give you a helm menu to select a new link ty
C-u C-u will change the key at point to the selected keys."
(let* ((object (org-element-context))
(last-char (save-excursion
- (goto-char (org-element-property :end object))
- (backward-char)
- (if (looking-at " ")
- " "
- ""))))
+ (when (org-element-property :end object)
+ (goto-char (org-element-property :end object))
+ (unless (bobp)
+ (backward-char))
+ (if (looking-at " ")
+ " "
+ "")))))
(cond
;; case where we are in a link
((and (equal (org-element-type object) 'link)
@@ -3106,7 +3186,7 @@ C-u C-u will change the key at point to the selected keys."
;; We are next to a link, and we want to append
;; next to a link means one character back is on a link.
((save-excursion
- (backward-char)
+ (unless (bobp) (backward-char))
(and (equal (org-element-type (org-element-context)) 'link)
(-contains?
org-ref-cite-types
@@ -3169,6 +3249,7 @@ With two prefix args, insert a label link."
(save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(org-ref-bib-citation)))
"!!! No entry found !!!" )))
@@ -3184,11 +3265,13 @@ Checks for pdf and doi, and add appropriate functions."
(url (save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
(bibtex-autokey-get-field "url"))))
(doi (save-excursion
(with-temp-buffer
(insert-file-contents bibfile)
+ (bibtex-set-dialect (parsebib-find-bibtex-dialect) t)
(bibtex-search-entry key)
;; I like this better than bibtex-url which does not always find
;; the urls
@@ -3264,10 +3347,10 @@ Checks for pdf and doi, and add appropriate functions."
(email-bibtex-entry))))
t)
;; finally return a numbered list of the candidates
- (loop for i from 0
- for cell in candidates
- collect (cons (format "%2s. %s" i (car cell))
- (cdr cell)))))
+ (cl-loop for i from 0
+ for cell in candidates
+ collect (cons (format "%2s. %s" i (car cell))
+ (cdr cell)))))
(defvar org-ref-helm-user-candidates '()