X-Git-Url: https://git.donarmstrong.com/?p=org-ref.git;a=blobdiff_plain;f=org-ref.org;h=9665744c85bcf662ef33af3e9fa5de3cd738bb73;hp=6eac02944544b3df18d5d546d3ea307ec9e49e4c;hb=4b6c705cdc23015dcdbaba4cc0366b0a08db6693;hpb=34e438fd381bf6c0c9406700e78184590f1696cd diff --git a/org-ref.org b/org-ref.org index 6eac029..9665744 100644 --- a/org-ref.org +++ b/org-ref.org @@ -151,10 +151,11 @@ There are some variables needed later to tell this library where you store your (defcustom org-ref-cite-onclick-function 'org-ref-cite-click-helm - "Function that runs when you click on a cite link. The function must take no arguments. You may also use `org-ref-cite-onclick-minibuffer-menu' if you do not like helm." + "Function that runs when you click on a cite link. The function must take no arguments. You may also use `org-ref-cite-onclick-minibuffer-menu' if you do not like helm. If you like `hydra', consider using `org-ref-cite-hydra'." :type 'function :group 'org-ref) + (defcustom org-ref-show-citation-on-enter t "If non-nil add a hook function to show the citation summary in the minibuffer just by putting the cursor in a link" @@ -411,7 +412,7 @@ label:test (defcustom org-ref-label-color - "black" + "dark magenta" "Color of label links" :group 'org-ref) @@ -452,10 +453,16 @@ label:test "Face for ref links in org-ref.") -(when org-ref-colorize-links +(defun org-ref-colorize-links () + "Colorize org-ref links." + (hi-lock-mode 1) (highlight-regexp org-ref-cite-re 'org-ref-cite-face) (highlight-regexp org-ref-label-re 'org-ref-label-face) (highlight-regexp org-ref-ref-re 'org-ref-ref-face)) + + +(when org-ref-colorize-links + (add-hook 'org-mode-hook 'org-ref-colorize-links)) #+END_SRC #+RESULTS: @@ -1775,14 +1782,14 @@ We need some convenience functions to open act on the citation at point. These w (catch 'done (let ((url (bibtex-autokey-get-field "url"))) (when url - (browse-url url) + (browse-url (s-trim url)) (throw 'done nil))) (let ((doi (bibtex-autokey-get-field "doi"))) (when doi (if (string-match "^http" doi) (browse-url doi) - (browse-url (format "http://dx.doi.org/%s" doi))) + (browse-url (format "http://dx.doi.org/%s" (s-trim doi)))) (throw 'done nil)))))))) @@ -3386,8 +3393,112 @@ I like convenience. Here are some aliases for faster typing. * Helm interface [[https://github.com/tmalsburg/helm-bibtex][helm-bibtex]] is a very cool interface to bibtex files. Out of the box though, it is not super convenient for org-ref. Here, we modify it to make it fit our workflow and extend it where needed. +Let us add keywords as a searchable field. +#+BEGIN_SRC emacs-lisp +(setq helm-bibtex-additional-search-fields '(keywords)) +#+END_SRC + +Next, we are going to add keywords to the helm interface. This modifies the helm-bibtex function to add our keywords. +#+BEGIN_SRC emacs-lisp +(defun helm-bibtex-candidates-formatter (candidates source) + "Formats BibTeX entries for display in results list." + (cl-loop + with width = (with-helm-window (window-width)) + for entry in candidates + for entry = (cdr entry) + for entry-key = (helm-bibtex-get-value entry 'entry-key) + for fields = (--map (helm-bibtex-clean-string + (helm-bibtex-get-value entry it " ")) + '(author title year has-pdf has-note entry-type)) + for fields = (-update-at 0 'helm-bibtex-shorten-authors fields) + for fields = (append fields + (list (or (helm-bibtex-get-value entry 'keywords) + "" ))) + collect + (cons (s-format "$0 $1 $2 $3 $4$5 $6" 'elt + (-zip-with (lambda (f w) (truncate-string-to-width f w 0 ?\s)) + fields (list 36 (- width 85) 4 1 1 7 7))) + entry-key))) + +#+END_SRC + +Next, we add some functions to add keywords to a bibtex entry using a helm interface, and a new action to add keywords to entries from helm-bibtex. +#+BEGIN_SRC emacs-lisp +;; adapted from bibtex-utils.el +;; these are candidates for selecting keywords/tags +(defun org-ref-bibtex-keywords () + "Get keywords defined in current bibtex file. +These are in the keywords field, and are comma or semicolon separated." + (save-excursion + (goto-char (point-min)) + (let (keywords kstring) + (while (re-search-forward "^\\s-*keywords.*{\\([^}]+\\)}" nil t) + ;; TWS - remove newlines/multiple spaces: + (setq kstring (replace-regexp-in-string "[ \t\n]+" " " (match-string 1))) + (mapc + (lambda (v) + (add-to-list 'keywords v t)) + (split-string kstring "\\(,\\|;\\)[ \n]*\\|{\\|}" t))) + keywords))) + + +(defun org-ref-set-bibtex-keywords (keywords) + "Add KEYWORDS to a bibtex entry. +If KEYWORDS is a list, it is converted to a comma-separated string. The KEYWORDS are added to the beginning of the field. Otherwise KEYWORDS should be a string." + (interactive "sKeywords: ") + (bibtex-set-field + "keywords" + (concat + (if (listp keywords) + (mapconcat 'identity keywords ", ") + keywords) + (when (not (string= "" (bibtex-autokey-get-field "keywords"))) + (concat ", " (bibtex-autokey-get-field "keywords"))))) + (save-buffer)) + + +(defun helm-tag-bibtex-entry () + "Helm interface to add keywords to a bibtex entry. +Run this with the point in a bibtex entry." + (interactive) + (let ((keyword-source `((name . "Existing keywords") + (candidates . ,(org-ref-bibtex-keywords)) + (action . (lambda (candidate) + (org-ref-set-bibtex-keywords + (mapconcat + 'identity + (helm-marked-candidates) + ", ")))))) + (fallback-source `((name . "Add new keywords") + (dummy) + (action . (lambda (candidate) + (org-ref-set-bibtex-keywords helm-pattern) + ))))) + (helm :sources '(keyword-source fallback-source)))) + + +(defun org-ref-helm-tag-entries (candidates) + "Set tags on selected bibtex entries from helm-bibtex. +User is prompted for tags. This function is called from `helm-bibtex'." + (let ((keywords (read-input "Keywords (comma separated): "))) + (loop for key in (helm-marked-candidates) + do + (save-window-excursion + (helm-bibtex-show-entry key) + (bibtex-set-field + "keywords" + (concat + keywords + ", " (bibtex-autokey-get-field "keywords"))) + (save-buffer))))) +#+END_SRC + +Next, adapt the helm-bibtex source with these features: + 1. Make the default action to insert selected keys. 2. Make open entry second action +3. Add some features for adding keywords to bibtex entries. + #+BEGIN_SRC emacs-lisp :tangle org-ref.el (setq helm-source-bibtex '((name . "BibTeX entries") @@ -3398,11 +3509,12 @@ I like convenience. Here are some aliases for faster typing. ("Show entry" . helm-bibtex-show-entry) ("Open PDF file (if present)" . helm-bibtex-open-pdf) ("Open URL or DOI in browser" . helm-bibtex-open-url-or-doi) - ("Insert reference" . helm-bibtex-insert-reference) + ("Insert formatted 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) + ("Add keywords to entries" . org-ref-helm-tag-entries) )))) #+END_SRC @@ -3665,39 +3777,39 @@ This is a list of cons cells '((\"description\" . action)). The action function ** A hydra click interface I like hydra a lot. Here we define a hydra menu you might like for the link click action. -#+BEGIN_SRC emacs-lisp -(defhydra org-ref-cite-hydra (:color blue) - " -_p_: Open pdf _w_: WOS _g_: Google Scholar _s_: Copy citation to clipboard +#+BEGIN_SRC emacs-lisp :tangle org-ref.el +(when (featurep 'hydra) + (require 'hydra) + (setq hydra-is-helpful t) + + (defhydra org-ref-cite-hydra (:color blue) + " +_p_: Open pdf _w_: WOS _g_: Google Scholar _K_: Copy citation to clipboard _u_: Open url _r_: WOS related _P_: Pubmed _k_: Copy key to clipboard _n_: Open notes _c_: WOS citing _C_: Crossref _f_: Copy bibtex entry to file _o_: Open entry _e_: Email entry and pdf " - ("o" org-ref-open-citation-at-point nil) - ("p" org-ref-open-pdf-at-point nil) - ("n" org-ref-open-notes-at-point nil) - ("u" org-ref-open-url-at-point nil) - ("w" org-ref-wos-at-point nil) - ("r" org-ref-wos-related-at-point nil) - ("c" org-ref-wos-citing-at-point nil) - ("g" org-ref-google-scholar-at-point nil) - ("p" org-ref-pubmed-at-point nil) - ("C" org-ref-crossref-at-point nil) - ("s" org-ref-copy-entry-as-summary nil) - ("k" (progn - (kill-new - (car (org-ref-get-bibtex-key-and-file)))) nil) - ("f" org-ref-copy-entry-at-point-to-file nil) - - ("e" (save-excursion - (org-ref-open-citation-at-point) - (email-bibtex-entry)) nil)) + ("o" org-ref-open-citation-at-point nil) + ("p" org-ref-open-pdf-at-point nil) + ("n" org-ref-open-notes-at-point nil) + ("u" org-ref-open-url-at-point nil) + ("w" org-ref-wos-at-point nil) + ("r" org-ref-wos-related-at-point nil) + ("c" org-ref-wos-citing-at-point nil) + ("g" org-ref-google-scholar-at-point nil) + ("P" org-ref-pubmed-at-point nil) + ("C" org-ref-crossref-at-point nil) + ("K" org-ref-copy-entry-as-summary nil) + ("k" (progn + (kill-new + (car (org-ref-get-bibtex-key-and-file)))) nil) + ("f" org-ref-copy-entry-at-point-to-file nil) + + ("e" (save-excursion + (org-ref-open-citation-at-point) + (email-bibtex-entry)) nil))) #+END_SRC -#+RESULTS: -: org-ref-cite-hydra/body - -cite:oberhofer-2013-first * End of code #+BEGIN_SRC emacs-lisp :tangle org-ref.el (provide 'org-ref)