Parcourir la source

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.
Nicolas Goaziou il y a 11 ans
Parent
commit
149eafb487
1 fichiers modifiés avec 18 ajouts et 30 suppressions
  1. 18 30
      lisp/org-element.el

+ 18 - 30
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)))