Browse Source

Fix `org-cycle' within `orgstruct-mode'

* lisp/org.el (org-show-children): Fallback to `outline-show-children'
  when `orgstruct-mode' is active.

Reported-by: Jonas Bernoulli <jonas@bernoul.li>
<http://permalink.gmane.org/gmane.emacs.orgmode/102709>
Nicolas Goaziou 4 years ago
parent
commit
b8f100c14a
1 changed files with 33 additions and 29 deletions
  1. 33 29
      lisp/org.el

+ 33 - 29
lisp/org.el

@@ -24868,35 +24868,39 @@ Prefix arg LEVEL is how many levels below the current level
 should be shown.  Default is enough to cause the following
 heading to appear."
   (interactive "p")
-  (save-excursion
-    (org-back-to-heading t)
-    (let* ((current-level (funcall outline-level))
-           (max-level (org-get-valid-level
-                       current-level (if level (prefix-numeric-value level) 1)))
-           (end (save-excursion (org-end-of-subtree t t)))
-           (regexp-fmt "^\\*\\{%d,%s\\}\\(?: \\|$\\)")
-           (past-first-child nil)
-	   ;; Make sure to skip inlinetasks.
-           (re (format regexp-fmt
-		       current-level
-		       (cond
-			((not (featurep 'org-inlinetask)) "")
-			(org-odd-levels-only (- (* 2 org-inlinetask-min-level)
-						3))
-			(t (1- org-inlinetask-min-level))))))
-      ;; Display parent heading.
-      (outline-flag-region (line-end-position 0) (line-end-position) nil)
-      (forward-line)
-      ;; Display children.  First child may be deeper than expected
-      ;; MAX-LEVEL.  Since we want to display it anyway, adjust
-      ;; MAX-LEVEL accordingly.
-      (while (re-search-forward re end t)
-        (unless past-first-child
-          (setq re (format regexp-fmt
-			   current-level
-			   (max (funcall outline-level) max-level)))
-          (setq past-first-child t))
-        (outline-flag-region (line-end-position 0) (line-end-position) nil)))))
+  ;; If `orgstruct-mode' is active, use the slower version.
+  (if orgstruct-mode (call-interactively #'show-children)
+    (save-excursion
+      (org-back-to-heading t)
+      (let* ((current-level (funcall outline-level))
+	     (max-level (org-get-valid-level
+			 current-level
+			 (if level (prefix-numeric-value level) 1)))
+	     (end (save-excursion (org-end-of-subtree t t)))
+	     (regexp-fmt "^\\*\\{%d,%s\\}\\(?: \\|$\\)")
+	     (past-first-child nil)
+	     ;; Make sure to skip inlinetasks.
+	     (re (format regexp-fmt
+			 current-level
+			 (cond
+			  ((not (featurep 'org-inlinetask)) "")
+			  (org-odd-levels-only (- (* 2 org-inlinetask-min-level)
+						  3))
+			  (t (1- org-inlinetask-min-level))))))
+	;; Display parent heading.
+	(outline-flag-region (line-end-position 0) (line-end-position) nil)
+	(forward-line)
+	;; Display children.  First child may be deeper than expected
+	;; MAX-LEVEL.  Since we want to display it anyway, adjust
+	;; MAX-LEVEL accordingly.
+	(while (re-search-forward re end t)
+	  (unless past-first-child
+	    (setq re (format regexp-fmt
+			     current-level
+			     (max (funcall outline-level) max-level)))
+	    (setq past-first-child t))
+	  (outline-flag-region
+	   (line-end-position 0) (line-end-position) nil))))))
 
 (defun org-show-subtree ()
   "Show everything after this heading at deeper levels."