Commit 11db987f authored by Bill Wohler's avatar Bill Wohler
Browse files

* mh-search.el (mh-index-next-result-function): Add format to

docstring.
(mh-mairix-next-result): Use nil instead of () which doesn't stand out
as well.
(mh-pick-execute-search): Operate across all folders if no folder
given and recurse folder(s).
(mh-pick-next-result): Handle new output.

* mh-utils.el: (mh-collect-folder-names): Fix docstring.
(mh-children-p, mh-folder-list): New functions.
parent 9f7f49fb
2006-01-13 Bill Wohler <wohler@newt.com>
* mh-search.el (mh-index-next-result-function): Add format to
docstring.
(mh-mairix-next-result): Use nil instead of () which doesn't stand
out as well.
(mh-pick-execute-search): Operate across all folders if no folder
given and recurse folder(s).
(mh-pick-next-result): Handle new output.
* mh-utils.el: (mh-collect-folder-names): Fix docstring.
(mh-children-p, mh-folder-list): New functions.
2006-01-12 Bill Wohler <wohler@newt.com>
* mh-search.el: New file containing contents of mh-index.el and
......
......@@ -58,7 +58,9 @@
"Function which executes the search program.")
(defvar mh-index-next-result-function nil
"Function to parse the next line of output.")
"Function to parse the next line of output.
Expected to return a list of three strings: name of the folder,
message number, and optionally the match.")
(defvar mh-index-regexp-builder nil
"Function used to construct search regexp.")
......@@ -1180,7 +1182,7 @@ SEARCH-REGEXP-LIST is used to search."
(point) (1- msg-start)))
(car (read-from-string
(buffer-substring-no-properties msg-start end)))
())))
nil)))
(forward-line)))
(defun mh-mairix-regexp-builder (regexp-list)
......@@ -1330,31 +1332,36 @@ There are no semantics associated with the search criteria--they
are simply treated as strings. Case is ignored when all lowercase
is used, and regular expressions (a la \"ed\") are available.
Unlike the other index search programs, you must specify a
folder. In addition, this command does not descend into any
sub-folders that may be present.
In a program, FOLDER-PATH is the directory in which SEARCH-REGEXP
is used to search."
(set-buffer (get-buffer-create mh-temp-index-buffer))
(erase-buffer)
(setq mh-index-pick-folder
(concat "+" (substring folder-path (length mh-user-path))))
(apply #'call-process (expand-file-name "pick" mh-progs) nil '(t nil) nil
mh-index-pick-folder "-list" search-regexp)
(let ((folders
(mh-folder-list (substring folder-path (length mh-user-path)))))
(loop for folder in folders do
(setq folder (concat "+" folder))
(insert folder "\n")
(apply #'call-process (expand-file-name "pick" mh-progs)
nil '(t nil) nil folder "-list" search-regexp)))
(goto-char (point-min)))
(defun mh-pick-next-result ()
"Return the next pick search result."
(prog1 (block nil
(when (eobp) (return nil))
(unless (re-search-forward "^[1-9][0-9]*$" (line-end-position) t)
(return 'error))
(list mh-index-pick-folder
(car (read-from-string (buffer-substring-no-properties
(line-beginning-position)
(line-end-position))))
nil))
(prog1
(block nil
(when (eobp) (return nil))
(when (search-forward-regexp "^\+" (line-end-position) t)
(setq mh-index-pick-folder
(buffer-substring-no-properties (line-beginning-position)
(line-end-position)))
(return 'error))
(unless (search-forward-regexp "^[1-9][0-9]*$" (line-end-position) t)
(return 'error))
(list mh-index-pick-folder
(string-to-number
(buffer-substring-no-properties (line-beginning-position)
(line-end-position)))
nil))
(forward-line)))
;; All implementations of pick have special options -cc, -date, -from and
......
......@@ -2059,7 +2059,7 @@ folder buffer are not updated."
;; Initialize mh-sub-folders-cache...
(defun mh-collect-folder-names ()
"Collect folder names by running \"flists\"."
"Collect folder names by running \"folders\"."
(unless mh-flists-process
(setq mh-flists-process
(mh-exec-cmd-daemon "folders" 'mh-collect-folder-names-filter
......@@ -2158,6 +2158,44 @@ removed."
((not (equal (aref folder 0) ?+)) (setq folder (concat "+" folder)))))
folder)
(defmacro mh-children-p (folder)
"Return t if FOLDER from sub-folders cache has children.
The car of folder is the name, and the cdr is either t or some
sort of count that I do not understand. It's too small to be the
number of messages in the sub-folders and too large to be the
number of sub-folders. XXX"
`(if (cdr ,folder)
t
nil))
(defun mh-folder-list (folder)
"Return FOLDER and its descendents.
Returns a list of strings. For example,
'(\"inbox\" \"lists\" \"lists/mh-e\").
If folder is nil, then all folders are considered. Respects the
value of `mh-recursive-folders-flag'. If this flag is nil, and
the sub-folders have not been explicitly viewed, then they will
not be returned."
(let ((folder-list))
;; Normalize folder. Strip leading +. Add trailing slash. If no
;; folder is specified, ensure it is nil to ensure we get the
;; top-level folders; otherwise mh-sub-folders returns all the
;; files in / if given an empty string or +.
(when folder
(setq folder (replace-regexp-in-string "^\+" "" folder))
(setq folder (replace-regexp-in-string "/*$" "/" folder))
(if (equal folder "")
(setq folder nil)))
(loop for f in (mh-sub-folders folder) do
(setq folder-list (append folder-list (list (concat folder (car f)))))
(if (mh-children-p f)
(setq folder-list
(append folder-list
(mh-folder-list (concat folder (car f)))))))
folder-list))
(defun mh-sub-folders (folder &optional add-trailing-slash-flag)
"Find the subfolders of FOLDER.
The function avoids running folders unnecessarily by caching the
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment