The following answer completely hides everything from :PROPERTIES:
through :END:
. It can be tested by evaluating (org-cycle-hide-drawers 'children)
, or (org-cycle-hide-drawers 'all)
, or in conjunction with the other functions relating to cycling the outline views. The standard functions to unfold that are included within the org-mode
family all work -- e.g., show-all
; org-show-subtree
; etc.
(require 'org)
(defun org-cycle-hide-drawers (state)
"Re-hide all drawers after a visibility state change."
(when (and (derived-mode-p 'org-mode)
(not (memq state '(overview folded contents))))
(save-excursion
(let* ((globalp (memq state '(contents all)))
(beg (if globalp
(point-min)
(point)))
(end (if globalp
(point-max)
(if (eq state 'children)
(save-excursion
(outline-next-heading)
(point))
(org-end-of-subtree t)))))
(goto-char beg)
(while (re-search-forward org-drawer-regexp end t)
(save-excursion
(beginning-of-line 1)
(when (looking-at org-drawer-regexp)
(let* ((start (1- (match-beginning 0)))
(limit
(save-excursion
(outline-next-heading)
(point)))
(msg (format
(concat
"org-cycle-hide-drawers: "
"`:END:`"
" line missing at position %s")
(1+ start))))
(if (re-search-forward "^[ ]*:END:" limit t)
(outline-flag-region start (point-at-eol) t)
(user-error msg))))))))))
For anyone who interested in tab cycling between all of the various views (including revealing what is inside the :PROPERTIES:
drawer, there is an easy modification to org-cycle-internal-local
by adding an additional condition before (t ;; Default action: hide the subtree. . . .
((eq org-cycle-subtree-status 'subtree)
(org-show-subtree)
(org-unlogged-message "ALL")
(setq org-cycle-subtree-status 'all))
Screenshot -- Drawers Hidden:
https://www.lawlist.com/images/org_mode_properties_a.png
Screenshot -- Drawers Visible:
https://www.lawlist.com/images/org_mode_properties_b.png
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…