]> git.donarmstrong.com Git - org-ref.git/blobdiff - org-ref.org
add with-affiliates and catch all cite types
[org-ref.git] / org-ref.org
index 04746fe9c643408730cdf07700fb42264061a121..c9518c8865c0a02181fc9e67e9896a94826880c9 100644 (file)
@@ -12,6 +12,20 @@ This document is an experiment at creating a literate program to provide similar
 4. Exportable links to LaTeX
 5. Utility functions for dealing with bibtex files and org-files
 
+Some additional features include
+1. Get minibuffer messages for the cite/ref/label link under point
+
+With helm integration (default) you can:
+
+1. C-c ] to insert a citation link
+  in helm-bibtex
+   - Enter to insert or append citation(s)
+   - C-u Enter to insert an alternative cite link
+   - C-u C-u Enter to replace the citation at point
+2. C-u C-c ] to insert a ref link with helm completion
+3. C-u C-u C-c ] to insert a label with completion
+4. M-x org-ref to get a helm completion buffer with link checks, utilities and export options
+
 ** Header
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
 ;;; org-ref.el --- setup bibliography, cite, ref and label org-mode links.
@@ -471,7 +485,7 @@ This code provides some functions to generate a simple sorted bibliography in ht
 
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
 (defun org-ref-get-bibtex-keys ()
-  "return a list of unique keys in the buffer."
+  "Return a list of unique keys in the buffer."
   (let ((keys '()))
     (org-element-map (org-element-parse-buffer) 'link
       (lambda (link)
@@ -481,7 +495,9 @@ This code provides some functions to generate a simple sorted bibliography in ht
                (key
                 (org-ref-split-and-strip-string (plist-get plist ':path)))
              (when (not (-contains? keys key))
-               (setq keys (append keys (list key)))))))))
+               (setq keys (append keys (list key))))))))
+      ;; set with-affiliated to get keys in captions
+      nil nil nil t)
     ;; Sort keys alphabetically
     (setq keys (cl-sort keys 'string-lessp :key 'downcase))
     keys))
@@ -917,17 +933,17 @@ The label link provides a way to create labels in org-mode. We make it clickable
 #+BEGIN_SRC emacs-lisp  :tangle org-ref.el
 (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) t)
+  (+ (count-matches (format "label:%s\\b[^-:]" label) (point-min) (point-max))
      ;; for tblname, it is not enough to get word boundary
      ;; tab-little and tab-little-2 match then.
-     (count-matches (format "^#\\+tblname:\\s-*%s\\b[^-:]" label) (point-min) (point-max) t)
-     (count-matches (format "\\label{%s}\\b" label) (point-min) (point-max) t)
+     (count-matches (format "^#\\+tblname:\\s-*%s\\b[^-:]" label) (point-min) (point-max))
+     (count-matches (format "\\label{%s}" label) (point-min) (point-max))
      ;; this is the org-format #+label:
-     (count-matches (format "^#\\+label:\\s-*%s\\b[^-:]" label) (point-min) (point-max) t)
+     (count-matches (format "^#\\+label:\\s-*%s\\b[^-:]" label) (point-min) (point-max))
      (let ((custom-id-count 0))
        (org-map-entries
        (lambda ()
-         (when (string= label  (org-entry-get (point) "CUSTOM_ID"))
+         (when (string= label (org-entry-get (point) "CUSTOM_ID"))
            (setq custom-id-count (+ 1 custom-id-count)))))
        custom-id-count)))
 
