]> git.donarmstrong.com Git - org-ref.git/blobdiff - org-ref.el
adjusted cite link re to fix issue #23
[org-ref.git] / org-ref.el
index 273e5e4ebbce5f8b4e0444a012c102c246556029..fefd8317a0387d5cba569ef98fbff7ba15c82bc0 100644 (file)
@@ -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
@@ -504,7 +504,8 @@ 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)
@@ -748,11 +749,26 @@ Format according to the type in `org-ref-bibliography-entry-format'."
                       ;; write out the latex bibliography command
                       (format "\\bibliographystyle{%s}" keyword)))))
 
+
+(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 +916,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 +934,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 +968,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 +993,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 +1010,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 +1031,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 +1054,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 +1064,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 +1073,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 +1082,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 +1109,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 +1172,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 +1180,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 +1285,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 +1304,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 +1312,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 +1415,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 +1782,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)
@@ -2436,7 +2465,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)
@@ -3318,11 +3346,35 @@ _o_: Open entry   _e_: Email entry and pdf
 ;; * 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)