From a05e2cc235b10a7096538da4f6ae6d17c82a6b25 Mon Sep 17 00:00:00 2001 Message-ID: From: Ihor Radchenko Date: Wed, 5 Jul 2023 13:14:56 +0300 Subject: [PATCH] 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 Link: https://list.orgmode.org/orgmode/CAJcAo8sjD3_FX5pFQ4git9wRDNM3bMqTgP-R5mM8zcf1B3mjPg@mail.gmail.com/ --- etc/ORG-NEWS | 15 +++++++++++++++ lisp/ol.el | 36 +++++++++++++++++++++++++++++------- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index d04e92275..288d50842 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 @@ (defcustom org-link-keep-stored-after-insertion nil :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 @@ (defun org-store-link (arg &optional interactive?) ;; 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 -- 2.41.0