Document missing control strings for wl-summary-line-format
[elisp/wanderlust.git] / elmo / elmo-search.el
index fe4f5ea..59197ec 100644 (file)
                 (other :tag "Use" t))
   :group 'elmo)
 
-(defcustom elmo-search-engine-alist
-  '((namazu local-file
-           :prog "namazu"
-           :args ("--all" "--list" "--early" pattern elmo-search-namazu-index)
-           :charset 'iso-2022-jp)
-    (grep local-file
-         :prog "grep"
-         :args ("-l" "-e" pattern elmo-search-grep-target)))
+(defvar elmo-search-engine-alist nil
   "*An alist of search engines.
 Each element looks like (ENGINE CLASS PROPERTIES...)
 ENGINE is a symbol, the name of the search engine.
 CLASS is a symbol, the class name that performs a search.
-PROPERTIES is a plist, it configure an engine with the CLASS."
-  :group 'elmo)
+PROPERTIES is a plist, it configure an engine with the CLASS.")
 
 (defcustom elmo-search-default-engine 'namazu
   "*Default search engine for elmo-search folder."
@@ -88,7 +80,7 @@ Returns non-nil if fetching was succeed.")
 (defun elmo-make-search-engine (type &optional param)
   (let ((spec (or (cdr (assq type elmo-search-engine-alist))
                  (error "Undefined search engine `%s'" type))))
-    (require (intern (format "else-%s" (car spec))))
+    (require (intern (format "elmo-search-%s" (car spec))))
     (apply 'luna-make-entity
           (intern (format "elmo-search-engine-%s" (car spec)))
           :param param
@@ -135,11 +127,9 @@ Returns non-nil if fetching was succeed.")
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-search-folder)
                                              numbers flag-table)
   (let ((new-msgdb (elmo-make-msgdb))
-       (num (length numbers))
        entity)
-    (message "Creating msgdb...")
-    (elmo-with-progress-display (> num elmo-display-progress-threshold)
-       (elmo-folder-msgdb-create num "Creating msgdb...")
+    (elmo-with-progress-display (elmo-folder-msgdb-create (length numbers))
+       "Creating msgdb"
       (dolist (number numbers)
        (setq entity (elmo-search-engine-create-message-entity
                      (elmo-search-folder-engine-internal folder)
@@ -147,9 +137,7 @@ Returns non-nil if fetching was succeed.")
                      folder number))
        (when entity
          (elmo-msgdb-append-entity new-msgdb entity '(new unread)))
-       (elmo-progress-notify 'elmo-folder-msgdb-create)
-       (setq numbers (cdr numbers))))
-    (message "Creating msgdb...done")
+       (elmo-progress-notify 'elmo-folder-msgdb-create)))
     new-msgdb))
 
 (luna-define-method elmo-folder-message-file-p ((folder elmo-search-folder))
@@ -182,13 +170,14 @@ Returns non-nil if fetching was succeed.")
                                                         &optional
                                                         start-number)
   (let ((temp-dir (elmo-folder-make-temporary-directory folder))
-       (cur-number (if start-number 0)))
+       (cur-number (or start-number 0)))
     (dolist (number numbers)
       (elmo-copy-file
        (elmo-message-file-name folder number)
        (expand-file-name
-       (int-to-string (if start-number (incf cur-number) number))
-       temp-dir)))
+       (number-to-string (if start-number cur-number number))
+       temp-dir))
+      (incf cur-number))
     temp-dir))
 
 (luna-define-method elmo-map-message-fetch ((folder elmo-search-folder)
@@ -219,39 +208,56 @@ Returns non-nil if fetching was succeed.")
                    (concat "^" (regexp-quote
                                 (elmo-folder-prefix-internal folder))))))
 
+(luna-define-method elmo-folder-delete-messages ((folder elmo-search-folder)
+                                                numbers)
+  (elmo-folder-kill-messages folder numbers)
+  t)
+
 
 ;;; Search engine
 
-;; search engine for local files
+;; external program search engine
 (eval-and-compile
-  (luna-define-class elmo-search-engine-local-file (elmo-search-engine)
+  (luna-define-class elmo-search-engine-extprog (elmo-search-engine)
                     (prog args charset parser))
-  (luna-define-internal-accessors 'elmo-search-engine-local-file))
+  (luna-define-internal-accessors 'elmo-search-engine-extprog))
 
 (luna-define-method elmo-search-engine-do-search
-  ((engine elmo-search-engine-local-file) pattern)
+  ((engine elmo-search-engine-extprog) pattern)
   (with-temp-buffer
-    (let* ((charset (elmo-search-engine-local-file-charset-internal engine))
-          (pattern (if charset
-                       (encode-mime-charset-string pattern charset)
-                     pattern))
-          (parser (or (elmo-search-engine-local-file-parser-internal engine)
-                      #'elmo-search-parse-filename-list)))
+    (let ((charset (elmo-search-engine-extprog-charset-internal engine))
+         (parser (or (elmo-search-engine-extprog-parser-internal engine)
+                     #'elmo-search-parse-filename-list)))
       (apply 'call-process
-            (elmo-search-engine-local-file-prog-internal engine)
+            (elmo-search-engine-extprog-prog-internal engine)
             nil t t
-            (elmo-flatten
-             (mapcar
-              (lambda (arg)
-                (cond ((stringp arg) arg)
-                      ((functionp arg)
-                       (funcall arg engine))
-                      ((and (symbolp arg)
-                            (boundp arg))
-                       (symbol-value arg))))
-              (elmo-search-engine-local-file-args-internal engine))))
+            (delq
+             nil
+             (elmo-flatten
+              (mapcar
+               (lambda (arg)
+                 (cond ((stringp arg) arg)
+                       ((eq arg 'pattern)
+                        (if charset
+                            (encode-mime-charset-string pattern charset)
+                          pattern))
+                       ((functionp arg)
+                        (condition-case nil
+                            (funcall arg engine pattern)
+                          (wrong-number-of-arguments
+                           (funcall arg engine))))
+                       ((and (symbolp arg)
+                             (boundp arg))
+                        (symbol-value arg))))
+               (elmo-search-engine-extprog-args-internal engine)))))
       (funcall parser))))
 
+;; search engine for local files
+(eval-and-compile
+  (luna-define-class elmo-search-engine-local-file
+                    (elmo-search-engine-extprog))
+  (luna-define-internal-accessors 'elmo-search-engine-local-file))
+
 (defun elmo-search-parse-filename-list ()
   (let (bol locations)
     (goto-char (point-min))
@@ -274,26 +280,27 @@ Returns non-nil if fetching was succeed.")
   ((engine elmo-search-engine-local-file) handler folder number)
   (let ((filename (elmo-message-file-name folder number))
        entity uid)
-    (setq entity (elmo-msgdb-create-message-entity-from-file
-                 handler number filename))
-    (unless (or (elmo-message-entity-field entity 'to)
-               (elmo-message-entity-field entity 'cc)
-               (not (string= (elmo-message-entity-field entity 'subject)
-                             elmo-no-subject)))
-      (elmo-message-entity-set-field entity 'subject
-                                    (file-name-nondirectory filename))
-      (setq uid (nth 2 (file-attributes filename)))
-      (elmo-message-entity-set-field entity 'from
-                                    (concat
-                                     (user-full-name uid)
-                                     " <"(user-login-name uid) "@"
-                                     (system-name) ">")))
-    entity))
+    (when (and filename
+              (setq entity (elmo-msgdb-create-message-entity-from-file
+                            handler number filename)))
+      (unless (or (elmo-message-entity-field entity 'to)
+                 (elmo-message-entity-field entity 'cc)
+                 (not (string= (elmo-message-entity-field entity 'subject)
+                               elmo-no-subject)))
+       (elmo-message-entity-set-field entity 'subject
+                                      (file-name-nondirectory filename))
+       (setq uid (nth 2 (file-attributes filename)))
+       (elmo-message-entity-set-field entity 'from
+                                      (concat
+                                       (user-full-name uid)
+                                       " <"(user-login-name uid) "@"
+                                       (system-name) ">")))
+      entity)))
 
 (luna-define-method elmo-search-engine-fetch-message
   ((engine elmo-search-engine-local-file) location)
   (let ((filename (elmo-search-location-to-filename location)))
-    (when (file-exists-p filename)
+    (when (and filename (file-exists-p filename))
       (prog1
          (insert-file-contents-as-binary filename)
        (unless (or (std11-field-body "To")
@@ -319,7 +326,7 @@ Returns non-nil if fetching was succeed.")
            (encode-mime-charset-region (point-min) (point-max) charset)
            (set-buffer-multibyte nil)))))))
 
-(provide 'else-local-file)
+(provide 'elmo-search-local-file)
 
 ;; namazu
 (defcustom elmo-search-namazu-default-index-path "~/Mail"
@@ -336,21 +343,21 @@ If the value is a list, all elements are used as index paths for namazu."
                               (repeat (directory :tag "Index Path")))))
   :group 'elmo)
 
-(defun elmo-search-namazu-index (engine)
+(defun elmo-search-namazu-index (engine pattern)
   (let* ((param (elmo-search-engine-param-internal engine))
-        (index (cond ((cdr (assoc param
-                                  elmo-search-namazu-index-alias-alist)))
-                     ((eq (length param) 0)
-                      elmo-search-namazu-default-index-path)
-                     (t
-                      param))))
+        (index (cond
+                ((cdr (assoc param elmo-search-namazu-index-alias-alist)))
+                ((and param (> (length param) 0))
+                 param)
+                (t
+                 elmo-search-namazu-default-index-path))))
     (if (listp index)
        (mapcar 'expand-file-name index)
       (expand-file-name index))))
 
 
 ;; grep
-(defun elmo-search-grep-target (engine)
+(defun elmo-search-grep-target (engine pattern)
   (let ((dirname (expand-file-name (elmo-search-engine-param-internal engine)))
        (files (list null-device)))
     (dolist (filename (directory-files dirname))
@@ -359,6 +366,20 @@ If the value is a list, all elements are used as index paths for namazu."
     files))
 
 
+;;; Setup `elmo-search-engine-alist'
+(unless noninteractive
+  (or (assq 'namazu elmo-search-engine-alist)
+      (elmo-search-register-engine
+       'namazu 'local-file
+       :prog "namazu"
+       :args '("--all" "--list" "--early" pattern elmo-search-namazu-index)
+       :charset 'iso-2022-jp))
+  (or (assq 'grep elmo-search-engine-alist)
+      (elmo-search-register-engine
+       'grep 'local-file
+       :prog "grep"
+       :args '("-l" "-e" pattern elmo-search-grep-target))))
+
 (require 'product)
 (product-provide (provide 'elmo-search) (require 'elmo-version))