From: Lars Magne Ingebrigtsen Date: Sun, 10 Oct 2010 13:36:17 +0000 (+0200) Subject: (gnus-summary-nnir-goto-thread): Modify to work with imap X-Git-Url: http://cgit.sxemacs.org/?p=gnus;a=commitdiff_plain;h=f69c57496b475315d7d39365d1298b7830223dee (gnus-summary-nnir-goto-thread): Modify to work with imap From Andrew Cohen . --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 1ef90fd7a..c316444e9 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,13 @@ +2010-10-10 Andrew Cohen + + * nnir.el (autoload): Clean up autoloads. + (nnir-imap-default-search-key): Renamed from + nnir-imap-search-field. Use key rather than value. + (nnir-imap-search-other): New variable. + (nnir-read-parm): Use it. + (nnir-imap-expr-to-imap): Use %S rather than imap-quote-specials. + (gnus-summary-nnir-goto-thread): Modify to work with imap. + 2010-10-10 Stefan Monnier * nnimap.el (nnimap-wait-for-response): If the user hits `C-g', kill diff --git a/lisp/nnir.el b/lisp/nnir.el index 86acad166..2a264d1fa 100644 --- a/lisp/nnir.el +++ b/lisp/nnir.el @@ -339,23 +339,34 @@ (eval-when-compile (require 'cl)) + +(eval-when-compile + (autoload 'nnimap-buffer "nnimap") + (autoload 'nnimap-command "nnimap") + (autoload 'nnimap-possibly-change-group "nnimap")) + (nnoo-declare nnir) (nnoo-define-basics nnir) (gnus-declare-backend "nnir" 'mail) -(defvar nnir-imap-search-field "TEXT" - "The IMAP search item when doing an nnir search. To use raw - imap queries by default set this to \"\"") +(defvar nnir-imap-default-search-key "Whole message" + "The default IMAP search key for an nnir search. Must be one of + the keys in nnir-imap-search-arguments. To use raw imap queries + by default set this to \"Imap\"") (defvar nnir-imap-search-arguments '(("Whole message" . "TEXT") ("Subject" . "SUBJECT") ("To" . "TO") ("From" . "FROM") - ("Head" . "HEADER \"%s\"") - (nil . "")) - "Mapping from user readable strings to IMAP search items for use in nnir") + ("Imap" . "")) + "Mapping from user readable keys to IMAP search items for use in nnir") + +(defvar nnir-imap-search-other "HEADER %S" + "The IMAP search item to use for anything other than + nnir-imap-search-arguments. By default this is the name of an + email header field") (defvar nnir-imap-search-argument-history () "The history for querying search options in nnir") @@ -375,12 +386,12 @@ result, `gnus-retrieve-headers' will be called instead.") ()) (imap nnir-run-imap ((criteria - "Search in: " ; Prompt + "Search in" ; Prompt ,(mapcar 'car nnir-imap-search-arguments) ; alist for completing nil ; allow any user input nil ; initial value nnir-imap-search-argument-history ; the history to use - ,nnir-imap-search-field ; default + ,nnir-imap-default-search-key ; default ))) (swish++ nnir-run-swish++ ((group . "Group spec: "))) @@ -702,19 +713,30 @@ and show thread that contains this article." (let* ((cur (gnus-summary-article-number)) (group (nnir-artlist-artitem-group nnir-artlist cur)) (backend-number (nnir-artlist-artitem-number nnir-artlist cur)) - server backend-group) - (setq server (nnir-group-server group)) - (setq backend-group (gnus-group-real-name group)) - (gnus-group-read-ephemeral-group - backend-group - (gnus-server-to-method server) - t ; activate - (cons (current-buffer) - 'summary) ; window config - nil - (list backend-number)) - (gnus-summary-limit (list backend-number)) - (gnus-summary-refer-thread))) + (id (mail-header-id (gnus-summary-article-header))) + (refs (split-string + (mail-header-references (gnus-summary-article-header))))) + (if (string= (car (gnus-group-method group)) "nnimap") + (with-current-buffer (nnimap-buffer) + (let* ((cmd (let ((value + (format + "(OR HEADER REFERENCES %s HEADER Message-Id %s)" + id id))) + (dolist (refid refs value) + (setq value (format + "(OR (OR HEADER Message-Id %s HEADER REFERENCES %s) %s)" + refid refid value))))) + (result (nnimap-command + "UID SEARCH %s" cmd))) + (gnus-summary-read-group-1 group t t gnus-summary-buffer nil + (and (car result) + (delete 0 (mapcar #'string-to-number + (cdr (assoc "SEARCH" (cdr result))))))))) + (gnus-summary-read-group-1 group t t gnus-summary-buffer + nil (list backend-number)) + (gnus-summary-limit (list backend-number)) + (gnus-summary-refer-thread)))) + (if (fboundp 'eval-after-load) (eval-after-load "gnus-sum" @@ -936,22 +958,9 @@ pairs (also vectors, actually)." ;; IMAP interface. ;; todo: -;; nnir invokes this two (2) times???! -;; we should not use nnimap at all but open our own server connection -;; we should not LIST * but use nnimap-list-pattern from defs ;; send queries as literals ;; handle errors -(autoload 'nnimap-open-server "nnimap") -(defvar nnimap-server-buffer) ;; nnimap.el -(autoload 'imap-mailbox-select "imap") -(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. @@ -963,7 +972,8 @@ details on the language and supported extensions" (group (or group-option (gnus-group-group-name))) (defs (caddr (gnus-server-to-method srv))) (criteria (or (cdr (assq 'criteria query)) - nnir-imap-search-field)) + (cdr (assoc nnir-imap-default-search-key + nnir-imap-search-arguments)))) (gnus-inhibit-demon t) artlist) (message "Opening server %s" server) @@ -1044,7 +1054,7 @@ In future the following will be added to the language: (cond ;; Simple string term ((stringp expr) - (format "%s \"%s\"" criteria (imap-quote-specials expr))) + (format "%s %S" criteria expr)) ;; Trivial term: and ((eq expr 'and) nil) ;; Composite term: or expression @@ -1580,7 +1590,7 @@ Tested with Namazu 2.0.6 on a GNU/Linux system." (if (listp prompt) (let* ((result (apply 'gnus-completing-read prompt)) (mapping (or (assoc result nnir-imap-search-arguments) - (assoc nil nnir-imap-search-arguments)))) + (cons nil nnir-imap-search-other)))) (cons sym (format (cdr mapping) result))) (cons sym (read-string prompt)))))