|
|
- ;;; helm-bibtex.el --- A bibliography manager based on Helm
-
- ;; Author: Titus von der Malsburg <malsburg@posteo.de>
- ;; Maintainer: Titus von der Malsburg <malsburg@posteo.de>
- ;; Version: 2.0.0
- ;; Package-Requires: ((helm "1.5.5") (parsebib "1.0") (s "1.9.0") (dash "2.6.0") (f "0.16.2") (cl-lib "0.5") (biblio "0.2"))
-
- ;; 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 3 of the License, 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. If not, see <http://www.gnu.org/licenses/>.
-
- ;;; Commentary:
-
- ;; A bibliography manager for Emacs, based on Helm and the
- ;; bibtex-completion backend.
- ;;
- ;; News:
- ;; - 09/06/2018: Added virtual APA field `author-or-editor` for use in
- ;; notes templates.
- ;; - 02/06/2018: Reload bibliography proactively when bib files are
- ;; changed.
- ;; - 21/10/2017: Added support for multiple PDFs and other file
- ;; types. See `bibtex-completion-pdf-extension' and
- ;; `bibtex-completion-find-additional-pdfs' for details.
- ;; - 10/10/2017: Added support for ~@string~ constants.
- ;; - 02/10/2017: Date field is used when year is undefined.
- ;; - 29/09/2017: BibTeX entry, citation macro, or org-bibtex entry at
- ;; point, will be pre-selected in helm-bibtex and ivy-bibtex giving
- ;; quick access to PDFs and other functions.
- ;;
- ;; See NEWS.org for old news.
- ;;
- ;; Key features:
- ;; - Quick access to your bibliography from within Emacs
- ;; - Powerful search capabilities
- ;; - Provides instant search results as you type
- ;; - Tightly integrated with LaTeX authoring, emails, Org mode, etc.
- ;; - Open the PDFs, URLs, or DOIs associated with an entry
- ;; - Insert LaTeX cite commands, Ebib links, or Pandoc citations,
- ;; BibTeX entries, or plain text references at point, attach PDFs to
- ;; emails
- ;; - Support for note taking
- ;; - Quick access to online bibliographic databases such as Pubmed,
- ;; arXiv, Google Scholar, Library of Congress, etc.
- ;; - Imports BibTeX entries from CrossRef and other sources.
- ;;
- ;; See the github page for details:
- ;;
- ;; https://github.com/tmalsburg/helm-bibtex
-
- ;;; Install:
-
- ;; Put this file in a directory included in your load path or install
- ;; helm-bibtex from MELPA (preferred). Then add the following in your
- ;; Emacs startup file:
- ;;
- ;; (require 'helm-bibtex)
- ;;
- ;; Alternatively, you can use autoload:
- ;;
- ;; (autoload 'helm-bibtex "helm-bibtex" "" t)
- ;;
- ;; Requirements are parsebib, helm, s, dash, and f. The easiest way
- ;; to install these packages is through MELPA. Make sure helm is
- ;; properly configured (see
- ;; https://github.com/emacs-helm/helm#install-from-emacs-packaging-system).
- ;;
- ;; Let helm-bibtex know where it can find your bibliography by setting
- ;; the variable `bibtex-completion-bibliography'. See the manual for
- ;; more details:
- ;;
- ;; https://github.com/tmalsburg/helm-bibtex#minimal-configuration
-
- ;;; Usage:
-
- ;; You can search entries using the command `helm-bibtex'. Select an
- ;; entry and press TAB to access all available actions. At the end of
- ;; the list of matches you find some dummy entries that can be used
- ;; for searching in online databases. Apart from that, familiarize
- ;; yourself with Helm. It's more powerful that you might think.
-
- ;;; Code:
-
- (require 'helm)
- (require 'helm-net)
- (require 'helm-easymenu)
- (require 'bibtex-completion)
-
- ;; Silence the byte compiler
- (eval-when-compile (defvar helm-bibtex-local-bib))
-
- ;; The following allows people to continue using their old helm-bibtex
- ;; configurations:
-
- (cl-loop
- for var in '("bibliography" "library-path" "pdf-open-function"
- "pdf-symbol" "format-citation-functions" "notes-path"
- "notes-template-multiple-files"
- "notes-template-one-file" "notes-key-pattern"
- "notes-extension" "notes-symbol" "fallback-options"
- "browser-function" "additional-search-fields"
- "no-export-fields" "cite-commands"
- "cite-default-command"
- "cite-prompt-for-optional-arguments"
- "cite-default-as-initial-input" "pdf-field")
- for oldvar = (intern (concat "helm-bibtex-" var))
- for newvar = (intern (concat "bibtex-completion-" var))
- do
- (define-obsolete-variable-alias oldvar newvar "2016-03-20"))
-
- ;; Helm-specific configurations:
-
- (defcustom helm-bibtex-full-frame t
- "Non-nil means open `helm-bibtex' using the entire window.
- When nil, the window will split below."
- :group 'bibtex-completion
- :type 'boolean)
-
- (easy-menu-add-item nil '("Tools" "Helm" "Tools") ["BibTeX" helm-bibtex t])
-
- ;; Candidate formatter:
-
- ;; The function `window-width' does not necessarily report the correct
- ;; number of characters that fit on a line. This is a
- ;; work-around. See also this bug report:
- ;; http://debbugs.gnu.org/cgi/bugreport.cgi?bug=19395
- (defun helm-bibtex-window-width ()
- "Return the width of the window to pass to `helm-bibtex-candidates-formatter'."
- (1- (window-body-width)))
-
- (defun helm-bibtex-candidates-formatter (candidates _)
- "Format CANDIDATES for display in helm."
- (cl-loop
- with width = (with-helm-window (helm-bibtex-window-width))
- for entry in candidates
- for entry = (cdr entry)
- for entry-key = (bibtex-completion-get-value "=key=" entry)
- collect (cons (bibtex-completion-format-entry entry width) entry-key)))
-
- ;; Warp bibtex-completion actions with some helm-specific code:
-
- (defmacro helm-bibtex-helmify-action (action name)
- "Wrap ACTION in another function NAME.
- Then pass the candidates marked in helm to ACTION. Also uses
- `with-helm-current-buffer' such that when ACTION inserts text it
- comes out in the right buffer."
- `(defun ,name (_)
- (let ((keys (helm-marked-candidates :with-wildcard t)))
- (with-helm-current-buffer
- (,action keys)))))
-
- (helm-bibtex-helmify-action bibtex-completion-open-pdf helm-bibtex-open-pdf)
- (helm-bibtex-helmify-action bibtex-completion-open-url-or-doi helm-bibtex-open-url-or-doi)
- (helm-bibtex-helmify-action bibtex-completion-open-any helm-bibtex-open-any)
- (helm-bibtex-helmify-action bibtex-completion-insert-citation helm-bibtex-insert-citation)
- (helm-bibtex-helmify-action bibtex-completion-insert-reference helm-bibtex-insert-reference)
- (helm-bibtex-helmify-action bibtex-completion-insert-key helm-bibtex-insert-key)
- (helm-bibtex-helmify-action bibtex-completion-insert-bibtex helm-bibtex-insert-bibtex)
- (helm-bibtex-helmify-action bibtex-completion-add-PDF-attachment helm-bibtex-add-PDF-attachment)
- (helm-bibtex-helmify-action bibtex-completion-edit-notes helm-bibtex-edit-notes)
- (helm-bibtex-helmify-action bibtex-completion-show-entry helm-bibtex-show-entry)
- (helm-bibtex-helmify-action bibtex-completion-add-pdf-to-library helm-bibtex-add-pdf-to-library)
-
- ;; Helm sources:
-
- (defvar helm-source-bibtex
- (helm-build-sync-source "BibTeX entries"
- :header-name (lambda (name)
- (format "%s%s: " name (if helm-bibtex-local-bib " (local)" "")))
- :candidates 'helm-bibtex-candidates
- :filtered-candidate-transformer 'helm-bibtex-candidates-formatter
- :action (helm-make-actions
- "Open PDF, URL or DOI" 'helm-bibtex-open-any
- "Open URL or DOI in browser" 'helm-bibtex-open-url-or-doi
- "Insert citation" 'helm-bibtex-insert-citation
- "Insert 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
- "Show entry" 'helm-bibtex-show-entry
- "Add PDF to library" 'helm-bibtex-add-pdf-to-library))
- "Source for searching in BibTeX files.")
-
- (defvar helm-source-fallback-options
- '((name . "Fallback options")
- (match (lambda (_candidate) t))
- (candidates . bibtex-completion-fallback-candidates)
- (no-matchplugin)
- (nohighlight)
- (action . (lambda (candidate) (bibtex-completion-fallback-action candidate helm-pattern))))
- "Source for online look-up.")
-
- ;; Helm-bibtex command:
-
- ;;;###autoload
- (defun helm-bibtex (&optional arg local-bib input)
- "Search BibTeX entries.
-
- With a prefix ARG, the cache is invalidated and the bibliography
- reread.
-
- If LOCAL-BIB is non-nil, display that the BibTeX entries are read
- from the local bibliography. This is set internally by
- `helm-bibtex-with-local-bibliography'.
-
- If INPUT is non-nil and a string, that value is going to be used
- as a predefined search term. Can be used to define functions for
- frequent searches (e.g. your own publications)."
- (interactive "P")
- (when arg
- (bibtex-completion-clear-cache))
- (bibtex-completion-init)
- (let* ((candidates (bibtex-completion-candidates))
- (key (bibtex-completion-key-at-point))
- (preselect (and key
- (cl-position-if (lambda (cand)
- (member (cons "=key=" key)
- (cdr cand)))
- candidates))))
- (helm :sources (list helm-source-bibtex helm-source-fallback-options)
- :full-frame helm-bibtex-full-frame
- :buffer "*helm bibtex*"
- :input input
- :preselect (lambda ()
- (and preselect
- (> preselect 0)
- (helm-next-line preselect)))
- :candidate-number-limit (max 500 (1+ (or preselect 0)))
- :bibtex-candidates candidates
- :bibtex-local-bib local-bib)))
-
- ;;;###autoload
- (defun helm-bibtex-with-local-bibliography (&optional arg)
- "Search BibTeX entries with local bibliography.
-
- With a prefix ARG the cache is invalidated and the bibliography
- reread."
- (interactive "P")
- (let* ((local-bib (bibtex-completion-find-local-bibliography))
- (bibtex-completion-bibliography (or local-bib
- bibtex-completion-bibliography)))
- (helm-bibtex arg local-bib)))
-
- (provide 'helm-bibtex)
-
- ;; Local Variables:
- ;; byte-compile-warnings: (not cl-functions obsolete)
- ;; coding: utf-8
- ;; indent-tabs-mode: nil
- ;; End:
-
- ;;; helm-bibtex.el ends here
|