X-Git-Url: https://git.donarmstrong.com/?p=org-ref.git;a=blobdiff_plain;f=org-ref.org;h=0cd567a69a30a6119015fbfd1b43acbecc031239;hp=e59f91df88044c9559454985759c418b2008d90c;hb=b364e49eb183d660d9adb4267bc962b9e98183ae;hpb=6a424578cb6dc578f4b5a7898637ee3f8d651221 diff --git a/org-ref.org b/org-ref.org index e59f91d..0cd567a 100644 --- a/org-ref.org +++ b/org-ref.org @@ -3398,7 +3398,7 @@ Let us add keywords as a searchable field. (setq helm-bibtex-additional-search-fields '(keywords)) #+END_SRC -Next, we are going to add keywords to the helm interface. +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." @@ -3422,11 +3422,70 @@ Next, we are going to add keywords to the helm interface. #+END_SRC -1. Make the default action to insert selected keys. -2. Make open entry second action -#+BEGIN_SRC emacs-lisp :tangle org-ref.el -(defun org-ref-tag-entries (candidates) - "Set tags on selected entries." +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 &optional arg) + "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 of comma-separate keywords." + (interactive "sKeywords: \nP") + (bibtex-set-field + "keywords" + (if arg + ;; replace with arg + (if (listp keywords) + (mapconcat 'identity keywords ", ") + keywords) + ;; else concatentate + (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 @@ -3436,9 +3495,17 @@ Next, we are going to add keywords to the helm interface. "keywords" (concat keywords - "," (bibtex-autokey-get-field "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") (init . helm-bibtex-init) @@ -3453,7 +3520,7 @@ Next, we are going to add keywords to the helm interface. ("Insert BibTeX entry" . helm-bibtex-insert-bibtex) ("Attach PDF to email" . helm-bibtex-add-PDF-attachment) ("Edit notes" . helm-bibtex-edit-notes) - ("Tag entries" . org-ref-tag-entries) + ("Add keywords to entries" . org-ref-helm-tag-entries) )))) #+END_SRC