X-Git-Url: https://git.donarmstrong.com/?p=org-ref.git;a=blobdiff_plain;f=org-ref.el;h=4a8796980717ee75bba826805dc22fbb1d5ce1cf;hp=0b86ed0156fd8d76572fdb2ffdf160625cc2df0b;hb=5d9b13dc9c509e506a989e31aa14197c6566ced5;hpb=d06422e1b0990063d3fedf2a6b4077802061c484 diff --git a/org-ref.el b/org-ref.el index 0b86ed0..4a87969 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,7 +82,7 @@ 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, %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." @@ -327,12 +328,12 @@ You will see a message in the minibuffer when on a cite, ref or label link." ":\\([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 @@ -498,11 +499,11 @@ 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) @@ -552,6 +553,8 @@ Format according to the type in `org-ref-bibliography-entry-format'." (setq output (replace-regexp-in-string "()" "" output)) ;; get rid of empty link and doi (setq output (replace-regexp-in-string " link\\." "" output)) + ;; change double dash to single dash + (setq output (replace-regexp-in-string "--" "-" output)) (setq output (replace-regexp-in-string " doi\\." "" output)) (format "
  • [%s] %s
  • " key key output))) @@ -571,7 +574,7 @@ 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 + (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)))))) @@ -650,26 +653,27 @@ Format according to the type in `org-ref-bibliography-entry-format'." (split-string (org-element-property :path object) ",")) - ;; 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) - ;; we found a match - (setq key-end (- (match-end 0) 1)) - ;; no comma found so take the point - (setq key-end (point)))) - ;; and backward to previous comma from point - (save-excursion - (if (search-backward "," link-string-beginning 1 1) - ;; we found a match - (setq key-beginning (+ (match-beginning 0) 1)) - (setq key-beginning (point)))) ; no match found + (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) + ;; we found a match + (setq key-end (- (match-end 0) 1)) + ;; no comma found so take the point + (setq key-end (point)))) + ;; and backward to previous comma from point + (save-excursion + (if (search-backward "," link-string-beginning 1 1) + ;; we found a match + (setq key-beginning (+ (match-beginning 0) 1)) + (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))) - ;; open file on click - (find-file bibfile))) + (setq bibfile (org-ref-strip-string + (buffer-substring key-beginning key-end))) + ;; open file on click + (find-file bibfile)))) ;; formatting code (lambda (keyword desc format) @@ -716,21 +720,22 @@ Format according to the type in `org-ref-bibliography-entry-format'." (set (make-local-variable 'reftex-default-bibliography) (split-string (org-element-property :path object) ",")) - ;; 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))) - (find-file bibfile))) ; open file on click + (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))) + (find-file bibfile)))) ; open file on click ;; formatting code (lambda (keyword desc format) @@ -822,21 +827,22 @@ ARG does nothing." (set (make-local-variable 'reftex-default-addbibresource) (split-string (org-element-property :path object) ",")) - ;; 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))) - (find-file bibfile))) ; open file on click + (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))) + (find-file bibfile)))) ; open file on click ;; formatting code (lambda (keyword desc format) @@ -863,11 +869,11 @@ ARG does nothing." (string-match-p "[^.]*\\.\\(png\\|jpg\\|eps\\|pdf\\)$" (org-element-property :path link))) - (incf counter) + (cl-incf counter) (let* ((start (org-element-property :begin link)) (parent (car (cdr (org-element-property :parent link)))) - (caption (caaar (plist-get parent :caption))) + (caption (cl-caaar (plist-get parent :caption))) (name (plist-get parent :name))) (if caption (format @@ -906,10 +912,10 @@ ARG does nothing." (org-element-map (org-element-parse-buffer 'element) 'table (lambda (table) "create a link for to the table" - (incf counter) + (cl-incf counter) (let ((start (org-element-property :begin table)) (name (org-element-property :name table)) - (caption (caaar (org-element-property :caption table)))) + (caption (cl-caaar (org-element-property :caption table)))) (if caption (format "[[elisp:(progn (switch-to-buffer \"%s\")(widen)(goto-char %s))][table %s: %s]] %s\n" @@ -966,7 +972,7 @@ ARG does nothing." (org-ref-count-labels label)))) (lambda (keyword desc format) (cond - ((eq format 'html) (format "()" path)) + ((eq format 'html) (format "()" keyword)) ((eq format 'latex) (format "\\label{%s}" keyword))))) @@ -1045,7 +1051,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))))) @@ -1220,19 +1226,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) @@ -1416,28 +1422,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))) @@ -1504,9 +1512,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 @@ -2089,8 +2097,8 @@ This assumes you are in an article." (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))) @@ -2110,8 +2118,8 @@ This assumes you are in an article." (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))) @@ -2161,8 +2169,8 @@ 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))) + (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))) @@ -2219,7 +2227,7 @@ key author journal year volume pages doi url key org-ref-pdf-directory key)) (re-search-forward (format ":Custom_ID: %s$" - (first (reftex-citation t)) nil 'end)) + (cl-first (reftex-citation t)) nil 'end)) (funcall org-ref-open-notes-function)) ;; ** Open bibtex entry in browser @@ -2749,7 +2757,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 @@ -2923,26 +2931,27 @@ Shows bad citations, ref links and labels" (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-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 + (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) @@ -3078,16 +3087,16 @@ User is prompted for tags. This function is called from `helm-bibtex'. Argument CANDIDATES helm candidates." (message "") (let ((keywords (read-string "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))))) + (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") @@ -3313,10 +3322,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 '()