summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2020-05-10 11:14:40 +0200
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2020-05-10 11:14:40 +0200
commit6076f40caeed8c2b57ec8aa99e98bd812a086cca (patch)
tree3c3620f2311cfb7fc752abd141e30aa4ef7928ce
parenteabc9712b7cf089a748783a0efd2d971074b8da7 (diff)
downloadorg-mode-6076f40caeed8c2b57ec8aa99e98bd812a086cca.tar.gz
Better checks to avoid re-hiding folded drawers
* lisp/org.el (org-hide-drawer-all): Hide regular drawers even in folded headlines. They do not use the same invisibility spec. However, when the heading is folded, still ignore property drawers. (org-cycle-hide-property-drawers): Only skip property drawers folded with or inside `outline' overlays.
-rw-r--r--lisp/org.el31
1 files changed, 18 insertions, 13 deletions
diff --git a/lisp/org.el b/lisp/org.el
index d8ab32e..9b9b437 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -6122,16 +6122,20 @@ Return a non-nil value when toggling is successful."
(save-excursion
(goto-char (point-min))
(while (re-search-forward org-drawer-regexp nil t)
- (pcase (get-char-property-and-overlay (point) 'invisible)
- (`(_ . ,o) (goto-char (overlay-end o)))
- (_
- (let ((drawer (org-element-at-point)))
- (when (memq (org-element-type drawer) '(drawer property-drawer))
- (org-hide-drawer-toggle t nil drawer)
- ;; Make sure to skip drawer entirely or we might flag it
- ;; another time when matching its ending line with
- ;; `org-drawer-regexp'.
- (goto-char (org-element-property :end drawer)))))))))
+ (let* ((drawer (org-element-at-point))
+ (type (org-element-type drawer)))
+ (when (memq type '(drawer property-drawer))
+ ;; We are sure regular drawers are unfolded because of
+ ;; `org-show-all' call above. However, property drawers may
+ ;; be folded, or in a folded headline. In that case, do not
+ ;; re-hide it.
+ (unless (and (eq type 'property-drawer)
+ (eq 'outline (get-char-property (point) 'invisible)))
+ (org-hide-drawer-toggle t nil drawer))
+ ;; Make sure to skip drawer entirely or we might flag it
+ ;; another time when matching its ending line with
+ ;; `org-drawer-regexp'.
+ (goto-char (org-element-property :end drawer)))))))
(defun org-cycle-hide-property-drawers (state)
"Re-hide all drawers after a visibility state change.
@@ -6148,13 +6152,14 @@ STATE should be one of the symbols listed in the docstring of
(while (re-search-forward org-property-start-re end t)
(pcase (get-char-property-and-overlay (point) 'invisible)
;; Do not fold already folded drawers.
- (`(,_ . ,o) (goto-char (overlay-end o)))
+ (`(outline . ,o) (goto-char (overlay-end o)))
(_
(let ((start (match-end 0)))
(when (org-at-property-drawer-p)
(let ((end (re-search-forward org-property-end-re)))
- ;; Property drawers use `outline' invisibility spec so
- ;; they can be swallowed once we hide the outline.
+ ;; Property drawers use `outline' invisibility spec
+ ;; so they can be swallowed once we hide the
+ ;; outline.
(org-flag-region start end t 'outline)))))))))))
;;;; Visibility cycling