From 2ae8d6c1cf7f6adec7922eefc6277f8ba066ea13 Mon Sep 17 00:00:00 2001 From: Ihor Radchenko Date: Wed, 26 Jan 2022 19:27:03 +0800 Subject: [PATCH] org-babel-tangle-collect-blocks: Use cache * lisp/ob-tangle.el (org-babel-tangle-collect-blocks): Use element cache to find the containing headline instead of regexp search. Direct regexp search sometimes causes quadratic scaling. See https://lists.gnu.org/r/emacs-orgmode/2022-01/msg00484.html --- lisp/ob-tangle.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lisp/ob-tangle.el b/lisp/ob-tangle.el index c4b69dfd3..5dc365e67 100644 --- a/lisp/ob-tangle.el +++ b/lisp/ob-tangle.el @@ -37,6 +37,9 @@ (declare-function org-babel-update-block-body "ob-core" (new-body)) (declare-function org-back-to-heading "org" (&optional invisible-ok)) (declare-function org-before-first-heading-p "org" ()) +(declare-function org-element--cache-active-p "org-element" ()) +(declare-function org-element-lineage "org-element" (datum &optional types with-self)) +(declare-function org-element-property "org-element" (property element)) (declare-function org-element-at-point "org-element" (&optional pom cached-only)) (declare-function org-element-type "org-element" (element)) (declare-function org-heading-components "org" ()) @@ -425,8 +428,10 @@ code blocks by target file." (let ((counter 0) last-heading-pos blocks) (org-babel-map-src-blocks (buffer-file-name) (let ((current-heading-pos - (org-with-wide-buffer - (org-with-limited-levels (outline-previous-heading))))) + (if (org-element--cache-active-p) + (or (org-element-property :begin (org-element-lineage (org-element-at-point) '(headline) t)) 1) + (org-with-wide-buffer + (org-with-limited-levels (outline-previous-heading)))))) (if (eq last-heading-pos current-heading-pos) (cl-incf counter) (setq counter 1) (setq last-heading-pos current-heading-pos)))