From 68a44eadac00d07e2b45b10da60e0e3cd6300d6f Mon Sep 17 00:00:00 2001 From: Ihor Radchenko Date: Sat, 16 Oct 2021 23:29:11 +0800 Subject: [PATCH] org.el/org-narrow-to-subtree: Support cache and passing element arg --- lisp/org.el | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index 23b6bd657..ba3ca1c5e 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -7899,17 +7899,26 @@ If yes, remember the marker and the distance to BEG." (move-marker (car x) (+ beg (cdr x)))) (setq org-markers-to-move nil)) -(defun org-narrow-to-subtree () +(defun org-narrow-to-subtree (&optional element) "Narrow buffer to the current subtree." (interactive) - (save-excursion - (save-match-data - (org-with-limited-levels - (narrow-to-region - (progn (org-back-to-heading t) (point)) - (progn (org-end-of-subtree t t) - (when (and (org-at-heading-p) (not (eobp))) (backward-char 1)) - (point))))))) + (if (org-element--cache-active-p) + (if-let* ((heading (org-element-lineage + (or element (org-element-at-point)) + '(headline) t)) + (end (org-element-property :end heading))) + (narrow-to-region (org-element-property :begin heading) + (if (= end (point-max)) + end (1- end))) + (signal 'outline-before-first-heading nil)) + (save-excursion + (save-match-data + (org-with-limited-levels + (narrow-to-region + (progn (org-back-to-heading t) (point)) + (progn (org-end-of-subtree t t) + (when (and (org-at-heading-p) (not (eobp))) (backward-char 1)) + (point)))))))) (defun org-toggle-narrow-to-subtree () "Narrow to the subtree at point or widen a narrowed buffer."