summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRasmus <rasmus@gmx.us>2015-05-15 13:08:11 +0200
committerRasmus <rasmus@gmx.us>2015-05-21 00:21:34 +0200
commitaf6fdf30718158f2d3729a2ba2d407f7ab71b255 (patch)
tree4839d355363051524acf204b996fc4de1b749fc6
parent6ba251d4738b146b11b42499fdf6d966f120b82a (diff)
downloadorg-mode-af6fdf30718158f2d3729a2ba2d407f7ab71b255.tar.gz
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.
-rw-r--r--etc/ORG-NEWS3
-rwxr-xr-xlisp/org.el40
-rw-r--r--testing/lisp/test-org.el31
3 files changed, 61 insertions, 13 deletions
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 3803060..4ef8656 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 8a331c2..6ed8f76 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 7d09288..2f21c8e 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<point>- 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 :<point>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 "* <point>TODO H :tag:"
+ (org-return)
+ (buffer-string))))
+ (should
+ (equal "* TODO [#B] H :tag:\n"
+ (org-test-with-temp-text "* TODO<point> [#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] foo<point>bar :tag:"
+ (org-return)
+ (buffer-string)))))
+ ;; At bol of headline insert newline.
+ (should
+ (equal "\n* h"
+ (org-test-with-temp-text "<point>* h"
+ (org-return)
(buffer-string)))))
(ert-deftest test-org/meta-return ()