summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Lundin <mdl@imapmail.org>2011-01-26 01:03:47 +0000
committerCarsten Dominik <carsten.dominik@gmail.com>2011-01-25 22:58:57 +0100
commitc03c8f0e7cc5b8cb1268fe2f7663b6e197d6cb88 (patch)
treee41e27ea5304e2051fa330d0e1a3bf8791ba9b31
parent8899e596f9b504104c2189df87d8faa63a0e9cd1 (diff)
downloadorg-mode-c03c8f0e7cc5b8cb1268fe2f7663b6e197d6cb88.tar.gz
Optimize org-habit-parse-todo
* lisp/org-habit.el: (org-habit-parse-todo) Don't parse more days than needed. When constructing a consistency graph, org-habit now stops searching for timestamps when the number of matches exceeds the span of time displayed in the graph. This can lead to a significant speedup in agenda construction, especially for entries with many logbook entries. Previously, org-habit would parse all logbook timestamps, even if they numbered in the hundreds.
-rw-r--r--lisp/org-habit.el16
1 files changed, 12 insertions, 4 deletions
diff --git a/lisp/org-habit.el b/lisp/org-habit.el
index b174a1f..5d2514a 100644
--- a/lisp/org-habit.el
+++ b/lisp/org-habit.el
@@ -170,10 +170,18 @@ This list represents a \"habit\" for the rest of this module."
habit-entry scheduled-repeat))
(setq deadline (+ scheduled (- dr-days sr-days))))
(org-back-to-heading t)
- (while (re-search-forward "- State \"DONE\".*\\[\\([^]]+\\)\\]" end t)
- (push (time-to-days
- (org-time-string-to-time (match-string-no-properties 1)))
- closed-dates))
+ (let* ((maxdays (+ org-habit-preceding-days org-habit-following-days))
+ (reversed org-log-states-order-reversed)
+ (search (if reversed 're-search-forward 're-search-backward))
+ (limit (if reversed end (point)))
+ (count 0))
+ (unless reversed (goto-char end))
+ (while (and (< count maxdays)
+ (funcall search "- State \"DONE\".*\\[\\([^]]+\\)\\]" limit t))
+ (push (time-to-days
+ (org-time-string-to-time (match-string-no-properties 1)))
+ closed-dates)
+ (setq count (1+ count))))
(list scheduled sr-days deadline dr-days closed-dates))))
(defsubst org-habit-scheduled (habit)