;;; 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, key-chord.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.")
(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
'()
("⇌" . "$\\\\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.
(" " . " ")
(" " . " ")
("—" . "-")
("‘" . "'")
("’" . "'")
+ ("’" . "'")
("“" . "\"")
("’" . "'")
("”" . "\"")))
(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")
(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
;; 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)
(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
-(require 'hydra)
-(require 'key-chord)
-(key-chord-define-global
- "jj"
- (defhydra jmax-bibtex-hydra (:color blue)
+(defhydra jmax-bibtex-hydra (:color blue)
"
_p_: Open pdf _y_: Copy key _n_: New entry _w_: WOS
-_u_: Open url _f_: Copy formatted entry _o_: Copy entry _c_: WOS citing
-_r_: Refile entry _k_: Add keywords _d_: delete entry _r_: WOS related
+_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)
- ("r" jmax-bibtex-wos-related)
+ ("a" jmax-bibtex-wos-related)
("R" jmax-bibtex-crossref)
("g" jmax-bibtex-google-scholar)
("n" jmax-bibtex-new-entry/body)
(read-input "Keywords: "
(bibtex-autokey-get-field "keywords"))
t)))
- ("u" org-ref-open-in-browser)
+ ("b" org-ref-open-in-browser)
("r" (lambda () (interactive)
(bibtex-beginning-of-entry)
(bibtex-kill-entry)
(save-buffer)
(kill-buffer)))
("e" email-bibtex-entry)
- ("U" (doi-utils-update-bibtex-entry-from-doi (jmax-bibtex-entry-doi)))))
+ ("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:"
("t" bibtex-MastersThesis "MS Thesis")
("R" bibtex-TechReport "Report")
("u" bibtex-Unpublished "unpublished")
- ("c" bibtex-InCollection "Article in collection"))
+ ("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)
(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)
(defalias 'jb 'jmax-bibtex)
+;; * The end
(provide 'jmax-bibtex)
;;; jmax-bibtex.el ends here