diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index a4725ae8c..d75efdeda 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -13,6 +13,21 @@ Please send Org bug reports to mailto:emacs-orgmode@gnu.org. * Version 9.7 (not released yet) ** Important announcements and breaking changes +*** ~org-store-link~ now moves an already stored link to front of the ~org-stored-links~ + +Previously, when the link to be stored were stored already, +~org-store-link~ displayed a message and did nothing. + +Now, ~org-store-link~ moves the stored link to front of the list of +stored links. This way, the link will show up first in the completion +and when inserting all the stored links with ~org-insert-all-links~. + +The new behavior is controlled by new customization ~org-link-store-existing~. + +Users can set ~org-link-store-existing~ to nil to revert previous +defaults. The value of =store-duplicate= will force duplicate links +in ~org-stored-links~. The default value is =move-to-front=. + *** Major changes and additions to Org API **** New term: "syntax node" diff --git a/lisp/ol.el b/lisp/ol.el index 6dd7e0fa1..3a8ca5f39 100644 --- a/lisp/ol.el +++ b/lisp/ol.el @@ -509,6 +509,20 @@ links more efficient." :type 'boolean :safe #'booleanp) +(defcustom org-link-store-existing 'move-to-front + "Variable controlling how to deal with already stored links. +When nil, ignore store request for an already stored link. +When symbol `move-to-front', move the stored link to the front of +`org-stored-links'. +When symbol `store-duplicate', add a duplicate in front." + :group 'org-link-store + :type '(choice + (const :tag "Do no store duplicate" nil) + (const :tag "Move stored duplicate to front" move-to-front) + (const :tag "Store duplicate" store-duplicate)) + :safe #'symbolp + :package-version '(Org . "9.7")) + ;;; Public variables (defconst org-target-regexp (let ((border "[^<>\n\r \t]")) @@ -1749,16 +1763,24 @@ non-nil." ;; Store and return the link (if (not (and interactive? link)) (or agenda-link (and link (org-link-make-string link desc))) - (if (member (list link desc) org-stored-links) - (message "This link has already been stored") - (push (list link desc) org-stored-links) - (message "Stored: %s" (or desc link)) + (dotimes (_ (if custom-id 2 1)) ; Store 2 links when CUSTOM-ID is non-nil. + (pcase org-link-store-existing + ((or `store-duplicate + (guard (not (member (list link desc) org-stored-links)))) + (push (list link desc) org-stored-links) + (message "Stored: %s" (or desc link))) + ((or`nil (guard (equal (list link desc) (car org-stored-links)))) + (message "This link has already been stored")) + (`move-to-front + (setq org-stored-links + (delete (list link desc) org-stored-links)) + (push (list link desc) org-stored-links) + (message "Link moved to front: %s" (or desc link)))) (when custom-id (setq link (concat "file:" (abbreviate-file-name - (buffer-file-name (buffer-base-buffer))) - "::#" custom-id)) - (push (list link desc) org-stored-links))) + (buffer-file-name (buffer-base-buffer))) + "::#" custom-id)))) (car org-stored-links))))) ;;;###autoload