Fix behavior of `org-forward/backward-h-s-l' before first headline
authorBastien Guerry <bzg@altern.org>
Tue, 1 Jan 2013 22:49:12 +0000 (23:49 +0100)
committerBastien Guerry <bzg@altern.org>
Tue, 1 Jan 2013 22:49:12 +0000 (23:49 +0100)
* org.el (org-forward-heading-same-level): Before the first
headline, go to the first headline.
(org-backward-heading-same-level): Before the first headline,
go to the beginning of the buffer, like
`outline-previous-visible-heading' does.

lisp/org.el

index 1837218..d46b020 100644 (file)
@@ -22382,39 +22382,41 @@ Stop at the first and last subheadings of a superior heading.
 Normally this only looks at visible headings, but when INVISIBLE-OK is
 non-nil it will also look at invisible ones."
   (interactive "p")
-  (org-back-to-heading invisible-ok)
-  (org-at-heading-p)
-  (let* ((level (- (match-end 0) (match-beginning 0) 1))
-        (re (format "^\\*\\{1,%d\\} " level))
-        l)
-    (forward-char 1)
-    (while (> arg 0)
-      (while (and (re-search-forward re nil 'move)
-                 (setq l (- (match-end 0) (match-beginning 0) 1))
-                 (= l level)
-                 (not invisible-ok)
-                 (progn (backward-char 1) (outline-invisible-p)))
-       (if (< l level) (setq arg 1)))
-      (setq arg (1- arg)))
-    (beginning-of-line 1)))
+  (if (not (ignore-errors (org-back-to-heading invisible-ok)))
+      (outline-next-heading)
+    (org-at-heading-p)
+    (let* ((level (- (match-end 0) (match-beginning 0) 1))
+          (re (format "^\\*\\{1,%d\\} " level))
+          l)
+      (forward-char 1)
+      (while (> arg 0)
+       (while (and (re-search-forward re nil 'move)
+                   (setq l (- (match-end 0) (match-beginning 0) 1))
+                   (= l level)
+                   (not invisible-ok)
+                   (progn (backward-char 1) (outline-invisible-p)))
+         (if (< l level) (setq arg 1)))
+       (setq arg (1- arg)))
+      (beginning-of-line 1))))
 
 (defun org-backward-heading-same-level (arg &optional invisible-ok)
   "Move backward to the arg'th subheading at same level as this one.
 Stop at the first and last subheadings of a superior heading."
   (interactive "p")
-  (org-back-to-heading)
-  (org-at-heading-p)
-  (let* ((level (- (match-end 0) (match-beginning 0) 1))
-        (re (format "^\\*\\{1,%d\\} " level))
-        l)
-    (while (> arg 0)
-      (while (and (re-search-backward re nil 'move)
-                 (setq l (- (match-end 0) (match-beginning 0) 1))
-                 (= l level)
-                 (not invisible-ok)
-                 (outline-invisible-p))
-       (if (< l level) (setq arg 1)))
-      (setq arg (1- arg)))))
+  (if (not (ignore-errors (org-back-to-heading)))
+      (goto-char (point-min))
+    (org-at-heading-p)
+    (let* ((level (- (match-end 0) (match-beginning 0) 1))
+          (re (format "^\\*\\{1,%d\\} " level))
+          l)
+      (while (> arg 0)
+       (while (and (re-search-backward re nil 'move)
+                   (setq l (- (match-end 0) (match-beginning 0) 1))
+                   (= l level)
+                   (not invisible-ok)
+                   (outline-invisible-p))
+         (if (< l level) (setq arg 1)))
+       (setq arg (1- arg))))))
 
 (defun org-forward-element ()
   "Move forward by one element.