X-Git-Url: https://git.donarmstrong.com/?p=org-ref.git;a=blobdiff_plain;f=org-ref.org;h=d2674294649c8282d73beab5fbde3c8ce130247e;hp=40a29405d95a0e3a849003c180917238c95486c5;hb=43e5b01ab93725dd43204248a80edd30ce04e7de;hpb=50440af50787febd2d7797ff722a9d107416a98a diff --git a/org-ref.org b/org-ref.org index 40a2940..d267429 100644 --- a/org-ref.org +++ b/org-ref.org @@ -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}" 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 "()" path)) @@ -1043,7 +1063,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 +1074,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 +1099,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 +1109,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 +1202,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 +1227,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 +1292,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 +3104,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 +3121,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 +3146,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 +3160,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 +3189,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 +3353,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 ()