diff options
author | Nicolas Goaziou <n.goaziou@gmail.com> | 2012-08-26 23:32:46 +0200 |
---|---|---|
committer | Nicolas Goaziou <n.goaziou@gmail.com> | 2012-08-26 23:44:51 +0200 |
commit | 664132667b05d1e7d7c9c3466b341b1588784e42 (patch) | |
tree | 250fd3eb10bcec198eac3baff65e8ccd6ffb4899 | |
parent | 3404ac84ec933877bf78b7f821c26be89f5faca9 (diff) | |
download | org-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.el | 39 | ||||
-rw-r--r-- | testing/lisp/test-org.el | 39 |
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) |