# HG changeset patch # User Chong Yidong # Date 1291414011 18000 # Node ID 6da5e88812e50ce4ee6b7786c25bf96f34581241 # Parent 11c12bf130385ce2f34cc70e84d8618f3c84e757 nnir.el: Rearrange code to allow macros to be autoloaded by gnus-sum.el. * nnir.el: Rearrange code to allow macros to be autoloaded by gnus-sum.el. (nnir-retrieve-headers-override-function): Make this variable customizable. (nnir-retrieve-headers): Remove obsolete subject-mangling code. diff -r 11c12bf13038 -r 6da5e88812e5 lisp/gnus/ChangeLog --- a/lisp/gnus/ChangeLog Fri Dec 03 17:05:02 2010 -0500 +++ b/lisp/gnus/ChangeLog Fri Dec 03 17:06:51 2010 -0500 @@ -1,3 +1,14 @@ +2010-12-03 Andrew Cohen + + * nnir.el: Rearrange code to allow macros to be autoloaded by + gnus-sum.el. + (nnir-retrieve-headers-override-function): Make this variable + customizable. + (nnir-retrieve-headers): Remove obsolete subject-mangling code. + + * gnus-sum.el (nnir-article-group,nnir-article-rsv): Autoload macros + from nnir.el. + 2010-12-03 Julien Danjou * gnus-demon.el (gnus-demon-init): Fix time computing when time is nil. diff -r 11c12bf13038 -r 6da5e88812e5 lisp/gnus/gnus-sum.el --- a/lisp/gnus/gnus-sum.el Fri Dec 03 17:05:02 2010 -0500 +++ b/lisp/gnus/gnus-sum.el Fri Dec 03 17:06:51 2010 -0500 @@ -60,6 +60,8 @@ (autoload 'gnus-article-outlook-unwrap-lines "deuglify" nil t) (autoload 'gnus-article-outlook-repair-attribution "deuglify" nil t) (autoload 'gnus-article-outlook-rearrange-citation "deuglify" nil t) +(autoload 'nnir-article-rsv "nnir" nil nil 'macro) +(autoload 'nnir-article-group "nnir" nil nil 'macro) (defcustom gnus-kill-summary-on-exit t "*If non-nil, kill the summary buffer when you exit from it. diff -r 11c12bf13038 -r 6da5e88812e5 lisp/gnus/nnir.el --- a/lisp/gnus/nnir.el Fri Dec 03 17:05:02 2010 -0500 +++ b/lisp/gnus/nnir.el Fri Dec 03 17:06:51 2010 -0500 @@ -163,7 +163,9 @@ ;; `nnir-engines'. Then, users can choose the backend by setting ;; `nnir-search-engine' as a server variable. -;;; Setup Code: +;;; Code: + +;;; Setup: ;; For Emacs <22.2 and XEmacs. (eval-and-compile @@ -171,12 +173,117 @@ (require 'nnoo) (require 'gnus-group) -(require 'gnus-sum) (require 'message) (require 'gnus-util) (eval-when-compile (require 'cl)) +;;; Internal Variables: + +(defvar nnir-current-query nil + "Internal: stores current query (= group name).") + +(defvar nnir-current-server nil + "Internal: stores current server (does it ever change?).") + +(defvar nnir-current-group-marked nil + "Internal: stores current list of process-marked groups.") + +(defvar nnir-artlist nil + "Internal: stores search result.") + +(defvar nnir-tmp-buffer " *nnir*" + "Internal: temporary buffer.") + +(defvar nnir-search-history () + "Internal: the history for querying search options in nnir") + +(defvar nnir-extra-parms nil + "Internal: stores request for extra search parms") + +;; Imap variables + +(defvar nnir-imap-search-arguments + '(("Whole message" . "TEXT") + ("Subject" . "SUBJECT") + ("To" . "TO") + ("From" . "FROM") + ("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") + +;;; Helper macros + +;; Data type article list. + +(defmacro nnir-artlist-length (artlist) + "Returns number of articles in artlist." + `(length ,artlist)) + +(defmacro nnir-artlist-article (artlist n) + "Returns from ARTLIST the Nth artitem (counting starting at 1)." + `(when (> ,n 0) + (elt ,artlist (1- ,n)))) + +(defmacro nnir-artitem-group (artitem) + "Returns the group from the ARTITEM." + `(elt ,artitem 0)) + +(defmacro nnir-artitem-number (artitem) + "Returns the number from the ARTITEM." + `(elt ,artitem 1)) + +(defmacro nnir-artitem-rsv (artitem) + "Returns the Retrieval Status Value (RSV, score) from the ARTITEM." + `(elt ,artitem 2)) + +(defmacro nnir-article-group (article) + "Returns the group for ARTICLE" + `(nnir-artitem-group (nnir-artlist-article nnir-artlist ,article))) + +(defmacro nnir-article-number (article) + "Returns the number for ARTICLE" + `(nnir-artitem-number (nnir-artlist-article nnir-artlist ,article))) + +(defmacro nnir-article-rsv (article) + "Returns the rsv for ARTICLE" + `(nnir-artitem-rsv (nnir-artlist-article nnir-artlist ,article))) + +(defsubst nnir-article-ids (article) + "Returns the pair `(nnir id . real id)' of ARTICLE" + (cons article (nnir-article-number article))) + +(defmacro nnir-categorize (sequence keyfunc &optional valuefunc) + "Sorts a sequence into categories and returns a list of the form +`((key1 (element11 element12)) (key2 (element21 element22))'. +The category key for a member of the sequence is obtained +as `(keyfunc member)' and the corresponding element is just +`member'. If `valuefunc' is non-nil, the element of the list +is `(valuefunc member)'." + `(unless (null ,sequence) + (let (value) + (mapcar + (lambda (member) + (let ((y (,keyfunc member)) + (x ,(if valuefunc + `(,valuefunc member) + 'member))) + (if (assoc y value) + (push x (cadr (assoc y value))) + (push (list y (list x)) value)))) + ,sequence) + value))) + +;;; Finish setup: + +(require 'gnus-sum) (eval-when-compile (autoload 'nnimap-buffer "nnimap") @@ -223,6 +330,17 @@ :type '(regexp) :group 'nnir) +(defcustom nnir-retrieve-headers-override-function nil + "*If non-nil, a function that accepts an article list and group +and populates the `nntp-server-buffer' with the retrieved +headers. Must return either 'nov or 'headers indicating the +retrieved header format. + +If this variable is nil, or if the provided function returns nil for a search +result, `gnus-retrieve-headers' will be called instead." + :type '(function) + :group 'nnir) + (defcustom 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 @@ -385,24 +503,6 @@ :type '(directory) :group 'nnir) -;; Imap variables - -(defvar nnir-imap-search-arguments - '(("Whole message" . "TEXT") - ("Subject" . "SUBJECT") - ("To" . "TO") - ("From" . "FROM") - ("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") - ;;; Developer Extension Variable: (defvar nnir-engines @@ -444,101 +544,6 @@ Add an entry here when adding a new search engine.") -(defvar nnir-retrieve-headers-override-function nil - "If non-nil, a function that accepts an article list and group -and populates the `nntp-server-buffer' with the retrieved -headers. Must return either 'nov or 'headers indicating the -retrieved header format. - -If this variable is nil, or if the provided function returns nil for a search -result, `gnus-retrieve-headers' will be called instead.") - -;;; Internal Variables: - -(defvar nnir-current-query nil - "Internal: stores current query (= group name).") - -(defvar nnir-current-server nil - "Internal: stores current server (does it ever change?).") - -(defvar nnir-current-group-marked nil - "Internal: stores current list of process-marked groups.") - -(defvar nnir-artlist nil - "Internal: stores search result.") - -(defvar nnir-tmp-buffer " *nnir*" - "Internal: temporary buffer.") - -(defvar nnir-search-history () - "Internal: the history for querying search options in nnir") - -(defvar nnir-extra-parms nil - "Internal: stores request for extra search parms") - -;;; Code: - -;;; Helper macros - -;; Data type article list. - -(defmacro nnir-artlist-length (artlist) - "Returns number of articles in artlist." - `(length ,artlist)) - -(defmacro nnir-artlist-article (artlist n) - "Returns from ARTLIST the Nth artitem (counting starting at 1)." - `(when (> ,n 0) - (elt ,artlist (1- ,n)))) - -(defmacro nnir-artitem-group (artitem) - "Returns the group from the ARTITEM." - `(elt ,artitem 0)) - -(defmacro nnir-artitem-number (artitem) - "Returns the number from the ARTITEM." - `(elt ,artitem 1)) - -(defmacro nnir-artitem-rsv (artitem) - "Returns the Retrieval Status Value (RSV, score) from the ARTITEM." - `(elt ,artitem 2)) - -(defmacro nnir-article-group (article) - "Returns the group for ARTICLE" - `(nnir-artitem-group (nnir-artlist-article nnir-artlist ,article))) - -(defmacro nnir-article-number (article) - "Returns the number for ARTICLE" - `(nnir-artitem-number (nnir-artlist-article nnir-artlist ,article))) - -(defmacro nnir-article-rsv (article) - "Returns the rsv for ARTICLE" - `(nnir-artitem-rsv (nnir-artlist-article nnir-artlist ,article))) - -(defsubst nnir-article-ids (article) - "Returns the pair `(nnir id . real id)' of ARTICLE" - (cons article (nnir-article-number article))) - -(defmacro nnir-categorize (sequence keyfunc &optional valuefunc) - "Sorts a sequence into categories and returns a list of the form -`((key1 (element11 element12)) (key2 (element21 element22))'. -The category key for a member of the sequence is obtained -as `(keyfunc member)' and the corresponding element is just -`member'. If `valuefunc' is non-nil, the element of the list -is `(valuefunc member)'." - `(unless (null ,sequence) - (let (value) - (mapcar - (lambda (member) - (let ((y (,keyfunc member)) - (x ,(if valuefunc - `(,valuefunc member) - 'member))) - (if (assoc y value) - (push x (cadr (assoc y value))) - (push (list y (list x)) value)))) - ,sequence) - value))) ;; Gnus glue. @@ -633,11 +638,6 @@ (art (car (rassoc artno articleids)))) (when art (mail-header-set-number novitem art) - ;; (mail-header-set-subject - ;; novitem - ;; (format "[%d: %s/%d] %s" - ;; (nnir-article-rsv art) artgroup artno - ;; (mail-header-subject novitem))) (push novitem headers)) (forward-line 1))))) (setq headers