浏览代码

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 11 年之前
父节点
当前提交
149eafb487
共有 1 个文件被更改,包括 18 次插入30 次删除
  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)))