From d30093d4019d445b6b8d176837601bc3f712b190 Mon Sep 17 00:00:00 2001 From: Alexey Lebedeff Date: Wed, 12 Aug 2015 23:02:49 +0300 Subject: [PATCH] Make `org-return' follow links in headings again * org.el (org-return): Check for links first when `org-return-follows-link' is non-nil, before inserting any newlines. This patch restores order in which `org-return' perform actions (which was changed in a7e62499f2fe5c313567212ee90ff743c5e734a8). It is TINYCHANGE, because patch mostly consists of moving existing code around. --- lisp/org.el | 63 ++++++++++++++++++++++++------------------------ testing/lisp/test-org.el | 6 +++++ 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index e8643e1..d7ecf85 100755 --- a/lisp/org.el +++ b/lisp/org.el @@ -21287,7 +21287,28 @@ will not happen if point is in a table or on a \"dead\" object (e.g., within a comment). In these case, you need to use `org-open-at-point' directly." (interactive) - (if (and (not (bolp)) + (let* ((context (if org-return-follows-link (org-element-context) + (org-element-at-point))) + (type (org-element-type context))) + (cond + ;; In a table, call `org-table-next-row'. + ((or (and (eq type 'table) + (>= (point) (org-element-property :contents-begin context)) + (< (point) (org-element-property :contents-end context))) + (org-element-lineage context '(table-row table-cell) t)) + (org-table-justify-field-maybe) + (call-interactively #'org-table-next-row)) + ;; On a link or a timestamp but not on white spaces after it, + ;; call `org-open-line' if `org-return-follows-link' allows it. + ((and org-return-follows-link + (memq type '(link timestamp)) + (< (point) + (save-excursion (goto-char (org-element-property :end context)) + (skip-chars-backward " \t") + (point)))) + (call-interactively #'org-open-at-point)) + ;; Insert newline in heading, but preserve tags. + ((and (not (bolp)) (save-excursion (beginning-of-line) (looking-at org-complex-heading-regexp))) ;; At headline. @@ -21317,36 +21338,16 @@ object (e.g., within a comment). In these case, you need to use (end-of-line) (org-show-entry) (if indent (newline-and-indent) (newline)) - (and string (save-excursion (insert (org-trim string))))) - (let* ((context (if org-return-follows-link (org-element-context) - (org-element-at-point))) - (type (org-element-type context))) - (cond - ;; In a table, call `org-table-next-row'. - ((or (and (eq type 'table) - (>= (point) (org-element-property :contents-begin context)) - (< (point) (org-element-property :contents-end context))) - (org-element-lineage context '(table-row table-cell) t)) - (org-table-justify-field-maybe) - (call-interactively #'org-table-next-row)) - ;; On a link or a timestamp but not on white spaces after it, - ;; call `org-open-line' if `org-return-follows-link' allows it. - ((and org-return-follows-link - (memq type '(link timestamp)) - (< (point) - (save-excursion (goto-char (org-element-property :end context)) - (skip-chars-backward " \t") - (point)))) - (call-interactively #'org-open-at-point)) - ;; In a list, make sure indenting keeps trailing text within. - ((and indent - (not (eolp)) - (org-element-lineage context '(item))) - (let ((trailing-data - (delete-and-extract-region (point) (line-end-position)))) - (newline-and-indent) - (save-excursion (insert trailing-data)))) - (t (if indent (newline-and-indent) (newline))))))) + (and string (save-excursion (insert (org-trim string)))))) + ;; In a list, make sure indenting keeps trailing text within. + ((and indent + (not (eolp)) + (org-element-lineage context '(item))) + (let ((trailing-data + (delete-and-extract-region (point) (line-end-position)))) + (newline-and-indent) + (save-excursion (insert trailing-data)))) + (t (if indent (newline-and-indent) (newline)))))) (defun org-return-indent () "Goto next table row or insert a newline and indent. diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index 3a156b8..9fee787 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -893,6 +893,12 @@ (org-test-with-temp-text "Link [[target]] <>" (let ((org-return-follows-link nil)) (org-return)) (org-looking-at-p "<>"))) + ;; Link in heading should also be opened when `org-return-follows-link` is non-nil. + (should + (org-test-with-temp-text "* [[b][a]]\n* b" + (let ((org-return-follows-link t)) + (org-return)) + (org-looking-at-p "* b"))) ;; However, do not open link when point is in a table. (should (org-test-with-temp-text "| [[target]] |\n| between |\n| <> |" -- 2.1.4