]> git.donarmstrong.com Git - org-ref.git/blobdiff - jmax-bibtex.el
ignore some files
[org-ref.git] / jmax-bibtex.el
index 836f931b25acd61e6970af271c59acf747ed9fcc..d25b5bdd0d0be5ed4aefb13901176b8a48bfe355 100644 (file)
@@ -1,10 +1,83 @@
 ;;; jmax-bibtex.el --- jmax-bibtex utilities
 
+;; Copyright(C) 2014 John Kitchin
+
+;; Author: John Kitchin <jkitchin@andrew.cmu.edu>
+;; URL: https://github.com/jkitchin/org-ref
+;; Version: 0.1
+;; Keywords: org-mode, bibtex
+;; Package-Requires: ((org-ref) (s) (dash) (doi-utils) (key-chord))
+
+;; 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.
+
 ;;; Commentary:
-;; Requires: s.el, dash.el, org-ref.el, doi-utils.el
+
+;; jmax-bibtex-generate-longtitles
+;; jmax-bibtex-generate-shorttitles
+;; jmax-stringify-journal-name :: replace a journal name with a string in
+;; `jmax-bibtex-journal-abbreviations'
+;; jmax-set-journal-string :: in a bibtex entry run this to replace the
+;; journal with a string
+;;
+;; jmax-title-case-article :: title case the title in an article
+;; jmax-sentence-case-article :: sentence case the title in an article.
+
+;; jmax-replace-nonascii :: replace nonascii characters in a bibtex
+;; entry. Replacements are in `jmax-nonascii-latex-replacements'.
+;;
+;; jmax-title-case-article
+;; jmax-sentence-case-article
+;;
+;; jmax-bibtex-next-entry :: bound to M-n
+;; jmax-bibtex-previous-entry :: bound to M-p
+;;
+;; Functions to act on a bibtex entry or file
+;; jmax-bibtex-hydra/body gives a hydra menu to a lot of useful functions.
+;; jmax-bibtex-new-entry/body gives a hydra menu to add new bibtex entries.
+;; jmax-bibtex-file/body gives a hydra menu of actions for the bibtex file
+;;
+;; jmax-bibtex :: a deprecated menu of actions
+
+(require 'hydra)
+(require 'key-chord)
 
 ;;; Code:
+;; * Custom variables
+(defgroup jmax-bibtex nil
+  "Customization group for jmax-bibtex.")
+
+
+(defcustom jmax-bibtex-hydra-key-chord
+  nil
+  "key-chord to run `jmax-bibtex-hydra'.
+I like \"jj\""
+  :type 'string
+  :group 'jmax-bibtex)
 
+
+(defcustom jmax-bibtex-hydra-key-binding
+  nil
+  "key-binding to run `jmax-bibtex-hydra'.
+I like \C-cj."
+  :type 'string
+  :group 'jmax-bibtex)
+
+;; * Journal abbreviations
 (defvar jmax-bibtex-journal-abbreviations
   '(("ACAT" "ACS Catalysis" "ACS Catal.")
     ("AM" "Acta Materialia" "Acta Mater.")
     ("JPCC" "The Journal of Physical Chemistry C" "J. Phys. Chem. C")
     ("JPCL" "The Journal of Physical Chemistry Letters" "J. Phys. Chem. Lett.")
     ("JCP" "The Journal of Chemical Physics" "J. Chem. Phys.")
+    ("MSMSE" "Modelling and Simulation in Materials Science and Engineering" "Modell. Simul. Mater. Sci. Eng.")
     ("TSF" "Thin Solid Films" "Thin Solid Films")
     ("TC" "Topics in Catalysis" "Top. Catal.")
     ("WR" "Water Research" "Water Res."))
@@ -155,6 +229,7 @@ This is defined in `jmax-bibtex-journal-abbreviations'."
     (bibtex-fill-entry)
     (bibtex-clean-entry)))
 
+;; * Non-ascii character replacement
 ;; see https://github.com/fxcoudert/tools/blob/master/doi2bib for more replacements
 (defvar jmax-nonascii-latex-replacements
   '()
@@ -173,14 +248,18 @@ This is defined in `jmax-bibtex-journal-abbreviations'."
        ("ë" . "{\\\\\"e}")
        ("ü" . "{\\\\\"u}")
        ("ñ" . "{\\\\~n}")
+       ("ņ" . "{\\\\c{n}}")
        ("å" . "{\\\\aa}")
        ("ö" . "{\\\\\"o}")
+       ("Á" . "{\\\\'A}")
+       ("á" . "{\\\\'a}")
        ("í" . "{\\\\'i}")
        ("ó" . "{\\\\'o}")
        ("ó" . "{\\\\'o}")
        ("ú" .  "{\\\\'u}")
        ("ú" . "{\\\\'u}")
        ("š" . "{\\\\v{s}}")
+       ("ř"  . "{\\\\v{r}}")
        ("İ" . "{\\\\.I}")
        ("ğ" . "{\\\\u{g}}")
        ("δ" . "$\\\\delta$")
@@ -194,15 +273,20 @@ This is defined in `jmax-bibtex-journal-abbreviations'."
        ("⇌" . "$\\\\leftrightharpoons$")
        ("×" . "$\\\\times$")
        ("°" . "$\\\\deg$")
+       ("ş" . "{\\\\c{s}}")
+       ("ı" . "i")                    ; I think this is a turkish i
        ;; I think these are non-ascii spaces. there seems to be more than one.
        (" " . " ")
        (" " . " ")
        ("–" . "-")
        ("−" . "-")
        ("–" . "-")
+       ("—" . "-")
        ("‘" . "'")
        ("’" . "'")
+       ("’" . "'")
        ("“" . "\"")
+       ("’" . "'")
        ("”" . "\"")))
 
 (defun jmax-replace-nonascii ()
@@ -215,11 +299,12 @@ This is defined in `jmax-bibtex-journal-abbreviations'."
     (dolist (char (mapcar (lambda (x) (car x)) jmax-nonascii-latex-replacements))
       (while (re-search-forward char nil t)
        (replace-match (cdr (assoc char jmax-nonascii-latex-replacements))))
-      (goto-char (point-min)))))
+      (goto-char (point-min))))
+  (save-buffer))
 
 (add-hook 'org-ref-clean-bibtex-entry-hook 'jmax-replace-nonascii)
 
