From 149eafb4870b533149dad6ead89ec8b1ca9e44f2 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Thu, 12 Dec 2013 23:21:33 +0100 Subject: [PATCH] org-element: Small change to cache optimization * lisp/org-element.el (org-element-at-point): Simplify opportunistic shortcut by looking only for blank lines and headlines or inlinetasks. Since regexp is simpler, we can afford to make more searches. --- lisp/org-element.el | 48 ++++++++++++++++++------------------------------ 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index 928f788a4..13d7fc631 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -5199,46 +5199,34 @@ first row." ;; Opportunistic shortcut. Instead of going back to ;; headline above (or beginning of buffer) and descending ;; again, first try to find a known element above current - ;; position. Give up after 3 tries or when we hit + ;; position. Give up after 10 tries or when we hit ;; a headline (or beginning of buffer). (beginning-of-line) (skip-chars-backward " \r\t\n") - (dotimes (i 3) - (unless (re-search-backward org-element-paragraph-separate nil t) - (throw 'loop (goto-char (point-min)))) - (cond ((not (org-string-match-p "\\S-" (match-string 0))) + (dotimes (i 10) + (cond ((not (re-search-backward "^\\(?:\\*+ \\|[ \t]*$\\)" nil t)) + (throw 'loop (goto-char (point-min)))) + ((/= (char-after) ?*) (when (bobp) (throw 'loop nil)) ;; An element cannot start at a headline, so check ;; first non-blank line below. (skip-chars-forward " \r\t\n" origin) (beginning-of-line)) - ((org-looking-at-p org-element--affiliated-re) - ;; At an affiliated keyword, make sure to move to - ;; the first one. - (if (re-search-backward "^[ \t]*[^#]" nil t) - (forward-line) - (throw 'loop (goto-char (point-min))))) - ((org-looking-at-p "^[ \t]*:\\(?: \\|$\\)") - ;; At a fixed width area or a property drawer, reach - ;; the beginning of the element. - (if (re-search-backward "^[ \t]*[^:]" nil t) - (forward-line) - (throw 'loop (goto-char (point-min)))))) - (when (org-with-limited-levels (org-at-heading-p)) - ;; Tough luck: we're back at a headline above. Move to - ;; beginning of section. - (forward-line) - (skip-chars-forward " \r\t\n") - (beginning-of-line) - (throw 'loop nil)) + ((org-with-limited-levels (org-at-heading-p)) + ;; Tough luck: we're back at a headline above. + ;; Move to beginning of section. + (forward-line) + (skip-chars-forward " \r\t\n") + (beginning-of-line) + (throw 'loop nil))) (let ((cached (org-element-cache-get (point) 'element))) - ;; Search successful: we know an element before point - ;; which is not an headline. If it has a common - ;; ancestor with ORIGIN, set this ancestor as the - ;; current parent and the element as the one to check. - ;; Otherwise, move at top level and start parsing right - ;; after its broader ancestor. (when cached + ;; Search successful: we know an element before point + ;; which is not an headline. If it has a common + ;; ancestor with ORIGIN, set this ancestor as the + ;; current parent and the element as the one to + ;; check. Otherwise, move at top level and start + ;; parsing right after its broader ancestor. (let ((cache-end (org-element-property :end cached))) (if (or (> cache-end origin) (and (= cache-end origin) (= (point-max) origin))) -- 2.11.4.GIT