@@ -935,7 +951,14 @@ The label link provides a way to create labels in org-mode. We make it clickable
  "label"
  (lambda (label)
    "on clicking count the number of label tags used in the buffer. A number greater than one means multiple labels!"
-   (message (format "%s occurences" (org-ref-count-labels label))))
+   (let ((count (org-ref-count-labels label)))
+   (message (format "%s occurence%s"
+                   count
+                   (if (or (= count 0)
+                             (> count 1))
+                       "s"
+                     ""))
+                   (org-ref-count-labels label))))
  (lambda (keyword desc format)
    (cond
     ((eq format 'html) (format "(<label>%s</label>)" path))
@@ -1043,7 +1066,7 @@ It would be nice to use completion to enter a ref link, where a list of labels i
 
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
 (defun org-ref-get-org-labels ()
- "find #+LABEL: labels"
+ "Return a list of #+LABEL: labels."
   (save-excursion
     (goto-char (point-min))
     (let ((matches '()))
@@ -1054,7 +1077,7 @@ matches)))
 
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
 (defun org-ref-get-custom-ids ()
- "return a list of custom_id properties in the buffer"
+ "Return a list of custom_id properties in the buffer."
  (let ((results '()) custom_id)
    (org-map-entries
     (lambda ()
@@ -1079,6 +1102,7 @@ Finally, we get the table names.
 
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
 (defun org-ref-get-tblnames ()
+  "Return list of table names in the buffer."
   (org-element-map (org-element-parse-buffer 'element) 'table
     (lambda (table)
       (org-element-property :name table))))
@@ -1088,18 +1112,24 @@ Now, we can put all the labels together which will give us a list of candidates.
 
 #+BEGIN_SRC emacs-lisp  :tangle org-ref.el
 (defun org-ref-get-labels ()
-  "returns a list of labels in the buffer that you can make a ref link to. this is used to auto-complete ref links."
+  "Returns a list of labels in the buffer that you can make a ref link to.
+This is used to auto-complete ref links and in helm menus."
   (save-excursion
     (save-restriction
       (widen)
       (goto-char (point-min))
       (let ((matches '()))
-       (while (re-search-forward "label:\\([a-zA-z0-9:-]*\\)" (point-max) t)
+        ;; these are the 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))
-       (append matches (org-ref-get-org-labels) (org-ref-get-latex-labels) (org-ref-get-tblnames) (org-ref-get-custom-ids))))))
+       (append matches
+               (org-ref-get-org-labels)
+               (org-ref-get-latex-labels)
+               (org-ref-get-tblnames)
+               (org-ref-get-custom-ids))))))
 #+END_SRC
 
-Let us make a helm function to insert a label link. This will help you enter unique labels.
+Let us make a helm function to insert a label link. This will help you enter unique labels by showing matching labels until they are all gone and you are left with a unique one. If you are on a link, it means you want to replace it.
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
 (defun org-ref-helm-insert-label-link ()
   "Insert a label link. helm just shows you what labels already exist.
@@ -1175,7 +1205,7 @@ If you are on a label link, replace it."
                                             helm-pattern))))))))))))
 #+END_SRC
 
-Now we create the completion function. This works from the org-machinery, e.g. if you type C-c C-l to insert a link, and use completion by pressing tab.
+Now we create a completion function. This works from the org-machinery, e.g. if you type C-c C-l to insert a link, and use completion by pressing tab.
 
 #+BEGIN_SRC emacs-lisp  :tangle org-ref.el
 (defun org-ref-complete-link (&optional arg)
@@ -1200,10 +1230,14 @@ Another alternative ref insertion is to use helm.
   "Helm menu to insert ref links to labels in the document.
 If you are on link, replace with newly selected label.
 Use C-u to insert a different kind of ref link.
+Use C-u C-u to insert a [[#custom-id]] link
 "
   (interactive)
   (let* ((labels (org-ref-get-labels))
-        (contexts (mapcar 'org-ref-get-label-context labels))
+        (bs (buffer-string))
+        (contexts (with-temp-buffer
+                    (insert bs)
+                    (mapcar 'org-ref-get-label-context labels)))
         (cb (current-buffer)))
 
     (helm :input (thing-at-point 'word)
@@ -1261,7 +1295,12 @@ Use C-u to insert a different kind of ref link.
                                                       (candidates . ("ref" "eqref" "pageref" "nameref"))
                                                       (action . (lambda (x) x))))
                                      ":" label)))
-                                  ))))))))
+                                  ;; two prefixes, insert section custom-id link
+                                  ((equal helm-current-prefix-arg '(16))
+                                   (insert
+                                    (format "[[#%s]]" label)))
+                                  ))
+                             ))))))
 #+END_SRC
 
 #+RESULTS:
