X-Git-Url: https://git.donarmstrong.com/?p=org-ref.git;a=blobdiff_plain;f=jmax-bibtex.el;h=066c406f4114eb3f3ee5338b418739caa24b4bc9;hp=3e932dcf3a1e4224a916d7ed4e08f4280884f157;hb=c0a019259256ee8189620264893c36f10ab1c672;hpb=76ef70aebe633f11444a59d89258dd6b52d7ffb5 diff --git a/jmax-bibtex.el b/jmax-bibtex.el index 3e932dc..066c406 100644 --- a/jmax-bibtex.el +++ b/jmax-bibtex.el @@ -1,10 +1,83 @@ ;;; jmax-bibtex.el --- jmax-bibtex utilities +;; Copyright(C) 2014 John Kitchin + +;; Author: John Kitchin +;; 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 '() @@ -199,6 +273,8 @@ 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. (" " . " ") (" " . " ") @@ -208,6 +284,7 @@ This is defined in `jmax-bibtex-journal-abbreviations'." ("—" . "-") ("‘" . "'") ("’" . "'") + ("’" . "'") ("“" . "\"") ("’" . "'") ("”" . "\""))) @@ -222,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") @@ -328,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 @@ -368,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) @@ -378,66 +454,73 @@ 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 -(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) @@ -451,10 +534,10 @@ _U_: Update entry _N_: Open notes _R_: Crossref _g_: Google Sch ("K" (lambda () (interactive) (org-ref-set-bibtex-keywords - (read-input "Keywords: " - (bibtex-autokey-get-field "keywords")) + (read-string "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) @@ -466,9 +549,25 @@ _U_: Update entry _N_: Open notes _R_: Crossref _g_: Google Sch (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:" @@ -484,12 +583,26 @@ _U_: Update entry _N_: Open notes _R_: Crossref _g_: Google Sch ("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) @@ -505,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) @@ -530,6 +643,7 @@ entry having a doi." (defalias 'jb 'jmax-bibtex) +;; * The end (provide 'jmax-bibtex) ;;; jmax-bibtex.el ends here