X-Git-Url: https://git.donarmstrong.com/?p=org-ref.git;a=blobdiff_plain;f=org-ref.el;h=4ad23bd0023dff86aaa39525e99965a46b7339e0;hp=430ae0e8806164032c4091b02ffb6b22170b7026;hb=837a40a0aa440126af8ca228565373082f460a26;hpb=1966dbdc30a4c41858474c78d201e267928c6846
diff --git a/org-ref.el b/org-ref.el
index 430ae0e..4ad23bd 100644
--- a/org-ref.el
+++ b/org-ref.el
@@ -326,7 +326,7 @@ 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
@@ -334,7 +334,7 @@ You will see a message in the minibuffer when on a cite, ref or label link."
(setq org-ref-ref-re
- "ref:\\([a-zA-Z0-9-_:]*,?\\)*")
+ "\\(eq\\)?ref:\\([a-zA-Z0-9-_:]*,?\\)*")
(defface org-ref-cite-face
@@ -423,7 +423,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
@@ -504,16 +503,21 @@ Format according to the type in `org-ref-bibliography-entry-format'."
(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))))))
+ (message "%s not found in %s"
+ key (file-truename file))))))
(with-temp-buffer
(insert-file-contents file)
(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 +543,16 @@ 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 "
[%s] %s" key key (org-ref-get-bibtex-entry-citation key)))
+ (let ((output))
+ (setq output (org-ref-get-bibtex-entry-citation key))
+ ;; unescape the &
+ (setq output (replace-regexp-in-string "\\\\&" "&" output))
+ ;; hack to replace {} around text
+ (setq output (replace-regexp-in-string " {\\(.*\\)} " " \\1 " output))
+ ;; get rid of empty parens
+ (setq output (replace-regexp-in-string "()" "" output))
+ (format "[%s] %s"
+ key key output)))
(defun org-ref-get-html-bibliography ()
"Create an html bibliography when there are keys."
@@ -611,45 +623,53 @@ Format according to the type in `org-ref-bibliography-entry-format'."
;; may contain multiple files. this code finds the
;; one you clicked on and opens it.
(lambda (link-string)
- ;; get link-string boundaries
- ;; we have to go to the beginning of the line, and then search forward
-
+ ;; get link-string boundaries we have to go to the
+ ;; beginning of the line, and then search forward
(let* ((bibfile)
;; object is the link you clicked on
(object (org-element-context))
(link-string-beginning)
- (link-string-end))
-
+ (link-string-end)
+ (cp (point)))
(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)))
- ;; We set the reftex-default-bibliography
- ;; here. it should be a local variable only in
- ;; the current buffer. We need this for using
- ;; reftex to do citations.
- (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
+ ;; Make sure point is in the link-path.
+ (if (< cp link-string-beginning)
+ (goto-char link-string-beginning))
+ ;; We set the reftex-default-bibliography
+ ;; here. it should be a local variable only in
+ ;; the current buffer. We need this for using
+ ;; reftex to do citations.
+ (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)
+ ;; 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)))
- (find-file bibfile))) ; open file on click
+ (setq bibfile (org-ref-strip-string
+ (buffer-substring key-beginning key-end)))
+ ;; open file on click
+ (find-file bibfile)))
- ;; formatting code
+ ;; formatting code
(lambda (keyword desc format)
(cond
((eq format 'org) (org-ref-get-org-bibliography))
@@ -657,10 +677,14 @@ Format according to the type in `org-ref-bibliography-entry-format'."
((eq format 'html) (org-ref-get-html-bibliography))
((eq format 'latex)
;; write out the latex bibliography command
- (format "\\bibliography{%s}" (replace-regexp-in-string "\\.bib" "" (mapconcat 'identity
- (mapcar 'expand-file-name
- (split-string keyword ","))
- ",")))))))
+ (format "\\bibliography{%s}"
+ (replace-regexp-in-string
+ "\\.bib" ""
+ (mapconcat
+ 'identity
+ (mapcar 'expand-file-name
+ (split-string keyword ","))
+ ",")))))))
(org-add-link-type "nobibliography"
;; this code is run on clicking. The bibliography
@@ -714,20 +738,11 @@ Format according to the type in `org-ref-bibliography-entry-format'."
((eq format 'html) (org-ref-get-html-bibliography))
((eq format 'latex)
;; write out the latex bibliography command
-
-; (format "{\\setbox0\\vbox{\\bibliography{%s}}}"
-; (replace-regexp-in-string "\\.bib" "" (mapconcat 'identity
-; (mapcar 'expand-file-name
-; (split-string keyword ","))
-; ",")))
-
(format "\\nobibliography{%s}"
(replace-regexp-in-string "\\.bib" "" (mapconcat 'identity
(mapcar 'expand-file-name
(split-string keyword ","))
- ",")))
-
- ))))
+ ",")))))))
(org-add-link-type "printbibliography"
(lambda (arg) (message "Nothing implemented for clicking here."))
@@ -737,8 +752,7 @@ Format according to the type in `org-ref-bibliography-entry-format'."
((eq format 'html) (org-ref-get-html-bibliography))
((eq format 'latex)
;; write out the biblatex bibliography command
- "\\printbibliography"))
-))
+ "\\printbibliography"))))
(org-add-link-type "bibliographystyle"
(lambda (arg) (message "Nothing implemented for clicking here."))
@@ -746,13 +760,31 @@ Format according to the type in `org-ref-bibliography-entry-format'."
(cond
((eq format 'latex)
;; write out the latex bibliography command
- (format "\\bibliographystyle{%s}" keyword)))))
+ (format "\\bibliographystyle{%s}" keyword))
+ ;; Other styles should not have an output for this
+ (t
+ ""))))
+
+
+(defun org-bibliographystyle-complete-link (&optional arg)
+ "Completion function for bibliographystyle link.
+ARG does nothing."
+ (format "bibliographystyle:%s" (ido-completing-read
+ "style: "
+ '("unsrt" "plain" "alpha"
+ ;; natbib
+ ;; https://www.sharelatex.com/learn/Natbib_bibliography_styles
+ "dinat" "humannat" "plainnat"
+ "abbrnat" "unsrtnat" "rusnat"
+ "ksfhnat"))))
+
(defun org-bibliography-complete-link (&optional arg)
"Completion function for bibliography link.
ARG does nothing."
(format "bibliography:%s" (read-file-name "enter file: " nil nil t)))
+
(defun org-ref-insert-bibliography-link ()
"Insert a bibliography with completion."
(interactive)
@@ -900,6 +932,8 @@ ARG does nothing."
((eq format 'latex)
(format "\\listoftables")))))
+
+;; ** label link
(defun org-ref-count-labels (label)
"Counts number of matches for LABEL in the document."
(+ (count-matches (format "label:%s\\b[^-:]" label) (point-min) (point-max))
@@ -916,7 +950,6 @@ ARG does nothing."
(setq custom-id-count (+ 1 custom-id-count)))))
custom-id-count)))
-;; ** label link
(org-add-link-type
"label"
(lambda (label)
@@ -951,21 +984,21 @@ ARG does nothing."
:type "ref"
:link (concat "ref:" (org-element-property :name object))))
-;; it turns out this does not work. you can already store a link to a heading with a CUSTOM_ID
;; store link on heading with custom_id
-; (when (and (equal (org-element-type object) 'headline)
-; (org-entry-get (point) "CUSTOM_ID"))
-; (org-store-link-props
-; :type "ref"
-; :link (concat "ref:" (org-entry-get (point) "CUSTOM_ID"))))
+ ;; this is not a ref link, but it is still what you want
+ (when (and (equal (org-element-type object) 'headline)
+ (org-entry-get (point) "CUSTOM_ID"))
+ (org-store-link-props
+ :type "custom_id"
+ :link (format "[[#%s]]" (org-entry-get (point) "CUSTOM_ID"))))
;; and to #+label: lines
+
(when (and (equal (org-element-type object) 'paragraph)
(org-element-property :name object))
(org-store-link-props
:type "ref"
- :link (concat "ref:" (org-element-property :name object))))
-))
+ :link (concat "ref:" (org-element-property :name object))))))
(add-hook 'org-store-link-functions 'org-label-store-link)
@@ -976,10 +1009,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
@@ -995,20 +1026,15 @@ 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))
-
-;; Commented out because these ref links do not actually translate correctly in LaTeX.
-;; you need [[#label]] links.
- ;; CUSTOM_ID
-; (progn
-; (goto-char (point-min))
-; (re-search-forward (format ":CUSTOM_ID:\s-*\\(%s\\)" 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)
(error "%s not found" label))
@@ -1021,14 +1047,20 @@ ARG does nothing."
((eq format 'latex)
(format "\\ref{%s}" keyword)))))
+
(defun org-ref-get-org-labels ()
"Return a list of #+LABEL: labels."
(save-excursion
(goto-char (point-min))
(let ((matches '()))
(while (re-search-forward "^#\\+label:\\s-+\\(.*\\)\\b" (point-max) t)
- (add-to-list 'matches (match-string-no-properties 1) t))
-matches)))
+ ;; do not do this for tables. We get those in `org-ref-get-tblnames'.
+ ;; who would have thought you have save match data here? Trust me. When
+ ;; I wrote this, you did.
+ (unless (save-match-data (equal (car (org-element-at-point)) 'table))
+ (add-to-list 'matches (match-string-no-properties 1) t)))
+ matches)))
+
(defun org-ref-get-custom-ids ()
"Return a list of custom_id properties in the buffer."
@@ -1038,7 +1070,8 @@ matches)))
(let ((custom_id (org-entry-get (point) "CUSTOM_ID")))
(when (not (null custom_id))
(setq results (append results (list custom_id)))))))
-results))
+ results))
+
(defun org-ref-get-latex-labels ()
"Return list of matchin LaTeX defined labels in buffer."
@@ -1047,7 +1080,8 @@ results))
(let ((matches '()))
(while (re-search-forward "\\\\label{\\([a-zA-z0-9:-]*\\)}" (point-max) t)
(add-to-list 'matches (match-string-no-properties 1) t))
-matches)))
+ matches)))
+
(defun org-ref-get-tblnames ()
"Return list of table names in the buffer."
@@ -1055,6 +1089,7 @@ matches)))
(lambda (table)
(org-element-property :name table))))
+
(defun org-ref-get-labels ()
"Return a list of labels in the buffer that you can make a ref link to.
This is used to complete ref links and in helm menus."
@@ -1063,15 +1098,22 @@ This is used to complete ref links and in helm menus."
(widen)
(goto-char (point-min))
(let ((matches '()))
- ;; these are the label:stuff kinds
- (while (re-search-forward "[^#+]label:\\([a-zA-z0-9:-]*\\)" (point-max) t)
+ ;; these are the org-ref label:stuff kinds
+ (while (re-search-forward
+ "[^#+]label:\\([a-zA-z0-9:-]*\\)" (point-max) t)
(add-to-list 'matches (match-string-no-properties 1) t))
+ ;; now add all the other kinds of labels.
(append matches
+ ;; #+label:
(org-ref-get-org-labels)
+ ;; \label{}
(org-ref-get-latex-labels)
+ ;; #+tblname: and actually #+label
(org-ref-get-tblnames)
+ ;; CUSTOM_IDs
(org-ref-get-custom-ids))))))
+
(defun org-ref-helm-insert-label-link ()
"Insert a label link. helm just shows you what labels already exist.
If you are on a label link, replace it."
@@ -1083,7 +1125,8 @@ If you are on a label link, replace it."
;; default action is to open to the label
(action . (lambda (label)
;; unfortunately I do not have markers here
- (org-open-link-from-string (format "ref:%s" label))))
+ (org-open-link-from-string
+ (format "ref:%s" label))))
;; if you select a label, replace current one
(action . (lambda (label)
(switch-to-buffer ,cb)
@@ -1145,6 +1188,7 @@ If you are on a label link, replace it."
(or label
helm-pattern))))))))))))
+
(defun org-ref-complete-link (&optional arg)
"Completion function for ref links.
Optional argument ARG Does nothing."
@@ -1152,11 +1196,13 @@ Optional argument ARG Does nothing."
(setq label (completing-read "label: " (org-ref-get-labels)))
(format "ref:%s" label)))
+
(defun org-ref-insert-ref-link ()
"Completion function for a ref link."
(interactive)
(insert (org-ref-complete-link)))
+
(defun org-ref-helm-insert-ref-link ()
"Helm menu to insert ref links to labels in the document.
If you are on link, replace with newly selected label.
@@ -1255,20 +1301,14 @@ Use C-u C-u to insert a [[#custom-id]] link"
;; #+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))
-
-;; Commented out because these ref links do not actually translate correctly in LaTeX.
-;; you need [[#label]] links.
- ;; CUSTOM_ID
-; (progn
-; (goto-char (point-min))
-; (re-search-forward (format ":CUSTOM_ID:\s-*\\(%s\\)" 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)
(error "%s not found" label))
@@ -1280,6 +1320,7 @@ Use C-u C-u to insert a [[#custom-id]] link"
((eq format 'latex)
(format "\\pageref{%s}" keyword)))))
+
(defun org-pageref-complete-link (&optional arg)
"Completion function for ref links.
Optional argument ARG Does nothing."
@@ -1287,11 +1328,13 @@ Optional argument ARG Does nothing."
(setq label (completing-read "label: " (org-ref-get-labels)))
(format "ref:%s" label)))
+
(defun org-pageref-insert-ref-link ()
"Insert a pageref link with completion."
(interactive)
(insert (org-pageref-complete-link)))
+
;; *** nameref link
(org-add-link-type
"nameref"
@@ -1388,7 +1431,9 @@ keyword we clicked on. We also strip the text properties."
(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)))
+ (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)
;; link with description. assume only one key
@@ -1753,7 +1798,7 @@ get a lot of options. LINK-STRING is used by the link function."
choice
2))))))
-;; ** Generation of the cite links
+;; *** Generation of the cite links
(defmacro org-ref-make-completion-function (type)
"Macro to make a link completion function for a link of TYPE."
`(defun ,(intern (format "org-%s-complete-link" type)) (&optional arg)
@@ -2060,7 +2105,6 @@ 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)
@@ -2074,14 +2118,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 ()
@@ -2366,7 +2409,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
@@ -2436,7 +2479,6 @@ Makes a new buffer with clickable links."
(while (re-search-forward
(format "[^#+]label:%s\\s-" label) nil t)
(push (cons label (point-marker)) multiple-labels))
-
(goto-char (point-min))
(while (re-search-forward
(format "\\label{%s}\\s-?" label) nil t)
@@ -2454,6 +2496,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.
@@ -2462,7 +2527,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)
@@ -2482,6 +2548,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)
@@ -2506,8 +2578,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 ()
@@ -2788,87 +2859,88 @@ 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))
+
+ ;; 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)
@@ -3003,7 +3075,7 @@ 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): ")))
+ (let ((keywords (read-string "Keywords (comma separated): ")))
(loop for key in (helm-marked-candidates)
do
(save-window-excursion
@@ -3041,11 +3113,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)
@@ -3079,7 +3153,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
@@ -3315,6 +3389,38 @@ _o_: Open entry _e_: Email entry and pdf
(org-ref-open-citation-at-point)
(email-bibtex-entry)) nil)))
+;; * org-ref-help
+(defun org-ref-help ()
+ "Open the org-ref manual."
+ (interactive)
+ (find-file (expand-file-name
+ "org-ref.org"
+ (file-name-directory
+ (find-library-name "org-ref")))))
+
+;; * org-ref menu
+(defun org-ref-org-menu ()
+ "Add org-ref menu to the Org menu."
+
+ (easy-menu-change
+ '("Org") "org-ref"
+ '( ["Insert citation" org-ref-helm-insert-cite-link]
+ ["Insert ref" org-ref-helm-insert-ref-link]
+ ["Insert label" org-ref-helm-insert-label-link]
+ "--"
+ ["List of figures" org-ref-list-of-figures]
+ ["List of tables" org-ref-list-of-tables]
+ ["Extract bibtex entries" org-ref-extract-bibtex-entries]
+ ["Check org-file" org-ref]
+ "--"
+ ["Help" org-ref-help]
+ ["Customize org-ref" (customize-group 'org-ref)])
+ "Show/Hide")
+
+ (easy-menu-change '("Org") "--" nil "Show/Hide"))
+
+(add-hook 'org-mode-hook 'org-ref-org-menu)
+
;; * The end
(provide 'org-ref)