]> git.donarmstrong.com Git - org-ref.git/blobdiff - org-ref.org
bump to v0.2
[org-ref.git] / org-ref.org
index ddf6131c07c2435153b1cd61e27db9478735c5ec..6d69a14b072a55ae10b5c99e5860cc26ff7d66f8 100644 (file)
@@ -1,3 +1,4 @@
+# -*- org-edit-src-content-indentation: 0; -*-
 #+TITLE: Org-ref - The best reference handling for org-mode
 #+AUTHOR: John Kitchin
 #+DATE: April 29, 2014
 #+TITLE: Org-ref - The best reference handling for org-mode
 #+AUTHOR: John Kitchin
 #+DATE: April 29, 2014
@@ -1631,7 +1632,6 @@ The first thing we need is to get the bibtex key we clicked on.
 point to get a comma, or the end of the link, and then backwards
 to get a comma, or the beginning of the link. that delimits the
 keyword we clicked on. We also strip the text properties."
 point to get a comma, or the end of the link, and then backwards
 to get a comma, or the beginning of the link. that delimits the
 keyword we clicked on. We also strip the text properties."
-  (interactive)
   (let* ((object (org-element-context))
         (link-string (org-element-property :path object)))
     ;; you may click on the part before the citations. here we make
   (let* ((object (org-element-context))
         (link-string (org-element-property :path object)))
     ;; you may click on the part before the citations. here we make
@@ -1685,7 +1685,6 @@ internal bibliographies
 
 falling back to what the user has set in org-ref-default-bibliography
 "
 
 falling back to what the user has set in org-ref-default-bibliography
 "
-  (interactive)
   (catch 'result
     (save-excursion
       (goto-char (point-min))
   (catch 'result
     (save-excursion
       (goto-char (point-min))
@@ -1745,7 +1744,6 @@ Finally, we want to know which file the key is in.
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
 (defun org-ref-get-bibtex-key-and-file (&optional key)
   "returns the bibtex key and file that it is in. If no key is provided, get one under point"
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
 (defun org-ref-get-bibtex-key-and-file (&optional key)
   "returns the bibtex key and file that it is in. If no key is provided, get one under point"
- (interactive)
  (let ((org-ref-bibliography-files (org-ref-find-bibliography))
        (file))
    (unless key
  (let ((org-ref-bibliography-files (org-ref-find-bibliography))
        (file))
    (unless key
@@ -1891,7 +1889,6 @@ Prompt for NEW-FILE includes bib files in org-ref-default-bibliography, and bib
 
 (defun org-ref-get-doi-at-point ()
   "Get doi for key at point."
 
 (defun org-ref-get-doi-at-point ()
   "Get doi for key at point."
-  (interactive)
   (let* ((results (org-ref-get-bibtex-key-and-file))
         (key (car results))
         (bibfile (cdr results))
   (let* ((results (org-ref-get-bibtex-key-and-file))
         (key (car results))
         (bibfile (cdr results))
@@ -2155,19 +2152,16 @@ We will want to generate formatting functions for each citation type. The reason
 We create the links by mapping the function onto the list of defined link types.
 
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
 We create the links by mapping the function onto the list of defined link types.
 
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
-;;;###autoload
 (defun org-ref-format-citation-description (desc)
   "Return formatted citation description.  If the cite link has a
 description, it is optional text for the citation command. You
 can specify pre and post text by separating these with ::, for
 example [[cite:key][pre text::post text]]."
 (defun org-ref-format-citation-description (desc)
   "Return formatted citation description.  If the cite link has a
 description, it is optional text for the citation command. You
 can specify pre and post text by separating these with ::, for
 example [[cite:key][pre text::post text]]."
-  (interactive)
   (cond
    ((string-match "::" desc)
     (format "[%s][%s]" (car (setq results (split-string desc "::"))) (cadr results)))
    (t (format "[%s]" desc))))
 
   (cond
    ((string-match "::" desc)
     (format "[%s][%s]" (car (setq results (split-string desc "::"))) (cadr results)))
    (t (format "[%s]" desc))))
 
-;;;###autoload
 (defun org-ref-define-citation-link (type &optional key)
   "Add a citation link of TYPE for org-ref.
 With optional KEY, set the reftex binding. For example:
 (defun org-ref-define-citation-link (type &optional key)
   "Add a citation link of TYPE for org-ref.
 With optional KEY, set the reftex binding. For example:
@@ -2207,7 +2201,6 @@ and the completion function."
 We need a convenient method to insert links. In reftex you use the keystroke C-c ], which gives you a minibuffer to search the bibtex files from. This function is bound to that same keystroke here [[*org-mode%20/%20reftex%20setup][org-mode / reftex setup]]. This function will append to a cite link if you call it while on a link.
 
 #+BEGIN_SRC emacs-lisp  :tangle org-ref.el
 We need a convenient method to insert links. In reftex you use the keystroke C-c ], which gives you a minibuffer to search the bibtex files from. This function is bound to that same keystroke here [[*org-mode%20/%20reftex%20setup][org-mode / reftex setup]]. This function will append to a cite link if you call it while on a link.
 
 #+BEGIN_SRC emacs-lisp  :tangle org-ref.el
-;;;###autoload
 (defun org-ref-insert-cite-link (alternative-cite)
   "Insert a default citation link using reftex. If you are on a link, it
 appends to the end of the link, otherwise, a new link is
 (defun org-ref-insert-cite-link (alternative-cite)
   "Insert a default citation link using reftex. If you are on a link, it
 appends to the end of the link, otherwise, a new link is
@@ -2272,7 +2265,6 @@ If you know the specific bibtex key, you may like to use completion directly. Yo
 Alternatively, you may shortcut the org-machinery with this command. You will be prompted for a citation type, and then offered key completion.
 
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
 Alternatively, you may shortcut the org-machinery with this command. You will be prompted for a citation type, and then offered key completion.
 
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
-;;;###autoload
 (defun org-ref-insert-cite-with-completion (type)
   "Insert a cite link with completion"
   (interactive (list (ido-completing-read "Type: " org-ref-cite-types)))
 (defun org-ref-insert-cite-with-completion (type)
   "Insert a cite link with completion"
   (interactive (list (ido-completing-read "Type: " org-ref-cite-types)))
@@ -2283,7 +2275,6 @@ Alternatively, you may shortcut the org-machinery with this command. You will be
 org-mode already defines a store link function for bibtex entries. It does not store the link I want though, it only stores a brief citation of the entry. I want a citation link. Here is a function to do that.
 
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
 org-mode already defines a store link function for bibtex entries. It does not store the link I want though, it only stores a brief citation of the entry. I want a citation link. Here is a function to do that.
 
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
-;;;###autoload
 (defun org-ref-store-bibtex-entry-link ()
   "Save a citation link to the current bibtex entry. Saves in the default link type."
   (interactive)
 (defun org-ref-store-bibtex-entry-link ()
   "Save a citation link to the current bibtex entry. Saves in the default link type."
   (interactive)
@@ -2513,7 +2504,6 @@ This assumes you are in an article."
 ** open pdf from bibtex
 We bind this to a key here: [[*key%20bindings%20for%20utilities][key bindings for utilities]].
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
 ** open pdf from bibtex
 We bind this to a key here: [[*key%20bindings%20for%20utilities][key bindings for utilities]].
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
-;;;###autoload
 (defun org-ref-open-bibtex-pdf ()
   "open pdf for a bibtex entry, if it exists. assumes point is in
 the entry of interest in the bibfile. but does not check that."
 (defun org-ref-open-bibtex-pdf ()
   "open pdf for a bibtex entry, if it exists. assumes point is in
 the entry of interest in the bibfile. but does not check that."
@@ -2831,7 +2821,6 @@ Makes a new buffer with clickable links."
          (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))
          (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))
-               (message-box "%s" link)
                (setq
                 bad-citations
                 (append
                (setq
                 bad-citations
                 (append
@@ -3218,7 +3207,7 @@ Sometimes it may be helpful to manually change the order of citations. These fun
    (setf (nth j keys) tempi))
   keys)
 
    (setf (nth j keys) tempi))
   keys)
 
-;;;###autoload
+
 (defun org-ref-swap-citation-link (direction)
  "move citation at point in direction +1 is to the right, -1 to the left"
  (interactive)
 (defun org-ref-swap-citation-link (direction)
  "move citation at point in direction +1 is to the right, -1 to the left"
  (interactive)
@@ -3238,7 +3227,17 @@ Sometimes it may be helpful to manually change the order of citations. These fun
          (org-ref-swap-keys i (- i 1) keys))
        (setq keys (mapconcat 'identity keys ","))
        ;; and replace the link with the sorted keys
          (org-ref-swap-keys i (- i 1) keys))
        (setq keys (mapconcat 'identity keys ","))
        ;; and replace the link with the sorted keys
-       (cl--set-buffer-substring begin end (concat type ":" keys " "))
+       (cl--set-buffer-substring
+        begin end
+        (concat
+         type ":" keys
+         ;; It seems the space at the end can get consumed, so we see if there
+         ;; is a space, and add it if so. Sometimes there is a comma or period,
+         ;; then we do not want a space.
+         (when
+             (save-excursion
+               (goto-char end)
+               (looking-back " ")) " ")))
        ;; now go forward to key so we can move with the key
        (re-search-forward key)
        (goto-char (match-beginning 0)))))
        ;; now go forward to key so we can move with the key
        (re-search-forward key)
        (goto-char (match-beginning 0)))))
@@ -3305,7 +3304,7 @@ To get a lighter weight message about the label, ref and cite links, we define a
                          (point)))))
       (throw 'result "!!! NO CONTEXT FOUND !!!"))))
 
                          (point)))))
       (throw 'result "!!! NO CONTEXT FOUND !!!"))))
 
-;;;###autoload
+
 (defun org-ref-link-message ()
   "Print a minibuffer message about the link that point is on."
   (interactive)
 (defun org-ref-link-message ()
   "Print a minibuffer message about the link that point is on."
   (interactive)
@@ -3414,36 +3413,39 @@ I like convenience. Here are some aliases for faster typing.
 [[https://github.com/tmalsburg/helm-bibtex][helm-bibtex]] is a very cool interface to bibtex files. Out of the box though, it is not super convenient for org-ref. Here, we modify it to make it fit our workflow and extend it where needed.
 
 Let us add keywords as a searchable field.
 [[https://github.com/tmalsburg/helm-bibtex][helm-bibtex]] is a very cool interface to bibtex files. Out of the box though, it is not super convenient for org-ref. Here, we modify it to make it fit our workflow and extend it where needed.
 
 Let us add keywords as a searchable field.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp  :tangle org-ref.el
 (setq helm-bibtex-additional-search-fields '(keywords))
 #+END_SRC
 
 Next, we are going to add keywords to the helm interface. This modifies the helm-bibtex function to add our keywords.
 (setq helm-bibtex-additional-search-fields '(keywords))
 #+END_SRC
 
 Next, we are going to add keywords to the helm interface. This modifies the helm-bibtex function to add our keywords.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp :tangle org-ref.el
 (defun helm-bibtex-candidates-formatter (candidates source)
   "Formats BibTeX entries for display in results list."
   (cl-loop
 (defun helm-bibtex-candidates-formatter (candidates source)
   "Formats BibTeX entries for display in results list."
   (cl-loop
-    with width = (with-helm-window (window-width))
-    for entry in candidates
-    for entry = (cdr entry)
-    for entry-key = (helm-bibtex-get-value entry 'entry-key)
-    for fields = (--map (helm-bibtex-clean-string
-                          (helm-bibtex-get-value entry it " "))
-                        '(author title year has-pdf has-note entry-type))
-    for fields = (-update-at 0 'helm-bibtex-shorten-authors fields)
-    for fields = (append fields
-                        (list  (or (helm-bibtex-get-value entry 'keywords)
+   with width = (with-helm-window (helm-bibtex-window-width))
+   for entry in candidates
+   for entry = (cdr entry)
+   for entry-key = (helm-bibtex-get-value "=key=" entry)
+   if (assoc-string "author" entry 'case-fold)
+     for fields = '("author" "title" "year" "=has-pdf=" "=has-note=" "=type=")
+   else
+     for fields = '("editor" "title" "year" "=has-pdf=" "=has-note=" "=type=")
+   for fields = (--map (helm-bibtex-clean-string
+                        (helm-bibtex-get-value it entry " "))
+                       fields)
+   for fields = (-update-at 0 'helm-bibtex-shorten-authors fields)
+   for fields = (append fields
+                        (list  (or (helm-bibtex-get-value "keywords" entry)
                                    "" )))
                                    "" )))
-    collect
-    (cons (s-format "$0 $1 $2 $3 $4$5 $6" 'elt
-            (-zip-with (lambda (f w) (truncate-string-to-width f w 0 ?\s))
-                       fields (list 36 (- width 85) 4 1 1 7 7)))
-          entry-key)))
-
+   collect
+   (cons (s-format "$0 $1 $2 $3 $4$5 $6" 'elt
+                   (-zip-with (lambda (f w) (truncate-string-to-width f w 0 ?\s))
+                              fields (list 36 (- width 85) 4 1 1 7 7)))
+         entry-key)))
 #+END_SRC
 
 Next, we add some functions to add keywords to a bibtex entry using a helm interface, and a new action to add keywords to entries from helm-bibtex.
 #+END_SRC
 
 Next, we add some functions to add keywords to a bibtex entry using a helm interface, and a new action to add keywords to entries from helm-bibtex.
-#+BEGIN_SRC emacs-lisp
+#+BEGIN_SRC emacs-lisp  :tangle org-ref.el
 ;; adapted from bibtex-utils.el
 ;; these are candidates for selecting keywords/tags
 (defun org-ref-bibtex-keywords ()
 ;; adapted from bibtex-utils.el
 ;; these are candidates for selecting keywords/tags
 (defun org-ref-bibtex-keywords ()
@@ -3461,7 +3463,7 @@ These are in the keywords field, and are comma or semicolon separated."
         (split-string kstring "\\(,\\|;\\)[ \n]*\\|{\\|}" t)))
       keywords)))
 
         (split-string kstring "\\(,\\|;\\)[ \n]*\\|{\\|}" t)))
       keywords)))
 
-;;;###autoload
+
 (defun org-ref-set-bibtex-keywords (keywords &optional arg)
   "Add KEYWORDS to a bibtex entry.
 If KEYWORDS is a list, it is converted to a comma-separated string. The KEYWORDS are added to the beginning of the field. Otherwise KEYWORDS should be a string of comma-separate keywords."
 (defun org-ref-set-bibtex-keywords (keywords &optional arg)
   "Add KEYWORDS to a bibtex entry.
 If KEYWORDS is a list, it is converted to a comma-separated string. The KEYWORDS are added to the beginning of the field. Otherwise KEYWORDS should be a string of comma-separate keywords."
@@ -3482,7 +3484,7 @@ If KEYWORDS is a list, it is converted to a comma-separated string. The KEYWORDS
        (concat ", "  (bibtex-autokey-get-field "keywords"))))))
   (save-buffer))
 
        (concat ", "  (bibtex-autokey-get-field "keywords"))))))
   (save-buffer))
 
-;;;###autoload
+
 (defun helm-tag-bibtex-entry ()
   "Helm interface to add keywords to a bibtex entry.
 Run this with the point in a bibtex entry."
 (defun helm-tag-bibtex-entry ()
   "Helm interface to add keywords to a bibtex entry.
 Run this with the point in a bibtex entry."
@@ -3502,10 +3504,31 @@ Run this with the point in a bibtex entry."
                                       )))))
     (helm :sources '(keyword-source fallback-source))))
 
                                       )))))
     (helm :sources '(keyword-source fallback-source))))
 
+(defun helm-bibtex-show-entry (key)
+  "Show the entry in the BibTeX file.
+The original function in helm-bibtex has a bug where it finds the
+first key that partially matches. This version avoids that."
+  (catch 'break
+    (dolist (bibtex-file (if (listp helm-bibtex-bibliography)
+                             helm-bibtex-bibliography
+                           (list helm-bibtex-bibliography)))
+      (let ((buf (helm-bibtex-buffer-visiting bibtex-file))
+            (entries '()))
+        (find-file bibtex-file)
+        (bibtex-map-entries
+        (lambda (key start end)
+          (add-to-list 'entries (cons key start))))
+        (if (assoc key entries)
+           (progn
+             (goto-char (cdr (assoc key entries)))
+             (throw 'break t))
+          (unless buf
+            (kill-buffer)))))))
 
 (defun org-ref-helm-tag-entries (candidates)
   "Set tags on selected bibtex entries from helm-bibtex.
 User is prompted for tags. This function is called from `helm-bibtex'."
 
 (defun org-ref-helm-tag-entries (candidates)
   "Set tags on selected bibtex entries from helm-bibtex.
 User is prompted for tags. This function is called from `helm-bibtex'."
+  (message "")
   (let ((keywords (read-input "Keywords (comma separated): ")))
     (loop for key in (helm-marked-candidates)
          do
   (let ((keywords (read-input "Keywords (comma separated): ")))
     (loop for key in (helm-marked-candidates)
          do
@@ -3634,7 +3657,6 @@ With two prefix args, insert a label link."
    ((equal arg '(16))
     (org-ref-helm-insert-label-link))))
 
    ((equal arg '(16))
     (org-ref-helm-insert-label-link))))
 
-(require 'helm-bibtex)
 
 ;; add our own fallback entries where we want them. These appear in reverse order of adding in the menu
 (setq helm-bibtex-fallback-options
 
 ;; add our own fallback entries where we want them. These appear in reverse order of adding in the menu
 (setq helm-bibtex-fallback-options
@@ -3773,9 +3795,11 @@ This is a list of cons cells '((\"description\" . action)). The action function
  'org-ref-helm-user-candidates
  '("Example" . (lambda () (message-box "You did it!")))
  t)
  'org-ref-helm-user-candidates
  '("Example" . (lambda () (message-box "You did it!")))
  t)
+
 ;;;###autoload
 (defun org-ref-cite-click-helm (key)
 ;;;###autoload
 (defun org-ref-cite-click-helm (key)
-  "subtle points.
+  "Open helm for actions on a cite link.
+subtle points.
 1. get name and candidates before entering helm because we need the org-buffer.
 2. switch back to the org buffer before evaluating the action. most of them need the point and buffer."
   (interactive)
 1. get name and candidates before entering helm because we need the org-buffer.
 2. switch back to the org buffer before evaluating the action. most of them need the point and buffer."
   (interactive)