(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))
More posts about: emacs
// Add Comment »