]> git.donarmstrong.com Git - org-ref.git/blobdiff - org-ref.org
fix bug in get labels.
[org-ref.git] / org-ref.org
index 40a29405d95a0e3a849003c180917238c95486c5..62361c04e8274928f92a05b8142345957e821b2a 100644 (file)
@@ -12,6 +12,19 @@ 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
 
+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.
@@ -917,17 +930,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}\\b" 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 +948,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))
@@ -1094,9 +1114,14 @@ Now, we can put all the labels together which will give us a list of candidates.
       (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.
@@ -1200,10 +1225,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,6 +1290,10 @@ 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
 
@@ -3069,14 +3102,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 !!!"))))
 
 
@@ -3106,7 +3131,6 @@ To get a lighter weight message about the label, ref and cite links, we define a
          (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 +3138,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,24 +3152,26 @@ 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
            (save-excursion
-              (goto-char link-string-beginning)
              (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
-              (goto-char link-string-beginning)
              (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
@@ -3149,7 +3181,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
@@ -3314,7 +3345,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 ()