emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Ihor Radchenko <yantar92@posteo.net>
To: Anthony Carrico <acarrico@memebeam.org>
Cc: emacs-orgmode@gnu.org
Subject: [PATCH] Re: what is the purpose of "This link has already been stored"?
Date: Wed, 05 Jul 2023 10:19:41 +0000	[thread overview]
Message-ID: <87fs62acea.fsf@localhost> (raw)
In-Reply-To: <87h6qqwh23.fsf@localhost>

[-- Attachment #1: Type: text/plain, Size: 525 bytes --]

Ihor Radchenko <yantar92@posteo.net> writes:

> What Samuel described is a sequence of M-x org-store-link followed by
> M-x org-insert-all-links. With such workflow, user can expect that the
> links are going to be stored in order. If we are instead shuffle the
> stored links, M-x org-insert-all-links may result in unexpected
> behaviour.
>
> Currently, when link to place is already stored, not error is thrown, a
> message is displayed, no link is stored, and the stored link list is not
> altered.

Attaching the patch.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-org-store-link-Move-already-stored-link-to-front-by-.patch --]
[-- Type: text/x-patch, Size: 4498 bytes --]

From a05e2cc235b10a7096538da4f6ae6d17c82a6b25 Mon Sep 17 00:00:00 2001
Message-ID: <a05e2cc235b10a7096538da4f6ae6d17c82a6b25.1688552284.git.yantar92@posteo.net>
From: Ihor Radchenko <yantar92@posteo.net>
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 <samologist@gmail.com>
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


[-- Attachment #3: Type: text/plain, Size: 224 bytes --]


-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>

  parent reply	other threads:[~2023-07-05 10:20 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-28  1:35 what is the purpose of "This link has already been stored"? Samuel Wales
2023-06-28  9:32 ` Ihor Radchenko
2023-06-28 16:19   ` Anthony Carrico
2023-06-28 16:48     ` Ihor Radchenko
2023-06-28 23:59   ` Samuel Wales
2023-06-29  0:04     ` Samuel Wales
2023-06-29  0:07       ` Samuel Wales
2023-06-29 10:28         ` Ihor Radchenko
2023-06-29 13:02           ` Anthony Carrico
2023-06-29 13:09             ` Ihor Radchenko
2023-06-30  3:00               ` Samuel Wales
2023-06-30  3:26                 ` Samuel Wales
2023-07-05 10:19               ` Ihor Radchenko [this message]
2023-07-06  0:28                 ` [PATCH] " Samuel Wales
2023-07-15 12:35                 ` Ihor Radchenko
2023-07-21  4:13                   ` Samuel Wales
2023-07-21  7:46                     ` Ihor Radchenko
2023-08-06 18:47                 ` Bastien
2023-08-06 20:53                   ` Samuel Wales
2023-08-08  9:08                     ` Ihor Radchenko
2023-08-08  9:04                   ` Ihor Radchenko
2023-08-08 13:37                     ` Bastien Guerry
2023-08-11  9:31                       ` Ihor Radchenko
2023-08-13  9:34                         ` Bastien Guerry
2023-08-13 10:32                           ` Ihor Radchenko
2023-08-14  0:36                             ` Samuel Wales
2023-08-14 10:19                               ` Ihor Radchenko
2023-08-14 10:51                           ` Ihor Radchenko
2023-08-14 16:29                             ` Bastien Guerry
2023-08-15 10:55                               ` Ihor Radchenko
2023-08-16 13:20                                 ` Bastien Guerry
2023-07-01  4:48 ` org-insert-link completion by description (Re: what is the purpose of "This link has already been stored"?) Max Nikulin
2023-07-01  5:15   ` Samuel Wales
2023-07-01  5:26     ` Samuel Wales
2023-07-01  6:12     ` Max Nikulin
2023-07-02  3:29       ` Max Nikulin
2023-07-02  5:02         ` Samuel Wales
2023-07-02  5:52           ` Max Nikulin
2023-07-02  6:03             ` Samuel Wales
2023-07-03 14:56               ` Max Nikulin
2023-07-03 23:28                 ` Samuel Wales
2023-07-03 23:42                   ` Samuel Wales
2023-07-03 23:48                   ` Samuel Wales
2023-07-03 23:49                     ` Samuel Wales
2023-07-03 23:50                       ` Samuel Wales
2023-07-04  0:27                         ` Samuel Wales
2023-07-04  0:28                           ` Samuel Wales
2023-07-04  1:45                             ` Max Nikulin
2023-07-04  2:29                               ` Samuel Wales
2023-07-04  9:31                                 ` Ihor Radchenko
2023-07-05  0:10                                   ` Samuel Wales
2023-07-05 11:00                                     ` Ihor Radchenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87fs62acea.fsf@localhost \
    --to=yantar92@posteo.net \
    --cc=acarrico@memebeam.org \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).