X-Git-Url: https://cgit.sxemacs.org/?p=gnus;a=blobdiff_plain;f=lisp%2Fnnir.el;h=453cabbc4d36e164363f6bbbe7fc616bcf234f61;hp=a826b5be7915ddb20fec3e7c7afb197531d5ff20;hb=0223772f70a38366cff8ef602ccdf091829165b6;hpb=aaff5cad4b7225cd056a7c322950b9887e3442c0 diff --git a/lisp/nnir.el b/lisp/nnir.el index a826b5be7..453cabbc4 100644 --- a/lisp/nnir.el +++ b/lisp/nnir.el @@ -345,14 +345,16 @@ (gnus-declare-backend "nnir" 'mail) (defvar nnir-imap-search-field "TEXT" - "The IMAP search item when doing an nnir search") + "The IMAP search item when doing an nnir search. To use raw + imap queries by default set this to \"\"") (defvar nnir-imap-search-arguments '(("Whole message" . "TEXT") ("Subject" . "SUBJECT") ("To" . "TO") ("From" . "FROM") - (nil . "HEADER \"%s\"")) + ("Head" . "HEADER \"%s\"") + (nil . "")) "Mapping from user readable strings to IMAP search items for use in nnir") (defvar nnir-imap-search-argument-history () @@ -790,7 +792,7 @@ and show thread that contains this article." (if nnir-get-article-nov-override-function (setq novitem (funcall nnir-get-article-nov-override-function artitem)) - ;; else, set novitem through nnheader-parse-nov/nnheader-parse-head + ;; else, set novitem through nnheader-parse-nov/nnheader-parse-head (case (setq foo (gnus-retrieve-headers (list artno) artfullgroup nil)) (nov @@ -879,7 +881,9 @@ ready to be added to the list of search results." (when (file-readable-p (concat prefix dirnam article)) ;; remove trailing slash and, for nnmaildir, cur/new/tmp (setq dirnam - (substring dirnam 0 (if (string= server "nnmaildir:") -5 -1))) + (substring dirnam 0 + (if (string= (gnus-group-server server) "nnmaildir") + -5 -1))) ;; Set group to dirnam without any leading dots or slashes, ;; and with all subsequent slashes replaced by dots @@ -888,7 +892,7 @@ ready to be added to the list of search results." "[/\\]" "." t))) (vector (nnir-group-full-name group server) - (if (string= server "nnmaildir:") + (if (string= (gnus-group-server server) "nnmaildir") (nnmaildir-base-name-to-article-number (substring article 0 (string-match ":" article)) group nil) @@ -956,6 +960,11 @@ pairs (also vectors, actually)." (autoload 'imap-search "imap") (autoload 'imap-quote-specials "imap") +(eval-when-compile + (autoload 'nnimap-buffer "nnimap") + (autoload 'nnimap-command "nnimap") + (autoload 'nnimap-possibly-change-group "nnimap")) + (defun nnir-run-imap (query srv &optional group-option) "Run a search against an IMAP back-end server. This uses a custom query language parser; see `nnir-imap-make-query' for @@ -967,23 +976,30 @@ details on the language and supported extensions" (defs (caddr (gnus-server-to-method srv))) (criteria (or (cdr (assq 'criteria query)) nnir-imap-search-field)) - artlist buf) + (gnus-inhibit-demon t) + artlist) (message "Opening server %s" server) (condition-case () - (when (nnimap-open-server server defs) ;; xxx - (setq buf nnimap-server-buffer) ;; xxx - (message "Searching %s..." group) - (let ((arts 0) - (mbx (gnus-group-real-name group))) - (when (imap-mailbox-select mbx nil buf) - (mapc - (lambda (artnum) - (push (vector group artnum 1) artlist) - (setq arts (1+ arts))) - (imap-search (nnir-imap-make-query criteria qstring) buf)) - (message "Searching %s... %d matches" mbx arts))) - (message "Searching %s...done" group)) - (quit nil)) + (when (nnimap-possibly-change-group (gnus-group-short-name group) server) + (with-current-buffer (nnimap-buffer) + (message "Searching %s..." group) + (let ((arts 0) + (result + (nnimap-command "UID SEARCH %s" + (if (string= criteria "") + qstring + (nnir-imap-make-query criteria qstring) + )))) + (mapc + (lambda (artnum) + (push (vector group artnum 1) artlist) + (setq arts (1+ arts))) + (and (car result) + (delete 0 (mapcar #'string-to-number + (cdr (assoc "SEARCH" (cdr result))))))) + (message "Searching %s... %d matches" group arts))) + (message "Searching %s...done" group)) + (quit nil)) (reverse artlist)))) (defun nnir-imap-make-query (criteria qstring) @@ -1186,7 +1202,7 @@ Windows NT 4.0." ;; is sufficient. Note that we can't only use the value of ;; nnml-use-compressed-files because old articles might have been ;; saved with a different value. - (article-pattern (if (string= server "nnmaildir:") + (article-pattern (if (string= (gnus-group-server server) "nnmaildir") ":[0-9]+" "^[0-9]+\\(\\.[a-z0-9]+\\)?$")) score artno dirnam filenam) @@ -1436,7 +1452,7 @@ Tested with Namazu 2.0.6 on a GNU/Linux system." (when group (error "The Namazu backend cannot search specific groups")) (save-excursion - (let ((article-pattern (if (string= server "nnmaildir:") + (let ((article-pattern (if (string= (gnus-group-server server) "nnmaildir") ":[0-9]+" "^[0-9]+$")) artlist @@ -1536,17 +1552,13 @@ Tested with Namazu 2.0.6 on a GNU/Linux system." "find" group "-type" "f" "-name" "[0-9]*" "-exec" "grep" `("-l" ,@(and grep-options - ;; Note: the 3rd arg of `split-string' is not - ;; available in Emacs 21. - (delete "" (split-string grep-options "\\s-"))) + (split-string grep-options "\\s-" t)) "-e" ,regexp "{}" "+")))) ;; Translate relative paths to group names. (while (not (eobp)) - (let* ((path (delete - "" - (split-string - (buffer-substring (point) (line-end-position)) "/"))) + (let* ((path (split-string + (buffer-substring (point) (line-end-position)) "/" t)) (art (string-to-number (car (last path))))) (while (string= "." (car path)) (setq path (cdr path))) @@ -1578,7 +1590,7 @@ Tested with Namazu 2.0.6 on a GNU/Linux system." (let ((sym (car parmspec)) (prompt (cdr parmspec))) (if (listp prompt) - (let* ((result (apply 'completing-read prompt)) + (let* ((result (gnus-completing-read prompt nil)) (mapping (or (assoc result nnir-imap-search-arguments) (assoc nil nnir-imap-search-arguments)))) (cons sym (format (cdr mapping) result)))