From: yamaoka Date: Sun, 26 Jan 2003 22:21:38 +0000 (+0000) Subject: Import Oort Gnus v0.14. X-Git-Tag: ognus-0_14~1 X-Git-Url: http://git.chise.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88a2cbade926ab994768b63e407390a44762941c;p=elisp%2Fgnus.git- Import Oort Gnus v0.14. --- diff --git a/ChangeLog b/ChangeLog index 3b79a97..59c4126 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2003-01-24 Jesper Harder + + * etc/gnus-tut.txt: Update. + 2003-01-15 Simon Josefsson * GNUS-NEWS: Add. Fix from Reiner Steib diff --git a/README b/README index 6249e88..043068b 100644 --- a/README +++ b/README @@ -6,11 +6,15 @@ To use Gnus you first have to unpack the files, which you've obviously done, because you are reading this. You should definitely byte-compile the source files. To do that, you -can simply say "./configure && make" in this directory. If you are -using XEmacs, you *must* say "make EMACS=xemacs". In that case you -may also want to pull down the package of nice glyphs from -. It should be installed -into the "gnus-5.6.53/etc" directory. +can simply say "./configure && make" in this directory. + +Do not say "make install". I repeat, do *NOT* say "make install". If +you say "make install" and then complain about things not working, +I'll be very annoyed. If you say "make install" and things happen to +work, that's all fine and dandy for you, but it's quite likely that it +won't. + +If you are using XEmacs, you *must* say "./configure && make EMACS=xemacs". Then you have to tell Emacs where Gnus is. You might put something like @@ -39,7 +43,7 @@ in your Emacs, you should probably exit that Emacs and start a new one to fire up Gnus. Gnus does absolutely not work with anything older than Emacs 20.3 or -XEmacs 20.0. So you definitely need a new Emacs. +XEmacs 20.0. You definitely need a relatively current Emacs. To compile the Gnus manual, you either need a pretty new Emacs, or a pretty new version of the texinfo tools. diff --git a/etc/gnus-tut.txt b/etc/gnus-tut.txt index 1e282d3..2125de8 100644 --- a/etc/gnus-tut.txt +++ b/etc/gnus-tut.txt @@ -195,7 +195,7 @@ which are both faster and more accurated. There is absolutely no chance, whatsoever, of getting Gnus to work with Emacs 18. It won't even work on Emacsen older than Emacs -19.30/XEmacs 19.13. Upgrade your Emacs or die. +20.3/XEmacs 20.4. Upgrade your Emacs or die. From lars Thu Feb 23 23:20:38 1995 @@ -223,7 +223,7 @@ want this is beyond me, but here goes: Create the group by saying -`M-a my.virtual.newsgroupnnvirtual^rec\.aquaria\.*' +`G V my.virtual.newsgroupnnvirtual^rec\.aquaria\.*' This will create the group "nnvirtual:my.virtual.newsgroup", which will collect all articles from all the groups in the "rec.aquaria" diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 84f6e5f..0f3847a 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,127 @@ +2003-01-24 20:32:44 Lars Magne Ingebrigtsen + + * gnus.el: Oort Gnus v0.14 is released. + +2003-01-24 Kai Gro,A_(Bjohann + + * gnus-sum.el (gnus-summary-prepare-threads): Reset state for %B + before beginning. Trivial patch from Mark Thomas + . + +2003-01-24 Teodor Zlatanov + + * spam.el (spam-check-blackholes, spam-split) + (spam-mark-junk-as-spam-routine, spam-summary-prepare-exit): added + gnus-message calls to show to users what spam.el is doing + +2003-01-24 Jesper Harder + + * gnus-msg.el (gnus-message-replysign) + (gnus-message-replyencrypt): Fix typo. + +2003-01-24 Lars Magne Ingebrigtsen + + * gnus-art.el (gnus-mime-security-show-details): Toggle showing + details. + +2003-01-23 Lars Magne Ingebrigtsen + + * gnus-art.el (gnus-article-press-button): let* -> let. + (gnus-mime-security-show-details): Cleaned up. + (gnus-mime-security-press-button): Save excursion. + (gnus-insert-mime-security-button): Clean up. + + * gnus-sum.el (gnus-summary-force-verify-and-decrypt): Doc fix. + + * gnus-async.el (gnus-async-wait-for-article): Don't use a + timeout. + + * nntp.el (nntp-accept-process-output): Removed timeout. + (nntp-read-timeout): New variable. + (nntp-accept-process-output): Use it. + + * gnus-sum.el (gnus-data-find-list): Remove *. + +2002-01-23 Kevin Greiner + + * gnus-sum.el (gnus-summary-first-subject): Fixed bug that I + introduced on 2002-01-22. + (gnus-summary-first-unseen-or-unread-subject): Ditto. + +2003-01-23 Teodor Zlatanov + + * spam.el (spam-check-regex-headers, spam-list-of-checks) + (spam-regex-headers-spam, spam-regex-headers-ham): added spam/ham + checks of incoming mail based on simple header regexp matching + +2003-01-22 Teodor Zlatanov + + * gnus-sum.el (gnus-spam-mark): set to `$' + +2002-01-22 Kevin Greiner + + * gnus-agent.el (gnus-agent-get-undownloaded-list): Now computes + gnus-newsgroup-unfetched, the list of articles whose headers have + not been fetched from the server. + + * gnus-sum.el (gnus-summary-find-next): Removed undownloaded + parameter as it never worked due to a bug. Added check to prevent + selection of any article in the gnus-newsgroup-unfetched list. + (gnus-summary-find-prev): Added check to prevent selection of any + article in the gnus-newsgroup-unfetched list. + (gnus-summary-first-subject): Documented API. Modified + implementation so that constraints are handled independently. + Added check to prevent selection of any article in the + gnus-newsgroup-unfetched list. + (gnus-summary-first-unseen-subject): Updated parameters in + gnus-summary-first-subject call to match new API. + (gnus-summary-first-unseen-or-unread-subject): Ditto. + (gnus-summary-catchup): Do not mark unfetched articles as read. + +2003-01-22 Jesper Harder + + * gnus-art.el (gnus-treat-strip-pgp, gnus-article-hide-pgp-hook): + make-obsolete-variable allows only two arguments in XEmacs and + Emacs 20. + + * gnus-sum.el (gnus-summary-wash-hide-map): Remove + gnus-article-hide-pgp. + (gnus-summary-make-menu-bar): do. + + * gnus-art.el (gnus-treat-strip-pgp): Make obsolete. + (gnus-treatment-function-alist): Remove gnus-treat-strip-pgp and + gnus-article-hide-pgp. + (article-hide-pgp): Remove. + (gnus-article-hide): Remove gnus-article-hide-pgp. + + * gnus.el: Remove gnus-article-hide-pgp + +2003-01-21 Lars Magne Ingebrigtsen + + * message.el (message-required-headers): Doc fix. + +2003-01-21 Teodor Zlatanov + + * spam.el (spam-group-ham-processor-bogofilter-p): fixed bug + (spam-ifile-register-ham-routine, spam-ifile-ham-category): new + option to make ifile a purely binary classifier + +2003-01-21 Lars Magne Ingebrigtsen + + * mml-sec.el (mml-secure-sign-pgpauto): Renamed. + (mml-secure-encrypt-pgpmime): Removed double. + + * gnus-sum.el (gnus-summary-mark-article-as-replied): Added + debugging statements. + +2003-01-21 Andreas Fuchs + + * mml-sec.el (mml-sign-alist): Added pgpauto. + +2003-01-21 Lars Magne Ingebrigtsen + + * gnus.el (gnus-version-number): Bumped version number. + 2003-01-21 07:15:41 Lars Magne Ingebrigtsen * gnus.el: Oort Gnus v0.13 is released. diff --git a/lisp/gnus-agent.el b/lisp/gnus-agent.el index 2f773f3..a40e48a 100644 --- a/lisp/gnus-agent.el +++ b/lisp/gnus-agent.el @@ -748,9 +748,11 @@ article's mark is toggled." (let ((gnus-command-method (gnus-find-method-for-group gnus-newsgroup-name))) (when (set (make-local-variable 'gnus-newsgroup-agentized) (gnus-agent-method-p gnus-command-method)) (let* ((alist (gnus-agent-load-alist gnus-newsgroup-name)) - (headers gnus-newsgroup-headers) - (undownloaded (list nil)) - (tail undownloaded)) + (headers gnus-newsgroup-headers) + (undownloaded (list nil)) + (tail-undownloaded undownloaded) + (unfetched (list nil)) + (tail-unfetched unfetched)) (while (and alist headers) (let ((a (caar alist)) (h (mail-header-number (car headers)))) @@ -760,21 +762,26 @@ article's mark is toggled." ;; headers that are not in the alist should be ;; fictious (see nnagent-retrieve-headers); they ;; imply that this article isn't in the agent. - (gnus-agent-append-to-list tail h) + (gnus-agent-append-to-list tail-undownloaded h) + (gnus-agent-append-to-list tail-unfetched h) (pop headers)) ((cdar alist) (pop alist) (pop headers) - nil; ignore already downloaded + nil ; ignore already downloaded ) (t (pop alist) (pop headers) - (gnus-agent-append-to-list tail a))))) + (gnus-agent-append-to-list tail-undownloaded a))))) (while headers - (gnus-agent-append-to-list tail (mail-header-number (pop headers)))) - (setq gnus-newsgroup-undownloaded (cdr undownloaded)))))) + (let ((num (mail-header-number (pop headers)))) + (gnus-agent-append-to-list tail-undownloaded num) + (gnus-agent-append-to-list tail-unfetched num))) + + (setq gnus-newsgroup-undownloaded (cdr undownloaded) + gnus-newsgroup-unfetched (cdr unfetched)))))) (defun gnus-agent-catchup () "Mark all articles as read that are neither cached, downloaded, nor downloadable." diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index 04f524b..f65665e 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -544,10 +544,9 @@ The following additional specs are available: :type 'hook :group 'gnus-article-various) -(defcustom gnus-article-hide-pgp-hook nil - "*A hook called after successfully hiding a PGP signature." - :type 'hook - :group 'gnus-article-various) +(defvar gnus-article-hide-pgp-hook nil) +(make-obsolete-variable 'gnus-article-hide-pgp-hook + "This variable is obsolete in Gnus 5.10.") (defcustom gnus-article-button-face 'bold "Face used for highlighting buttons in the article buffer. @@ -966,13 +965,8 @@ See Info node `(gnus)Customizing Articles' for details." :link '(custom-manual "(gnus)Customizing Articles") :type gnus-article-treat-custom) -(defcustom gnus-treat-strip-pgp t - "Strip PGP signatures. -Valid values are nil, t, `head', `last', an integer or a predicate. -See Info node `(gnus)Customizing Articles' for details." - :group 'gnus-article-treat - :link '(custom-manual "(gnus)Customizing Articles") - :type gnus-article-treat-custom) +(make-obsolete-variable 'gnus-treat-strip-pgp + "This option is obsolete in Gnus 5.10.") (defcustom gnus-treat-strip-pem nil "Strip PEM signatures. @@ -1359,7 +1353,6 @@ It is a string, such as \"PGP\". If nil, ask user." (gnus-treat-hide-signature gnus-article-hide-signature) (gnus-treat-strip-list-identifiers gnus-article-hide-list-identifiers) (gnus-treat-leading-whitespace gnus-article-remove-leading-whitespace) - (gnus-treat-strip-pgp gnus-article-hide-pgp) (gnus-treat-strip-pem gnus-article-hide-pem) (gnus-treat-from-picon gnus-treat-from-picon) (gnus-treat-mail-picon gnus-treat-mail-picon) @@ -2312,42 +2305,6 @@ The `gnus-list-identifiers' variable specifies what to do." "^Subject: +\\(\\(R[Ee]: +\\)+\\)R[Ee]: +" nil t) (delete-region (match-beginning 1) (match-end 1)))))))) -(defun article-hide-pgp () - "Remove any PGP headers and signatures in the current article." - (interactive) - (save-excursion - (save-restriction - (let ((inhibit-point-motion-hooks t) - buffer-read-only beg end) - (article-goto-body) - ;; Hide the "header". - (when (re-search-forward "^-----BEGIN PGP SIGNED MESSAGE-----\n" nil t) - (gnus-add-wash-type 'pgp) - (delete-region (match-beginning 0) (match-end 0)) - ;; Remove armor headers (rfc2440 6.2) - (delete-region (point) (or (re-search-forward "^[ \t]*\n" nil t) - (point))) - (setq beg (point)) - ;; Hide the actual signature. - (and (search-forward "\n-----BEGIN PGP SIGNATURE-----\n" nil t) - (setq end (1+ (match-beginning 0))) - (delete-region - end - (if (search-forward "\n-----END PGP SIGNATURE-----\n" nil t) - (match-end 0) - ;; Perhaps we shouldn't hide to the end of the buffer - ;; if there is no end to the signature? - (point-max)))) - ;; Hide "- " PGP quotation markers. - (when (and beg end) - (narrow-to-region beg end) - (goto-char (point-min)) - (while (re-search-forward "^- " nil t) - (delete-region - (match-beginning 0) (match-end 0))) - (widen)) - (gnus-run-hooks 'gnus-article-hide-pgp-hook)))))) - (defun article-hide-pem (&optional arg) "Toggle hiding of any PEM headers and signatures in the current article. If given a negative prefix, always show; if given a positive prefix, @@ -3394,7 +3351,6 @@ If variable `gnus-use-long-file-name' is non-nil, it is article-wash-html article-unsplit-urls article-hide-list-identifiers - article-hide-pgp article-strip-banner article-babel article-hide-pem @@ -5032,13 +4988,12 @@ the entire article will be yanked." (defun gnus-article-hide (&optional arg force) "Hide all the gruft in the current article. -This means that PGP stuff, signatures, cited text and (some) -headers will be hidden. +This means that signatures, cited text and (some) headers will be +hidden. If given a prefix, show the hidden text instead." (interactive (append (gnus-article-hidden-arg) (list 'force))) (gnus-article-hide-headers arg) (gnus-article-hide-list-identifiers arg) - (gnus-article-hide-pgp arg) (gnus-article-hide-citation-maybe arg force) (gnus-article-hide-signature arg)) @@ -5783,8 +5738,8 @@ call it with the value of the `gnus-data' text property." If the text at point has a `gnus-callback' property, call it with the value of the `gnus-data' text property." (interactive) - (let* ((data (get-text-property (point) 'gnus-data)) - (fun (get-text-property (point) 'gnus-callback))) + (let ((data (get-text-property (point) 'gnus-data)) + (fun (get-text-property (point) 'gnus-callback))) (when fun (funcall fun data)))) @@ -6501,42 +6456,45 @@ For example: (defun gnus-mime-security-show-details (handle) (let ((details (mm-handle-multipart-ctl-parameter handle 'gnus-details))) - (if details - (if gnus-mime-security-show-details-inline - (let ((gnus-mime-security-button-pressed t) - (gnus-mime-security-button-line-format - (get-text-property (point) 'gnus-line-format)) + (if (not details) + (gnus-message 5 "No details.") + (if gnus-mime-security-show-details-inline + (let ((gnus-mime-security-button-pressed + (not (get-text-property (point) 'gnus-mime-details))) + (gnus-mime-security-button-line-format + (get-text-property (point) 'gnus-line-format)) buffer-read-only) - (forward-char -1) - (while (eq (get-text-property (point) 'gnus-line-format) - gnus-mime-security-button-line-format) - (forward-char -1)) - (forward-char) - (save-restriction - (narrow-to-region (point) (point)) - (gnus-insert-mime-security-button handle)) - (delete-region (point) - (or (text-property-not-all - (point) (point-max) - 'gnus-line-format - gnus-mime-security-button-line-format) - (point-max)))) - (if (gnus-buffer-live-p gnus-mime-security-details-buffer) - (with-current-buffer gnus-mime-security-details-buffer - (erase-buffer) - t) - (setq gnus-mime-security-details-buffer - (gnus-get-buffer-create "*MIME Security Details*"))) - (with-current-buffer gnus-mime-security-details-buffer - (insert details) - (goto-char (point-min))) - (pop-to-buffer gnus-mime-security-details-buffer)) - (gnus-message 5 "No details.")))) + (forward-char -1) + (while (eq (get-text-property (point) 'gnus-line-format) + gnus-mime-security-button-line-format) + (forward-char -1)) + (forward-char) + (save-restriction + (narrow-to-region (point) (point)) + (gnus-insert-mime-security-button handle)) + (delete-region (point) + (or (text-property-not-all + (point) (point-max) + 'gnus-line-format + gnus-mime-security-button-line-format) + (point-max)))) + ;; Not inlined. + (if (gnus-buffer-live-p gnus-mime-security-details-buffer) + (with-current-buffer gnus-mime-security-details-buffer + (erase-buffer) + t) + (setq gnus-mime-security-details-buffer + (gnus-get-buffer-create "*MIME Security Details*"))) + (with-current-buffer gnus-mime-security-details-buffer + (insert details) + (goto-char (point-min))) + (pop-to-buffer gnus-mime-security-details-buffer))))) (defun gnus-mime-security-press-button (handle) - (if (mm-handle-multipart-ctl-parameter handle 'gnus-info) - (gnus-mime-security-show-details handle) - (gnus-mime-security-verify-or-decrypt handle))) + (save-excursion + (if (mm-handle-multipart-ctl-parameter handle 'gnus-info) + (gnus-mime-security-show-details handle) + (gnus-mime-security-verify-or-decrypt handle)))) (defun gnus-insert-mime-security-button (handle &optional displayed) (let* ((protocol (mm-handle-multipart-ctl-parameter handle 'protocol)) @@ -6557,7 +6515,8 @@ For example: b e) (setq gnus-tmp-details (if gnus-tmp-details - (concat "\n" gnus-tmp-details) "")) + (concat "\n" gnus-tmp-details) + "")) (setq gnus-tmp-pressed-details (if gnus-mime-security-button-pressed gnus-tmp-details "")) (unless (bolp) @@ -6569,6 +6528,7 @@ For example: `(,@(gnus-local-map-property gnus-mime-security-button-map) gnus-callback gnus-mime-security-press-button gnus-line-format ,gnus-mime-security-button-line-format + gnus-mime-details ,gnus-mime-security-button-pressed article-type annotation gnus-data ,handle)) (setq e (point)) @@ -6581,8 +6541,8 @@ For example: (lambda (widget/window &optional overlay pos) ;; Needed to properly clear the message due to a bug in ;; wid-edit (XEmacs only). - (if (boundp 'help-echo-owns-message) - (setq help-echo-owns-message t)) + (when (boundp 'help-echo-owns-message) + (setq help-echo-owns-message t)) (format "%S: show detail" (aref gnus-mouse-2 0)))))) diff --git a/lisp/gnus-async.el b/lisp/gnus-async.el index 56d8f67..5dac280 100644 --- a/lisp/gnus-async.el +++ b/lisp/gnus-async.el @@ -276,7 +276,7 @@ It should return non-nil if the article is to be prefetched." ;; needs to be done in nntp.el. (while (eq article gnus-async-current-prefetch-article) (incf tries) - (when (nntp-accept-process-output proc 1) + (when (nntp-accept-process-output proc) (setq tries 0)) (when (and (not nntp-have-messaged) (= tries 3)) diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el index 286e8f1..d219a9d 100644 --- a/lisp/gnus-msg.el +++ b/lisp/gnus-msg.el @@ -235,14 +235,14 @@ This variable is used only when `gnus-post-method' is `current'." (defcustom gnus-message-replysign nil - "Automatically sign replys to signed messages. + "Automatically sign replies to signed messages. See also the `mml-default-sign-method' variable." :group 'gnus-message :type 'boolean) (defcustom gnus-message-replyencrypt nil - "Automatically encrypt replys to encrypted messages. + "Automatically encrypt replies to encrypted messages. See also the `mml-default-encrypt-method' variable." :group 'gnus-message :type 'boolean) diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index fd2f4fe..0ff298e 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -429,7 +429,7 @@ this variable specifies group names." :group 'gnus-summary-marks :type 'character) -(defcustom gnus-spam-mark ?H +(defcustom gnus-spam-mark ?$ "*Mark used for spam articles." :group 'gnus-summary-marks :type 'character) @@ -1234,6 +1234,9 @@ the type of the variable (string, integer, character, etc).") (defvar gnus-newsgroup-downloadable nil "Sorted list of articles in the current newsgroup that can be processed.") +(defvar gnus-newsgroup-unfetched nil + "Sorted list of articles in the current newsgroup whose headers have not been fetched into the agent.") + (defvar gnus-newsgroup-undownloaded nil "List of articles in the current newsgroup that haven't been downloaded..") @@ -1297,6 +1300,7 @@ the type of the variable (string, integer, character, etc).") gnus-newsgroup-expirable gnus-newsgroup-processable gnus-newsgroup-killed gnus-newsgroup-downloadable gnus-newsgroup-undownloaded + gnus-newsgroup-unfetched gnus-newsgroup-unsendable gnus-newsgroup-unseen gnus-newsgroup-seen gnus-newsgroup-articles gnus-newsgroup-bookmarks gnus-newsgroup-dormant @@ -1814,7 +1818,6 @@ increase the score of each group you read." "c" gnus-article-hide-citation "C" gnus-article-hide-citation-in-followups "l" gnus-article-hide-list-identifiers - "p" gnus-article-hide-pgp "B" gnus-article-strip-banner "P" gnus-article-hide-pem "\C-c" gnus-article-hide-citation-maybe) @@ -2031,7 +2034,6 @@ increase the score of each group you read." ["Signature" gnus-article-hide-signature t] ["Citation" gnus-article-hide-citation t] ["List identifiers" gnus-article-hide-list-identifiers t] - ["PGP" gnus-article-hide-pgp t] ["Banner" gnus-article-strip-banner t] ["Boring headers" gnus-article-hide-boring-headers t]) ("Highlight" @@ -3247,11 +3249,11 @@ buffer that was in action when the last article was fetched." (setq gnus-tmp-lines -1)) (if (= gnus-tmp-lines -1) (setq gnus-tmp-lines "?") - (setq gnus-tmp-lines (number-to-string gnus-tmp-lines))) - (gnus-put-text-property + (setq gnus-tmp-lines (number-to-string gnus-tmp-lines))) + (gnus-put-text-property (point) (progn (eval gnus-summary-line-format-spec) (point)) - 'gnus-number gnus-tmp-number) + 'gnus-number gnus-tmp-number) (when (gnus-visual-p 'summary-highlight 'highlight) (forward-line -1) (gnus-run-hooks 'gnus-summary-update-hook) @@ -4543,7 +4545,8 @@ or a straight list of headers." gnus-tmp-number gnus-tmp-opening-bracket gnus-tmp-closing-bracket tree-stack) - (setq gnus-tmp-prev-subject nil) + (setq gnus-tmp-prev-subject nil + gnus-tmp-thread-tree-header-string "") (if (vectorp (car threads)) ;; If this is a straight (sic) list of headers, then a @@ -4785,10 +4788,10 @@ or a straight list of headers." (if (= gnus-tmp-lines -1) (setq gnus-tmp-lines "?") (setq gnus-tmp-lines (number-to-string gnus-tmp-lines))) - (gnus-put-text-property + (gnus-put-text-property (point) (progn (eval gnus-summary-line-format-spec) (point)) - 'gnus-number number) + 'gnus-number number) (when gnus-visual-p (forward-line -1) (gnus-run-hooks 'gnus-summary-update-hook) @@ -5996,53 +5999,53 @@ If EXCLUDE-GROUP, do not go to this group." (save-excursion (gnus-group-best-unread-group exclude-group)))) -(defun gnus-summary-find-next (&optional unread article backward undownloaded) +(defun gnus-summary-find-next (&optional unread article backward) (if backward (gnus-summary-find-prev) (let* ((dummy (gnus-summary-article-intangible-p)) (article (or article (gnus-summary-article-number))) - (arts (gnus-data-find-list article)) + (data (gnus-data-find-list article)) result) (when (and (not dummy) (or (not gnus-summary-check-current) (not unread) - (not (gnus-data-unread-p (car arts))))) - (setq arts (cdr arts))) + (not (gnus-data-unread-p (car data))))) + (setq data (cdr data))) (when (setq result (if unread (progn - (while arts - (when (or (and undownloaded - (memq (car arts) - gnus-newsgroup-undownloaded)) - (gnus-data-unread-p (car arts))) - (setq result (car arts) - arts nil)) - (setq arts (cdr arts))) + (while data + (unless (memq (gnus-data-number (car data)) + gnus-newsgroup-unfetched) + (when (gnus-data-unread-p (car data)) + (setq result (car data) + data nil))) + (setq data (cdr data))) result) - (car arts))) + (car data))) (goto-char (gnus-data-pos result)) (gnus-data-number result))))) (defun gnus-summary-find-prev (&optional unread article) (let* ((eobp (eobp)) (article (or article (gnus-summary-article-number))) - (arts (gnus-data-find-list article (gnus-data-list 'rev))) + (data (gnus-data-find-list article (gnus-data-list 'rev))) result) (when (and (not eobp) (or (not gnus-summary-check-current) (not unread) - (not (gnus-data-unread-p (car arts))))) - (setq arts (cdr arts))) + (not (gnus-data-unread-p (car data))))) + (setq data (cdr data))) (when (setq result (if unread (progn - (while arts - (when (gnus-data-unread-p (car arts)) - (setq result (car arts) - arts nil)) - (setq arts (cdr arts))) + (while data + (unless (memq (gnus-data-number (car data)) gnus-newsgroup-unfetched) + (when (gnus-data-unread-p (car data)) + (setq result (car data) + data nil))) + (setq data (cdr data))) result) - (car arts))) + (car data))) (goto-char (gnus-data-pos result)) (gnus-data-number result)))) @@ -6698,42 +6701,55 @@ If prefix argument NO-ARTICLE is non-nil, no article is selected initially." ;; Walking around summary lines. (defun gnus-summary-first-subject (&optional unread undownloaded unseen) - "Go to the first unread subject. -If UNREAD is non-nil, go to the first unread article. -Returns the article selected or nil if there are no unread articles." + "Go to the first subject satisfying any non-nil constraint. +If UNREAD is non-nil, the article should be unread. +If UNDOWNLOADED is non-nil, the article should be undownloaded. +If UNSEED is non-nil, the article should be unseen. +Returns the article selected or nil if there are no matching articles." (interactive "P") - (prog1 - (cond - ;; Empty summary. - ((null gnus-newsgroup-data) - (gnus-message 3 "No articles in the group") - nil) - ;; Pick the first article. - ((not unread) - (goto-char (gnus-data-pos (car gnus-newsgroup-data))) - (gnus-data-number (car gnus-newsgroup-data))) - ;; No unread articles. - ((null gnus-newsgroup-unreads) - (gnus-message 3 "No more unread articles") - nil) - ;; Find the first unread article. - (t - (let ((data gnus-newsgroup-data)) - (while (and data - (and (not (and undownloaded - (memq (car data) - gnus-newsgroup-undownloaded))) - (if unseen - (or (not (memq - (gnus-data-number (car data)) - gnus-newsgroup-unseen)) - (not (gnus-data-unread-p (car data)))) - (not (gnus-data-unread-p (car data)))))) - (setq data (cdr data))) - (when data - (goto-char (gnus-data-pos (car data))) - (gnus-data-number (car data)))))) - (gnus-summary-position-point))) + (cond + ;; Empty summary. + ((null gnus-newsgroup-data) + (gnus-message 3 "No articles in the group") + nil) + ;; Pick the first article. + ((not (or unread undownloaded unseen)) + (goto-char (gnus-data-pos (car gnus-newsgroup-data))) + (gnus-data-number (car gnus-newsgroup-data))) + ;; Find the first unread article. + (t + (let ((data gnus-newsgroup-data)) + (while (and data + (let ((num (gnus-data-number (car data)))) + (or (memq num gnus-newsgroup-unfetched) + (not (or (and unread + (memq num gnus-newsgroup-unreads)) + (and undownloaded + (memq num gnus-newsgroup-undownloaded)) + (and unseen + (memq num gnus-newsgroup-unseen))))))) + (setq data (cdr data))) + (prog1 + (if data + (progn + (goto-char (gnus-data-pos (car data))) + (gnus-data-number (car data))) + (gnus-message 3 "No more%s articles" + (let* ((r (when unread " unread")) + (d (when undownloaded " undownloaded")) + (s (when unseen " unseen")) + (l (delq nil (list r d s)))) + (cond ((= 3 (length l)) + (concat r "," d ", or" s)) + ((= 2 (length l)) + (concat (car l) ", or" (cadr l))) + ((= 1 (length l)) + (car l)) + (t + "")))) + nil + ) + (gnus-summary-position-point)))))) (defun gnus-summary-next-subject (n &optional unread dont-display) "Go to next N'th summary line. @@ -6890,6 +6906,7 @@ be displayed." 'old)))) (defun gnus-summary-force-verify-and-decrypt () + "Display buttons for signed/encrypted parts and verify/decrypt them." (interactive) (let ((mm-verify-option 'known) (mm-decrypt-option 'known) @@ -7188,19 +7205,20 @@ Return nil if there are no unread articles." Return nil if there are no unseen articles." (interactive) (prog1 - (when (gnus-summary-first-subject t t t) + (when (gnus-summary-first-subject nil nil t) (gnus-summary-show-thread) - (gnus-summary-first-subject t t t)) + (gnus-summary-first-subject nil nil t)) (gnus-summary-position-point))) (defun gnus-summary-first-unseen-or-unread-subject () - "Place the point on the subject line of the first unseen article. -Return nil if there are no unseen articles." + "Place the point on the subject line of the first unseen article or, +if all article have been seen, on the subject line of the first unread +article." (interactive) (prog1 - (unless (when (gnus-summary-first-subject t t t) + (unless (when (gnus-summary-first-subject nil nil t) (gnus-summary-show-thread) - (gnus-summary-first-subject t t t)) + (gnus-summary-first-subject nil nil t)) (when (gnus-summary-first-subject t) (gnus-summary-show-thread) (gnus-summary-first-subject t))) @@ -9432,6 +9450,8 @@ ARTICLE can also be a list of articles." (interactive (list (gnus-summary-article-number))) (let ((articles (if (listp article) article (list article)))) (dolist (article articles) + (unless (numberp article) + (error "%s is not a number" article)) (push article gnus-newsgroup-replied) (let ((buffer-read-only nil)) (when (gnus-summary-goto-subject article nil t) @@ -9980,8 +10000,10 @@ The number of articles marked as read is returned." gnus-newsgroup-spam-marked nil gnus-newsgroup-dormant nil)) (setq gnus-newsgroup-unreads - (gnus-intersection gnus-newsgroup-unreads - gnus-newsgroup-downloadable))) + (gnus-sorted-nunion + (gnus-intersection gnus-newsgroup-unreads + gnus-newsgroup-downloadable) + gnus-newsgroup-unfetched))) ;; We actually mark all articles as canceled, which we ;; have to do when using auto-expiry or adaptive scoring. (gnus-summary-show-all-threads) @@ -9990,12 +10012,12 @@ The number of articles marked as read is returned." (goto-char to-here) (while (and (gnus-summary-mark-article-as-read gnus-catchup-mark) - (gnus-summary-find-next (not all) nil nil t)))) - (when (gnus-summary-first-subject (not all) t) + (gnus-summary-find-next (not all))))) + (when (gnus-summary-first-subject (not all)) (while (and (if to-here (< (point) to-here) t) (gnus-summary-mark-article-as-read gnus-catchup-mark) - (gnus-summary-find-next (not all) nil nil t))))) + (gnus-summary-find-next (not all)))))) (gnus-set-mode-line 'summary)) t)) (gnus-summary-position-point))) diff --git a/lisp/gnus.el b/lisp/gnus.el index 47c9829..67379cb 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -282,7 +282,7 @@ is restarted, and sometimes reloaded." :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) -(defconst gnus-version-number "0.13" +(defconst gnus-version-number "0.14" "Version number for this version of Gnus.") (defconst gnus-version (format "Oort Gnus v%s" gnus-version-number) @@ -2430,7 +2430,6 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.") gnus-article-decode-HZ gnus-article-wash-html gnus-article-unsplit-urls - gnus-article-hide-pgp gnus-article-hide-pem gnus-article-hide-signature gnus-article-strip-leading-blank-lines gnus-article-date-local gnus-article-date-original gnus-article-date-lapsed diff --git a/lisp/message.el b/lisp/message.el index 9419ce7..8e9882d 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -194,9 +194,9 @@ Checks include `subject-cmsg', `multiple-headers', `sendsys', :type '(repeat sexp)) ; Fixme: improve this (defcustom message-required-headers '((optional . References) From) - "*Headers to be generated or promted for when sending a message. + "*Headers to be generated or prompted for when sending a message. Also see `message-required-news-headers' and -1message-required-mail-headers'." +`message-required-mail-headers'." :group 'message-news :group 'message-headers :type '(repeat sexp)) diff --git a/lisp/mm-decode.el b/lisp/mm-decode.el index 977bb8a..41da384 100644 --- a/lisp/mm-decode.el +++ b/lisp/mm-decode.el @@ -1290,9 +1290,9 @@ If RECURSIVE, search recursively." (defsubst mm-set-handle-multipart-parameter (handle parameter value) ;; HANDLE could be a CTL. - (if handle - (put-text-property 0 (length (car handle)) parameter value - (car handle)))) + (when handle + (put-text-property 0 (length (car handle)) parameter value + (car handle)))) (defun mm-possibly-verify-or-decrypt (parts ctl) (let ((type (car ctl)) @@ -1325,25 +1325,26 @@ If RECURSIVE, search recursively." protocols nil) (setq protocols (cdr protocols)))))) (setq func (nth 1 (assoc protocol mm-verify-function-alist))) - (if (cond - ((eq mm-verify-option 'never) nil) - ((eq mm-verify-option 'always) t) - ((eq mm-verify-option 'known) - (and func - (or (not (setq functest - (nth 3 (assoc protocol - mm-verify-function-alist)))) - (funcall functest parts ctl)))) - (t (y-or-n-p + (when (cond + ((eq mm-verify-option 'never) nil) + ((eq mm-verify-option 'always) t) + ((eq mm-verify-option 'known) + (and func + (or (not (setq functest + (nth 3 (assoc protocol + mm-verify-function-alist)))) + (funcall functest parts ctl)))) + (t + (y-or-n-p (format "Verify signed (%s) part? " (or (nth 2 (assoc protocol mm-verify-function-alist)) (format "protocol=%s" protocol)))))) - (save-excursion - (if func - (funcall func parts ctl) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (format "Unknown sign protocol (%s)" protocol)))))) + (save-excursion + (if func + (funcall func parts ctl) + (mm-set-handle-multipart-parameter + mm-security-handle 'gnus-details + (format "Unknown sign protocol (%s)" protocol)))))) ((equal subtype "encrypted") (unless (setq protocol (mm-handle-multipart-ctl-parameter ctl 'protocol)) @@ -1356,25 +1357,26 @@ If RECURSIVE, search recursively." parts nil) (setq parts (cdr parts)))))) (setq func (nth 1 (assoc protocol mm-decrypt-function-alist))) - (if (cond - ((eq mm-decrypt-option 'never) nil) - ((eq mm-decrypt-option 'always) t) - ((eq mm-decrypt-option 'known) - (and func - (or (not (setq functest - (nth 3 (assoc protocol - mm-decrypt-function-alist)))) - (funcall functest parts ctl)))) - (t (y-or-n-p + (when (cond + ((eq mm-decrypt-option 'never) nil) + ((eq mm-decrypt-option 'always) t) + ((eq mm-decrypt-option 'known) + (and func + (or (not (setq functest + (nth 3 (assoc protocol + mm-decrypt-function-alist)))) + (funcall functest parts ctl)))) + (t + (y-or-n-p (format "Decrypt (%s) part? " (or (nth 2 (assoc protocol mm-decrypt-function-alist)) (format "protocol=%s" protocol)))))) - (save-excursion - (if func - (setq parts (funcall func parts ctl)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (format "Unknown encrypt protocol (%s)" protocol)))))) + (save-excursion + (if func + (setq parts (funcall func parts ctl)) + (mm-set-handle-multipart-parameter + mm-security-handle 'gnus-details + (format "Unknown encrypt protocol (%s)" protocol)))))) (t nil)) parts)) diff --git a/lisp/mml-sec.el b/lisp/mml-sec.el index 8a02fc5..0b1be32 100644 --- a/lisp/mml-sec.el +++ b/lisp/mml-sec.el @@ -31,6 +31,7 @@ (defvar mml-sign-alist '(("smime" mml-smime-sign-buffer mml-smime-sign-query) ("pgp" mml-pgp-sign-buffer list) + ("pgpauto" mml-pgpauto-sign-buffer list) ("pgpmime" mml-pgpmime-sign-buffer list)) "Alist of MIME signer functions.") @@ -40,6 +41,7 @@ (defvar mml-encrypt-alist '(("smime" mml-smime-encrypt-buffer mml-smime-encrypt-query) ("pgp" mml-pgp-encrypt-buffer list) + ("pgpauto" mml-pgpauto-sign-buffer list) ("pgpmime" mml-pgpmime-encrypt-buffer list)) "Alist of MIME encryption functions.") @@ -49,6 +51,7 @@ (defcustom mml-signencrypt-style-alist '(("smime" separate) ("pgp" separate) + ("pgpauto" separate) ("pgpmime" separate)) "Alist specifying if `signencrypt' results in two separate operations or not. The first entry indicates the MML security type, valid entries include @@ -118,6 +121,20 @@ You can also customize or set `mml-signencrypt-style-alist' instead." (or (mml2015-encrypt cont sign) (error "Encryption failed... inspect message logs for errors"))) +(defun mml-pgpauto-sign-buffer (cont) + (message-goto-body) + (or (if (re-search-backward "Content-Type: *multipart/.*" nil t) ; there must be a better way... + (mml2015-sign cont) + (mml1991-sign cont)) + (error "Encryption failed... inspect message logs for errors"))) + +(defun mml-pgpauto-encrypt-buffer (cont &optional sign) + (message-goto-body) + (or (if (re-search-backward "Content-Type: *multipart/.*" nil t) ; there must be a better way... + (mml2015-encrypt cont sign) + (mml1991-encrypt cont sign)) + (error "Encryption failed... inspect message logs for errors"))) + (defun mml-secure-part (method &optional sign) (save-excursion (let ((tags (funcall (nth 2 (assoc method (if sign mml-sign-alist @@ -148,6 +165,11 @@ You can also customize or set `mml-signencrypt-style-alist' instead." (interactive) (mml-secure-part "pgp" 'sign)) +(defun mml-secure-sign-pgpauto () + "Add MML tags to PGP-auto sign this MML part." + (interactive) + (mml-secure-part "pgpauto" 'sign)) + (defun mml-secure-sign-pgpmime () "Add MML tags to PGP/MIME sign this MML part." (interactive) @@ -214,6 +236,11 @@ You can also customize or set `mml-signencrypt-style-alist' instead." (interactive) (mml-secure-message "pgpmime" 'sign)) +(defun mml-secure-message-sign-pgpauto () + "Add MML tag to encrypt/sign the entire message." + (interactive) + (mml-secure-message "pgpauto" 'sign)) + (defun mml-secure-message-encrypt-smime (&optional dontsign) "Add MML tag to encrypt and sign the entire message. If called with a prefix argument, only encrypt (do NOT sign)." @@ -232,6 +259,12 @@ If called with a prefix argument, only encrypt (do NOT sign)." (interactive "P") (mml-secure-message "pgpmime" (if dontsign 'encrypt 'signencrypt))) +(defun mml-secure-message-encrypt-pgpauto (&optional dontsign) + "Add MML tag to encrypt and sign the entire message. +If called with a prefix argument, only encrypt (do NOT sign)." + (interactive "P") + (mml-secure-message "pgpauto" (if dontsign 'encrypt 'signencrypt))) + (provide 'mml-sec) ;;; mml-sec.el ends here diff --git a/lisp/nnslashdot.el b/lisp/nnslashdot.el index 7f9203c..63b39c9 100644 --- a/lisp/nnslashdot.el +++ b/lisp/nnslashdot.el @@ -515,4 +515,3 @@ (provide 'nnslashdot) ;;; nnslashdot.el ends here - diff --git a/lisp/nntp.el b/lisp/nntp.el index ca1c917..ae0cfdb 100644 --- a/lisp/nntp.el +++ b/lisp/nntp.el @@ -207,6 +207,10 @@ NOTE: This variable is never seen to work in Emacs 20 and XEmacs 21.") "*Hook run just before posting an article. It is supposed to be used to insert Cancel-Lock headers.") +(defvoo nntp-read-timeout 0.1 + "How long nntp should wait between checking for the end of output. +Shorter values mean quicker response, but is more CPU intensive.") + ;;; Internal variables. (defvar nntp-record-commands nil @@ -576,17 +580,15 @@ command whose response triggered the error." nntp-server-buffer)) (buffer (and process (process-buffer process)))) - ; when I an able to identify - ; the connection to the server - ; AND I've received NO reponse - ; for nntp-connection-timeout - ; seconds. + ;; When I an able to identify the + ;; connection to the server AND I've + ;; received NO reponse for + ;; nntp-connection-timeout seconds. (when (and buffer (eq 0 (buffer-size buffer))) - ; Close the connection. Take - ; no other action as the - ; accept input code will - ; handle the closed - ; connection. + ;; Close the connection. Take no + ;; other action as the accept input + ;; code will handle the closed + ;; connection. (nntp-kill-buffer buffer)))))))) (unwind-protect (setq nntp-with-open-group-internal @@ -594,8 +596,7 @@ command whose response triggered the error." (progn ,@forms) (quit (nntp-close-server) - (signal 'quit nil))) - ) + (signal 'quit nil)))) (when timer (nnheader-cancel-timer timer))) nil)) @@ -729,7 +730,8 @@ command whose response triggered the error." (set-buffer buf) (goto-char (point-max)) (if (not nntp-server-list-active-group) - (not (re-search-backward "\r?\n" (- (point) 3) t)) + (not (re-search-backward "\r?\n" + (- (point) 3) t)) (not (re-search-backward "^\\.\r?\n" (- (point) 4) t))))) (nntp-accept-response))) @@ -1270,7 +1272,7 @@ password contained in '~/.nntp-authinfo'." (nnheader-report 'nntp message) message)) -(defun nntp-accept-process-output (process &optional timeout) +(defun nntp-accept-process-output (process) "Wait for output from PROCESS and message some dots." (save-excursion (set-buffer (or (nntp-find-connection-buffer nntp-server-buffer) @@ -1280,15 +1282,18 @@ password contained in '~/.nntp-authinfo'." (unless (< len 10) (setq nntp-have-messaged t) (nnheader-message 7 "nntp read: %dk" len))) - (if timeout - (accept-process-output process timeout) - (accept-process-output process 0 100)) + (accept-process-output + process + (truncate nntp-read-timeout) + (truncate (* (- nntp-read-timeout + (truncate nntp-read-timeout)) + 1000))) ;; accept-process-output may update status of process to indicate ;; that the server has closed the connection. This MUST be ;; handled here as the buffer restored by the save-excursion may ;; be the process's former output buffer (i.e. now killed) (or (and process - (memq (process-status process) '(open run))) + (memq (process-status process) '(open run))) (nntp-report "Server closed connection")))) (defun nntp-accept-response () @@ -1438,12 +1443,13 @@ password contained in '~/.nntp-authinfo'." (while (re-search-forward "^[0-9][0-9][0-9] .*\n" nil t) (incf received)) (setq last-point (point)) - (or (< received count) ;; I haven't started reading the final response + (or (< received count) + ;; I haven't started reading the final response (progn (goto-char (point-max)) (forward-line -1) - (not (looking-at "^\\.\r?\n"))) ;; I haven't read the end of the final response - )) + (not (looking-at "^\\.\r?\n"))))) + ;; I haven't read the end of the final response (nntp-accept-response) (set-buffer process-buffer)))) @@ -1461,8 +1467,9 @@ password contained in '~/.nntp-authinfo'." (when (<= count 1) (goto-char (point-min)) (when (re-search-forward "^[0-9][0-9][0-9] .*\n\\([0-9]+\\)" nil t) - (let ((low-limit (string-to-int (buffer-substring (match-beginning 1) - (match-end 1))))) + (let ((low-limit (string-to-int + (buffer-substring (match-beginning 1) + (match-end 1))))) (while (and articles (<= (car articles) low-limit)) (setq articles (cdr articles)))))) (set-buffer buf)) diff --git a/lisp/spam.el b/lisp/spam.el index 86012dc..067425a 100644 --- a/lisp/spam.el +++ b/lisp/spam.el @@ -105,6 +105,12 @@ The regular expression is matched against the address." :type 'boolean :group 'spam) +(defcustom spam-use-regex-headers nil + "Whether a header regular expression match should be used by spam-split. +Also see the variable `spam-spam-regex-headers' and `spam-ham-regex-headers'." + :type 'boolean + :group 'spam) + (defcustom spam-use-bogofilter-headers nil "Whether bogofilter headers should be used by spam-split. Enable this if you pre-process messages with Bogofilter BEFORE Gnus sees them." @@ -177,6 +183,16 @@ Such articles will be transmitted to `bogofilter -s' on group exit." :type 'face :group 'spam) +(defcustom spam-regex-headers-spam '("^X-Spam-Flag: YES") + "Regular expression for positive header spam matches" + :type '(repeat (regexp :tag "Regular expression to match spam header")) + :group 'spam) + +(defcustom spam-regex-headers-ham '("^X-Spam-Flag: NO") + "Regular expression for positive header ham matches" + :type '(repeat (regexp :tag "Regular expression to match ham header")) + :group 'spam) + (defgroup spam-ifile nil "Spam ifile configuration." :group 'spam) @@ -198,6 +214,13 @@ Such articles will be transmitted to `bogofilter -s' on group exit." :type 'string :group 'spam-ifile) +(defcustom spam-ifile-ham-category nil + "Name of the ham ifile category. If nil, the current group name will +be used." + :type '(choice (string :tag "Use a fixed category") + (const :tag "Use the current group name")) + :group 'spam-ifile) + (defcustom spam-ifile-all-categories nil "Whether the ifile check will return all categories, or just spam. Set this to t if you want to use the spam-split invocation of ifile as @@ -275,7 +298,7 @@ your main source of newsgroup names." (spam-group-processor-p group 'gnus-group-ham-exit-processor-ifile)) (defun spam-group-ham-processor-bogofilter-p (group) - (spam-group-processor-p group 'gnus-group-ham-exit-processor-ifile)) + (spam-group-processor-p group 'gnus-group-ham-exit-processor-bogofilter)) (defun spam-group-spam-processor-stat-p (group) (spam-group-processor-p group 'gnus-group-spam-exit-processor-stat)) @@ -298,24 +321,30 @@ your main source of newsgroup names." (defun spam-summary-prepare-exit () ;; The spam processors are invoked for any group, spam or ham or neither + (gnus-message 6 "Exiting summary buffer and applying spam rules") (when (and spam-bogofilter-path (spam-group-spam-processor-bogofilter-p gnus-newsgroup-name)) + (gnus-message 5 "Registering spam with bogofilter") (spam-bogofilter-register-spam-routine)) (when (and spam-ifile-path (spam-group-spam-processor-ifile-p gnus-newsgroup-name)) + (gnus-message 5 "Registering spam with ifile") (spam-ifile-register-spam-routine)) (when (spam-group-spam-processor-stat-p gnus-newsgroup-name) + (gnus-message 5 "Registering spam with spam-stat") (spam-stat-register-spam-routine)) (when (spam-group-spam-processor-blacklist-p gnus-newsgroup-name) + (gnus-message 5 "Registering spam with the blacklist") (spam-blacklist-register-routine)) (if spam-move-spam-nonspam-groups-only (when (not (spam-group-spam-contents-p gnus-newsgroup-name)) (spam-mark-spam-as-expired-and-move-routine (gnus-parameter-spam-process-destination gnus-newsgroup-name))) + (gnus-message 5 "Marking spam as expired and moving it") (spam-mark-spam-as-expired-and-move-routine (gnus-parameter-spam-process-destination gnus-newsgroup-name))) @@ -325,18 +354,24 @@ your main source of newsgroup names." (when (spam-group-ham-contents-p gnus-newsgroup-name) (when (spam-group-ham-processor-whitelist-p gnus-newsgroup-name) + (gnus-message 5 "Registering ham with the whitelist") (spam-whitelist-register-routine)) (when (spam-group-ham-processor-ifile-p gnus-newsgroup-name) + (gnus-message 5 "Registering ham with ifile") (spam-ifile-register-ham-routine)) (when (spam-group-ham-processor-bogofilter-p gnus-newsgroup-name) + (gnus-message 5 "Registering ham with Bogofilter") (spam-bogofilter-register-ham-routine)) (when (spam-group-ham-processor-stat-p gnus-newsgroup-name) + (gnus-message 5 "Registering ham with spam-stat") (spam-stat-register-ham-routine)) (when (spam-group-ham-processor-BBDB-p gnus-newsgroup-name) + (gnus-message 5 "Registering ham with the BBDB") (spam-BBDB-register-routine))) ;; now move all ham articles out of spam groups (when (spam-group-spam-contents-p gnus-newsgroup-name) + (gnus-message 5 "Moving ham messages from spam group") (spam-ham-move-routine (gnus-parameter-ham-process-destination gnus-newsgroup-name)))) @@ -346,6 +381,7 @@ your main source of newsgroup names." ;; check the global list of group names spam-junk-mailgroups and the ;; group parameters (when (spam-group-spam-contents-p gnus-newsgroup-name) + (gnus-message 5 "Marking unread articles as spam") (let ((articles gnus-newsgroup-articles) article) (while articles @@ -457,6 +493,7 @@ your main source of newsgroup names." (defvar spam-list-of-checks '((spam-use-blacklist . spam-check-blacklist) + (spam-use-regex-headers . spam-check-regex-headers) (spam-use-whitelist . spam-check-whitelist) (spam-use-BBDB . spam-check-BBDB) (spam-use-ifile . spam-check-ifile) @@ -492,11 +529,32 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (while (and list-of-checks (not decision)) (let ((pair (pop list-of-checks))) (when (symbol-value (car pair)) + (gnus-message 5 "spam-split: calling the %s function" (symbol-name (cdr pair))) (setq decision (funcall (cdr pair)))))) (if (eq decision t) nil decision))) +;;;; Regex headers + +(defun spam-check-regex-headers () + (let (ret found) + (dolist (h-regex spam-regex-headers-ham) + (unless found + (goto-char (point-min)) + (when (re-search-forward h-regex nil t) + (message "Ham regex header search positive.") + (setq found t)))) + (dolist (s-regex spam-regex-headers-spam) + (unless found + (goto-char (point-min)) + (when (re-search-forward s-regex nil t) + (message "Spam regex header search positive." (match-string 1)) + (setq found t) + (setq ret spam-split-group)))) + ret)) + + ;;;; Blackholes. (defun spam-check-blackholes () @@ -507,9 +565,10 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (with-temp-buffer (insert headers) (goto-char (point-min)) + (gnus-message 5 "Checking headers for relay addresses") (while (re-search-forward "\\[\\([0-9]+.[0-9]+.[0-9]+.[0-9]+\\)\\]" nil t) - (message "Blackhole search found host IP %s." (match-string 1)) + (gnus-message 9 "Blackhole search found host IP %s." (match-string 1)) (push (mapconcat 'identity (nreverse (split-string (match-string 1) "\\.")) ".") @@ -520,11 +579,12 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (if spam-use-dig (let ((query-result (query-dig query-string))) (when query-result - (message "spam: positive blackhole check '%s'" query-result) + (gnus-message 5 "(DIG): positive blackhole check '%s'" query-result) (push (list ip server query-result) matches))) ;; else, if not using dig.el (when (query-dns query-string) + (gnus-message 5 "positive blackhole check") (push (list ip server (query-dns query-string 'TXT)) matches))))))) (when matches @@ -548,7 +608,7 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details." (let* ((parsed-address (gnus-extract-address-components from)) (name (or (car parsed-address) "Ham Sender")) (net-address (car (cdr parsed-address)))) - (message "Adding address %s to BBDB" from) + (gnus-message 5 "Adding address %s to BBDB" from) (when (and net-address (not (bbdb-search-simple nil net-address))) (bbdb-create-internal name nil net-address nil nil @@ -644,7 +704,7 @@ Uses `gnus-newsgroup-name' if category is nil (for ham registration)." nil (lambda (article) (spam-ifile-register-with-ifile - (spam-get-article-as-string article) nil)))) + (spam-get-article-as-string article) spam-ifile-ham-category)))) ;;;; spam-stat diff --git a/texi/ChangeLog b/texi/ChangeLog index 84b9365..efeb708 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,3 +1,55 @@ +2003-01-23 Lars Magne Ingebrigtsen + + * gnus.texi (NNTP): Addition. + +2003-01-23 Teodor Zlatanov + + * gnus.texi (Regular Expressions Header Matching): documentation + for new spam splitting functionality + +2003-01-23 Jesper Harder + + * gnus.texi (Signing and encrypting): Index. + (Smileys): Update. + (Toolbar): Move to XVarious because it's XEmacs specific. + +2003-01-22 Jesper Harder + + * gnus.texi (Picons): Update. + +2003-01-22 Kai Gro,A_(Bjohann + + * gnus.texi (Agent Expiry, Agent Variables): Don't use @pxref for + index entries. + +2003-01-22 Simon Josefsson + + * gnus.texi (IMAP): Add. + (Expiring in IMAP): Typo fixes. + +2003-01-22 Kevin Greiner + + * gnus.texi (Agent Regeneration): New node. + (gnus-select-article-hook): clarified. + (gnus-downloaded-mark): Added definition. + (gnus-undownloaded-mark): Updated definition to reference the new + %O spec. + (gnus-agent-catchup): Identified articles that are NOT marked as read. + (gnus-agent-fetch-group): New command. + (gnus-agent-fetch-series): New command. + (Agent Expiry): Added comment to document that + gnus-request-expire-articles may invoke gnus-agent-expire. + (gnus-agent-mark-unread-after-downloaded): New variable. + (gnus-agent-consider-all-articles): New variable. + (gnus-agent-max-fetch-size): New variable. + +2003-01-22 Jesper Harder + + * gnusref.tex (subsection*{Notes}): do. + + * gnus.texi (Article Hiding): Remove gnus-article-hide-pgp. + (Customizing Articles): Remove gnus-treat-strip-pgp. + 2003-01-21 Jesper Harder * gnus.texi (Various Summary Stuff): Add diff --git a/texi/gnus.texi b/texi/gnus.texi index 1dcfeda..45627ce 100644 --- a/texi/gnus.texi +++ b/texi/gnus.texi @@ -33,7 +33,7 @@ \makeindex \begin{document} -\newcommand{\gnusversionname}{Oort Gnus v0.13} +\newcommand{\gnusversionname}{Oort Gnus v0.14} \newcommand{\gnuschaptername}{} \newcommand{\gnussectionname}{} @@ -385,7 +385,7 @@ can be gotten by any nefarious means you can think of---@sc{nntp}, local spool or your mbox file. All at the same time, if you want to push your luck. -This manual corresponds to Oort Gnus v0.13. +This manual corresponds to Oort Gnus v0.14. @end ifinfo @@ -753,6 +753,7 @@ Gnus Unplugged * Agent Commands:: New commands for all the buffers. * Agent as Cache:: The Agent is a big cache too. * Agent Expiry:: How to make old articles go away. +* Agent Regeneration:: How to recover from lost connections and other accidents. * Agent and IMAP:: How to use the Agent with IMAP. * Outgoing Messages:: What happens when you post/mail something? * Agent Variables:: Customizing is fun. @@ -768,9 +769,9 @@ Agent Categories Agent Commands -* Group Agent Commands:: -* Summary Agent Commands:: -* Server Agent Commands:: +* Group Agent Commands:: Configure groups and fetch their contents. +* Summary Agent Commands:: Manually select then fetch specific articles. +* Server Agent Commands:: Select the servers that are supported by the agent. Scoring @@ -843,17 +844,8 @@ Image Enhancements * Picons:: How to display pictures of what you're reading. * Smileys:: Show all those happy faces the way they were meant to be shown. * X-Face:: Display a funky, teensy black-and-white image. -* Toolbar:: Click'n'drool. * XVarious:: Other XEmacsy Gnusey variables. -Picons - -* Picon Basics:: What are picons and How do I get them. -* Picon Requirements:: Don't go further if you aren't using XEmacs. -* Easy Picons:: Displaying Picons---the easy way. -* Hard Picons:: The way you should do it. You'll learn something. -* Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with. - Thwarting Email Spam * The problem of spam:: Some background, and some solutions @@ -5015,9 +5007,9 @@ the server and display it in the article buffer. @item gnus-select-article-hook @vindex gnus-select-article-hook This hook is called whenever an article is selected. By default it -exposes any threads hidden under the selected article. If you wish -that the Agent saves all articles you read, putting -@code{gnus-agent-fetch-selected-article} on this hook should do it. +exposes any threads hidden under the selected article. If you would +like each article to be saved in the Agent as you read it, putting +@code{gnus-agent-fetch-selected-article} on this hook will do so. @item gnus-mark-article-hook @vindex gnus-mark-article-hook @@ -5760,12 +5752,20 @@ with a @samp{.} in the second column (@code{gnus-unseen-mark}). Compare with @code{gnus-recent-mark}. @item +@vindex gnus-downloaded-mark +When using the Gnus agent @pxref{Agent Basics}, articles may be +downloaded for unplugged (offline) viewing. If you are using the +@samp{%O} spec, these articles get the @samp{+} mark in that spec. +(The variable @code{gnus-downloaded-mark} controls which character to +use.) + +@item @vindex gnus-undownloaded-mark -When using the Gnus agent @pxref{Agent Basics}, some articles might not -have been downloaded. Such articles cannot be viewed while you are -offline (unplugged). These articles get the @samp{@@} mark in the -first column. (The variable @code{gnus-undownloaded-mark} controls -which character to use.) +When using the Gnus agent @pxref{Agent Basics}, some articles might +not have been downloaded. Such articles cannot be viewed while you +are unplugged (offline). If you are using the @samp{%O} spec, these +articles get the @samp{-} mark in that spec. (The variable +@code{gnus-undownloaded-mark} controls which character to use.) @item @vindex gnus-downloadable-mark @@ -8109,29 +8109,6 @@ subject. This can also be a list of regular expressions. @end table -@item W W p -@kindex W W p (Summary) -@findex gnus-article-hide-pgp -@vindex gnus-article-hide-pgp-hook -Hide @sc{pgp} signatures (@code{gnus-article-hide-pgp}). The -@code{gnus-article-hide-pgp-hook} hook will be run after a @sc{pgp} -signature has been hidden. For example, to automatically verify -articles that have signatures in them do: -@lisp -;;; Hide pgp cruft if any. - -(setq gnus-treat-strip-pgp t) - -;;; After hiding pgp, verify the message; -;;; only happens if pgp signature is found. - -(add-hook 'gnus-article-hide-pgp-hook - (lambda () - (save-excursion - (set-buffer gnus-original-article-buffer) - (mc-verify)))) -@end lisp - @item W W P @kindex W W P (Summary) @findex gnus-article-hide-pem @@ -10769,7 +10746,6 @@ possible but those listed are probably sufficient for most people. @item gnus-treat-strip-leading-blank-lines (t, integer) @item gnus-treat-strip-multiple-blank-lines (t, integer) @item gnus-treat-strip-pem (t, last, integer) -@item gnus-treat-strip-pgp (t, last, integer) @item gnus-treat-strip-trailing-blank-lines (t, last, integer) @item gnus-treat-unsplit-urls (t, integer) @item gnus-treat-wash-html (t, integer) @@ -11580,6 +11556,9 @@ format or @sc{pgp/mime} or @sc{s/mime}. For decoding such messages, see the @code{mm-verify-option} and @code{mm-decrypt-option} options (@pxref{Security}). +@vindex gnus-message-replysign +@vindex gnus-message-replyencrypt +@vindex gnus-message-replysignencrypted Often, you would like to sign replies to people who send you signed messages. Even more often, you might want to encrypt messages which are in reply to encrypted messages. Gnus offers @@ -12315,6 +12294,15 @@ inhibit Gnus to add a @code{Message-ID} header, you could say: Note that not all servers support the recommended ID. This works for INN versions 2.3.0 and later, for instance. + +@item nntp-read-timeout +@vindex nntp-read-timeout +How long nntp should wait between checking for the end of output. +Shorter values mean quicker response, but is more CPU intensive. The +default is 0.1 seconds. If you have a slow line to the server (and +don't like to see Emacs eat your available CPU power), you might set +this to, say, 1. + @end table @menu @@ -15190,6 +15178,11 @@ need external programs and libraries, see below.) (nnimap-stream ssl)))) @end lisp +After defining the new server, you can subscribe to groups on the +server using normal Gnus commands such as @kbd{U} in the Group Buffer +(@pxref{Subscription Commands}) or via the Server Buffer +(@pxref{Server Buffer}). + The following variables can be used to create a virtual @code{nnimap} server: @@ -15592,16 +15585,17 @@ analyses the body to split the article. @subsection Expiring in IMAP @cindex expiring imap mail -Even though @sc{nnimap} is not a proper @sc{nnmail} derived back end, -it supports most features in regular expiring (@pxref{Expiring Mail}). -Unlike splitting in IMAP (@pxref{Splitting in IMAP}) it do not clone -the @sc{nnmail} variables (i.e., creating @var{nnimap-expiry-wait}) -but reuse the @sc{nnmail} variables. What follows below are the -variables used by the @sc{nnimap} expiry process. +Even though @code{nnimap} is not a proper @code{nnmail} derived back +end, it supports most features in regular expiring (@pxref{Expiring +Mail}). Unlike splitting in IMAP (@pxref{Splitting in IMAP}) it do +not clone the @code{nnmail} variables (i.e., creating +@var{nnimap-expiry-wait}) but reuse the @code{nnmail} variables. What +follows below are the variables used by the @code{nnimap} expiry +process. A note on how the expire mark is stored on the @sc{imap} server is appropriate here as well. The expire mark is translated into a -@sc{imap} client specific mark, @code{gnus-expire}, and stored on the +@code{imap} client specific mark, @code{gnus-expire}, and stored on the message. This means that likely only Gnus will understand and treat the @code{gnus-expire} mark properly, although other clients may allow you to view client specific flags on the message. It also means that @@ -15619,7 +15613,7 @@ number, the symbol @var{immediate} or @var{never}. @item nnmail-expiry-target This variable is supported, and internally implemented by calling the -@sc{nnmail} functions that handle this. It contains an optimization +@code{nnmail} functions that handle this. It contains an optimization that if the destination is a IMAP group on the same server, the article is copied instead of appended (that is, uploaded again). @@ -16616,6 +16610,7 @@ Of course, to use it as such, you have to learn a few new commands. * Agent Commands:: New commands for all the buffers. * Agent as Cache:: The Agent is a big cache too. * Agent Expiry:: How to make old articles go away. +* Agent Regeneration:: How to recover from lost connections and other accidents. * Agent and IMAP:: How to use the Agent with IMAP. * Outgoing Messages:: What happens when you post/mail something? * Agent Variables:: Customizing is fun. @@ -17101,9 +17096,9 @@ toggles the plugged/unplugged state of the Gnus Agent. @menu -* Group Agent Commands:: -* Summary Agent Commands:: -* Server Agent Commands:: +* Group Agent Commands:: Configure groups and fetch their contents. +* Summary Agent Commands:: Manually select then fetch specific articles. +* Server Agent Commands:: Select the servers that are supported by the agent. @end menu @@ -17185,7 +17180,19 @@ default. @item J c @kindex J c (Agent Summary) @findex gnus-agent-catchup -Mark all undownloaded articles as read (@code{gnus-agent-catchup}). +Mark all articles as read (@code{gnus-agent-catchup}) that are neither cached, downloaded, nor downloadable. + +@item J S +@kindex J S (Agent Summary) +@findex gnus-agent-fetch-group +Download all eligible (See @pxref{Agent Categories}) articles in this group. +(@code{gnus-agent-fetch-group}). + +@item J s +@kindex J s (Agent Summary) +@findex gnus-agent-fetch-series +Download all processable articles in this group. +(@code{gnus-agent-fetch-series}). @item J u @kindex J u (Agent Summary) @@ -17248,6 +17255,10 @@ whenever you feel that you're running out of space. It's not particularly fast or efficient, and it's not a particularly good idea to interrupt it (with @kbd{C-g} or anything else) once you've started it. +Note that other functions, e.g. @code{gnus-request-expire-articles}, +might run @code{gnus-agent-expire} for you to keep the agent +synchronized with the group. + @code{gnus-agent-expire-days} can also be a list of regexp/day pairs. The regexps will be matched against group names to allow differing expiry in different groups. @@ -17260,7 +17271,8 @@ expiry in different groups. @end lisp If you use the list form, the last element must always be the default -method---it must always match all groups. +method---it must always match all groups. Also, for a regexp to match, +it must match from the beginning of the group's name. @vindex gnus-agent-expire-all If @code{gnus-agent-expire-all} is non-@code{nil}, this command will @@ -17268,15 +17280,49 @@ expire all articles---unread, read, ticked and dormant. If @code{nil} (which is the default), only read articles are eligible for expiry, and unread, ticked and dormant articles will be kept indefinitely. -@findex gnus-agent-regenerate If you find that some articles eligible for expiry are never expired, perhaps some Gnus Agent files are corrupted. There's a special @code{gnus-agent-regenerate} command to fix possible problems. +@node Agent Regeneration +@subsection Agent Regeneration + +@cindex Agent Regeneration +@cindex Gnus Agent Regeneration +@cindex regeneration + +The local data structures used by @code{nnagent} may become corrupted +due to certain exceptional conditions. When this happens, +@code{nnagent} functionality may degrade or even fail. The solution +to this problem is to repair the local data structures by removing all +internal inconsistencies. + +For example, if your connection to your server is lost while +downloaded articles into the agent, the local data structures will not +know about articles downloaded prior to the connection failure. +Running @code{gnus-agent-regenerate} or +@code{gnus-agent-regenerate-group} will update the data structures +such that you don't need to download these articles a second time. + +@findex gnus-agent-regenerate +@kindex M-x gnus-agent-regenerate +The command @code{gnus-agent-regenerate} will perform +@code{gnus-agent-regenerate-group} on every agentized group. While +you can run @code{gnus-agent-regenerate} in any buffer, it is strongly +recommended that you first close all summary buffers. + +@findex gnus-agent-regenerate-group +@kindex M-x gnus-agent-regenerate-group +The command @code{gnus-agent-regenerate-group} uses the local copies +of individual articles to repair the local NOV(header) database. It +then updates the internal data structures that document which articles +are stored locally. An optional argument will mark articles in the +agent as unread. + @node Agent and IMAP @subsection Agent and IMAP -The Agent work with any Gnus back end, including nnimap. However, +The Agent works with any Gnus back end, including nnimap. However, since there are some conceptual differences between @sc{nntp} and @sc{imap}, this section (should) provide you with some information to make Gnus Agent work smoother as a @sc{imap} Disconnected Mode client. @@ -17383,6 +17429,30 @@ offline servers into online status when you re-connect. If it has any other value, all offline servers will be automatically switched into online status. +@item gnus-agent-mark-unread-after-downloaded +@vindex gnus-agent-mark-unread-after-downloaded +If @code{gnus-agent-mark-unread-after-downloaded} is non-@code{nil}, +mark articles as unread after downloading. The default is t. + +@item gnus-agent-consider-all-articles +@vindex gnus-agent-consider-all-articles +If @code{gnus-agent-consider-all-articles} is non-@code{nil}, the +agent will fetch all missing headers. When @code{nil}, the agent will +fetch only new headers. The default is @code{nil}. + +@item gnus-agent-max-fetch-size +@vindex gnus-agent-max-fetch-size +The agent fetches articles into a temporary buffer prior to parsing +them into individual files. To avoid exceeding the max. buffer size, +the agent alternates between fetching and parsing until all articles +have been fetched. @code{gnus-agent-max-fetch-size} provides a size +limit to control how often the cycling occurs. A large value improves +performance. A small value minimizes the time lost should the +connection be lost while fetching (You may need to run +@code{gnus-agent-regenerate-group} to update the group's state. +However, all articles parsed prior to loosing the connection will be +available while unplugged). + @item gnus-server-unopen-status @vindex gnus-server-unopen-status Perhaps not a Agent variable, but closely related to the Agent, this @@ -17479,7 +17549,7 @@ may ask: @end table In short, when Gnus is unplugged, it only looks into the locally stored -articles; when it's plugged, it only talks to your ISP and also uses the +articles; when it's plugged, it talks to your ISP and may also use the locally stored articles. @@ -20637,7 +20707,6 @@ Gnus has taken advantage of that. * Picons:: How to display pictures of what you're reading. * Smileys:: Show all those happy faces the way they were meant to be shown. * X-Face:: Display a funky, teensy black-and-white image. -* Toolbar:: Click'n'drool. * XVarious:: Other XEmacsy Gnusey variables. @end menu @@ -20655,18 +20724,6 @@ So@dots{} You want to slow down your news reader even more! This is a good way to do so. Its also a great way to impress people staring over your shoulder as you read news. -@menu -* Picon Basics:: What are picons and How do I get them. -* Picon Requirements:: Don't go further if you aren't using XEmacs. -* Easy Picons:: Displaying Picons---the easy way. -* Hard Picons:: The way you should do it. You'll learn something. -* Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with. -@end menu - - -@node Picon Basics -@subsubsection Picon Basics - What are Picons? To quote directly from the Picons Web site: @iftex @@ -20685,228 +20742,49 @@ in either monochrome @code{XBM} format or color @code{XPM} and @code{GIF} formats. @end quotation -@vindex gnus-picons-piconsearch-url -If you have a permanent connection to the Internet you can use Steve -Kinzler's Picons Search engine by setting -@code{gnus-picons-piconsearch-url} to the string @* -@uref{http://www.cs.indiana.edu/picons/search.html}. - -@vindex gnus-picons-database -Otherwise you need a local copy of his database. For instructions on -obtaining and installing the picons databases, point your Web browser at @* -@uref{http://www.cs.indiana.edu/picons/ftp/index.html}. Gnus expects -picons to be installed into a location pointed to by -@code{gnus-picons-database}. +@vindex gnus-picon-databases +For instructions on obtaining and installing the picons databases, +point your Web browser at +@uref{http://www.cs.indiana.edu/picons/ftp/index.html}. If you are using Debian GNU/Linux, saying @samp{apt-get install picons.*} will install the picons where Gnus can find them. +To enable displaying picons, simply make sure that +@code{gnus-picon-databases} points to the directory containing the +Picons databases. -@node Picon Requirements -@subsubsection Picon Requirements - -To have Gnus display Picons for you, you must have @code{x} support -compiled into XEmacs. To display color picons which are much nicer -than the black & white one, you also need one of @code{xpm} or -@code{gif} compiled into XEmacs. - -@vindex gnus-picons-convert-x-face -If you want to display faces from @code{X-Face} headers, you should have -the @code{xface} support compiled into XEmacs. Otherwise you must have -the @code{netpbm} utilities installed, or munge the -@code{gnus-picons-convert-x-face} variable to use something else. -(NOTE: @code{x-face} is used in the variable name, not @code{xface}) - -@node Easy Picons -@subsubsection Easy Picons - -To enable displaying picons, simply put the following line in your -@file{~/.gnus} file and start Gnus. - -@lisp -(setq gnus-use-picons t) -(setq gnus-treat-display-picons t) -@end lisp - -and make sure @code{gnus-picons-database} points to the directory -containing the Picons databases. - -Alternatively if you want to use the web piconsearch engine add this: - -@lisp -(setq gnus-picons-piconsearch-url - "http://www.cs.indiana.edu:800/piconsearch") -@end lisp - - -@node Hard Picons -@subsubsection Hard Picons - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -Gnus can display picons for you as you enter and leave groups and -articles. It knows how to interact with three sections of the picons -database. Namely, it can display the picons newsgroup pictures, -author's face picture(s), and the authors domain. To enable this -feature, you need to select where to get the picons from, and where to -display them. +The following variables offer control over where things are located. @table @code -@item gnus-picons-database -@vindex gnus-picons-database -The location of the picons database. Should point to a directory +@item gnus-picon-databases +@vindex gnus-picon-databases +The location of the picons database. This is a list of directories containing the @file{news}, @file{domains}, @file{users} (and so on) -subdirectories. This is only useful if -@code{gnus-picons-piconsearch-url} is @code{nil}. Defaults to -@file{/usr/local/faces/}. - -@item gnus-picons-piconsearch-url -@vindex gnus-picons-piconsearch-url -The URL for the web picons search engine. The only currently known -engine is @uref{http://www.cs.indiana.edu:800/piconsearch}. To -workaround network delays, icons will be fetched in the background. If -this is @code{nil} 'the default), then picons are fetched from local -database indicated by @code{gnus-picons-database}. - -@item gnus-picons-display-where -@vindex gnus-picons-display-where -Where the picon images should be displayed. It is @code{picons} by -default (which by default maps to the buffer @samp{*Picons*}). Other -valid places could be @code{article}, @code{summary}, or -@samp{*scratch*} for all I care. Just make sure that you've made the -buffer visible using the standard Gnus window configuration -routines---@pxref{Window Layout}. - -@item gnus-picons-group-excluded-groups -@vindex gnus-picons-group-excluded-groups -Groups that are matched by this regexp won't have their group icons -displayed. - -@end table - -Note: If you set @code{gnus-use-picons} to @code{t}, it will set up your -window configuration for you to include the @code{picons} buffer. - -Now that you've made those decision, you need to add the following -functions to the appropriate hooks so these pictures will get displayed -at the right time. - -@vindex gnus-picons-display-where -@table @code -@item gnus-article-display-picons -@findex gnus-article-display-picons -Looks up and displays the picons for the author and the author's domain -in the @code{gnus-picons-display-where} buffer. - -@item gnus-picons-article-display-x-face -@findex gnus-picons-article-display-x-face -Decodes and displays the X-Face header if present. -(NOTE: @code{x-face} is used in the function name, not @code{xface}) - -@end table - - - -@node Picon Useless Configuration -@subsubsection Picon Useless Configuration - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -The following variables offer further control over how things are -done, where things are located, and other useless stuff you really -don't need to worry about. +subdirectories. Defaults to @code{("/usr/lib/picon" +"/usr/local/faces")}. -@table @code - -@item gnus-picons-news-directories -@vindex gnus-picons-news-directories -List of subdirectories to search in @code{gnus-picons-database} for +@item gnus-picon-news-directories +@vindex gnus-picon-news-directories +List of subdirectories to search in @code{gnus-picon-databases} for newsgroups faces. @code{("news")} is the default. -@item gnus-picons-user-directories -@vindex gnus-picons-user-directories -List of subdirectories to search in @code{gnus-picons-database} for user -faces. @code{("local" "users" "usenix" "misc")} is the default. +@item gnus-picon-user-directories +@vindex gnus-picon-user-directories +List of subdirectories to search in @code{gnus-picon-databases} for user +faces. @code{("users" "usenix" "local" "misc")} is the default. -@item gnus-picons-domain-directories -@vindex gnus-picons-domain-directories -List of subdirectories to search in @code{gnus-picons-database} for +@item gnus-picon-domain-directories +@vindex gnus-picon-domain-directories +List of subdirectories to search in @code{gnus-picon-databases} for domain name faces. Defaults to @code{("domains")}. Some people may want to add @samp{"unknown"} to this list. -@item gnus-picons-convert-x-face -@vindex gnus-picons-convert-x-face -If you don't have @code{xface} support builtin XEmacs, this is the -command to use to convert the @code{X-Face} header to an X bitmap -(@code{xbm}). Defaults to @code{(format "@{ echo '/* Width=48, -Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s" -gnus-picons-x-face-file-name)} -(NOTE: @code{x-face} is used in the variable name, not @code{xface}) - -@item gnus-picons-x-face-file-name -@vindex gnus-picons-x-face-file-name -Names a temporary file to store the @code{X-Face} bitmap in. Defaults -to @code{(format "/tmp/picon-xface.%s.xbm" (user-login-name))}. -(NOTE: @code{x-face} is used in the variable name, not @code{xface}) - -@item gnus-picons-has-modeline-p -@vindex gnus-picons-has-modeline-p -If you have set @code{gnus-picons-display-where} to @code{picons}, your -XEmacs frame will become really cluttered. To alleviate this a bit you -can set @code{gnus-picons-has-modeline-p} to @code{nil}; this will -remove the mode line from the Picons buffer. This is only useful if -@code{gnus-picons-display-where} is @code{picons}. - -@item gnus-picons-refresh-before-display -@vindex gnus-picons-refresh-before-display -If non-nil, display the article buffer before computing the picons. -Defaults to @code{nil}. - -@item gnus-picons-display-as-address -@vindex gnus-picons-display-as-address -If @code{t} display textual email addresses along with pictures. -Defaults to @code{t}. - -@item gnus-picons-file-suffixes -@vindex gnus-picons-file-suffixes +@item gnus-picon-file-types +@vindex gnus-picon-file-types Ordered list of suffixes on picon file names to try. Defaults to -@code{("xpm" "gif" "xbm")} minus those not builtin your XEmacs. - -@item gnus-picons-setup-hook -@vindex gnus-picons-setup-hook -Hook run in the picon buffer, if that is displayed. - -@item gnus-picons-display-article-move-p -@vindex gnus-picons-display-article-move-p -Whether to move point to first empty line when displaying picons. This -has only an effect if `gnus-picons-display-where' has value `article'. - -If @code{nil}, display the picons in the @code{From} and -@code{Newsgroups} lines. This is the default. - -@item gnus-picons-clear-cache-on-shutdown -@vindex gnus-picons-clear-cache-on-shutdown -Whether to clear the picons cache when exiting gnus. Gnus caches every -picons it finds while it is running. This saves some time in the search -process but eats some memory. If this variable is set to @code{nil}, -Gnus will never clear the cache itself; you will have to manually call -@code{gnus-picons-clear-cache} to clear it. Otherwise the cache will be -cleared every time you exit Gnus. Defaults to @code{t}. - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex +@code{("xpm" "gif" "xbm")} minus those not builtin your Emacs. @end table @@ -20931,27 +20809,20 @@ In short---to use Smiley in Gnus, put the following in your (setq gnus-treat-display-smileys t) @end lisp -Smiley maps text smiley faces---@samp{:-)}, @samp{:-=}, @samp{:-(} and +Smiley maps text smiley faces---@samp{:-)}, @samp{8-)}, @samp{:-(} and the like---to pictures and displays those instead of the text smiley faces. The conversion is controlled by a list of regexps that matches text and maps that to file names. -@vindex smiley-nosey-regexp-alist -@vindex smiley-deformed-regexp-alist -Smiley supplies two example conversion alists by default: -@code{smiley-deformed-regexp-alist} (which matches @samp{:)}, @samp{:(} -and so on), and @code{smiley-nosey-regexp-alist} (which matches -@samp{:-)}, @samp{:-(} and so on). - -The alist used is specified by the @code{smiley-regexp-alist} variable, -which defaults to the value of @code{smiley-deformed-regexp-alist}. - -The first item in each element is the regexp to be matched; the second -element is the regexp match group that is to be replaced by the picture; -and the third element is the name of the file to be displayed. +@vindex smiley-regexp-alist +The alist used is specified by the @code{smiley-regexp-alist} +variable. The first item in each element is the regexp to be matched; +the second element is the regexp match group that is to be replaced by +the picture; and the third element is the name of the file to be +displayed. The following variables customize where Smiley will look for these -files, as well as the color to be used and stuff: +files: @table @code @@ -20959,25 +20830,9 @@ files, as well as the color to be used and stuff: @vindex smiley-data-directory Where Smiley will look for smiley faces files. -@item smiley-flesh-color -@vindex smiley-flesh-color -Skin color. The default is @samp{yellow}, which is really racist. - -@item smiley-features-color -@vindex smiley-features-color -Color of the features of the face. The default is @samp{black}. - -@item smiley-tongue-color -@vindex smiley-tongue-color -Color of the tongue. The default is @samp{red}. - -@item smiley-circle-color -@vindex smiley-circle-color -Color of the circle around the face. The default is @samp{black}. - -@item smiley-mouse-face -@vindex smiley-mouse-face -Face used for mouse highlighting over the smiley face. +@item gnus-smiley-file-types +@vindex gnus-smiley-file-types +List of suffixes on smiley file names to try. @end table @@ -21074,38 +20929,6 @@ Using the last function would be something like this: @end lisp -@node Toolbar -@subsection Toolbar - -@table @code - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -@item gnus-use-toolbar -@vindex gnus-use-toolbar -If @code{nil}, don't display toolbars. If non-@code{nil}, it should be -one of @code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar}, -@code{right-toolbar}, or @code{left-toolbar}. - -@item gnus-group-toolbar -@vindex gnus-group-toolbar -The toolbar in the group buffer. - -@item gnus-summary-toolbar -@vindex gnus-summary-toolbar -The toolbar in the summary buffer. - -@item gnus-summary-mail-toolbar -@vindex gnus-summary-mail-toolbar -The toolbar in the summary buffer of mail groups. - -@end table - - @node XVarious @subsection Various XEmacs Variables @@ -21133,16 +20956,38 @@ Valid values include @code{flame}, @code{pine}, @code{moss}, A glyph displayed in all Gnus mode lines. It is a tiny gnu head by default. +@end table + +@subsubsection Toolbar + +@table @code + +@item gnus-use-toolbar +@vindex gnus-use-toolbar +If @code{nil}, don't display toolbars. If non-@code{nil}, it should be +one of @code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar}, +@code{right-toolbar}, or @code{left-toolbar}. + +@item gnus-group-toolbar +@vindex gnus-group-toolbar +The toolbar in the group buffer. + +@item gnus-summary-toolbar +@vindex gnus-summary-toolbar +The toolbar in the summary buffer. + +@item gnus-summary-mail-toolbar +@vindex gnus-summary-mail-toolbar +The toolbar in the summary buffer of mail groups. + +@end table + @iftex @iflatex \margindex{} @end iflatex @end iftex -@end table - - - @node Fuzzy Matching @section Fuzzy Matching @@ -21665,6 +21510,7 @@ The following are the methods you can use to control the behavior of * Blacklists and Whitelists:: * BBDB Whitelists:: * Blackholes:: +* Regular Expressions Header Matching:: * Bogofilter:: * ifile spam filtering:: * spam-stat spam filtering:: @@ -21799,6 +21645,40 @@ The default setting of @code{t} is recommended. Blackhole checks are done only on incoming mail. There is no spam or ham processor for blackholes. +@node Regular Expressions Header Matching +@subsubsection Regular Expressions Header Matching +@cindex spam filtering +@cindex regular expressions header matching, spam filtering +@cindex spam + +@defvar spam-use-regex-headers + +This option is disabled by default. You can let Gnus check the +message headers against lists of regular expressions when you set this +option. The variables @code{spam-regex-headers-spam} and +@code{spam-regex-headers-ham} hold the list of regular expressions. +Gnus will check against the message headers to determine if the +message is spam or ham, respectively. + +@end defvar + +@defvar spam-regex-headers-spam + +The list of regular expressions that, when matched in the headers of +the message, positively identify it as spam. + +@end defvar + +@defvar spam-regex-headers-ham + +The list of regular expressions that, when matched in the headers of +the message, positively identify it as ham. + +@end defvar + +Regular expression header checks are done only on incoming mail. +There is no specific spam or ham processor for regular expressions. + @node Bogofilter @subsubsection Bogofilter @cindex spam filtering diff --git a/texi/gnusref.tex b/texi/gnusref.tex index 32d11be..abb47eb 100644 --- a/texi/gnusref.tex +++ b/texi/gnusref.tex @@ -663,7 +663,6 @@ W W b & Hide {\bf boring} headers.\\ W W s & Hide {\bf signature}.\\ W W l & Hide {\bf list} identifiers in subject-header.\\ - W W p & Hide {\bf PGP}-signatures.\\ W W P & Hide {\bf PEM} (privacy enhanced messages).\\ W W B & Hide banner specified by group parameter.\\ W W c & Hide {\bf citation}.\\