#+END_SRC
Let us make a helm function to insert a label link. This will help you enter unique labels.
-#+BEGIN_SRC emacs-lisp
+#+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."
(interactive)
Another alternative ref insertion is to use helm.
-#+BEGIN_SRC emacs-lisp
+#+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.
-Use C-u to insert a different kind of ref link."
+If you are on link, replace with newly selected label.
+Use C-u to insert a different kind of ref link.
+"
(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
) "\n\n") label)))
(action . (lambda (label)
(switch-to-buffer ,cb)
- (insert
- (concat
- (if helm-current-prefix-arg
- (helm :sources '((name . "Ref link types")
- (candidates . ("ref" "eqref" "pageref" "nameref"))
- (action . (lambda (x) x))))
- "ref")
- ":" label)))))))))
+
+ (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 " ")
+ " "
+ ""))))
+ (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
+ (concat
+ (helm :sources '((name . "Ref link types")
+ (candidates . ("ref" "eqref" "pageref" "nameref"))
+ (action . (lambda (x) x))))
+ ":" label)))
+ ))))))))
+
+
+
#+END_SRC
#+RESULTS:
(insert (concat "," (mapconcat 'identity keys ","))))
;; double prefix, replace key at point
((equal helm-current-prefix-arg '(16))
- (message-box "Replacing %s with %s"
- (car (org-ref-get-bibtex-key-and-file))
- (mapconcat 'identity keys ","))
(setf (buffer-substring
(org-element-property :begin object)
(org-element-property :end object))
;; replace space at end to avoid collapsing into next word.
" ")))
(t
- (message-box "Not found"))))
+ (message "Not found"))))
;; We are next to a link, and we want to append
;; next to a link means one character back is on a link.
(-contains?
org-ref-cite-types
(org-element-property :type (org-element-context)))))
- ;;(message-box "at end of a link")
- ;; (goto-char (org-element-property :end object))
(while (looking-back " ") (backward-char))
(insert (concat "," (mapconcat 'identity keys ","))))