Re: [O] org-store-link without having to press Enter?
Hi Bastien, Bastien wrote: > please test the attached patch against master. This fills my needs. Thanks! > It creates a new command `org-insert-last-stored-link' > bound to `C-c M-l'. > > You can use `C-2 C-c M-l' to insert the last two links. > > So the set of commands around inserting links would be: > > C-c l => store link (the suggested user binding) > C-c C-l => insert a link > C-c C-M-l => insert all links as a list > C-u C-c C-M-l => insert all links as a list and keep them > C-1 C-c C-M-l => insert the last stored link > C-c M-l => short for the previous keybinding > > I also find myself in this workflow: > > 1. collect various links through a session > 2. store the last one for a new task > 3. dump all links into some "read later" heading > > so I think this feature deserves to be in core. > > What do you and others think? Best regards, Seb -- Sebastien Vauban
Re: [O] org-store-link without having to press Enter?
Nick Dokos writes: >> What do you and others think? > > Much better! I've now pushed this patch in master. Sébastien, please test C-c M-l to insert the last stored link and let us know what you think. Thanks, -- Bastien
Re: [O] org-store-link without having to press Enter?
Nick Dokos writes: > Bastien writes: > >> 1. collect various links through a session >> 2. store the last one for a new task >> 3. dump all links into some "read later" heading >> >> so I think this feature deserves to be in core. >> >> What do you and others think? >> > > Much better! Thanks -- and thanks for fixing the typos in the patch. I'll wait for Sébastien's feedback on this and install the patch in master if it fits his needs. >> +(defun org-insert-last-stored-link (arg) >> + "Insert the last link stored in `org-stored-links'." > > Not sure whether it's worth adding a comment here: I had to experiment > a bit to > convince myself that an interactive call without a prefix arg passed 1 > as the value of arg. I found it unclear but that may be just > my ignorance. My (highly subjective) stand on this: people who will not read the code don't need to understand that the default ARG value will be 1, those who want to read the code also want to make the extra effort to understand why "p" makes the ARG default value to 1. This is fairly standard Elisp code :) -- Bastien
Re: [O] org-store-link without having to press Enter?
Bastien writes: > 1. collect various links through a session > 2. store the last one for a new task > 3. dump all links into some "read later" heading > > so I think this feature deserves to be in core. > > What do you and others think? > Much better! > > diff --git a/lisp/org.el b/lisp/org.el > index ecd84e9..85e7ce5 100644 > --- a/lisp/org.el > +++ b/lisp/org.el > @@ -9930,14 +9930,29 @@ This command can be called in any mode to insert a > link in Org-mode syntax." >(org-load-modules-maybe) >(org-run-like-in-org-mode 'org-insert-link)) > > -(defun org-insert-all-links (&optional keep) > - "Insert all links in `org-stored-links'." > +(defun org-insert-all-links (&optional keep not-as-list-item) > + "Insert all links in `org-stored-links'. > +When `keep' is non-nil, do not delete then link from `org-stored-links'. ^^^the > +When `not-as-list-item', insert the link directly, not as a list item." >(interactive "P") > - (let ((links (copy-sequence org-stored-links)) l) > -(while (setq l (if keep (pop links) (pop org-stored-links))) > - (insert "- ") > + (let ((org-keep-stored-link-after-insertion (equal keep '(4))) > + (links (copy-seq org-stored-links)) > + (cnt 1) l) > +(if (null org-stored-links) > + (message "No link to insert") > +(while (and (or (listp keep) (>= keep cnt)) > + (setq l (if (listp keep) > + (pop links) > + (pop org-stored-links > + (setq cnt (1+ cnt)) > + (unless not-as-list-item (insert "- ")) >(org-insert-link nil (car l) (or (cadr l) "")) > - (insert "\n" > + (unless not-as-list-item (insert "\n")) > + > +(defun org-insert-last-stored-link (arg) > + "Insert the last link stored in `org-stored-links'." Not sure whether it's worth adding a comment here: I had to experiment a bit to convince myself that an interactive call without a prefix arg passed 1 as the value of arg. I found it unclear but that may be just my ignorance. > + (interactive "p") > + (org-insert-all-links arg t)) > > (defun org-link-fontify-links-to-this-file () >"Fontify links to the current file in `org-stored-links'." > @@ -19198,6 +19213,7 @@ boundaries." > (org-defkey org-mode-map "\C-c\C-x\C-n" 'org-next-link) > (org-defkey org-mode-map "\C-c\C-x\C-p" 'org-previous-link) > (org-defkey org-mode-map "\C-c\C-l" 'org-insert-link) > +(org-defkey org-mode-map "\C-c\M-l" 'org-insert-last-stored-link) > (org-defkey org-mode-map "\C-c\C-\M-l" 'org-insert-all-links) > (org-defkey org-mode-map "\C-c\C-o" 'org-open-at-point) > (org-defkey org-mode-map "\C-c%"'org-mark-ring-push) Nick
Re: [O] org-store-link without having to press Enter?
Hi Sébastien, please test the attached patch against master. It creates a new command `org-insert-last-stored-link' bound to `C-c M-l'. You can use `C-2 C-c M-l' to insert the last two links. So the set of commands around inserting links would be: C-c l => store link (the suggested user binding) C-c C-l => insert a link C-c C-M-l => insert all links as a list C-u C-c C-M-l => insert all links as a list and keep them C-1 C-c C-M-l => insert the last stored link C-c M-l => short for the previous keybinding I also find myself in this workflow: 1. collect various links through a session 2. store the last one for a new task 3. dump all links into some "read later" heading so I think this feature deserves to be in core. What do you and others think? diff --git a/lisp/org.el b/lisp/org.el index ecd84e9..85e7ce5 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -9930,14 +9930,29 @@ This command can be called in any mode to insert a link in Org-mode syntax." (org-load-modules-maybe) (org-run-like-in-org-mode 'org-insert-link)) -(defun org-insert-all-links (&optional keep) - "Insert all links in `org-stored-links'." +(defun org-insert-all-links (&optional keep not-as-list-item) + "Insert all links in `org-stored-links'. +When `keep' is non-nil, do not delete then link from `org-stored-links'. +When `not-as-list-item', insert the link directly, not as a list item." (interactive "P") - (let ((links (copy-sequence org-stored-links)) l) -(while (setq l (if keep (pop links) (pop org-stored-links))) - (insert "- ") + (let ((org-keep-stored-link-after-insertion (equal keep '(4))) + (links (copy-seq org-stored-links)) + (cnt 1) l) +(if (null org-stored-links) + (message "No link to insert") +(while (and (or (listp keep) (>= keep cnt)) + (setq l (if (listp keep) + (pop links) + (pop org-stored-links + (setq cnt (1+ cnt)) + (unless not-as-list-item (insert "- ")) (org-insert-link nil (car l) (or (cadr l) "")) - (insert "\n" + (unless not-as-list-item (insert "\n")) + +(defun org-insert-last-stored-link (arg) + "Insert the last link stored in `org-stored-links'." + (interactive "p") + (org-insert-all-links arg t)) (defun org-link-fontify-links-to-this-file () "Fontify links to the current file in `org-stored-links'." @@ -19198,6 +19213,7 @@ boundaries." (org-defkey org-mode-map "\C-c\C-x\C-n" 'org-next-link) (org-defkey org-mode-map "\C-c\C-x\C-p" 'org-previous-link) (org-defkey org-mode-map "\C-c\C-l" 'org-insert-link) +(org-defkey org-mode-map "\C-c\M-l" 'org-insert-last-stored-link) (org-defkey org-mode-map "\C-c\C-\M-l" 'org-insert-all-links) (org-defkey org-mode-map "\C-c\C-o" 'org-open-at-point) (org-defkey org-mode-map "\C-c%"'org-mark-ring-push) -- Bastien
Re: [O] org-store-link without having to press Enter?
Hello Nick, Nick Dokos wrote: > Sebastien Vauban writes: >> >> I'd like to use org-store-link in a piece of code. However, it currently >> requires the user to select some link from a list of store links. > > I think you mean org-insert-link, right? Yes; you're right! >> If I always want to select the last one -- that is, the default >> option --, how can I bypass the required RET? >> >> I can do this: >> >> (execute-kbd-macro "\C-c\C-l\C-m") >> >> But I find it fragile because it relies on key bindings which could >> change in time. >> >> How could I do otherwise? > > I don't know if there is an API, but org-store-link just adds the link > info to the front of the list org-stored-links, so the last link added > is (car org-stored-links). Each element of org-stored-links is > a two-element list (link description). Both of these are strings > (possibly strings with text properties). > > So something like this might work: > > (let ((link (car org-stored-links))) > (insert (format "[[%s][%s]]" (car link) (cadr link > > at least for now... It's imo "better" than the keyboard macro but it's > still pretty low level and ugly. It does work. THANKS! -- I prefer it over my own version. I thought there could exist some way to (pre-)send the input to be read when prompted by a function. It seems not (I guess you'd have mentioned it otherwise...). I wonder as well how I could do the `execute-kbd-macro' if there wasn't a key bound to the command I'm interested in. I tried things like the following, with no success: (execute-kbd-macro "M-x org-insert-link\C-m") Best regards, Seb -- Sebastien Vauban
Re: [O] org-store-link without having to press Enter?
"Sebastien Vauban" writes: > Hello, > > I'd like to use org-store-link in a piece of code. However, it currently > requires the user to select some link from a list of store links. > I think you mean org-insert-link, right? > If I always want to select the last one -- that is, the default > option --, how can I bypass the required RET? > > I can do this: > > (execute-kbd-macro "\C-c\C-l\C-m") > > But I find it fragile because it relies on key bindings which could > change in time. > > How could I do otherwise? > I don't know if there is an API, but org-store-link just adds the link info to the front of the list org-stored-links, so the last link added is (car org-stored-links). Each element of org-stored-links is a two-element list (link description). Both of these are strings (possibly strings with text properties). So something like this might work: (let ((link (car org-stored-links))) (insert (format "[[%s][%s]]" (car link) (cadr link at least for now... It's imo "better" than the keyboard macro but it's still pretty low level and ugly. Nick
[O] org-store-link without having to press Enter?
Hello, I'd like to use org-store-link in a piece of code. However, it currently requires the user to select some link from a list of store links. If I always want to select the last one -- that is, the default option --, how can I bypass the required RET? I can do this: (execute-kbd-macro "\C-c\C-l\C-m") But I find it fragile because it relies on key bindings which could change in time. How could I do otherwise? Best regards, Seb -- Sebastien Vauban