summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <n.goaziou@gmail.com>2012-08-26 23:32:46 +0200
committerNicolas Goaziou <n.goaziou@gmail.com>2012-08-26 23:44:51 +0200
commit664132667b05d1e7d7c9c3466b341b1588784e42 (patch)
tree250fd3eb10bcec198eac3baff65e8ccd6ffb4899
parent3404ac84ec933877bf78b7f821c26be89f5faca9 (diff)
downloadorg-mode-664132667b05d1e7d7c9c3466b341b1588784e42.tar.gz
Fix org-backward-element with point on first element in section
* lisp/org.el (org-backward-element): When called at the beginning of first element in section, the function shouldn't return an error but move point to headline or point-min instead. * testing/lisp/test-org.el: Add test.
-rw-r--r--lisp/org.el39
-rw-r--r--testing/lisp/test-org.el39
2 files changed, 47 insertions, 31 deletions
diff --git a/lisp/org.el b/lisp/org.el
index 4e19df8..b682fb6 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -21918,24 +21918,27 @@ Move to the next element at the same level, when possible."
"Move backward by one element.
Move to the previous element at the same level, when possible."
(interactive)
- (if (org-with-limited-levels (org-at-heading-p))
- ;; At an headline, move to the previous one, if any, or stay
- ;; here.
- (let ((origin (point)))
- (org-backward-heading-same-level 1)
- (unless (org-with-limited-levels (org-at-heading-p))
- (goto-char origin)
- (error "Cannot move further up")))
- (let* ((trail (org-element-at-point 'keep-trail))
- (elem (car trail))
- (prev-elem (nth 1 trail))
- (beg (org-element-property :begin elem)))
- (cond
- ;; Move to beginning of current element if point isn't there
- ;; already.
- ((/= (point) beg) (goto-char beg))
- ((not prev-elem) (error "Cannot move further up"))
- (t (goto-char (org-element-property :begin prev-elem)))))))
+ (cond ((bobp) (error "Cannot move further up"))
+ ((org-with-limited-levels (org-at-heading-p))
+ ;; At an headline, move to the previous one, if any, or stay
+ ;; here.
+ (let ((origin (point)))
+ (org-backward-heading-same-level 1)
+ (unless (org-with-limited-levels (org-at-heading-p))
+ (goto-char origin)
+ (error "Cannot move further up"))))
+ (t
+ (let* ((trail (org-element-at-point 'keep-trail))
+ (elem (car trail))
+ (prev-elem (nth 1 trail))
+ (beg (org-element-property :begin elem)))
+ (cond
+ ;; Move to beginning of current element if point isn't
+ ;; there already.
+ ((/= (point) beg) (goto-char beg))
+ (prev-elem (goto-char (org-element-property :begin prev-elem)))
+ ((org-before-first-heading-p) (goto-char (point-min)))
+ (t (org-back-to-heading)))))))
;;;###autoload
(defun org-up-element ()
diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el
index fdfd4ca..e7c090d 100644
--- a/testing/lisp/test-org.el
+++ b/testing/lisp/test-org.el
@@ -465,42 +465,55 @@ Outside."
(ert-deftest test-org/backward-element ()
"Test `org-backward-element' specifications."
- ;; 1. At BOB (modulo some white spaces): should error.
+ ;; 1. Should error at BOB.
(org-test-with-temp-text " \nParagraph."
- (org-skip-whitespace)
(should-error (org-backward-element)))
- ;; 2. Not at the beginning of an element: move at its beginning.
+ ;; 2. Should move at BOB when called on the first element in buffer.
+ (should
+ (org-test-with-temp-text "\n#+TITLE: test"
+ (progn (forward-line)
+ (org-backward-element)
+ (bobp))))
+ ;; 3. Not at the beginning of an element: move at its beginning.
(org-test-with-temp-text "Paragraph1.\n\nParagraph2."
(goto-line 3)
(end-of-line)
(org-backward-element)
(should (looking-at "Paragraph2.")))
- ;; 3. Headline tests.
+ ;; 4. Headline tests.
(org-test-with-temp-text "
* Head 1
** Head 1.1
*** Head 1.1.1
** Head 1.2"
- ;; 3.1. At an headline beginning: move to previous headline at the
+ ;; 4.1. At an headline beginning: move to previous headline at the
;; same level.
(goto-line 5)
(org-backward-element)
(should (looking-at "** Head 1.1"))
- ;; 3.2. At an headline beginning: move to parent headline if no
+ ;; 4.2. At an headline beginning: move to parent headline if no
;; headline at the same level.
(goto-line 3)
(org-backward-element)
(should (looking-at "* Head 1"))
- ;; 3.3. At the first top-level headline: should error.
+ ;; 4.3. At the first top-level headline: should error.
(goto-line 2)
(should-error (org-backward-element)))
- ;; 4. At beginning of first element inside a greater element:
+ ;; 5. At beginning of first element inside a greater element:
;; expected to move to greater element's beginning.
(org-test-with-temp-text "Before.\n#+BEGIN_CENTER\nInside.\n#+END_CENTER."
(goto-line 3)
(org-backward-element)
(should (looking-at "#\\+BEGIN_CENTER")))
- ;; 5. List tests.
+ ;; 6. At the beginning of the first element in a section: should
+ ;; move back to headline, if any.
+ (should
+ (org-test-with-temp-text "#+TITLE: test\n* Headline\n\nParagraph"
+ (progn (goto-char (point-max))
+ (beginning-of-line)
+ (org-backward-element)
+ (org-at-heading-p))))
+ ;; 7. List tests.
(org-test-with-temp-text "
- item1
@@ -516,19 +529,19 @@ Outside."
Outside."
- ;; 5.1. At beginning of sub-list: expected to move to the
+ ;; 7.1. At beginning of sub-list: expected to move to the
;; paragraph before it.
(goto-line 4)
(org-backward-element)
(should (looking-at "item1"))
- ;; 5.2. At an item in a list: expected to move at previous item.
+ ;; 7.2. At an item in a list: expected to move at previous item.
(goto-line 8)
(org-backward-element)
(should (looking-at " - sub2"))
(goto-line 12)
(org-backward-element)
(should (looking-at "- item1"))
- ;; 5.3. At end of list/sub-list: expected to move to list/sub-list
+ ;; 7.3. At end of list/sub-list: expected to move to list/sub-list
;; beginning.
(goto-line 10)
(org-backward-element)
@@ -536,7 +549,7 @@ Outside."
(goto-line 15)
(org-backward-element)
(should (looking-at "- item1"))
- ;; 5.4. At blank-lines before list end: expected to move to top
+ ;; 7.4. At blank-lines before list end: expected to move to top
;; item.
(goto-line 14)
(org-backward-element)