Re: [BUG] C-c C-o on headline evaluates source code blocks with links inside [9.5.2 (release_9.5.2-25-gaf6f12 @ /home/ignacio/repos/emacs/lisp/org/)]
Ihor Radchenko writes: > This will skip links inside property drawers, for example. > Attaching an alternative patch. Applied onto main via 057df6cce. Best, Ihor
Re: [BUG] C-c C-o on headline evaluates source code blocks with links inside [9.5.2 (release_9.5.2-25-gaf6f12 @ /home/ignacio/repos/emacs/lisp/org/)]
Ignacio Casso writes: > 1) `org-open-at-point' with point in a source code block calls and used > to call `org-babel-open-src-block-result'. This is not documented on the > docstring, but happens at least since Emacs 27' org built-in version, > 9.4.4. Confirmed. > 3) `org-open-at-point' with point in a headline collects all org links > in the body of the entry and offers to select one and open it, or if > there was only one it opens it directly. Links are collected using a > regular expression, so they match links inside a source code block. For > the selected link, `org-open-at-point' moves the point to the link and > calls itself recursively. In old versions of org, that means that it > opened the link. But in new versions, that means it evaluates the source > code block. > > To reproduce this behavior, just copy the following entry into an org > buffer and type C-c C-o with point in the heading. It will evaluate the > source code block, instead of just messaging "No Links" as it would do > with a source code block without links. > > * Heading > #+begin_src emacs-lisp > (message "https://orgmode.org/manual/;) > #+end_src Confirmed. > The following patch should fix it: > > -(push (match-string 0) links)) > + (when (eq (org-element-type (org-element-context)) 'link) > + (push (match-string 0) links))) This will skip links inside property drawers, for example. Attaching an alternative patch. Best, Ihor >From ca6afac5d68a5e83af6d8078d09a163c34d62e2e Mon Sep 17 00:00:00 2001 Message-Id: From: Ihor Radchenko Date: Sat, 26 Mar 2022 16:08:57 +0800 Subject: [PATCH] org-open-at-point: Do not list links under headline that cannot be opened * lisp/org-element.el (org-element-context): Do not alter match-data. * lisp/org.el (org-open-at-point): Update docstring listing that `org-open-at-point' opens src-blocks and citations. (org-offer-links-in-entry): Do not display links within invalid contexts. Reported in https://list.orgmode.org/paxpr06mb77609e8c8e769cd7d769fa4bc6...@paxpr06mb7760.eurprd06.prod.outlook.com/ --- lisp/org-element.el | 211 ++-- lisp/org.el | 13 ++- 2 files changed, 117 insertions(+), 107 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index 28339c1b8..c2ca9c62c 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -7770,113 +7770,114 @@ (defun org-element-context ( element) Providing it allows for quicker computation." (catch 'objects-forbidden (org-with-wide-buffer - (let* ((pos (point)) - (element (or element (org-element-at-point))) - (type (org-element-type element)) - (post (org-element-property :post-affiliated element))) - ;; If point is inside an element containing objects or - ;; a secondary string, narrow buffer to the container and - ;; proceed with parsing. Otherwise, return ELEMENT. - (cond - ;; At a parsed affiliated keyword, check if we're inside main - ;; or dual value. - ((and post (< pos post)) - (beginning-of-line) - (let ((case-fold-search t)) (looking-at org-element--affiliated-re)) - (cond - ((not (member-ignore-case (match-string 1) + (save-match-data + (let* ((pos (point)) + (element (or element (org-element-at-point))) + (type (org-element-type element)) + (post (org-element-property :post-affiliated element))) + ;; If point is inside an element containing objects or + ;; a secondary string, narrow buffer to the container and + ;; proceed with parsing. Otherwise, return ELEMENT. + (cond + ;; At a parsed affiliated keyword, check if we're inside main + ;; or dual value. + ((and post (< pos post)) + (beginning-of-line) + (let ((case-fold-search t)) (looking-at org-element--affiliated-re)) + (cond + ((not (member-ignore-case (match-string 1) org-element-parsed-keywords)) - (throw 'objects-forbidden element)) - ((< (match-end 0) pos) - (narrow-to-region (match-end 0) (line-end-position))) - ((and (match-beginning 2) - (>= pos (match-beginning 2)) - (< pos (match-end 2))) - (narrow-to-region (match-beginning 2) (match-end 2))) + (throw 'objects-forbidden element)) + ((< (match-end 0) pos) + (narrow-to-region (match-end 0) (line-end-position))) + ((and (match-beginning 2) + (>= pos (match-beginning 2)) + (< pos (match-end 2))) + (narrow-to-region (match-beginning 2) (match-end 2))) + (t (throw 'objects-forbidden element))) + ;; Also change type to retrieve correct restrictions. + (setq type 'keyword)) + ;; At an item, objects can only be located within tag, if any. + ((eq type 'item) + (let ((tag (org-element-property :tag element))) + (if (or (not tag) (/= (line-beginning-position) post)) + (throw 'objects-forbidden element) + (beginning-of-line) + (search-forward tag (line-end-position)) + (goto-char
Re: [BUG] C-c C-o on headline evaluates source code blocks with links inside [9.5.2 (release_9.5.2-25-gaf6f12 @ /home/ignacio/repos/emacs/lisp/org/)]
> The following patch should fix it: > > [4. patch --- text/x-diff; 0001-fixed-bug.patch] > From bc5092fdef512280b7d7d3aa04f1ba887360a759 Mon Sep 17 00:00:00 2001 > From: Ignacio > Date: Thu, 24 Mar 2022 01:15:44 +0100 > Subject: [PATCH] fixed bug > > --- > lisp/org/org.el | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/lisp/org/org.el b/lisp/org/org.el > index 67c8f1cedf..0fff28af81 100644 > --- a/lisp/org/org.el > +++ b/lisp/org/org.el > @@ -9063,7 +9063,8 @@ org-offer-links-in-entry >(org-back-to-heading t) >(setq end (save-excursion (outline-next-heading) (point))) >(while (re-search-forward org-link-any-re end t) > -(push (match-string 0) links)) > + (when (eq (org-element-type (org-element-context)) 'link) > + (push (match-string 0) links))) >(setq links (org-uniquify (reverse links > (cond > ((null links) Actually, this fix would suffer from the same problem as the fix for the issue of org-agenda recognizing timestamps inside source code blocks, and now links inside property drawers would no longer be opened using C-c C-o with point on the headline. So if we want to preserve that behavior the new lines should probably be (when (memq (org-element-type (org-element-context)) '(link node-property)) (push (match-string 0) links)) or something like that, with probably more element types in the list beside link and node-property.
[BUG] C-c C-o on headline evaluates source code blocks with links inside [9.5.2 (release_9.5.2-25-gaf6f12 @ /home/ignacio/repos/emacs/lisp/org/)]
Hello, The recent threads about timestamps inside property drawers, which mentioned the issue of timestamps and links being recognized in contexts where they should not, had me experimenting a bit, and I found the following bug (point 3) which was probably introduced by some change regarding those issues: 1) `org-open-at-point' with point in a source code block calls and used to call `org-babel-open-src-block-result'. This is not documented on the docstring, but happens at least since Emacs 27' org built-in version, 9.4.4. 2) `org-open-at-point' with point in a link inside a source code block also calls `org-babel-open-src-block-result' since at least org version 9.4.4. However I think that back when I was using Emacs 26, with org-builtin version 9.1.9 or so, it opened the link. I think that when that was fixed, the bug in 3) was introduced. 3) `org-open-at-point' with point in a headline collects all org links in the body of the entry and offers to select one and open it, or if there was only one it opens it directly. Links are collected using a regular expression, so they match links inside a source code block. For the selected link, `org-open-at-point' moves the point to the link and calls itself recursively. In old versions of org, that means that it opened the link. But in new versions, that means it evaluates the source code block. To reproduce this behavior, just copy the following entry into an org buffer and type C-c C-o with point in the heading. It will evaluate the source code block, instead of just messaging "No Links" as it would do with a source code block without links. * Heading #+begin_src emacs-lisp (message "https://orgmode.org/manual/;) #+end_src The following patch should fix it: >From bc5092fdef512280b7d7d3aa04f1ba887360a759 Mon Sep 17 00:00:00 2001 From: Ignacio Date: Thu, 24 Mar 2022 01:15:44 +0100 Subject: [PATCH] fixed bug --- lisp/org/org.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/org/org.el b/lisp/org/org.el index 67c8f1cedf..0fff28af81 100644 --- a/lisp/org/org.el +++ b/lisp/org/org.el @@ -9063,7 +9063,8 @@ org-offer-links-in-entry (org-back-to-heading t) (setq end (save-excursion (outline-next-heading) (point))) (while (re-search-forward org-link-any-re end t) - (push (match-string 0) links)) + (when (eq (org-element-type (org-element-context)) 'link) + (push (match-string 0) links))) (setq links (org-uniquify (reverse links (cond ((null links) -- 2.25.1 Emacs : GNU Emacs 29.0.50 (build 15, x86_64-pc-linux-gnu, GTK+ Version 3.24.20, cairo version 1.16.0) of 2022-03-23 Package: Org mode version 9.5.2 (release_9.5.2-25-gaf6f12 @ /home/ignacio/repos/emacs/lisp/org/)