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.
This commit is contained in:
Matt Lundin 2011-01-26 01:03:47 +00:00 committed by Carsten Dominik
parent 8899e596f9
commit c03c8f0e7c

View file

@ -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)