-
+;; * Title case transformations
 (defvar jmax-lower-case-words
   '("a" "an" "on" "and" "for"
     "the" "of" "in")
@@ -257,7 +342,7 @@ all the title entries in articles."
        (setf (car words) (s-capitalize (car words))))
 
       (setq title (mapconcat 'identity words " "))
-      
+
       ;; Capitalize letters after a dash
       (while
          (string-match "[a-zA-Z]-\\([a-z]\\)" title start)
@@ -265,7 +350,7 @@ all the title entries in articles."
          (setf (substring title (match-beginning 1) (match-end 1))
                (format "%s" (upcase char)))
          (setq start (match-end 1))))
-           
+
       ;; this is defined in doi-utils
       (bibtex-set-field
        "title"
@@ -297,7 +382,7 @@ all the title entries in articles."
                         word
                       (s-downcase word)))
                   words))
-      
+
       ;; capitalize first word
       (setf (car words) (s-capitalize (car words)))
 
@@ -312,7 +397,7 @@ all the title entries in articles."
 ;;             (format "{%s}" (upcase char)))
                (format "%s" (upcase char)))
          (setq start (match-end 1))))
-           
+
       ;; this is defined in doi-utils
       (bibtex-set-field
        "title" title)
@@ -321,9 +406,7 @@ all the title entries in articles."
       (bibtex-clean-entry)
       (bibtex-fill-entry))))
 
