Procházet zdrojové kódy

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 před 11 roky
rodič
revize
149eafb487
1 změnil soubory, kde provedl 18 přidání a 30 odebrání
  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)))