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.