-
-
-
+;; * Navigation in bibtex file
 (defun jmax-bibtex-next-entry (&optional n)
   "Jump to the beginning of the next bibtex entry.
 N is a prefix argument.  If it is numeric, jump that many entries
@@ -361,9 +444,9 @@ N is a prefix argument.  If it is numeric, jump that many entries back."
 ;; add to bibtex-mode-hook
 (add-hook 'bibtex-mode-hook 'jmax-bibtex-mode-keys)
 
-
+;; * Functions to act on an entry with a doi
 (defun jmax-bibtex-entry-doi ()
-  "get doi from entry at point"
+  "Get doi from entry at point."
   (interactive)
   (save-excursion
     (bibtex-beginning-of-entry)
@@ -371,56 +454,161 @@ N is a prefix argument.  If it is numeric, jump that many entries back."
 
 
 (defun jmax-bibtex-wos ()
-  "Open bibtex entry in Web Of Science if there is a DOI"
+  "Open bibtex entry in Web Of Science if there is a DOI."
   (interactive)
   (doi-utils-wos (jmax-bibtex-entry-doi)))
 
 
 (defun jmax-bibtex-wos-citing ()
-  "Open citing articles for bibtex entry in Web Of Science if there is a DOI"
+  "Open citing articles for bibtex entry in Web Of Science if there is a DOI."
   (interactive)
   (doi-utils-wos-citing (jmax-bibtex-entry-doi)))
 
 
 (defun jmax-bibtex-wos-related ()
-  "Open related articles for bibtex entry in Web Of Science if there is a DOI"
+  "Open related articles for bibtex entry in Web Of Science if there is a DOI."
   (interactive)
   (doi-utils-wos-related (jmax-bibtex-entry-doi)))
 
 
 (defun jmax-bibtex-wos-citing ()
-  "Open citing articles for bibtex entry in Web Of Science if there is a DOI"
+  "Open citing articles for bibtex entry in Web Of Science if there is a DOI."
   (interactive)
   (doi-utils-wos-citing (jmax-bibtex-entry-doi)))
 
 
 (defun jmax-bibtex-crossref ()
+  "Open the bibtex entry in Crossref by its doi."
   (interactive)
   (doi-utils-crossref (jmax-bibtex-entry-doi)))
 
 
 (defun jmax-bibtex-google-scholar ()
+  "Open the bibtex entry at point in google-scholar by its doi."
   (interactive)
   (doi-utils-google-scholar (jmax-bibtex-entry-doi)))
 
 
 (defun jmax-bibtex-pubmed ()
+  "Open the bibtex entry at point in Pubmed by its doi."
   (interactive)
   (doi-utils-pubmed (jmax-bibtex-entry-doi)))
 
+
 (defun jmax-bibtex-pdf (doi)
-  "thin wrapper to get `jmax-bibtex' to open pdf"
+  "Open the pdf for the bibtex entry at point.
+Thin wrapper to get `jmax-bibtex' to open pdf, because it calls
+functions with a DOI argument."
   (interactive)
   (org-ref-open-bibtex-pdf))
-  
 
 
+;; * Hydra menus
+;; ** Hydra menu for bibtex entries
+;; hydra menu for actions on bibtex entries
+(defhydra jmax-bibtex-hydra (:color blue)
+   "
+_p_: Open pdf     _y_: Copy key               _n_: New entry     _w_: WOS
+_b_: Open url     _f_: Copy formatted entry   _o_: Copy entry    _c_: WOS citing
+_r_: Refile entry _k_: Add keywords           _d_: delete entry  _a_: WOS related
+_e_: Email entry  _K_: Edit keywords          _L_: clean entry   _P_: Pubmed
+_U_: Update entry _N_: Open notes             _R_: Crossref      _g_: Google Scholar
+_s_: Sort entry   _a_: Remove nonascii        _h_: helm-bibtex   _q_: quit
+_u_: Update field _f_: file funcs
+"
+   ("p" org-ref-open-bibtex-pdf)
+   ("P" jmax-bibtex-pubmed)
+   ("w" jmax-bibtex-wos)
+   ("c" jmax-bibtex-wos-citing)
+   ("a" jmax-bibtex-wos-related)
+   ("R" jmax-bibtex-crossref)
+   ("g" jmax-bibtex-google-scholar)
+   ("n" jmax-bibtex-new-entry/body)
+   ("N" org-ref-open-bibtex-notes)
+   ("o" bibtex-copy-entry-as-kill)
+   ("d" bibtex-kill-entry)
+   ("L" org-ref-clean-bibtex-entry)
+   ("y" (kill-new  (bibtex-autokey-get-field "=key=")))
+   ("f" bibtex-copy-summary-as-kill)
+   ("k" helm-tag-bibtex-entry)
+   ("K" (lambda ()
+         (interactive)
+         (org-ref-set-bibtex-keywords
+          (read-input "Keywords: "
+                      (bibtex-autokey-get-field "keywords"))
+          t)))
+   ("b" org-ref-open-in-browser)
+   ("r" (lambda () (interactive)
+         (bibtex-beginning-of-entry)
+         (bibtex-kill-entry)
+         (find-file (ido-completing-read
+                     "Bibtex file: "
+                     (f-entries "." (lambda (f) (f-ext? f "bib")))))
+         (goto-char (point-max))
+         (bibtex-yank)
+         (save-buffer)
+         (kill-buffer)))
+   ("e" email-bibtex-entry)
+   ("U" (doi-utils-update-bibtex-entry-from-doi (jmax-bibtex-entry-doi)))
+   ("u" doi-utils-update-field)
+   ("f" jmax-bibtex-file/body)
+   ("h" helm-bibtex)
+   ("a" jmax-replace-nonascii)
+   ("s" org-ref-sort-bibtex-entry)
+   ("q" nil))
+
+;; create key-chord and key binding for hydra
+(when jmax-bibtex-hydra-key-chord
+  (key-chord-define-global
+   jmax-bibtex-hydra-key-chord
+   'jmax-bibtex-hydra/body))
+
+
+(when jmax-bibtex-hydra-key-binding
+  (global-set-key jmax-bibtex-hydra-key-binding 'jmax-bibtex-hydra/body))
+
+;; ** Hydra menu for new bibtex entries
+;; A hydra for adding new bibtex entries.
+(defhydra jmax-bibtex-new-entry (:color blue)
+  "New Bibtex entry:"
+  ("a" bibtex-Article "Article")
+  ("b" bibtex-Book "Book")
+  ("i" bibtex-InBook "In book")
+  ("l" bibtex-Booklet "Booklet")
+  ("P" bibtex-Proceedings "Proceedings")
+  ("p" bibtex-InProceedings "In proceedings")
+  ("m" bibtex-Misc "Misc.")
+  ("M" bibtex-Manual "Manual")
+  ("T" bibtex-PhdThesis "PhD Thesis")
+  ("t" bibtex-MastersThesis "MS Thesis")
+  ("R" bibtex-TechReport "Report")
+  ("u" bibtex-Unpublished "unpublished")
+  ("c" bibtex-InCollection "Article in collection")
+  ("q" nil "quit"))
+
+
+;; ** Hydra menu of functions to act on a bibtex file.
+(defhydra jmax-bibtex-file (:color blue)
+  "Bibtex file functions: "
+  ("v" bibtex-validate "Validate entries")
+  ("s" bibtex-sort-buffer "Sort entries")
+  ("r" bibtex-reformat "Reformat entries")
+  ("c" bibtex-count-entries "Count entries")
+  ("p" org-ref-build-full-bibliography "PDF bibliography"))
+
+
+;; * DEPRECATED bibtex menu
 (defvar jmax-bibtex-menu-funcs '()
- "Functions to run in doi menu. Each entry is a list of (key menu-name function). 
-The function must take one argument, the doi.")
+ "Functions to run in doi menu.
+Each entry is a list of (key menu-name function).  The function
+must take one argument, the doi.  This is somewhat deprecated, as
+I prefer the hydra interfaces above.")
 
 (setq jmax-bibtex-menu-funcs
       '(("p" "df" jmax-bibtex-pdf)
+       ("C" "opy" (lambda (doi)
+                    (kill-new (org-ref-bib-citation))
+                    (bury-buffer)))
        ("w" "os" doi-utils-wos)
        ("c" "iting articles" doi-utils-wos-citing)
        ("r" "elated articles" doi-utils-wos-related)
@@ -430,9 +618,11 @@ The function must take one argument, the doi.")
 
 (defun jmax-bibtex ()
   "Menu command to run in a bibtex entry.
-Functions from `jmax-bibtex-menu-funcs'."
-  
+Functions from `jmax-bibtex-menu-funcs'.  They all rely on the
+entry having a doi."
+
   (interactive)
+  ;; construct menu string as a message
   (message
    (concat
     (mapconcat
@@ -445,7 +635,7 @@ Functions from `jmax-bibtex-menu-funcs'."
                  (char-to-string input) jmax-bibtex-menu-funcs)))
     (when choice
       (funcall
-       (elt 
+       (elt
        choice
        2)
        (jmax-bibtex-entry-doi)
@@ -453,6 +643,7 @@ Functions from `jmax-bibtex-menu-funcs'."
 
 (defalias 'jb 'jmax-bibtex)
 
+;; * The end
 (provide 'jmax-bibtex)
 
 ;;; jmax-bibtex.el ends here