From af6fdf30718158f2d3729a2ba2d407f7ab71b255 Mon Sep 17 00:00:00 2001 From: Rasmus Date: Fri, 15 May 2015 13:08:11 +0200 Subject: [PATCH] org.el: RET breaks headline text * org.el (org-return): RET breaks headline text. * test-org.el (test-org/return): Test org-return on headline text. * ORG-NEWS: Add entry on new org-return behavior. --- etc/ORG-NEWS | 3 +++ lisp/org.el | 40 ++++++++++++++++++++++++++++++---------- testing/lisp/test-org.el | 31 ++++++++++++++++++++++++++++--- 3 files changed, 61 insertions(+), 13 deletions(-) diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index 380306009..4ef865666 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -93,6 +93,9 @@ functions. The Org version of these functions skips over inline tasks *** ~org-element-context~ no longer return objects in keywords ~org-element-context~ used to return objects on some keywords, i.e., =TITLE=, =DATE= and =AUTHOR=. It now returns only the keyword. +*** Behavior of ~org-return~ changed +If point is before or after the headline title, insert newline without +changing the headline. ** Removed functions *** Removed function ~org-translate-time~ Use ~org-timestamp-translate~ instead. diff --git a/lisp/org.el b/lisp/org.el index 8a331c2f5..6ed8f762c 100755 --- a/lisp/org.el +++ b/lisp/org.el @@ -21185,16 +21185,36 @@ 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 (save-excursion - (beginning-of-line) - (looking-at org-todo-line-regexp)) - (match-beginning 3) - (>= (point) (match-beginning 3))) - ;; Point is on headline tags. Do not break them: add a newline - ;; after the headline instead. - (progn (org-show-entry) - (end-of-line) - (if indent (newline-and-indent) (newline))) + (if (and (not (bolp)) + (save-excursion (beginning-of-line) + (looking-at org-complex-heading-regexp))) + ;; At headline. + (let ((tags-column (when (match-beginning 5) + (save-excursion (goto-char (match-beginning 5)) + (current-column)))) + ;; Test if before or after headline title. + (string (when (not (or (< (point) + (or (match-end 3) + (match-end 2) + (save-excursion + (goto-char (match-beginning 4)) + (skip-chars-backward " \t") + (point)))) + (and (match-beginning 5) + (>= (point) (match-beginning 5))))) + ;; Point is on headline keywords, tags or cookies. Do not break + ;; them: add a newline after the headline instead. + (org-string-nw-p + (delete-and-extract-region (point) (match-end 4)))))) + ;; Adjust alignment of tags. + (when (and tags-column string) + (org-align-tags-here (if org-auto-align-tags + org-tags-column + tags-column))) + (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))) diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index 7d09288f6..2f21c8e3b 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -834,7 +834,7 @@ ;;; Editing (ert-deftest test-org/return () - "Test RET (`org-return') specifications." + "Test `org-return' specifications." ;; Regular test. (should (equal "Para\ngraph" @@ -878,12 +878,37 @@ (org-test-with-temp-text "- A\n- B" (org-return t) (buffer-string)))) - ;; Special case: on tags part of a headline, add a newline below it - ;; instead of breaking it. + ;; On tags part of a headline, add a newline below it instead of + ;; breaking it. (should (equal "* H :tag:\n" (org-test-with-temp-text "* H :tag:" (org-return) + (buffer-string)))) + ;; Before headline text, add a newline below it instead of breaking + ;; it. + (should + (equal "* TODO H :tag:\n" + (org-test-with-temp-text "* TODO H :tag:" + (org-return) + (buffer-string)))) + (should + (equal "* TODO [#B] H :tag:\n" + (org-test-with-temp-text "* TODO [#B] H :tag:" + (org-return) + (buffer-string)))) + ;; At headline text, break headline text but preserve tags. + (should + (equal "* TODO [#B] foo :tag:\nbar" + (let (org-auto-align-tags) + (org-test-with-temp-text "* TODO [#B] foobar :tag:" + (org-return) + (buffer-string))))) + ;; At bol of headline insert newline. + (should + (equal "\n* h" + (org-test-with-temp-text "* h" + (org-return) (buffer-string))))) (ert-deftest test-org/meta-return () -- 2.11.4.GIT