]> git.donarmstrong.com Git - org-ref.git/blobdiff - jmax-bibtex.el
string-to-int is a obsoleted function
[org-ref.git] / jmax-bibtex.el
index 33bfe88755e642995b44bac3fe8ec16d8cabb814..066c406f4114eb3f3ee5338b418739caa24b4bc9 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.")
@@ -156,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
   '()
@@ -185,6 +259,7 @@ This is defined in `jmax-bibtex-journal-abbreviations'."
        ("ú" .  "{\\\\'u}")
        ("ú" . "{\\\\'u}")
        ("š" . "{\\\\v{s}}")
+       ("ř"  . "{\\\\v{r}}")
        ("İ" . "{\\\\.I}")
        ("ğ" . "{\\\\u{g}}")
        ("δ" . "$\\\\delta$")
@@ -198,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 ()
@@ -219,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")
@@ -325,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
@@ -365,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)
@@ -375,54 +454,155 @@ 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-string "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)
@@ -438,7 +618,7 @@ 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'. They all rely on the
+Functions from `jmax-bibtex-menu-funcs'.  They all rely on the
 entry having a doi."
 
   (interactive)
@@ -463,6 +643,7 @@ entry having a doi."
 
 (defalias 'jb 'jmax-bibtex)
 
+;; * The end
 (provide 'jmax-bibtex)
 
 ;;; jmax-bibtex.el ends here