Playing around with planner-search-notes

| emacs
(defun planner-search-notes (regexp)
  "Return a buffer with all the notes returned by the query for REGEXP."
  (interactive "MRegexp: ")
  (with-emacs-wiki-project planner-project
    (let ((results (planner-search-notes-internal regexp)))
      (if results
          (progn
            (set-buffer
             (get-buffer-create (generate-new-buffer-name
                                 (concat "Planner Search: " regexp))))
            (setq emacs-wiki-current-project planner-project)
            (mapcar (lambda (item)
                      (insert (car item) "\t"
                              (cadr item) "\n"))
                    results)
            (planner-mode)
            (goto-char point-min)
            (display-buffer (current-buffer)))
        (message "No results found.")))))

(defun planner-search-notes-internal (regexp)
  "Return an alist of all notes in daily plan pages containing REGEXP.
The alist is of the form ((REFERENCE . TEXT) (REFERENCE . TEXT))."
  (let ((pages (sort (copy-sequence (emacs-wiki-file-alist))
                     (lambda (a b)
                       (string< (car a) (car b)))))
        page start anchor text results)
    (while pages
      (setq page (caar pages))
      (when (string-match planner-date-regexp page)
        (with-temp-buffer
          (insert-file-contents-literally (cdar pages))
          (setq start nil)
          ;; Find the first note
          (when (re-search-forward "\\.\\(#[0-9]+\\)\s+\\(.*\\)" nil t)
            (setq start (match-beginning 2))
            (setq anchor (match-string 1))
            (setq title (match-string 2)))
          (while (re-search-forward "\\.\\(#[0-9]+\\)\s+\\(.*\\)" nil t)
            ;; The text between start and (1- (match-beginning 0))
            ;; is the note body.
            (setq text (buffer-substring start (1- (match-beginning 0))))
            (save-match-data
              (when (string-match regexp text)
                (add-to-list 'results (list (concat page anchor)
                                            title))))
            (setq start (match-beginning 2))
            (setq anchor (match-string 1))
            (setq title (match-string 2)))
          (when start
            (setq text (buffer-substring start (point-max)))
            (when (string-match regexp text)
              (add-to-list 'results (list (concat page anchor)
                                          title))))))
      (setq pages (cdr pages)))
    results))
You can comment with Disqus or you can e-mail me at sacha@sachachua.com.