X-Git-Url: https://git.donarmstrong.com/?p=org-ref.git;a=blobdiff_plain;f=org-ref.org;h=73562e9f990125bc4d2f1d65bf160947b6cc2cea;hp=22cf65eb33096d11d0a2dc769acb44e40d3797d2;hb=236918d8c5dc176729b4720dd7e7a74e24a756af;hpb=c52f96fe6fae23ff9d73651395ce8699a82284d1 diff --git a/org-ref.org b/org-ref.org index 22cf65e..73562e9 100644 --- a/org-ref.org +++ b/org-ref.org @@ -1102,17 +1102,49 @@ Now, we can put all the labels together which will give us a list of candidates. Let us make a helm function to insert a label link. This will help you enter unique labels. #+BEGIN_SRC emacs-lisp :tangle org-ref.el (defun org-ref-helm-insert-label-link () - "Insert a label link. helm just shows you what labels already exist." + "Insert a label link. helm just shows you what labels already exist. +If you are on a label link, replace it." (interactive) (let* ((labels (org-ref-get-labels)) (cb (current-buffer))) (helm :sources `(((name . "Existing labels") (candidates . ,labels) + ;; default action is to open to the label (action . (lambda (label) ;; unfortunately I do not have markers here - (org-open-link-from-string (format "ref:%s" label))))) + (org-open-link-from-string (format "ref:%s" label)))) + ;; if you select a label, replace current one + (action . (lambda (label) + (switch-to-buffer ,cb) + (cond + ;; no prefix or on a link + ((equal helm-current-prefix-arg nil) + (let* ((object (org-element-context)) + (last-char (save-excursion + (goto-char (org-element-property :end object)) + (backward-char) + (if (looking-at " ") + " " + "")))) + (when (-contains? '("label") + (org-element-property :type object)) + ;; we are on a link, so replace it. + (setf + (buffer-substring + (org-element-property :begin object) + (org-element-property :end object)) + (concat + (replace-regexp-in-string + (org-element-property :path object) + label + (org-element-property :raw-link object)) + last-char))))) + ;; no prefix options defined + )))) + ;; no matching selection creates a new label ((name . "Create new label") (dummy) + ;; default action creates a new label (action . (lambda (label) (switch-to-buffer ,cb) (insert @@ -1145,17 +1177,21 @@ Another alternative ref insertion is to use helm. #+BEGIN_SRC emacs-lisp :tangle org-ref.el (defun org-ref-helm-insert-ref-link () "Helm menu to insert ref links to labels in the document. +If you are on link, replace with newly selected label. Use C-u to insert a different kind of ref link. -C-u C-u to replace the current ref with selection" +" (interactive) (let* ((labels (org-ref-get-labels)) (contexts (mapcar 'org-ref-get-label-context labels)) (cb (current-buffer))) - (helm :sources `(((name . "Available labels to ref") + (helm :input (thing-at-point 'word) + :sources `(((name . "Available labels to ref") (candidates . ,(loop for label in labels for context in contexts -;; we do some kludgy adding spaces and bars to make it "easier" to see in helm. + ;; we do some kludgy adding spaces + ;; and bars to make it "easier" to + ;; see in helm. collect (cons (concat label "\n" (mapconcat @@ -1164,15 +1200,38 @@ C-u C-u to replace the current ref with selection" (split-string context "\n") "\n" ) "\n\n") label))) + ;; default action to replace or insert ref link. (action . (lambda (label) (switch-to-buffer ,cb) (cond - ;; no prefix + ;; no prefix or on a link ((equal helm-current-prefix-arg nil) - (insert - (concat - "ref:" label))) + (let* ((object (org-element-context)) + (last-char (save-excursion + (goto-char (org-element-property :end object)) + (backward-char) + (if (looking-at " ") + " " + "")))) + (if (-contains? '("ref" "eqref" "pageref" "nameref") + (org-element-property :type object)) + ;; we are on a link, so replace it. + (setf + (buffer-substring + (org-element-property :begin object) + (org-element-property :end object)) + (concat + (replace-regexp-in-string + (org-element-property :path object) + label + (org-element-property :raw-link object)) + last-char)) + ;; insert a new link + (insert + (concat + "ref:" label)) + ))) ;; one prefix, alternate ref link ((equal helm-current-prefix-arg '(4)) (insert @@ -1181,29 +1240,7 @@ C-u C-u to replace the current ref with selection" (candidates . ("ref" "eqref" "pageref" "nameref")) (action . (lambda (x) x)))) ":" label))) - ;; two prefixes, replace current label - ((equal helm-current-prefix-arg '(16)) - ;; get link - (let* ((object (org-element-context)) - (last-char (save-excursion - (goto-char (org-element-property :end object)) - (backward-char) - (if (looking-at " ") - " " - "")))) - (setf - (buffer-substring - (org-element-property :begin object) - (org-element-property :end object)) - (concat - (replace-regexp-in-string - (org-element-property :path object) - label - (org-element-property :raw-link object)) - last-char)))))))))))) - - - + )))))))) #+END_SRC #+RESULTS: @@ -3147,7 +3184,13 @@ In the helm-bibtex buffer, C-u will give you a helm menu to select a new link ty C-u C-u will change the key at point to the selected keys. " - (let* ((object (org-element-context))) + (let* ((object (org-element-context)) + (last-char (save-excursion + (goto-char (org-element-property :end object)) + (backward-char) + (if (looking-at " ") + " " + "")))) (cond ;; case where we are in a link ((and (equal (org-element-type object) 'link) @@ -3172,7 +3215,7 @@ C-u C-u will change the key at point to the selected keys. (org-element-property :raw-link object) ) ;; replace space at end to avoid collapsing into next word. - " "))) + last-char))) (t (message "Not found")))) @@ -3204,11 +3247,19 @@ C-u C-u will change the key at point to the selected keys. (setq helm-bibtex-format-citation-functions '((org-mode . helm-bibtex-format-org-ref))) -(defun org-ref-helm-insert-cite-link () - "org-ref function to use helm on the bibliography defined in the org-file." - (interactive) - (let ((helm-bibtex-bibliography (org-ref-find-bibliography))) - (helm-bibtex))) +(defun org-ref-helm-insert-cite-link (arg) + "org-ref function to use helm-bibtex to insert a citation link. +With one prefix arg, insert a ref link. +With two prefix args, insert a label link." + (interactive "P") + (cond + ((equal arg nil) + (let ((helm-bibtex-bibliography (org-ref-find-bibliography))) + (helm-bibtex))) + ((equal arg '(4)) + (org-ref-helm-insert-ref-link)) + ((equal arg '(16)) + (org-ref-helm-insert-label-link)))) (require 'helm-bibtex)