]> git.donarmstrong.com Git - org-ref.git/commitdiff
Merge branch 'master' of https://github.com/OlafMerkert/org-ref into OlafMerkert...
authorJohn Kitchin <jkitchin@andrew.cmu.edu>
Tue, 3 Mar 2015 14:47:25 +0000 (09:47 -0500)
committerJohn Kitchin <jkitchin@andrew.cmu.edu>
Tue, 3 Mar 2015 14:47:25 +0000 (09:47 -0500)
.gitignore
Cask [new file with mode: 0644]
jmax-bibtex.el
org-ref-init.el [new file with mode: 0644]
org-ref.org

index 356702b5f740fa45751c0da765600dd2124105fd..00e3105a2318f93e7b28ef66bf0acdf72a8c0038 100644 (file)
@@ -1,2 +1,3 @@
 *.el
-*.elc
\ No newline at end of file
+*.elc
+!org-ref-init.el
\ No newline at end of file
diff --git a/Cask b/Cask
new file mode 100644 (file)
index 0000000..2701a2b
--- /dev/null
+++ b/Cask
@@ -0,0 +1,18 @@
+(source gnu)
+(source melpa)
+
+(package-file "org-ref-init.el")
+
+(files "*.el" "*.info" "*.org")
+
+(development
+ (depends-on "ecukes")
+ (depends-on "ert-runner")
+ (depends-on "el-mock")
+ (depends-on "dash")
+ (depends-on "helm")
+ (depends-on "helm-bibtex")
+ (depends-on "s")
+ (depends-on "f")
+ (depends-on "hydra")
+ (depends-on "parsebib"))
index ea4ab971ca8867123e3a4f287a117be501ea4df7..6833e210db9a8b1e1b84639adffaeadb4f3da4ac 100644 (file)
@@ -209,6 +209,7 @@ This is defined in `jmax-bibtex-journal-abbreviations'."
        ("‘" . "'")
        ("’" . "'")
        ("“" . "\"")
+       ("’" . "'")
        ("”" . "\"")))
 
 (defun jmax-replace-nonascii ()
diff --git a/org-ref-init.el b/org-ref-init.el
new file mode 100644 (file)
index 0000000..3526762
--- /dev/null
@@ -0,0 +1,75 @@
+;;; org-ref-init.el --- setup bibliography, cite, ref and label org-mode links.
+
+;; Copyright(C) 2014 John Kitchin
+
+;; Author: John Kitchin <jkitchin@andrew.cmu.edu>
+;; This file is not currently part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2, or (at
+;; your option) any later version.
+
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program ; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Version: 0.1
+
+;;; Commentary:
+;;
+;; Lisp code to setup bibliography cite, ref and label org-mode links.
+;; also sets up reftex and helm for org-mode citations. The links are
+;; clickable and do things that are useful. You should really read
+;; org-ref.org for details.
+;;
+;; Package-Requires: ((dash) (helm) (helm-bibtex))
+
+;; org path for loadable org-files
+(defvar org-ref-org-load-path
+  nil
+  "List of directories to find org-files that `org-babel-load-file' can load code from.")
+
+;; https://github.com/jkitchin/org-ref
+(defun org-ref-org-require (feature)
+  "Load a FEATURE from an org-file.
+FEATURE is a symbol, and it is loaded from an org-file by the name of FEATURE.org, that is in the `org-load-path'.  The FEATURE is loaded from `org-babel-load-file'."
+  (let ((org-file (concat (symbol-name feature) ".org"))
+       (path))
+
+    ;; find the org-file
+    (catch 'result
+      (loop for dir in org-ref-org-load-path do
+           (when (file-exists-p
+                  (setq path
+                        (expand-file-name
+                         org-file
+                         dir)))
+             (throw 'result path))))
+    (let ((default-directory (file-name-directory path)))
+      (org-babel-load-file path))))
+
+;; remember this directory
+(defconst org-ref-dir (file-name-directory (or load-file-name
+                                              (buffer-file-name)))
+    "Directory where org-ref is installed.")
+
+;; for loading org-files
+(add-to-list 'org-ref-org-load-path org-ref-dir)
+;; for loading emacs-lisp files
+(add-to-list 'load-path org-ref-dir)
+
+(org-ref-org-require 'org-ref)
+(org-ref-org-require 'doi-utils)
+(org-ref-org-require 'pubmed)
+(require 'jmax-bibtex)
+
+(provide 'org-ref-init)
+
+;;; org-ref-init.el ends here
index e0ce7436c73dad8003305084649947cb302bab0a..9665744c85bcf662ef33af3e9fa5de3cd738bb73 100644 (file)
@@ -3393,8 +3393,112 @@ I like convenience. Here are some aliases for faster typing.
 * Helm interface
 [[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
+(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
+(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)
+                                   "" )))
+    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.
+#+BEGIN_SRC emacs-lisp
+;; adapted from bibtex-utils.el
+;; these are candidates for selecting keywords/tags
+(defun org-ref-bibtex-keywords ()
+  "Get keywords defined in current bibtex file.
+These are in the keywords field, and are comma or semicolon separated."
+  (save-excursion
+    (goto-char (point-min))
+    (let (keywords kstring)
+      (while (re-search-forward "^\\s-*keywords.*{\\([^}]+\\)}" nil t)
+        ;; TWS - remove newlines/multiple spaces:
+       (setq kstring (replace-regexp-in-string "[ \t\n]+" " " (match-string 1)))
+       (mapc
+        (lambda (v)
+          (add-to-list 'keywords v t))
+        (split-string kstring "\\(,\\|;\\)[ \n]*\\|{\\|}" t)))
+      keywords)))
+
+
+(defun org-ref-set-bibtex-keywords (keywords)
+  "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."
+  (interactive "sKeywords: ")
+  (bibtex-set-field
+   "keywords"
+   (concat
+    (if (listp keywords)
+       (mapconcat 'identity keywords ", ")
+      keywords)
+    (when (not (string= "" (bibtex-autokey-get-field "keywords")))
+      (concat ", "  (bibtex-autokey-get-field "keywords")))))
+  (save-buffer))
+
+
+(defun helm-tag-bibtex-entry ()
+  "Helm interface to add keywords to a bibtex entry.
+Run this with the point in a bibtex entry."
+  (interactive)
+  (let ((keyword-source `((name . "Existing keywords")
+                         (candidates . ,(org-ref-bibtex-keywords))
+                         (action . (lambda (candidate)
+                                     (org-ref-set-bibtex-keywords
+                                      (mapconcat
+                                       'identity
+                                       (helm-marked-candidates)
+                                       ", "))))))
+       (fallback-source `((name . "Add new keywords")
+                          (dummy)
+                          (action . (lambda (candidate)
+                                      (org-ref-set-bibtex-keywords helm-pattern)
+                                      )))))
+    (helm :sources '(keyword-source fallback-source))))
+
+
+(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'."
+  (let ((keywords (read-input "Keywords (comma separated): ")))
+    (loop for key in (helm-marked-candidates)
+         do
+         (save-window-excursion
+           (helm-bibtex-show-entry key)
+           (bibtex-set-field
+            "keywords"
+            (concat
+             keywords
+             ", " (bibtex-autokey-get-field "keywords")))
+           (save-buffer)))))
+#+END_SRC
+
+Next, adapt the helm-bibtex source with these features:
+
 1. Make the default action to insert selected keys.
 2. Make open entry second action
+3. Add some features for adding keywords to bibtex entries.
+
 #+BEGIN_SRC emacs-lisp :tangle org-ref.el
 (setq helm-source-bibtex
       '((name                                      . "BibTeX entries")
@@ -3405,11 +3509,12 @@ I like convenience. Here are some aliases for faster typing.
                   ("Show entry"                   . helm-bibtex-show-entry)
                   ("Open PDF file (if present)"   . helm-bibtex-open-pdf)
                   ("Open URL or DOI in browser"   . helm-bibtex-open-url-or-doi)
-                  ("Insert reference"             . helm-bibtex-insert-reference)
+                  ("Insert formatted reference"   . helm-bibtex-insert-reference)
                   ("Insert BibTeX key"            . helm-bibtex-insert-key)
                   ("Insert BibTeX entry"          . helm-bibtex-insert-bibtex)
                   ("Attach PDF to email"          . helm-bibtex-add-PDF-attachment)
                   ("Edit notes"                   . helm-bibtex-edit-notes)
+                   ("Add keywords to entries"      . org-ref-helm-tag-entries)
                   ))))
 #+END_SRC