@@ -2575,13 +2614,21 @@ Makes a new buffer with clickable links."
     (org-element-map (org-element-parse-buffer) 'link
       (lambda (link)
        (let ((plist (nth 1 link)))
-         (when (equal (plist-get plist ':type) "cite")
-           (dolist (key (org-ref-split-and-strip-string (plist-get plist ':path)) )
+         (when (-contains? org-ref-cite-types (plist-get plist :type))
+           (dolist (key (org-ref-split-and-strip-string (plist-get plist :path)))
              (when (not (index key bibtex-keys))
-               (setq bad-citations (append bad-citations
-                                           `(,(format "%s [[elisp:(progn (switch-to-buffer-other-frame \"%s\")(goto-char %s))][not found here]]\n"
-                                                      key (buffer-name)(plist-get plist ':begin)))))
-               ))))))
+               (message-box "%s" link)
+               (setq
+                bad-citations
+                (append
+                 bad-citations
+                 `(,(format "%s [[elisp:(progn (switch-to-buffer-other-frame \"%s\")(goto-char %s))][not found here]]\n"
+                            key
+                            (buffer-name)
+                            (plist-get plist :begin)))))
+               )))))
+      ;; set with-affilates to t to get citations in a caption
+      nil nil nil t)
 
     (if bad-citations
       (progn
@@ -3069,14 +3116,6 @@ To get a lighter weight message about the label, ref and cite links, we define a
                        (progn
                          (forward-line 4)
                          (point)))))
-
-      ;; maybe we have a CUSTOM-ID
-      (org-map-entries
-       (lambda () (when (string=
-                        label
-                        (org-entry-get (point) "CUSTOM_ID"))
-                   (throw 'result (org-get-heading)))))
-      (beep)
       (throw 'result "!!! NO CONTEXT FOUND !!!"))))
 
 
@@ -3094,19 +3133,24 @@ To get a lighter weight message about the label, ref and cite links, we define a
 
         ;; message some context about the label we are referring to
         ((string= type "ref")
-         (message (org-ref-get-label-context
-                   (org-element-property :path object))))
+         (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 (org-ref-get-label-context
-                   (org-element-property :path object))))
+         (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
-            (when (> count 1) (beep))
            (message (concat
                      (number-to-string count)
                      " occurence"
@@ -3114,6 +3158,12 @@ To get a lighter weight message about the label, ref and cite links, we define a
                                (> 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)
@@ -3122,13 +3172,16 @@ To get a lighter weight message about the label, ref and cite links, we define a
                 (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
@@ -3136,6 +3189,7 @@ To get a lighter weight message about the label, ref and cite links, we define a
              (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)
@@ -3147,7 +3201,6 @@ To get a lighter weight message about the label, ref and cite links, we define a
                   (buffer-substring key-beginning key-end)))
            (if (file-exists-p bibfile)
                (message "%s exists." bibfile)
-              (beep)
              (message "!!! %s NOT FOUND !!!" bibfile))))
         )))))
 #+END_SRC
@@ -3231,10 +3284,12 @@ C-u C-u will change the key at point to the selected keys.
               (replace-regexp-in-string
                (car (org-ref-get-bibtex-key-and-file)) ; key
                (mapconcat 'identity keys ",")          ; new keys
-               (org-element-property :raw-link object)
-               )
+               (org-element-property :raw-link object))
               ;; replace space at end to avoid collapsing into next word.
-              last-char)))
+              last-char))
+       ;; and we want to go to the end of the new link
+       (goto-char
+        (org-element-property :end (org-element-context))))
        (t
        (message "Not found"))))
 
@@ -3312,7 +3367,6 @@ This code provides a helm interface to things you can do when you click on a cit
            (insert-file-contents bibfile)
            (bibtex-search-entry key)
            (org-ref-bib-citation)))
-      (beep)
       "!!! No entry found !!!" )))
 
 (defun org-ref-cite-candidates ()