Implement faster `show-children' function

* lisp/org.el (org-show-children): New function.
(org-cycle-internal-local):
(org-set-visibility-according-to-property):
(org-content):
(org-move-subtree-down):
(orgstruct-setup):
(org-show-set-visibility):
* contrib/lisp/org-toc.el (org-toc-cycle-subtree):
(org-toc-restore-config):
* lisp/org-agenda.el (org-agenda-show-1):
* lisp/org-feed.el (org-feed-update): Use new function.

* etc/ORG-NEWS: Document new function.

Suggested-by: Samuel Wales <samologist@gmail.com>
<http://permalink.gmane.org/gmane.emacs.orgmode/99616>
This commit is contained in:
Nicolas Goaziou 2015-08-10 13:34:07 +02:00
parent 181df8493e
commit 898cfbcac0
5 changed files with 51 additions and 15 deletions

View File

@ -197,7 +197,7 @@ specified, then make `org-toc-recenter' use this value."
(setq ov (make-overlay beg end))) (setq ov (make-overlay beg end)))
;; change the folding status of this headline ;; change the folding status of this headline
(cond ((or (null status) (eq status 'folded)) (cond ((or (null status) (eq status 'folded))
(show-children) (org-show-children)
(message "CHILDREN") (message "CHILDREN")
(overlay-put ov 'status 'children)) (overlay-put ov 'status 'children))
((eq status 'children) ((eq status 'children)
@ -441,7 +441,7 @@ current table of contents to it."
(setq ov (make-overlay (match-beginning 0) (setq ov (make-overlay (match-beginning 0)
(match-end 0)))) (match-end 0))))
(cond ((eq (cdr hlcfg0) 'children) (cond ((eq (cdr hlcfg0) 'children)
(show-children) (org-show-children)
(message "CHILDREN") (message "CHILDREN")
(overlay-put ov 'status 'children)) (overlay-put ov 'status 'children))
((eq (cdr hlcfg0) 'branches) ((eq (cdr hlcfg0) 'branches)

View File

@ -8,6 +8,10 @@ See the end of the file for license conditions.
Please send Org bug reports to emacs-orgmode@gnu.org. Please send Org bug reports to emacs-orgmode@gnu.org.
* Version 8.4
** New functions
~org-show-children~ is a faster implementation of
~outline-show-children~.
* Version 8.3 * Version 8.3
** Incompatible changes ** Incompatible changes

View File

@ -8686,7 +8686,7 @@ if it was hidden in the outline."
(message "Remote: show with default settings")) (message "Remote: show with default settings"))
((= more 2) ((= more 2)
(show-entry) (show-entry)
(show-children) (org-show-children)
(save-excursion (save-excursion
(org-back-to-heading) (org-back-to-heading)
(run-hook-with-args 'org-cycle-hook 'children)) (run-hook-with-args 'org-cycle-hook 'children))

View File

@ -407,7 +407,7 @@ it can be a list structured like an entry in `org-feed-alist'."
;; Normalize the visibility of the inbox tree ;; Normalize the visibility of the inbox tree
(goto-char inbox-pos) (goto-char inbox-pos)
(hide-subtree) (hide-subtree)
(show-children) (org-show-children)
(org-cycle-hide-drawers 'children) (org-cycle-hide-drawers 'children)
;; Hooks and messages ;; Hooks and messages

View File

@ -6904,7 +6904,7 @@ in special contexts.
(if (org-at-item-p) (if (org-at-item-p)
(org-list-set-item-visibility (point-at-bol) struct 'children) (org-list-set-item-visibility (point-at-bol) struct 'children)
(org-show-entry) (org-show-entry)
(org-with-limited-levels (show-children)) (org-with-limited-levels (org-show-children))
;; FIXME: This slows down the func way too much. ;; FIXME: This slows down the func way too much.
;; How keep drawers hidden in subtree anyway? ;; How keep drawers hidden in subtree anyway?
;; (when (memq 'org-cycle-hide-drawers org-cycle-hook) ;; (when (memq 'org-cycle-hide-drawers org-cycle-hook)
@ -7006,7 +7006,7 @@ With a numeric prefix, show all headlines up to that level."
(hide-subtree)) (hide-subtree))
((equal state "children") ((equal state "children")
(org-show-hidden-entry) (org-show-hidden-entry)
(show-children)) (org-show-children))
((equal state "content") ((equal state "content")
(save-excursion (save-excursion
(save-restriction (save-restriction
@ -7055,7 +7055,7 @@ With numerical argument N, show content up to level N."
t) t)
(looking-at org-outline-regexp)) (looking-at org-outline-regexp))
(if (integerp arg) (if (integerp arg)
(show-children (1- arg)) (org-show-children (1- arg))
(show-branches)) (show-branches))
(if (bobp) (throw 'exit nil)))))) (if (bobp) (throw 'exit nil))))))
@ -8459,7 +8459,7 @@ case."
(if folded (if folded
(hide-subtree) (hide-subtree)
(org-show-entry) (org-show-entry)
(show-children) (org-show-children)
(org-cycle-hide-drawers 'children)) (org-cycle-hide-drawers 'children))
(org-clean-visibility-after-subtree-move) (org-clean-visibility-after-subtree-move)
;; move back to the initial column we were at ;; move back to the initial column we were at
@ -9216,6 +9216,7 @@ buffer. It will also recognize item context in multiline items."
org-shifttab org-shifttab
org-shifttab org-shifttab
org-shiftup org-shiftup
org-show-children
org-show-subtree org-show-subtree
org-sort org-sort
org-up-element org-up-element
@ -9223,8 +9224,7 @@ buffer. It will also recognize item context in multiline items."
outline-next-visible-heading outline-next-visible-heading
outline-previous-visible-heading outline-previous-visible-heading
outline-promote outline-promote
outline-up-heading outline-up-heading))
show-children))
(let ((f (or (car-safe cell) cell)) (let ((f (or (car-safe cell) cell))
(disable-when-heading-prefix (cdr-safe cell))) (disable-when-heading-prefix (cdr-safe cell)))
(when (fboundp f) (when (fboundp f)
@ -13981,7 +13981,7 @@ information."
(org-show-entry) (org-show-entry)
(org-with-limited-levels (org-with-limited-levels
(case detail (case detail
((tree canonical t) (show-children)) ((tree canonical t) (org-show-children))
((nil minimal ancestors)) ((nil minimal ancestors))
(t (save-excursion (t (save-excursion
(outline-next-heading) (outline-next-heading)
@ -13994,7 +13994,7 @@ information."
(while (org-up-heading-safe) (while (org-up-heading-safe)
(org-flag-heading nil) (org-flag-heading nil)
(when (memq detail '(canonical t)) (org-show-entry)) (when (memq detail '(canonical t)) (org-show-entry))
(when (memq detail '(tree canonical t)) (show-children))))))) (when (memq detail '(tree canonical t)) (org-show-children)))))))
(defvar org-reveal-start-hook nil (defvar org-reveal-start-hook nil
"Hook run before revealing a location.") "Hook run before revealing a location.")
@ -19702,6 +19702,7 @@ boundaries."
'org-next-visible-heading) 'org-next-visible-heading)
(define-key org-mode-map [remap outline-previous-visible-heading] (define-key org-mode-map [remap outline-previous-visible-heading]
'org-previous-visible-heading) 'org-previous-visible-heading)
(define-key org-mode-map [remap show-children] 'org-show-children)
;; Outline functions from `outline-mode-prefix-map' that can not ;; Outline functions from `outline-mode-prefix-map' that can not
;; be remapped in Org: ;; be remapped in Org:
@ -19714,13 +19715,10 @@ boundaries."
;; | Outline function | key binding | Org replacement | ;; | Outline function | key binding | Org replacement |
;; |------------------------------------+-------------+--------------------------| ;; |------------------------------------+-------------+--------------------------|
;; | `outline-next-visible-heading' | `C-c C-n' | better: skip inlinetasks |
;; | `outline-previous-visible-heading' | `C-c C-p' | better: skip inlinetasks |
;; | `outline-up-heading' | `C-c C-u' | still same function | ;; | `outline-up-heading' | `C-c C-u' | still same function |
;; | `outline-move-subtree-up' | overridden | better: org-shiftup | ;; | `outline-move-subtree-up' | overridden | better: org-shiftup |
;; | `outline-move-subtree-down' | overridden | better: org-shiftdown | ;; | `outline-move-subtree-down' | overridden | better: org-shiftdown |
;; | `show-entry' | overridden | no replacement | ;; | `show-entry' | overridden | no replacement |
;; | `show-children' | `C-c C-i' | visibility cycling |
;; | `show-branches' | `C-c C-k' | still same function | ;; | `show-branches' | `C-c C-k' | still same function |
;; | `show-subtree' | overridden | visibility cycling | ;; | `show-subtree' | overridden | visibility cycling |
;; | `show-all' | overridden | no replacement | ;; | `show-all' | overridden | no replacement |
@ -24887,6 +24885,40 @@ modified."
(reverse contents)))))) (reverse contents))))))
(funcall unindent-tree (org-element-contents parse-tree)))) (funcall unindent-tree (org-element-contents parse-tree))))
(defun org-show-children (&optional level)
"Show all direct subheadings of this heading.
Prefix arg LEVEL is how many levels below the current level should be shown.
Default is enough to cause the following heading to appear."
(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 () (defun org-show-subtree ()
"Show everything after this heading at deeper levels." "Show everything after this heading at deeper levels."
(interactive) (interactive)