org-store-link: Move already stored link to front by default

* lisp/ol.el (org-link-store-existing): New customization controlling
how to deal with already stored links.
(org-store-link): Respect the new customization, allowing duplicates
to (1) be added anyway; (2) be ignored; (3) be moved to front of
`org-stored-links'.  The default is (3).
* etc/ORG-NEWS (~org-store-link~ now moves an already stored link to
front of the ~org-stored-links~): Document the breaking change.

Reported-by: Samuel Wales <samologist@gmail.com>
Link: https://list.orgmode.org/orgmode/CAJcAo8sjD3_FX5pFQ4git9wRDNM3bMqTgP-R5mM8zcf1B3mjPg@mail.gmail.com/
This commit is contained in:
Ihor Radchenko 2023-07-05 13:14:56 +03:00
parent 5e31dcdd9a
commit c0dbcf361e
No known key found for this signature in database
GPG Key ID: 6470762A7DA11D8B
2 changed files with 44 additions and 7 deletions

View File

@ -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"

View File

@ -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