diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS index bba9457f2..6b40198b5 100644 --- a/etc/ORG-NEWS +++ b/etc/ORG-NEWS @@ -222,6 +222,10 @@ execution completes. The new ~:async~ header allows users to continue editing with Emacs while a ~:session~ block executes. ** Miscellaneous +*** =org-crypt.el= now applies initial visibility settings to decrypted entries + +Previously, all the text was unfolded unconditionally, including property drawers. + *** Blank lines after removed objects are not retained during export When certain objects in Org document are to be excluded from export, diff --git a/lisp/org-crypt.el b/lisp/org-crypt.el index b5df115cf..39d1a421d 100644 --- a/lisp/org-crypt.el +++ b/lisp/org-crypt.el @@ -81,6 +81,7 @@ (declare-function org-previous-visible-heading "org" (arg)) (declare-function org-scan-tags "org" (action matcher todo-only &optional start-level)) (declare-function org-set-property "org" (property value)) +(declare-function org-cycle-set-startup-visibility "org-cycle" ()) (defgroup org-crypt nil "Org Crypt." @@ -269,10 +270,12 @@ Assume `epg-context' is set." (decrypted-text (decode-coding-string (epg-decrypt-string epg-context encrypted-text) - 'utf-8))) + 'utf-8)) + origin-marker) ;; Delete region starting just before point, because the ;; outline property starts at the \n of the heading. (delete-region (1- (point)) end) + (setq origin-marker (point-marker)) ;; Store a checksum of the decrypted and the encrypted text ;; value. This allows reusing the same encrypted text if the ;; text does not change, and therefore avoid a re-encryption @@ -282,6 +285,12 @@ Assume `epg-context' is set." 'org-crypt-checksum (sha1 decrypted-text) 'org-crypt-key (org-crypt-key-for-heading) 'org-crypt-text encrypted-text)) + ;; Apply initial visibility. + (save-restriction + (narrow-to-region origin-marker (point)) + (set-marker origin-marker nil) + (org-cycle-set-startup-visibility)) + ;; ... but keep the previous folded state. (when folded-heading (goto-char folded-heading) (org-fold-subtree t)) diff --git a/lisp/org-cycle.el b/lisp/org-cycle.el index 50aa0d21d..762654567 100644 --- a/lisp/org-cycle.el +++ b/lisp/org-cycle.el @@ -638,20 +638,21 @@ With a numeric prefix, show all headlines up to that level." "Switch subtree visibility according to VISIBILITY property." (interactive) (let ((regexp (org-re-property "VISIBILITY"))) - (org-with-point-at 1 + (save-excursion + (goto-char (point-min)) (while (re-search-forward regexp nil t) - (let ((state (match-string 3))) + (let ((state (match-string 3))) (if (not (org-at-property-p)) (outline-next-heading) (save-excursion (org-back-to-heading t) (org-fold-subtree t) (pcase state - ("folded" + ("folded" (org-fold-subtree t)) - ("children" + ("children" (org-fold-show-hidden-entry) (org-fold-show-children)) - ("content" + ("content" ;; Newline before heading will be outside the ;; narrowing. Make sure that it is revealed. (org-fold-heading nil) @@ -659,9 +660,9 @@ With a numeric prefix, show all headlines up to that level." (save-restriction (org-narrow-to-subtree) (org-cycle-content)))) - ((or "all" "showall") + ((or "all" "showall") (org-fold-show-subtree)) - (_ nil))) + (_ nil))) (org-end-of-subtree t))))))) (defun org-cycle-overview ()