Patches between 5.10.4 and 5.10.5

Lars Magne Ingebrigtsen <[email protected]> Sun, 04 Jan 2004 01:32:40 +0100
Newsgroups gmane.emacs.gnus.patches
Message-ID <[email protected]>
Index: gnus/ChangeLog
diff -u gnus/ChangeLog:6.65 gnus/ChangeLog:6.68
--- gnus/ChangeLog:6.65	Fri Jan  2 21:28:23 2004
+++ gnus/ChangeLog	Sat Jan  3 16:19:01 2004
@@ -1,3 +1,12 @@
+2004-01-03  Reiner Steib  <[email protected]>
+
+	* GNUS-NEWS: Update copyright.
+
+	* etc/gnus-tut.txt (Gnus FAQ): Remove text version.  Refer to info
+	documentation and online version instead.
+
+	* GNUS-NEWS: Changed "Dired integration"
+
 2004-01-02  Reiner Steib  <[email protected]>
 
 	* GNUS-NEWS: Add `gnus-group-read-ephemeral-group'.
Index: gnus/GNUS-NEWS
diff -u gnus/GNUS-NEWS:6.66 gnus/GNUS-NEWS:6.68
--- gnus/GNUS-NEWS:6.66	Fri Jan  2 21:28:23 2004
+++ gnus/GNUS-NEWS	Sat Jan  3 16:19:01 2004
@@ -1,5 +1,5 @@
 GNUS NEWS -- history of user-visible changes.
-Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 See the end for copying conditions.
 
 Please send Gnus bug reports to [email protected].
@@ -34,12 +34,12 @@
 article buttons, see the info node "Article Button Levels".
 
 ** Dired integration
-`gnus-dired-minor-mode' installs key bindings in dired buffers to send
-a file as an attachment (`C-c C-a'), open a file using the approriate
-mailcap entry (`C-c C-l'), and print a file using the mailcap entry
-(`C-c P').  It is enabled with 
 
-      (add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
+`gnus-dired-minor-mode' installs key bindings in dired buffers to send a file
+as an attachment (`C-c C-m C-a'), open a file using the approriate mailcap
+entry (`C-c C-m C-l'), and print a file using the mailcap entry (`C-c C-m
+C-p').  See the info node "Other modes".
+
 
 ** Gnus can display RSS newsfeeds as a newsgroup.  To get started do `B
 nnrss RET RET' in the Group buffer.
Index: gnus/etc/gnus-tut.txt
diff -u gnus/etc/gnus-tut.txt:6.6 gnus/etc/gnus-tut.txt:6.7
--- gnus/etc/gnus-tut.txt:6.6	Thu May  1 17:17:52 2003
+++ gnus/etc/gnus-tut.txt	Sat Jan  3 14:25:08 2004
@@ -296,1594 +296,23 @@
 From fschmitt Sat Mar 22 18:13:00 2003
 From: [email protected] (Gnus FAQ team)
 Date: Sat Mar 22 18:13:00 2003
-Subject: Gnus FAQ
-Message-ID: <[email protected]>
+Subject: Gnus FAQ (Frequently Asked Questions)
+Message-ID: <[email protected]>
 
-This is the text version of the Gnus FAQ, see http://my.gnus.org for
-the up to date version of this document, there you can also find a
-html version and various other formats. There's also a texinfo version 
-of the FAQ distributed with Gnus.
+The Gnus FAQ is distributed within the Gnus manual.  The home page of
+the Gnus FAQ is <URL:http://my.gnus.org/FAQ/>, where you can find the
+most recent version in HTML various other formats.
 
-Table of Contents
+To browse the FAQ now, put the cursor at the end of the following line
+and press `C-x C-e':
 
-Introduction
-Frequently Asked Questions with Answers
-Glossary
+  (info "(gnus)Frequently Asked Questions")
 
-Abstract
+On older XEmacs version, use:
 
-This is the new Gnus Frequently Asked Questions list. If you have a
-Web browser, the official hypertext version is at http://
-my.gnus.org/FAQ/ [http://my.gnus.org/FAQ/], the Docbook source is
-available from http://sourceforge.net [http://sourceforge.net/
-projects/gnus/].
+  (Info-goto-node "(gnus)Frequently Asked Questions")
+  
+Or simply use RET or the middle mouse button, if the above is displayed
+as a clickable button.
 
-Please submit features and suggestions to the FAQ discussion list
-[mailto:[email protected]]. The list is protected against
-junk mail with qconfirm [http://smarden.org/qconfirm/index.html].
-As a subscriber, your submissions will automatically pass. You can
-also subscribe to the list by sending a blank email to
[email protected]
-[mailto:[email protected]] and browse the archive.
 
-Introduction
-
-This is the Gnus Frequently Asked Questions list.
-
-Gnus is a Usenet Newsreader and Electronic Mail User Agent
-implemented as a part of Emacs. It's been around in some form for
-almost a decade now, and has been distributed as a standard part of
-Emacs for much of that time. Gnus 5 is the latest (and greatest)
-incarnation. The original version was called GNUS, and was written
-by Masanobu UMEDA. When autumn crept up in '94, Lars Magne
-Ingebrigtsen grew bored and decided to rewrite Gnus.
-
-Its biggest strength is the fact that it is extremely customizable.
-It is somewhat intimidating at first glance, but most of the
-complexity can be ignored until you're ready to take advantage of
-it. If you receive a reasonable volume of e-mail (you're on various
-mailing lists), or you would like to read high-volume mailing lists
-but cannot keep up with them, or read high volume newsgroups or are
-just bored, then Gnus is what you want.
-
-This FAQ was maintained by Justin Sheehy until March 2002. He would
-like to thank Steve Baur and Per Abrahamsen for doing a wonderful
-job with this FAQ before him. We would like to do the same -
-thanks, Justin!
-
-If you have a Web browser, the official hypertext version is at:
-http://my.gnus.org/FAQ/ [http://my.gnus.org/FAQ/]. This version is
-much nicer than the unofficial hypertext versions that are archived
-at Utrecht, Oxford, Smart Pages, Ohio State, and other FAQ
-archives. See the resources question below if you want information
-on obtaining it in another format.
-
-The information contained here was compiled with the assistance of
-the Gnus development mailing list, and any errors or misprints are
-the my.gnus.org team's fault, sorry.
-
-Frequently Asked Questions with Answers
-
-1. Installation FAQ
-
-    1.1. What is the latest version of Gnus?
-    1.2. What's new in 5.10.0?
-    1.3. Where and how to get Gnus?
-    1.4. What to do with the tarball now?
-    1.5. Which version of Emacs do I need?
-    1.6. How do I run Gnus on both Emacs and XEmacs?
-
-2. Startup / Group buffer
-
-    2.1. Every time I start Gnus I get a message "Gnus auto-save
-        file exists. Do you want to read it?", what does this mean
-        and how to prevent it?
-    2.2. Gnus doesn't remember which groups I'm subscribed to,
-        what's this?
-    2.3. How to change the format of the lines in Group buffer?
-    2.4. My group buffer becomes a bit crowded, is there a way to
-        sort my groups into categories so I can easier browse
-        through them?
-    2.5. How to manually sort the groups in Group buffer? How to
-        sort the groups in a topic?
-
-3. Getting Messages
-
-    3.1. I just installed Gnus, started it via M-x gnus but it only
-        says "nntp (news) open error", what to do?
-    3.2. I'm working under Windows and have no idea what ~/.gnus
-        means.
-    3.3. My news server requires authentication, how to store user
-        name and password on disk?
-    3.4. Gnus seems to start up OK, but I can't find out how to
-        subscribe to a group.
-    3.5. Gnus doesn't show all groups / Gnus says I'm not allowed
-        to post on this server as well as I am, what's that?
-    3.6. I want Gnus to fetch news from several servers, is this
-        possible?
-    3.7. And how about local spool files?
-    3.8. OK, reading news works now, but I want to be able to read
-        my mail with Gnus, too. How to do it?
-    3.9. And what about IMAP?
-    3.10. At the office we use one of those MS Exchange servers,
-        can I use Gnus to read my mail from it?
-    3.11. Can I tell Gnus not to delete the mails on the server it
-        retrieves via POP3?
-
-4. Reading messages
-
-    4.1. When I enter a group, all read messages are gone. How to
-        view them again?
-    4.2. How to tell Gnus to show an important message every time I
-        enter a group, even when it's read?
-    4.3. How to view the headers of a message?
-    4.4. How to view the raw unformatted message?
-    4.5. How can I change the headers Gnus displays by default at
-        the top of the article buffer?
-    4.6. I'd like Gnus NOT to render HTML-mails but show me the
-        text part if it's available. How to do it?
-    4.7. Can I use some other browser than w3 to render my
-        HTML-mails?
-    4.8. Is there anything I can do to make poorly formatted mails
-        more readable?
-    4.9. Is there a way to automatically ignore posts by specific
-        authors or with specific words in the subject? And can I
-        highlight more interesting ones in some way?
-    4.10. How can I disable threading in some (e.g. mail-) groups,
-        or set other variables specific for some groups?
-    4.11. Can I highlight messages written by me and follow-ups to
-        those?
-    4.12. The number of total messages in a group which Gnus
-        displays in group buffer is by far to high, especially in
-        mail groups. Is this a bug?
-    4.13. I don't like the layout of summary and article buffer,
-        how to change it? Perhaps even a three pane display?
-    4.14. I don't like the way the Summary buffer looks, how to
-        tweak it?
-    4.15. How to split incoming mails in several groups?
-
-5. Composing messages
-
-    5.1. What are the basic commands I need to know for sending
-        mail and postings?
-    5.2. How to enable automatic word-wrap when composing messages?
-    5.3. How to set stuff like From, Organization, Reply-To,
-        signature...?
-    5.4. Can I set things like From, Signature etc group based on
-        the group I post too?
-    5.5. Is there a spell-checker? Perhaps even on-the-fly
-        spell-checking?
-    5.6. Can I set the dictionary based on the group I'm posting
-        to?
-    5.7. Is there some kind of address-book, so I needn't remember
-        all those email addresses?
-    5.8. Sometimes I see little images at the top of article
-        buffer. What's that and how can I send one with my
-        postings, too?
-    5.9. Sometimes I accidentally hit r instead of f in newsgroups.
-        Can Gnus warn me, when I'm replying by mail in newsgroups?
-    5.10. How to tell Gnus not to generate a sender header?
-    5.11. I want gnus to locally store copies of my send mail and
-        news, how to do it?
-    5.12. People tell me my Message-IDs are not correct, why aren't
-        they and how to fix it?
-
-6. Old messages
-
-    6.1. How to import my old mail into Gnus?
-    6.2. How to archive interesting messages?
-    6.3. How to search for a specific message?
-    6.4. How to get rid of old unwanted mail?
-    6.5. I want that all read messages are expired (at least in
-        some groups). How to do it?
-    6.6. I don't want expiration to delete my mails but to move
-        them to another group.
-
-7. Gnus in a dial-up environment
-
-    7.1. I don't have a permanent connection to the net, how can I
-        minimize the time I've got to be connected?
-    7.2. So what was this thing about the Agent?
-    7.3. I want to store article bodies on disk, too. How to do it?
-    7.4. How to tell Gnus not to try to send mails / postings while
-        I'm offline?
-
-8. Getting help
-
-    8.1. How to find information and help inside Emacs?
-    8.2. I can't find anything in the Gnus manual about X (e.g.
-        attachments, PGP, MIME...), is it not documented?
-    8.3. Which websites should I know?
-    8.4. Which mailing lists and newsgroups are there?
-    8.5. Where to report bugs?
-    8.6. I need real-time help, where to find it?
-
-9. Tuning Gnus
-
-    9.1. Starting Gnus is really slow, how to speed it up?
-    9.2. How to speed up the process of entering a group?
-    9.3. Sending mail becomes slower and slower, what's up?
-
-1. Installation FAQ
-
-1.1.  What is the latest version of Gnus?
-
-      Jingle please: Gnus 5.10.0 is released, get it while it's hot! As
-      well as the step in version number is rather small, Gnus 5.10 has
-      tons of new features which you shouldn't miss, however if you are
-      cautious, you might prefer to stay with 5.8.8 respectively 5.9
-      (they are basically the same) until some bugfix releases are out.
-
-1.2.  What's new in 5.10.0?
-
-      First of all, you should have a look into the file GNUS-NEWS in the
-      toplevel directory of the Gnus tarball, there the most important
-      changes are listed. Here's a short list of the changes I find
-      especially important/interesting:
-
-        * Major rewrite of the Gnus agent, Gnus agent is now active by
-          default.
-
-          Many new article washing functions for dealing with ugly
-          formatted articles.
-
-          Anti Spam features.
-
-          message-utils now included in Gnus.
-
-          New format specifiers for summary lines, e.g. %B for a complex
-          trn-style thread tree.
-
-1.3.  Where and how to get Gnus?
-
-      The latest released version of Gnus isn't included in Emacs 21 and
-      until now it also isn't available through the package system of
-      XEmacs 21.4, therefor you should get the Gnus tarball from http://
-      www.gnus.org/dist/gnus.tar.gz [http://www.gnus.org/dist/
-      gnus.tar.gz] or via anonymous FTP from ftp://ftp.gnus.org/pub/gnus/
-      gnus.tar.gz [ftp://ftp.gnus.org/pub/gnus/gnus.tar.gz].
-
-1.4.  What to do with the tarball now?
-
-      Untar it via tar xvzf gnus.tar.gz and do the common ./configure;
-      make; make install circle. (under MS-Windows either get the Cygwin
-      environment from http://www.cygwin.com [http://www.cygwin.com]
-      which allows you to do what's described above or unpack the tarball
-      with some packer (e.g. Winace from http://www.winace.com [http://
-      www.winace.com]) and use the batch-file make.bat included in the
-      tarball to install Gnus. If you don't want to (or aren't allowed
-      to) install Gnus system-wide, you can install it in your home
-      directory and add the following lines to your ~/.xemacs/init.el or
-      ~/.emacs:
-
-      (add-to-list 'load-path "/path/to/gnus/lisp")
-      (if (featurep 'xemacs)
-          (add-to-list 'Info-directory-list "/path/to/gnus/texi/")
-        (add-to-list 'Info-default-directory-list "/path/to/gnus/texi/"))
-
-
-      Make sure that you don't have any gnus related stuff before this
-      line, on MS Windows use something like "C:/path/to/lisp" (yes, "/
-      ").
-
-1.5.  Which version of Emacs do I need?
-
-      Gnus 5.10.0 requires an Emacs version that is greater than or equal
-      to Emacs 20.7 or XEmacs 21.1.
-
-1.6.  How do I run Gnus on both Emacs and XEmacs?
-
-      You can't use the same copy of Gnus in both as the Lisp files are
-      byte-compiled to a format which is different depending on which
-      Emacs did the compilation. Get one copy of Gnus for Emacs and one
-      for XEmacs.
-
-2. Startup / Group buffer
-
-2.1.  Every time I start Gnus I get a message "Gnus auto-save file
-      exists. Do you want to read it?", what does this mean and how to
-      prevent it?
-
-      This message means that the last time you used Gnus, it wasn't
-      properly exited and therefor couldn't write its informations to
-      disk (e.g. which messages you read), you are now asked if you want
-      to restore those informations from the auto-save file.
-
-      To prevent this message make sure you exit Gnus via q in group
-      buffer instead of just killing Emacs.
-
-2.2.  Gnus doesn't remember which groups I'm subscribed to, what's this?
-
-      You get the message described in the q/a pair above while starting
-      Gnus, right? It's an other symptom for the same problem, so read
-      the answer above.
-
-2.3.  How to change the format of the lines in Group buffer?
-
-      You've got to tweak the value of the variable
-      gnus-group-line-format. See the manual node "Group Line
-      Specification" for information on how to do this. An example for
-      this (guess from whose .gnus :-)):
-
-      (setq gnus-group-line-format "%P%M%S[%5t]%5y : %(%g%)\n")
-
-
-2.4.  My group buffer becomes a bit crowded, is there a way to sort my
-      groups into categories so I can easier browse through them?
-
-      Gnus offers the topic mode, it allows you to sort your groups in,
-      well, topics, e.g. all groups dealing with Linux under the topic
-      linux, all dealing with music under the topic music and all dealing
-      with scottish music under the topic scottish which is a subtopic of
-      music.
-
-      To enter topic mode, just hit t while in Group buffer. Now you can
-      use T n to create a topic at point and T m to move a group to a
-      specific topic. For more commands see the manual or the menu. You
-      might want to include the %P specifier at the beginning of your
-      gnus-group-line-format variable to have the groups nicely indented.
-
-2.5.  How to manually sort the groups in Group buffer? How to sort the
-      groups in a topic?
-
-      Move point over the group you want to move and hit C-k, now move
-      point to the place where you want the group to be and hit C-y.
-
-3. Getting Messages
-
-3.1.  I just installed Gnus, started it via M-x gnus but it only says
-      "nntp (news) open error", what to do?
-
-      You've got to tell Gnus where to fetch the news from. Read the
-      documentation for information on how to do this. As a first start,
-      put those lines in ~/.gnus:
-
-      (setq gnus-select-method '(nntp "news.yourprovider.net"))
-      (setq user-mail-address "[email protected]")
-      (setq user-full-name "Your Name")
-
-
-3.2.  I'm working under Windows and have no idea what ~/.gnus means.
-
-      The ~/ means the home directory where Gnus and Emacs look for the
-      configuration files. However, you don't really need to know what
-      this means, it suffices that Emacs knows what it means :-) You can
-      type C-x C-f ~/.gnus RET (yes, with the forward slash, even on
-      Windows), and Emacs will open the right file for you. (It will most
-      likely be new, and thus empty.) However, I'd discourage you from
-      doing so, since the directory Emacs chooses will most certainly not
-      be what you want, so let's do it the correct way. The first thing
-      you've got to do is to create a suitable directory (no blanks in
-      directory name please) e.g. c:\myhome. Then you must set the
-      environment variable HOME to this directory. To do this under Win9x
-      or Me include the line
-
-      SET HOME=C:\myhome
-
-
-      in your autoexec.bat and reboot. Under NT, 2000 and XP, hit
-      Winkey+Pause/Break to enter system options (if it doesn't work, go
-      to Control Panel -> System). There you'll find the possibility to
-      set environment variables, create a new one with name HOME and
-      value C:\myhome, a reboot is not necessary.
-
-      Now to create ~/.gnus, say C-x C-f ~/.gnus RET C-x C-s. in Emacs.
-
-3.3.  My news server requires authentication, how to store user name and
-      password on disk?
-
-      Create a file ~/.authinfo which includes for each server a line
-      like this
-
-      machine news.yourprovider.net login YourUserName password YourPassword
-
-      . Make sure that the file isn't readable to others if you work on a
-      OS which is capable of doing so. (Under Unix say
-
-      chmod 600 ~/.authinfo
-
-      in a shell.)
-
-3.4.  Gnus seems to start up OK, but I can't find out how to subscribe to
-      a group.
-
-      If you know the name of the group say U name.of.group RET in group
-      buffer (use the tab-completion Luke). Otherwise hit ^ in group
-      buffer, this brings you to the server buffer. Now place point (the
-      cursor) over the server which carries the group you want, hit RET,
-      move point to the group you want to subscribe to and say u to
-      subscribe to it.
-
-3.5.  Gnus doesn't show all groups / Gnus says I'm not allowed to post on
-      this server as well as I am, what's that?
-
-      Some providers allow restricted anonymous access and full access
-      only after authorization. To make Gnus send authinfo to those
-      servers append
-
-      force yes
-
-      to the line for those servers in ~/.authinfo.
-
-3.6.  I want Gnus to fetch news from several servers, is this possible?
-
-      Of course. You can specify more sources for articles in the
-      variable gnus-secondary-select-methods. Add something like this in
-      ~/.gnus:
-
-      (add-to-list 'gnus-secondary-select-methods '(nntp "news.yourSecondProvider.net"))
-      (add-to-list 'gnus-secondary-select-methods '(nntp "news.yourThirdProvider.net"))
-
-
-3.7.  And how about local spool files?
-
-      No problem, this is just one more select method called nnspool, so
-      you want this:
-
-      (add-to-list 'gnus-secondary-select-methods '(nnspool ""))
-
-
-      Or this if you don't want an NNTP Server as primary news source:
-
-      (setq gnus-select-method '(nnspool ""))
-
-
-      Gnus will look for the spool file in /usr/spool/news, if you want
-      something different, change the line above to something like this:
-
-      (add-to-list 'gnus-secondary-select-methods
-                   '(nnspool "" (nnspool-directory "/usr/local/myspoolddir")))
-
-
-      This sets the spool directory for this server only. You might have
-      to specify more stuff like the program used to post articles, see
-      the Gnus manual on how to do this.
-
-3.8.  OK, reading news works now, but I want to be able to read my mail
-      with Gnus, too. How to do it?
-
-      That's a bit harder since there are many possible sources for mail,
-      many possible ways for storing mail and many different ways for
-      sending mail. The most common cases are these: 1: You want to read
-      your mail from a pop3 server and send them directly to a SMTP
-      Server 2: Some program like fetchmail retrieves your mail and
-      stores it on disk from where Gnus shall read it. Outgoing mail is
-      sent by Sendmail, Postfix or some other MTA. Sometimes, you even
-      need a combination of the above cases.
-
-      However, the first thing to do is to tell Gnus in which way it
-      should store the mail, in Gnus terminology which back end to use.
-      Gnus supports many different back ends, the most commonly used one
-      is nnml. It stores every mail in one file and is therefor quite
-      fast. However you might prefer a one file per group approach if
-      your file system has problems with many small files, the nnfolder
-      back end is then probably the choice for you. To use nnml add the
-      following to ~/.gnus:
-
-      (add-to-list 'gnus-secondary-select-methods '(nnml ""))
-
-
-      As you might have guessed, if you want nnfolder, it's
-
-      (add-to-list 'gnus-secondary-select-methods '(nnfolder ""))
-
-
-      Now we need to tell Gnus, where to get it's mail from. If it's a
-      POP3 server, then you need something like this:
-
-      (eval-after-load "mail-source"
-        '(add-to-list 'mail-sources '(pop :server "pop.YourProvider.net"
-                                          :user "yourUserName"
-                                          :password "yourPassword"))
-
-
-      Make sure ~/.gnus isn't readable to others if you store your
-      password there. If you want to read your mail from a traditional
-      spool file on your local machine, it's
-
-      (eval-after-load "mail-source"
-        '(add-to-list 'mail-sources '(file :path "/path/to/spool/file"))
-
-
-      If it's a Maildir, with one file per message as used by postfix,
-      Qmail and (optionally) fetchmail it's
-
-      (eval-after-load "mail-source"
-        '(add-to-list 'mail-sources '(maildir :path "/path/to/Maildir/"
-                                              :subdirs ("cur" "new")))
-
-
-      And finally if you want to read your mail from several files in one
-      directory, for example because procmail already split your mail,
-      it's
-
-      (eval-after-load "mail-source"
-        '(add-to-list 'mail-sources '(directory :path "/path/to/procmail-dir/"
-                                                :suffix ".prcml"))
-
-
-      Where :suffix ".prcml" tells Gnus only to use files with the suffix
-      .prcml.
-
-      OK, now you only need to tell Gnus how to send mail. If you want to
-      send mail via sendmail (or whichever MTA is playing the role of
-      sendmail on your system), you don't need to do anything. However,
-      if you want to send your mail to an SMTP Server you need the
-      following in your ~/.gnus
-
-      (setq send-mail-function 'smtpmail-send-it)
-      (setq message-send-mail-function 'smtpmail-send-it)
-      (setq smtpmail-default-smtp-server "smtp.yourProvider.net")
-
-
-3.9.  And what about IMAP?
-
-      There are two ways of using IMAP with Gnus. The first one is to use
-      IMAP like POP3, that means Gnus fetches the mail from the IMAP
-      server and stores it on disk. If you want to do this (you don't
-      really want to do this) add the following to ~/.gnus
-
-      (add-to-list 'mail-sources '(imap :server "mail.mycorp.com"
-                                        :user "username"
-                                        :pass "password"
-                                        :stream network
-                                        :authentication login
-                                        :mailbox "INBOX"
-                                        :fetchflag "\\Seen"))
-
-
-      You might have to tweak the values for stream and/or
-      authentification, see the Gnus manual node "Mail Source Specifiers"
-      for possible values.
-
-      If you want to use IMAP the way it's intended, you've got to follow
-      a different approach. You've got to add the nnimap back end to your
-      select method and give the information about the server there.
-
-      (add-to-list 'gnus-secondary-select-methods
-                               '(nnimap "Give the baby a name"
-                                        (nnimap-address "imap.yourProvider.net")
-                                        (nnimap-port 143)
-                                        (nnimap-list-pattern "archive.*")))
-
-
-      Again, you might have to specify how to authenticate to the server
-      if Gnus can't guess the correct way, see the Manual Node "IMAP" for
-      detailed information.
-
-3.10. At the office we use one of those MS Exchange servers, can I use
-      Gnus to read my mail from it?
-
-      Offer your administrator a pair of new running shoes for activating
-      IMAP on the server and follow the instructions above.
-
-3.11. Can I tell Gnus not to delete the mails on the server it retrieves
-      via POP3?
-
-      First of all, that's not the way POP3 is intended to work, if you
-      have the possibility, you should use the IMAP Protocol if you want
-      your messages to stay on the server. Nevertheless there might be
-      situations where you need the feature, but sadly Gnus itself has no
-      predefined functionality to do so.
-
-      However this is Gnus county so there are possibilities to achieve
-      what you want. The easiest way is to get an external program which
-      retrieves copies of the mail and stores them on disk, so Gnus can
-      read it from there. On Unix systems you could use e.g. fetchmail
-      for this, on MS Windows you can use Hamster, an excellent local
-      news and mail server.
-
-      The other solution would be, to replace the method Gnus uses to get
-      mail from POP3 servers by one which is capable of leaving the mail
-      on the server. If you use XEmacs, get the package mail-lib, it
-      includes an enhanced pop3.el, look in the file, there's
-      documentation on how to tell Gnus to use it and not to delete the
-      retrieved mail. For GNU Emacs look for the file epop3.el which can
-      do the same (If you know the home of this file, please send me an
-      e-mail). You can also tell Gnus to use an external program (e.g.
-      fetchmail) to fetch your mail, see the info node "Mail Source
-      Specifiers" in the Gnus manual on how to do it.
-
-4. Reading messages
-
-4.1.  When I enter a group, all read messages are gone. How to view them
-      again?
-
-      If you enter the group by saying RET in summary buffer with point
-      over the group, only unread and ticked messages are loaded. Say C-u
-      RET instead to load all available messages. If you want only the
-      e.g. 300 newest say C-u 300 RET
-
-      Loading only unread messages can be annoying if you have threaded
-      view enabled, say
-
-      (setq gnus-fetch-old-headers 'some)
-
-
-      in ~/.gnus to load enough old articles to prevent teared threads,
-      replace 'some with t to load all articles (Warning: Both settings
-      enlarge the amount of data which is fetched when you enter a group
-      and slow down the process of entering a group).
-
-      If you already use Gnus 5.10.0, you can say /o N In summary buffer
-      to load the last N messages, this feature is not available in 5.8.8
-
-      If you don't want all old messages, but the parent of the message
-      you're just reading, you can say ^, if you want to retrieve the
-      whole thread the message you're just reading belongs to, A T is
-      your friend.
-
-4.2.  How to tell Gnus to show an important message every time I enter a
-      group, even when it's read?
-
-      You can tick important messages. To do this hit u while point is in
-      summary buffer over the message. When you want to remove the mark,
-      hit either d (this deletes the tick mark and set's unread mark) or
-      M c (which deletes all marks for the message).
-
-4.3.  How to view the headers of a message?
-
-      Say t to show all headers, one more t hides them again.
-
-4.4.  How to view the raw unformatted message?
-
-      Say C-u g to show the raw message g returns to normal view.
-
-4.5.  How can I change the headers Gnus displays by default at the top of
-      the article buffer?
-
-      The variable gnus-visible-headers controls which headers are shown,
-      its value is a regular expression, header lines which match it are
-      shown. So if you want author, subject, date, and if the header
-      exists, Followup-To and MUA / NUA say this in ~/.gnus:
-
-      (setq gnus-visible-headers
-      "^\\(From:\\|Subject:\\|Date:\\|Followup-To:\\|X-Newsreader:\\|User-Agent:\\|X-Mailer:\\)")
-
-
-4.6.  I'd like Gnus NOT to render HTML-mails but show me the text part if
-      it's available. How to do it?
-
-      Say
-
-      (eval-after-load "mm-decode"
-       '(progn
-            (add-to-list 'mm-discouraged-alternatives "text/html")
-            (add-to-list 'mm-discouraged-alternatives "text/richtext")))
-
-
-      in ~/.gnus. If you don't want HTML rendered, even if there's no
-      text alternative add
-
-      (setq mm-automatic-display (remove "text/html" mm-automatic-display))
-
-
-      too.
-
-4.7.  Can I use some other browser than w3 to render my HTML-mails?
-
-      Only if you use Gnus 5.10.0 or younger. In this case you've got the
-      choice between w3, w3m, links, lynx and html2text, which one is
-      used can be specified in the variable mm-text-html-renderer, so if
-      you want links to render your mail say
-
-      (setq mm-text-html-renderer 'links)
-
-
-4.8.  Is there anything I can do to make poorly formatted mails more
-      readable?
-
-      Gnus offers you several functions to "wash" incoming mail, you can
-      find them if you browse through the menu, item Article->Washing.
-      The most interesting ones are probably "Wrap long lines" ( W w ),
-      "Decode ROT13" ( W r ) and "Outlook Deuglify" which repairs the
-      dumb quoting used by many users of Microsoft products ( W Y f gives
-      you full deuglify. See W Y C-h or have a look at the menus for
-      other deuglifications). Outlook deuglify is only available since
-      Gnus 5.10.0.
-
-4.9.  Is there a way to automatically ignore posts by specific authors or
-      with specific words in the subject? And can I highlight more
-      interesting ones in some way?
-
-      You want Scoring. Scoring means, that you define rules which assign
-      each message an integer value. Depending on the value the message
-      is highlighted in summary buffer (if it's high, say +2000) or
-      automatically marked read (if the value is low, say -800) or some
-      other action happens.
-
-      There are basically three ways of setting up rules which assign the
-      scoring-value to messages. The first and easiest way is to set up
-      rules based on the article you are just reading. Say you're reading
-      a message by a guy who always writes nonsense and you want to
-      ignore his messages in the future. Hit L, to set up a rule which
-      lowers the score. Now Gnus asks you which the criteria for lowering
-      the Score shall be. Hit ? twice to see all possibilities, we want a
-      which means the author (the from header). Now Gnus wants to know
-      which kind of matching we want. Hit either e for an exact match or
-      s for substring-match and delete afterwards everything but the name
-      to score down all authors with the given name no matter which email
-      address is used. Now you need to tell Gnus when to apply the rule
-      and how long it should last, hit e.g. p to apply the rule now and
-      let it last forever. If you want to raise the score instead of
-      lowering it say I instead of L.
-
-      You can also set up rules by hand. To do this say V f in summary
-      buffer. Then you are asked for the name of the score file, it's
-      name.of.group.SCORE for rules valid in only one group or all.Score
-      for rules valid in all groups. See the Gnus manual for the exact
-      syntax, basically it's one big list whose elements are lists again.
-      the first element of those lists is the header to score on, then
-      one more list with what to match, which score to assign, when to
-      expire the rule and how to do the matching. If you find me very
-      interesting, you could e.g. add the following to your all.Score:
-
-      (("references" ("hschmi22.userfqdn.rz-online.de" 500 nil s))
-       ("message-id" ("hschmi22.userfqdn.rz-online.de" 999 nil s)))
-
-
-      This would add 999 to the score of messages written by me and 500
-      to the score of messages which are a (possibly indirect) answer to
-      a message written by me. Of course nobody with a sane mind would do
-      this :-)
-
-      The third alternative is adaptive scoring. This means Gnus watches
-      you and tries to find out what you find interesting and what
-      annoying and sets up rules which reflect this. Adaptive scoring can
-      be a huge help when reading high traffic groups. If you want to
-      activate adaptive scoring say
-
-      (setq gnus-use-adaptive-scoring t)
-
-
-      in ~/.gnus.
-
-4.10. How can I disable threading in some (e.g. mail-) groups, or set
-      other variables specific for some groups?
-
-      While in group buffer move point over the group and hit G c, this
-      opens a buffer where you can set options for the group. At the
-      bottom of the buffer you'll find an item that allows you to set
-      variables locally for the group. To disable threading enter
-      gnus-show-threads as name of variable and nil as value. Hit button
-      done at the top of the buffer when you're ready.
-
-4.11. Can I highlight messages written by me and follow-ups to those?
-
-      Stop those "Can I ..." questions, the answer is always yes in Gnus
-      Country :-). It's a three step process: First we make faces
-      (specifications of how summary-line shall look like) for those
-      postings, then we'll give them some special score and finally we'll
-      tell Gnus to use the new faces. You can find detailed instructions
-      on how to do it on my.gnus.org [http://my.gnus.org/Members/dzimmerm
-      /HowTo%2C2002-07-25%2C1027619165012198456/view]
-
-4.12. The number of total messages in a group which Gnus displays in
-      group buffer is by far to high, especially in mail groups. Is this
-      a bug?
-
-      No, that's a matter of design of Gnus, fixing this would mean
-      reimplementation of major parts of Gnus' back ends. Gnus thinks
-      "highest-article-number - lowest-article-number =
-      total-number-of-articles". This works OK for Usenet groups, but if
-      you delete and move many messages in mail groups, this fails. To
-      cure the symptom, enter the group via C-u RET (this makes Gnus get
-      all messages), then hit M P b to mark all messages and then say B m
-      name.of.group to move all messages to the group they have been in
-      before, they get new message numbers in this process and the count
-      is right again (until you delete and move your mail to other groups
-      again).
-
-4.13. I don't like the layout of summary and article buffer, how to
-      change it? Perhaps even a three pane display?
-
-      You can control the windows configuration by calling the function
-      gnus-add-configuration. The syntax is a bit complicated but
-      explained very well in the manual node "Window Layout". Some
-      popular examples:
-
-      Instead 25% summary 75% article buffer 35% summary and 65% article
-      (the 1.0 for article means "take the remaining space"):
-
-      (gnus-add-configuration '(article (vertical 1.0 (summary .35 point) (article 1.0))))
-
-
-      A three pane layout, Group buffer on the left, summary buffer
-      top-right, article buffer bottom-right:
-
-      (gnus-add-configuration
-       '(article
-         (horizontal 1.0
-                     (vertical 25
-                               (group 1.0))
-                     (vertical 1.0
-                               (summary 0.25 point)
-                               (article 1.0)))))
-      (gnus-add-configuration
-       '(summary
-         (horizontal 1.0
-                     (vertical 25
-                               (group 1.0))
-                     (vertical 1.0
-                               (summary 1.0 point)))))
-
-
-4.14. I don't like the way the Summary buffer looks, how to tweak it?
-
-      You've got to play around with the variable
-      gnus-summary-line-format. It's value is a string of symbols which
-      stand for things like author, date, subject etc. A list of the
-      available specifiers can be found in the manual node "Summary
-      Buffer Lines" and the often forgotten node "Formatting Variables"
-      and it's sub-nodes. There you'll find useful things like
-      positioning the cursor and tabulators which allow you a summary in
-      table form, but sadly hard tabulators are broken in 5.8.8.
-
-      Since 5.10.0, Gnus offers you some very nice new specifiers, e.g.
-      %B which draws a thread-tree and %&user-date which gives you a date
-      where the details are dependent of the articles age. Here's an
-      example which uses both:
-
-      (setq gnus-summary-line-format ":%U%R %B %s %-60=|%4L |%-20,20f |%&user-date; \n")
-
-
-      resulting in:
-
-      :O     Re: [Richard Stallman] rfc2047.el          |  13 |Lars Magne Ingebrigt |Sat 23:06
-      :O     Re: Revival of the ding-patches list       |  13 |Lars Magne Ingebrigt |Sat 23:12
-      :R  >  Re: Find correct list of articles for a gro|  25 |Lars Magne Ingebrigt |Sat 23:16
-      :O  \->  ...                                      |  21 |Kai Grossjohann      | 0:01
-      :R  >  Re: Cry for help: deuglify.el - moving stuf|  28 |Lars Magne Ingebrigt |Sat 23:34
-      :O  \->  ...                                      | 115 |Raymond Scholz       | 1:24
-      :O    \->  ...                                    |  19 |Lars Magne Ingebrigt |15:33
-      :O     Slow mailing list                          |  13 |Lars Magne Ingebrigt |Sat 23:49
-      :O     Re: `@' mark not documented                |  13 |Lars Magne Ingebrigt |Sat 23:50
-      :R  >  Re: Gnus still doesn't count messages prope|  23 |Lars Magne Ingebrigt |Sat 23:57
-      :O  \->  ...                                      |  18 |Kai Grossjohann      | 0:35
-      :O    \->  ...                                    |  13 |Lars Magne Ingebrigt | 0:56
-
-
-4.15. How to split incoming mails in several groups?
-
-      Gnus offers two possibilities for splitting mail, the easy
-      nnmail-split-methods and the more powerful Fancy Mail Splitting.
-      I'll only talk about the first one, refer to the manual, node
-      "Fancy Mail Splitting" for the latter.
-
-      The value of nnmail-split-methods is a list, each element is a list
-      which stands for a splitting rule. Each rule has the form "group
-      where matching articles should go to", "regular expression which
-      has to be matched", the first rule which matches wins. The last
-      rule must always be a general rule (regular expression .*) which
-      denotes where articles should go which don't match any other rule.
-      If the folder doesn't exist yet, it will be created as soon as an
-      article lands there. By default the mail will be send to all groups
-      whose rules match. If you don't want that (you probably don't
-      want), say
-
-      (setq nnmail-crosspost nil)
-
-
-      in ~/.gnus.
-
-      An example might be better than thousand words, so here's my
-      nnmail-split-methods. Note that I send duplicates in a special
-      group and that the default group is spam, since I filter all mails
-      out which are from some list I'm subscribed to or which are
-      addressed directly to me before. Those rules kill about 80% of the
-      Spam which reaches me (Email addresses are changed to prevent
-      spammers from using them):
-
-      (setq nnmail-split-methods
-        '(("duplicates" "^Gnus-Warning:.*duplicate")
-          ("XEmacs-NT" "^\\(To:\\|CC:\\).*[email protected].*")
-          ("Gnus-Tut" "^\\(To:\\|CC:\\).*[email protected].*")
-          ("tcsh" "^\\(To:\\|CC:\\).*[email protected].*")
-          ("BAfH" "^\\(To:\\|CC:\\).*localpart@.*uni-muenchen.bla.*")
-          ("Hamster-src" "^\\(CC:\\|To:\\).*hamster-sourcen@yahoogroups.\\(de\\|com\\).*")
-          ("Tagesschau" "^From: tagesschau <[email protected]>$")
-          ("Replies" "^\\(CC:\\|To:\\).*[email protected].*")
-          ("EK" "^From:.*\\([email protected]\\|[email protected]\\).*")
-          ("Spam" "^Content-Type:.*\\(ks_c_5601-1987\\|EUC-KR\\|big5\\|iso-2022-jp\\).*")
-          ("Spam" "^Subject:.*\\(This really work\\|XINGA\\|ADV:\\|XXX\\|adult\\|sex\\).*")
-          ("Spam" "^Subject:.*\\(\=\?ks_c_5601-1987\?\\|\=\?euc-kr\?\\|\=\?big5\?\\).*")
-          ("Spam" "^X-Mailer:\\(.*BulkMailer.*\\|.*MIME::Lite.*\\|\\)")
-          ("Spam" "^X-Mailer:\\(.*CyberCreek Avalanche\\|.*http\:\/\/GetResponse\.com\\)")
-          ("Spam" "^From:.*\\(verizon\.net\\|prontomail\.com\\|money\\|ConsumerDirect\\).*")
-          ("Spam" "^Delivered-To: GMX delivery to [email protected]$")
-          ("Spam" "^Received: from link2buy.com")
-          ("Spam" "^CC: .*[email protected]")
-          ("Spam" "^X-Mailer-Version: 1.50 BETA")
-          ("Uni" "^\\(CC:\\|To:\\).*[email protected].*")
-          ("Inbox" "^\\(CC:\\|To:\\).*\\(my\ name\\|[email protected]\\|[email protected]\\)")
-          ("Spam" "")))
-
-
-5. Composing messages
-
-5.1.  What are the basic commands I need to know for sending mail and
-      postings?
-
-      To start composing a new mail hit m either in Group or Summary
-      buffer, for a posting, it's either a in Group buffer and filling
-      the Newsgroups header manually or a in the Summary buffer of the
-      group where the posting shall be send to. Replying by mail is r if
-      you don't want to cite the author, or import the cited text
-      manually and R to cite the text of the original message. For a
-      follow up to a newsgroup, it's f and F (analog to r and R.
-
-      Enter new headers above the line saying "--text follows this
-      line--", enter the text below the line. When ready hit C-c C-c, to
-      send the message, if you want to finish it later hit C-c C-d to
-      save it in the drafts group, where you can start editing it again
-      by saying D e.
-
-5.2.  How to enable automatic word-wrap when composing messages?
-
-      Say
-
-      (add-hook 'message-mode-hook
-            (lambda ()
-                 (setq fill-column 72)
-                 (turn-on-auto-fill)))
-
-
-      in ~/.gnus. You can reformat a paragraph by hitting M-q (as usual)
-
-5.3.  How to set stuff like From, Organization, Reply-To, signature...?
-
-      There are other ways, but you should use posting styles for this.
-      (See below why). This example should make the syntax clear:
-
-      (setq gnus-posting-styles
-        '((".*"
-           (name "Frank Schmitt")
-           (address "[email protected]")
-           (organization "Hamme net, kren mer och nimmi")
-           (signature-file "~/.signature")
-           ("X-SampleHeader" "foobar")
-           (eval (setq some-variable "Foo bar")))))
-
-
-      The ".*" means that this settings are the default ones (see below),
-      valid values for the first element of the following lists are
-      signature, signature-file, organization, address, name or body. The
-      attribute name can also be a string. In that case, this will be
-      used as a header name, and the value will be inserted in the
-      headers of the article; if the value is `nil', the header name will
-      be removed. You can also say (eval (foo bar)), then the function
-      foo will be evaluated with argument bar and the result will be
-      thrown away.
-
-5.4.  Can I set things like From, Signature etc group based on the group
-      I post too?
-
-      That's the strength of posting styles. Before, we used ".*" to set
-      the default for all groups. You can use a regexp like "^gmane" and
-      the following settings are only applied to postings you send to the
-      gmane hierarchy, use ".*binaries" instead and they will be applied
-      to postings send to groups containing the string binaries in their
-      name etc.
-
-      You can instead of specifying a regexp specify a function which is
-      evaluated, only if it returns true, the corresponding settings take
-      effect. Two interesting candidates for this are message-news-p
-      which returns t if the current Group is a newsgroup and the
-      corresponding message-mail-p.
-
-      Note that all forms that match are applied, that means in the
-      example below, when I post to gmane.mail.spam.spamassassin.general,
-      the settings under ".*" are applied and the settings under
-      message-news-p and those under "^gmane" and those under "^gmane\
-      \.mail\\.spam\\.spamassassin\\.general$". Because of this put
-      general settings at the top and specific ones at the bottom.
-
-      (setq gnus-posting-styles
-        '((".*"  ;;default
-           (name "Frank Schmitt")
-           (organization "Hamme net, kren mer och nimmi")
-           (signature-file "~/.signature")    )
-          ((message-news-p)  ;;Usenet news?
-           (address "[email protected]")
-           ("Reply-To" "[email protected]")    )
-          ((message-mail-p)  ;;mail?
-           (address "[email protected]")    )
-          ("^gmane" ;;this is mail, too in fact
-           (address "[email protected]")
-           ("Reply-To" nil)    )
-          ("^gmane.mail.spam.spamassassin.general$"
-           (eval (setq mail-envelope-from "[email protected]"))
-           (address "[email protected]")) ))
-
-
-5.5.  Is there a spell-checker? Perhaps even on-the-fly spell-checking?
-
-      You can use ispell.el to spell-check stuff in Emacs. So the first
-      thing to do is to make sure that you've got either ispell [http://
-      fmg-www.cs.ucla.edu/fmg-members/geoff/ispell.html] or aspell [http:
-      //aspell.sourceforge.net/] installed and in your Path. Then you
-      need ispell.el [http://www.kdstevens.com/~stevens/ispell-page.html]
-      and for on-the-fly spell-checking flyspell.el [http://
-      www-sop.inria.fr/mimosa/personnel/Manuel.Serrano/flyspell/
-      flyspell.html]. Ispell.el is shipped with Gnus Emacs and available
-      through the Emacs package system, flyspell.el is shipped with Emacs
-      and part of XEmacs text-modes package which is available through
-      the package system, so there should be no need to install them
-      manually.
-
-      Ispell.el assumes you use ispell, if you choose aspell say
-
-      (setq ispell-program-name "aspell")
-
-      in your Emacs configuration file.
-
-      If you want your outgoing messages to be spell-checked, say
-
-      (add-hook 'message-send-hook 'ispell-message)
-
-      In your ~/.gnus, if you prefer on-the-fly spell-checking say
-
-      (add-hook 'message-mode-hook (lambda () (flyspell-mode 1)))
-
-5.6.  Can I set the dictionary based on the group I'm posting to?
-
-      Yes, say something like
-
-      (add-hook 'gnus-select-group-hook
-                (lambda ()
-                  (cond
-                   ((string-match
-                     "^de\\." (gnus-group-real-name gnus-newsgroup-name))
-                    (ispell-change-dictionary "deutsch8"))
-                   (t
-                    (ispell-change-dictionary "english")))))
-
-
-      in ~/.gnus. Change "^de\\." and "deutsch8" to something that suits
-      your needs.
-
-5.7.  Is there some kind of address-book, so I needn't remember all those
-      email addresses?
-
-      There's an very basic solution for this, mail aliases. You can
-      store your mail addresses in a ~/.mailrc file using a simple alias
-      syntax:
-
-      alias al        "Al <[email protected]>"
-
-
-      Then typing your alias (followed by a space or punctuation
-      character) on a To: or Cc: line in the message buffer will cause
-      gnus to insert the full address for you. See the node "Mail
-      Aliases" in Message (not Gnus) manual for details.
-
-      However, what you really want is the Insidious Big Brother Database
-      bbdb. Get it through the XEmacs package system or from bbdb's
-      homepage [http://bbdb.sourceforge.net/]. Now place the following in
-      ~/.gnus, to activate bbdb for Gnus:
-
-      (require 'bbdb)
-      (bbdb-initialize 'gnus 'message)
-
-
-      Now you probably want some general bbdb configuration, place them
-      in ~/.emacs:
-
-      (require 'bbdb)
-      ;;If you don't live in Northern America, you should disable the
-      ;;syntax check for telephone numbers by saying
-      (setq bbdb-north-american-phone-numbers-p nil)
-      ;;Tell bbdb about your email address:
-      (setq bbdb-user-mail-names
-            (regexp-opt '("[email protected]"
-                          "[email protected]")))
-      ;;cycling while completing email addresses
-      (setq bbdb-complete-name-allow-cycling t)
-      ;;No popup-buffers
-      (setq bbdb-use-pop-up nil)
-
-
-      Now you should be ready to go. Say M-x bbdb RET RET to open a bbdb
-      buffer showing all entries. Say c to create a new entry, b to
-      search your BBDB and C-o to add a new field to an entry. If you
-      want to add a sender to the BBDB you can also just hit `:' on the
-      posting in the summary buffer and you are done. When you now
-      compose a new mail, hit TAB to cycle through know recipients.
-
-5.8.  Sometimes I see little images at the top of article buffer. What's
-      that and how can I send one with my postings, too?
-
-      Those images are called X-Faces. They are 48*48 pixel b/w pictures,
-      encoded in a header line. If you want to include one in your posts,
-      you've got to convert some image to a X-Face. So fire up some image
-      manipulation program (say Gimp), open the image you want to
-      include, cut out the relevant part, reduce color depth to 1 bit,
-      resize to 48*48 and save as bitmap. Now you should get the compface
-      package from this site [ftp://ftp.cs.indiana.edu:/pub/faces/]. and
-      create the actual X-face by saying
-
-      cat file.xbm | xbm2ikon |compface > file.face
-      cat ./file.face | sed 's/\\/\\\\/g' | sed 's/\"/\\\"/g' > ./file.face.quoted
-
-
-      if you can't use compface, there's an online X-face converter at
-      http://www.dairiki.org/xface/ [http://www.dairiki.org/xface/]. If
-      you use MS Windows, you could also use the WinFace program from
-      http://www.xs4all.nl/~walterln/winface/ [http://www.xs4all.nl/
-      ~walterln/winface/]. Now you only have to tell Gnus to include the
-      X-face in your postings by saying
-
-      (setq message-default-headers
-              (with-temp-buffer
-                (insert "X-Face: ")
-                (insert-file-contents "~/.xemacs/xface")
-                (buffer-string)))
-
-
-      in ~/.gnus.
-
-5.9.  Sometimes I accidentally hit r instead of f in newsgroups. Can Gnus
-      warn me, when I'm replying by mail in newsgroups?
-
-      Put this in ~/.gnus:
-
-      (setq gnus-confirm-mail-reply-to-news t)
-
-
-      if you already use Gnus 5.10.0, if you still use 5.8.8 or 5.9 try
-      this instead:
-
-      (defadvice gnus-summary-reply (around reply-in-news activate)
-             (interactive)
-              (when (or (not (gnus-news-group-p gnus-newsgroup-name))
-                        (y-or-n-p "Really reply? "))
-               ad-do-it))
-
-
-5.10. How to tell Gnus not to generate a sender header?
-
-      Since 5.10.0 Gnus doesn't generate a sender header by default. For
-      older Gnus' try this in ~/.gnus:
-
-      (eval-after-load "message"
-            '(add-to-list 'message-syntax-checks '(sender . disabled)))
-
-
-5.11. I want gnus to locally store copies of my send mail and news, how
-      to do it?
-
-      You must set the variable gnus-message-archive-group to do this.
-      You can set it to a string giving the name of the group where the
-      copies shall go or like in the example below use a function which
-      is evaluated and which returns the group to use.
-
-      (setq gnus-message-archive-group
-              '((if (message-news-p)
-                    "nnml:Send-News"
-                  "nnml:Send-Mail")))
-
-
-5.12. People tell me my Message-IDs are not correct, why aren't they and
-      how to fix it?
-
-      The message-ID is an unique identifier for messages you send. To
-      make it unique, Gnus need to know which machine name to put after
-      the "@". If the name of the machine where Gnus is running isn't
-      suitable (it probably isn't at most private machines) you can tell
-      Gnus what to use by saying:
-
-      (defun message-make-message-id()
-         (concat "<"(message-unique-id)"@yourmachine.yourdomain.tld>"))
-
-
-      in ~/.gnus. If you have no idea what to insert for
-      "yourmachine.yourdomain.tld", you've got several choices. You can
-      either ask your provider if he allows you to use something like
-      yourUserName.userfqdn.provider.net, or you can use
-      somethingUnique.yourdomain.tld if you own the domain
-      yourdomain.tld, or you can register at a service which gives
-      private users a FQDN for free, e.g. http://www.stura.tu-freiberg.de
-      /~dlx/addfqdn.html [http://www.stura.tu-freiberg.de/~dlx/
-      addfqdn.html]. (Sorry but this website is in German, if you know of
-      an English one offering the same, drop me a note).
-
-      Finally you can tell Gnus not to generate a Message-ID for News at
-      all (and letting the server do the job) by saying
-
-      (setq message-required-news-headers
-        (remove' Message-ID message-required-news-headers))
-
-
-      you can also tell Gnus not to generate Message-IDs for mail by
-      saying
-
-      (setq message-required-mail-headers
-        (remove' Message-ID message-required-mail-headers))
-
-
-      , however some mail servers don't generate proper Message-IDs, too,
-      so test if your Mail Server behaves correctly by sending yourself a
-      Mail and looking at the Message-ID.
-
-6. Old messages
-
-6.1.  How to import my old mail into Gnus?
-
-      The easiest way is to tell your old mail program to export the
-      messages in mbox format. Most Unix mailers are able to do this, if
-      you come from the MS Windows world, you may find tools at http://
-      mbx2mbox.sourceforge.net/ [http://mbx2mbox.sourceforge.net/].
-
-      Now you've got to import this mbox file into Gnus. To do this,
-      create a nndoc group based on the mbox file by saying G f /path/
-      file.mbox RET in Group buffer. You now have read-only access to
-      your mail. If you want to import the messages to your normal Gnus
-      mail groups hierarchy, enter the nndoc group you've just created by
-      saying C-u RET (thus making sure all messages are retrieved), mark
-      all messages by saying M P b and either copy them to the desired
-      group by saying B c name.of.group RET or send them through
-      nnmail-split-methods (respool them) by saying B r.
-
-6.2.  How to archive interesting messages?
-
-      If you stumble across an interesting message, say in gnu.emacs.gnus
-      and want to archive it there are several solutions. The first and
-      easiest is to save it to a file by saying O f. However, wouldn't it
-      be much more convenient to have more direct access to the archived
-      message from Gnus? If you say yes, put this snippet by Frank Haun
-      <[email protected]> in ~/.gnus:
-
-      (defun my-archive-article (&optional n)
-        "Copies one or more article(s) to a corresponding `nnml:' group, e.g.
-      `gnus.ding' goes to `nnml:1.gnus.ding'. And `nnml:List-gnus.ding' goes
-      to `nnml:1.List-gnus-ding'.
-
-      Use process marks or mark a region in the summary buffer to archive
-      more then one article."
-        (interactive "P")
-        (let ((archive-name
-               (format
-                "nnml:1.%s"
-                (if (featurep 'xemacs)
-                    (replace-in-string gnus-newsgroup-name "^.*:" "")
-                  (replace-regexp-in-string "^.*:" "" gnus-newsgroup-name)))))
-          (gnus-summary-copy-article n archive-name)))
-
-
-      You can now say M-x my-archive-article in summary buffer to archive
-      the article under the cursor in a nnml group. (Change nnml to your
-      preferred back end)
-
-      Of course you can also make sure the cache is enabled by saying
-
-      (setq gnus-use-cache t)
-
-
-      then you only have to set either the tick or the dormant mark for
-      articles you want to keep, setting the read mark will remove them
-      from cache.
-
-6.3.  How to search for a specific message?
-
-      There are several ways for this, too. For a posting from a Usenet
-      group the easiest solution is probably to ask groups.google.com
-      [http://groups.google.com], if you found the posting there, tell
-      Google to display the raw message, look for the message-id, and say
-      M-^ [email protected] RET in a summary buffer. Since Gnus 5.10.0
-      there's also a Gnus interface for groups.google.com which you can
-      call with G W) in group buffer.
-
-      Another idea which works for both mail and news groups is to enter
-      the group where the message you are searching is and use the
-      standard Emacs search C-s, it's smart enough to look at articles in
-      collapsed threads, too. If you want to search bodies, too try M-s
-      instead. Further on there are the gnus-summary-limit-to-foo
-      functions, which can help you, too.
-
-      Of course you can also use grep to search through your local mail,
-      but this is both slow for big archives and inconvenient since you
-      are not displaying the found mail in Gnus. Here comes nnir into
-      action. Nnir is a front end to search engines like swish-e or
-      swish++ and others. You index your mail with one of those search
-      engines and with the help of nnir you can search trough the indexed
-      mail and generate a temporary group with all messages which met
-      your search criteria. If this sound cool to you get nnir.el from
-      ftp://ls6-ftp.cs.uni-dortmund.de/pub/src/emacs/ [ftp://
-      ls6-ftp.cs.uni-dortmund.de/pub/src/emacs/] or ftp://
-      ftp.is.informatik.uni-duisburg.de/pub/src/emacs/ [ftp://
-      ftp.is.informatik.uni-duisburg.de/pub/src/emacs/]. Instructions on
-      how to use it are at the top of the file.
-
-6.4.  How to get rid of old unwanted mail?
-
-      You can of course just mark the mail you don't need anymore by
-      saying # with point over the mail and then say B DEL to get rid of
-      them forever. You could also instead of actually deleting them,
-      send them to a junk-group by saying B m nnml:trash-bin which you
-      clear from time to time, but both are not the intended way in Gnus.
-
-      In Gnus, we let mail expire like news expires on a news server.
-      That means you tell Gnus the message is expirable (you tell Gnus "I
-      don't need this mail anymore") by saying E with point over the mail
-      in summary buffer. Now when you leave the group, Gnus looks at all
-      messages which you marked as expirable before and if they are old
-      enough (default is older than a week) they are deleted.
-
-6.5.  I want that all read messages are expired (at least in some
-      groups). How to do it?
-
-      If you want all read messages to be expired (e.g. in mailing lists
-      where there's an online archive), you've got two choices:
-      auto-expire and total-expire. Auto-expire means, that every article
-      which has no marks set and is selected for reading is marked as
-      expirable, Gnus hits E for you every time you read a message.
-      Total-expire follows a slightly different approach, here all
-      article where the read mark is set are expirable.
-
-      To activate auto-expire, include auto-expire in the Group
-      parameters for the group. (Hit G c in summary buffer with point
-      over the group to change group parameters). For total-expire add
-      total-expire to the group-parameters.
-
-      Which method you choose is merely a matter of taste: Auto-expire is
-      faster, but it doesn't play together with Adaptive Scoring, so if
-      you want to use this feature, you should use total-expire.
-
-      If you want a message to be excluded from expiration in a group
-      where total or auto expire is active, set either tick (hit u) or
-      dormant mark (hit u), when you use auto-expire, you can also set
-      the read mark (hit d).
-
-6.6.  I don't want expiration to delete my mails but to move them to
-      another group.
-
-      Say something like this in ~/.gnus:
-
-      (setq nnmail-expiry-target "nnml:expired")
-
-
-      (If you want to change the value of nnmail-expiry-target on a per
-      group basis see the question "How can I disable threading in some
-      (e.g. mail-) groups, or set other variables specific for some
-      groups?")
-
-7. Gnus in a dial-up environment
-
-7.1.  I don't have a permanent connection to the net, how can I minimize
-      the time I've got to be connected?
-
-      You've got basically two options: Either you use the Gnus Agent
-      (see below) for this, or you can install programs which fetch your
-      news and mail to your local disk and Gnus reads the stuff from your
-      local machine.
-
-      If you want to follow the second approach, you need a program which
-      fetches news and offers them to Gnus, a program which does the same
-      for mail and a program which receives the mail you write from Gnus
-      and sends them when you're online.
-
-      Let's talk about Unix systems first: For the news part, the easiest
-      solution is a small nntp server like Leafnode [http://
-      www.leafnode.org/] or sn [http://infa.abo.fi/~patrik/sn/], of
-      course you can also install a full featured news server like inn
-      [http://www.isc.org/products/INN/]. Then you want to fetch your
-      Mail, popular choices are fetchmail [http://www.catb.org/~esr/
-      fetchmail/] and getmail [http://www.qcc.ca/~charlesc/software/
-      getmail-3.0/]. You should tell those to write the mail to your disk
-      and Gnus to read it from there. Last but not least the mail sending
-      part: This can be done with every MTA like sendmail [http://
-      www.sendmail.org/], postfix [http://www.qmail.org/], exim [http://
-      www.exim.org/] or qmail [http://www.qmail.org/].
-
-      On windows boxes I'd vote for Hamster [http://www.tglsoft.de/],
-      it's a small freeware, open-source program which fetches your mail
-      and news from remote servers and offers them to Gnus (or any other
-      mail and/or news reader) via nntp respectively POP3 or IMAP. It
-      also includes a smtp server for receiving mails from Gnus.
-
-7.2.  So what was this thing about the Agent?
-
-      The Gnus agent is part of Gnus, it allows you to fetch mail and
-      news and store them on disk for reading them later when you're
-      offline. It kind of mimics offline newsreaders like e.g. Forte
-      Agent. If you want to use the Agent place the following in ~/.gnus
-      if you are still using 5.8.8 or 5.9 (it's the default since
-      5.10.0):
-
-      (setq gnus-agent t)
-
-
-      Now you've got to select the servers whose groups can be stored
-      locally. To do this, open the server buffer (that is press ^ while
-      in the group buffer). Now select a server by moving point to the
-      line naming that server. Finally, agentize the server by typing J a
-      . If you make a mistake, or change your mind, you can undo this
-      action by typing J r. When you're done, type 'q' to return to the
-      group buffer. Now the next time you enter a group on a agentized
-      server, the headers will be stored on disk and read from there the
-      next time you enter the group.
-
-7.3.  I want to store article bodies on disk, too. How to do it?
-
-      You can tell the agent to automatically fetch the bodies of
-      articles which fulfill certain predicates, this is done in a
-      special buffer which can be reached by saying J c in group buffer.
-      Please refer to the documentation for information which predicates
-      are possible and how exactly to do it.
-
-      Further on you can tell the agent manually which articles to store
-      on disk. There are two ways to do this: Number one: In the summary
-      buffer, process mark a set of articles that shall be stored in the
-      agent by saying # with point over the article and then type J s.
-      The other possibility is to set, again in the summary buffer,
-      downloadable (%) marks for the articles you want by typing @ with
-      point over the article and then typing J u. What's the difference?
-      Well, process marks are erased as soon as you exit the summary
-      buffer while downloadable marks are permanent. You can actually set
-      downloadable marks in several groups then use fetch session ('J s'
-      in the GROUP buffer) to fetch all of those articles. The only
-      downside is that fetch session also fetches all of the headers for
-      every selected group on an agentized server. Depending on the
-      volume of headers, the initial fetch session could take hours.
-
-7.4.  How to tell Gnus not to try to send mails / postings while I'm
-      offline?
-
-      All you've got to do is to tell Gnus when you are online (plugged)
-      and when you are offline (unplugged), the rest works automatically.
-      You can toggle plugged/unplugged state by saying J j in group
-      buffer. To start Gnus unplugged say M-x gnus-unplugged instead of
-      M-x gnus. Note that for this to work, the agent must be active.
-
-8. Getting help
-
-8.1.  How to find information and help inside Emacs?
-
-      The first stop should be the Gnus manual (Say C-h i d m Gnus RET to
-      start the Gnus manual, then walk through the menus or do a
-      full-text search with s). Then there are the general Emacs help
-      commands starting with C-h, type C-h ? ? to get a list of all
-      available help commands and their meaning. Finally M-x
-      apropos-command lets you search through all available functions and
-      M-x apropos searches the bound variables.
-
-8.2.  I can't find anything in the Gnus manual about X (e.g. attachments,
-      PGP, MIME...), is it not documented?
-
-      There's not only the Gnus manual but also the manuals for message,
-      emacs-mime, sieve and pgg. Those packages are distributed with Gnus
-      and used by Gnus but aren't really part of core Gnus, so they are
-      documented in different info files, you should have a look in those
-      manuals, too.
-
-8.3.  Which websites should I know?
-
-      The two most important ones are the official Gnus website [http://
-      www.gnus.org]. and it's sister site my.gnus.org (MGO) [http://
-      my.gnus.org], hosting an archive of lisp snippets, howtos, a (not
-      really finished) tutorial and this FAQ.
-
-      Tell me about other sites which are interesting.
-
-8.4.  Which mailing lists and newsgroups are there?
-
-      There's the newsgroup gnu.emacs.gnus (pull it from e.g.
-      news.gnus.org) which deals with general questions and the ding
-      mailing list ([email protected]) dealing with development of Gnus. You
-      can read the ding list via NNTP, too under the name gnus.ding from
-      news.gnus.org.
-
-      If you want to stay in the big8, news.software.newssreaders is also
-      read by some Gnus users (but chances for qualified help are much
-      better in the above groups) and if you speak German, there's
-      de.comm.software.gnus.
-
-8.5.  Where to report bugs?
-
-      Say M-x gnus-bug, this will start a message to the gnus bug mailing
-      list [mailto:[email protected]] including information about your
-      environment which make it easier to help you.
-
-8.6.  I need real-time help, where to find it?
-
-      Point your IRC client to irc.my.gnus.org channel #mygnus. Don't be
-      afraid if people there speak German, they are willing and capable
-      of switching to English when people from outside Germany enter.
-
-9. Tuning Gnus
-
-9.1.  Starting Gnus is really slow, how to speed it up?
-
-      The reason for this could be the way Gnus reads it's active file,
-      see the node "The Active File" in the Gnus manual for things you
-      might try to speed the process up. An other idea would be to byte
-      compile your ~/.gnus (say M-x byte-compile-file RET ~/.gnus RET to
-      do it). Finally, if you have require statements in your .gnus, you
-      could replace them with eval-after-load, which loads the stuff not
-      at startup time, but when it's needed. Say you've got this in your
-      ~/.gnus:
-
-      (require 'message)
-      (add-to-list 'message-syntax-checks '(sender . disabled))
-
-
-      then as soon as you start Gnus, message.el is loaded. If you
-      replace it with
-
-      (eval-after-load "message"
-            '(add-to-list 'message-syntax-checks '(sender . disabled)))
-
-
-      it's loaded when it's needed.
-
-9.2.  How to speed up the process of entering a group?
-
-      A speed killer is setting the variable gnus-fetch-old-headers to
-      anything different from nil, so don't do this if speed is an issue.
-      To speed up building of summary say
-
-      (gnus-compile)
-
-
-      at the bottom of your ~/.gnus, this will make gnus byte-compile
-      things like gnus-summary-line-format. then you could increase the
-      value of gc-cons-threshold by saying something like
-
-      (setq gc-cons-threshold 3500000)
-
-
-      in ~/.emacs. If you don't care about width of CJK characters or use
-      Gnus 5.10.0 or younger together with a recent GNU Emacs, you should
-      say
-
-      (setq gnus-use-correct-string-widths nil)
-
-
-      in ~/.gnus (thanks to Jesper harder for the last two suggestions).
-      Finally if you are still using 5.8.8 or 5.9 and experience speed
-      problems with summary buffer generation, you definitely should
-      update to 5.10.0 since there quite some work on improving it has
-      been done.
-
-9.3.  Sending mail becomes slower and slower, what's up?
-
-      The reason could be that you told Gnus to archive the messages you
-      wrote by setting gnus-message-archive-group. Try to use a nnml
-      group instead of an archive group, this should bring you back to
-      normal speed.
-
-Glossary
-
-~/.gnus
-
-    When the term ~/.gnus is used it just means your Gnus
-    configuration file. You might as well call it ~/.gnus.el or
-    specify another name.
-
-Back End
-
-    In Gnus terminology a back end is a virtual server, a layer
-    between core Gnus and the real NNTP-, POP3-, IMAP- or
-    whatever-server which offers Gnus a standardized interface to
-    functions like "get message", "get Headers" etc.
-
-Emacs
-
-    When the term Emacs is used in this FAQ, it means either GNU
-    Emacs or XEmacs.
-
-Message
-
-    In this FAQ message means a either a mail or a posting to a
-    Usenet Newsgroup or to some other fancy back end, no matter of
-    which kind it is.
-
-MUA
-
-    MUA is an acronym for Mail User Agent, it's the program you use
-    to read and write e-mails.
-
-NUA
-
-    NUA is an acronym for News User Agent, it's the program you use
-    to read and write Usenet news.
Index: gnus/lisp/ChangeLog
diff -u gnus/lisp/ChangeLog:6.2753 gnus/lisp/ChangeLog:6.2768
--- gnus/lisp/ChangeLog:6.2753	Sat Jan  3 00:09:35 2004
+++ gnus/lisp/ChangeLog	Sun Jan  4 01:31:39 2004
@@ -1,3 +1,51 @@
+2004-01-04 Lars Magne Ingebrigtsen <[email protected]>
+
+	* gnus.el: Gnus v5.10.5 is released.
+
+2004-01-03  Lars Magne Ingebrigtsen  <[email protected]>
+
+	* gnus-fun.el (gnus-face-from-file): Message 9.
+
+2004-01-03  Romain FRANCOISE  <[email protected]>
+
+	* gnus-fun.el (gnus-face-from-file): Use gnus-message.
+
+2004-01-03  Reiner Steib  <[email protected]>
+
+	* gnus-art.el (gnus-button-mid-or-mail-heuristic): Treat Gmane
+	addresses specially.  Fix returned value and messages.
+
+	* mm-decode.el (mm-enable-external): New variable.
+	(mm-display-part): Use it.
+	(mm-display-external): Fix message in case of nil handle.
+
+	* Update copyright for several files.
+
+	* spam-report.el (spam-report-gmane): Adjust verbosity.
+	Delete trailing whitespace.  Update copyright.
+
+	* spam.el: Fix many (but not all) checkdoc complaints.
+	Delete trailing whitespace.
+
+	* message.el (message-header-synonyms): Defcustom.
+	(message-get-reply-headers): Catch `Original-To'.
+	(message-carefully-insert-headers): Added comment.
+
+	* gnus-sum.el (gnus-summary-make-menu-bar): Improved "Washing" menu.
+
+2004-01-03  Lars Magne Ingebrigtsen  <[email protected]>
+
+	* gnus-sum.el (gnus-select-newsgroup): Use cat.
+
+	* gnus-agent.el (gnus-agent-cat-enable-undownloaded-faces): New
+	cat. 
+
+	* gnus.el (gnus-user-agent): Moved here.
+
+	* gnus-msg.el (gnus-user-agent): Moved from here.
+
+	* gnus.el (gnus-version-number): Bump.
+
 2004-01-03 Lars Magne Ingebrigtsen <[email protected]>
 
 	* gnus.el: Gnus v5.10.4 is released.
Index: gnus/lisp/gnus-agent.el
diff -u gnus/lisp/gnus-agent.el:6.185 gnus/lisp/gnus-agent.el:6.186
--- gnus/lisp/gnus-agent.el:6.185	Mon Dec 29 23:51:38 2003
+++ gnus/lisp/gnus-agent.el	Sat Jan  3 19:52:57 2004
@@ -344,6 +344,8 @@
  gnus-agent-cat-score-file                 agent-score-file)
 (gnus-agent-cat-defaccessor
  gnus-agent-cat-disable-undownloaded-faces agent-disable-undownloaded-faces)
+(gnus-agent-cat-defaccessor
+ gnus-agent-cat-enable-undownloaded-faces agent-enable-undownloaded-faces)
 
 (eval-when-compile
   (defsetf gnus-agent-cat-groups (category) (groups)
Index: gnus/lisp/gnus-art.el
diff -u gnus/lisp/gnus-art.el:6.380 gnus/lisp/gnus-art.el:6.381
--- gnus/lisp/gnus-art.el:6.380	Tue Dec 30 22:22:43 2003
+++ gnus/lisp/gnus-art.el	Sat Jan  3 22:05:08 2004
@@ -5838,13 +5838,14 @@
     ;; Certain special cases...
     (when (string-match
 	   (concat
-	    "^0[0-9]+-[0-9][0-9][0-9][0-9]@t-online\\.de$" "\\|"
-	    "^[0-9]+\.[0-9]+\@compuserve")
+	    "^0[0-9]+-[0-9][0-9][0-9][0-9]@t-online\\.de$\\|"
+	    "^[0-9]+\\.[0-9]+@compuserve\\|"
+	    "@public\\.gmane\\.org")
 	   mid-or-mail)
-      (gnus-message 8 "`%s' is a known mail address.")
+      (gnus-message 8 "`%s' is a known mail address." mid-or-mail)
       (setq result 'mail))
     (when (string-match "@.*@\\| " mid-or-mail)
-      (gnus-message 8 "`%s' is invalid.")
+      (gnus-message 8 "`%s' is invalid." mid-or-mail)
       (setq result 'invalid))
     ;; Nothing more to do, if result is not a number here...
     (when (numberp result)
@@ -5886,8 +5887,10 @@
 	  (gnus-message
 	   9 "`%s', rate `%s', result `%s'." mid-or-mail 5.0 result)))))
     (gnus-message 8 "`%s': Final rate is `%s'." mid-or-mail result)
+    ;; Maybe we should make this a customizable alist: (condition . 'result)
     (cond
-     ;; Maybe we should make this a customizable alist: (condition . 'result)
+     ((symbolp result) result)
+     ;; Now convert number into proper results:
      ((< result -10.0) 'mid)
      ((> result  10.0) 'mail)
      (t 'ask))))
Index: gnus/lisp/gnus-dired.el
diff -u gnus/lisp/gnus-dired.el:6.7 gnus/lisp/gnus-dired.el:6.8
--- gnus/lisp/gnus-dired.el:6.7	Fri Jan  2 22:42:24 2004
+++ gnus/lisp/gnus-dired.el	Sat Jan  3 16:18:59 2004
@@ -1,6 +1,6 @@
 ;;; gnus-dired.el --- utility functions where gnus and dired meet
 
-;; Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003
+;; Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004
 ;;        Free Software Foundation, Inc.
 
 ;; Authors: Benjamin Rutt <[email protected]>,
Index: gnus/lisp/gnus-fun.el
diff -u gnus/lisp/gnus-fun.el:6.48 gnus/lisp/gnus-fun.el:6.50
--- gnus/lisp/gnus-fun.el:6.48	Mon Jun 23 19:54:51 2003
+++ gnus/lisp/gnus-fun.el	Sat Jan  3 22:42:05 2004
@@ -119,8 +119,8 @@
 	(if (> (length attempt) 726)
 	    (progn
 	      (setq quant (- quant 2))
-	      (message "Length %d; trying quant %d"
-		       (length attempt) quant))
+	      (gnus-message 9 "Length %d; trying quant %d"
+			    (length attempt) quant))
 	  (setq done t)))
       (if done
 	  (mm-with-unibyte-buffer
Index: gnus/lisp/gnus-msg.el
diff -u gnus/lisp/gnus-msg.el:6.149 gnus/lisp/gnus-msg.el:6.151
--- gnus/lisp/gnus-msg.el:6.149	Fri Dec 19 15:41:04 2003
+++ gnus/lisp/gnus-msg.el	Sat Jan  3 16:18:59 2004
@@ -1,5 +1,5 @@
 ;;; gnus-msg.el --- mail and post interface for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Masanobu UMEDA <[email protected]>
@@ -281,24 +281,6 @@
 `gnus-summary-resend-message'."
   :group 'gnus-message
   :type 'boolean)
-
-(defcustom gnus-user-agent 'emacs-gnus-type
-  "Which information should be exposed in the User-Agent header.
-
-It can be one of the symbols `gnus' \(show only Gnus version\), `emacs-gnus'
-\(show only Emacs and Gnus versions\), `emacs-gnus-config' \(same as
-`emacs-gnus' plus system configuration\), `emacs-gnus-type' \(same as
-`emacs-gnus' plus system type\) or a custom string.  If you set it to a
-string, be sure to use a valid format, see RFC 2616."
-  :group 'gnus-message
-  :type '(choice
-	  (item :tag "Show Gnus and Emacs versions and system type"
-		emacs-gnus-type)
-	  (item :tag "Show Gnus and Emacs versions and system configuration"
-		emacs-gnus-config)
-	  (item :tag "Show Gnus and Emacs versions" emacs-gnus)
-	  (item :tag "Show only Gnus version" gnus)
-	  (string :tag "Other")))
 
 ;;; Internal variables.
 
Index: gnus/lisp/gnus-nocem.el
diff -u gnus/lisp/gnus-nocem.el:6.4 gnus/lisp/gnus-nocem.el:6.5
--- gnus/lisp/gnus-nocem.el:6.4	Fri Jan  2 21:12:56 2004
+++ gnus/lisp/gnus-nocem.el	Sat Jan  3 16:18:59 2004
@@ -1,6 +1,6 @@
 ;;; gnus-nocem.el --- NoCeM pseudo-cancellation treatment
 
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2004
 ;;        Free Software Foundation, Inc.
 
 
Index: gnus/lisp/gnus-sum.el
diff -u gnus/lisp/gnus-sum.el:6.373 gnus/lisp/gnus-sum.el:6.376
--- gnus/lisp/gnus-sum.el:6.373	Tue Dec 30 22:13:43 2003
+++ gnus/lisp/gnus-sum.el	Sat Jan  3 19:52:57 2004
@@ -1,5 +1,5 @@
 ;;; gnus-sum.el --- summary mode commands for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <[email protected]>
@@ -2174,7 +2174,7 @@
 	      ["Word wrap" gnus-article-fill-cited-article t]
 	      ["Fill long lines" gnus-article-fill-long-lines t]
 	      ["Capitalize sentences" gnus-article-capitalize-sentences t]
-	      ["CR" gnus-article-remove-cr t]
+	      ["Remove CR" gnus-article-remove-cr t]
 	      ["Quoted-Printable" gnus-article-de-quoted-unreadable t]
 	      ["Base64" gnus-article-de-base64-unreadable t]
 	      ["Rot 13" gnus-summary-caesar-message
@@ -2190,9 +2190,9 @@
 	      ["Unfold headers" gnus-article-treat-unfold-headers t]
 	      ["Fold newsgroups" gnus-article-treat-fold-newsgroups t]
 	      ["Html" gnus-article-wash-html t]
-	      ["URLs" gnus-article-unsplit-urls t]
+	      ["Unsplit URLs" gnus-article-unsplit-urls t]
 	      ["Verify X-PGP-Sig" gnus-article-verify-x-pgp-sig t]
-	      ["HZ" gnus-article-decode-HZ t]
+	      ["Decode HZ" gnus-article-decode-HZ t]
 	      ("(Outlook) Deuglify"
 	       ["Unwrap lines" gnus-article-outlook-unwrap-lines t]
 	       ["Repair attribution" gnus-article-outlook-repair-attribution t]
@@ -5043,9 +5043,9 @@
             (gnus-set-active group (cons (caar alist) (cdr active)))))
 
       (setq gnus-summary-use-undownloaded-faces
-            (not (gnus-agent-find-parameter
-                  group
-                  'agent-disable-undownloaded-faces))))
+	    (gnus-agent-find-parameter
+	     group
+	     'agent-enable-undownloaded-faces)))
 
     (setq gnus-newsgroup-name group
 	  gnus-newsgroup-unselected nil
Index: gnus/lisp/gnus.el
diff -u gnus/lisp/gnus.el:6.217 gnus/lisp/gnus.el:6.220
--- gnus/lisp/gnus.el:6.217	Fri Jan  2 23:02:04 2004
+++ gnus/lisp/gnus.el	Sat Jan  3 16:18:58 2004
@@ -1,7 +1,7 @@
 ;;; gnus.el --- a newsreader for GNU Emacs
 
 ;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, 1997,
-;; 1998, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+;; 1998, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 
 ;; Author: Masanobu UMEDA <[email protected]>
 ;;	Lars Magne Ingebrigtsen <[email protected]>
@@ -282,7 +282,7 @@
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "5.10.4"
+(defconst gnus-version-number "5.10.5"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Gnus v%s" gnus-version-number)
@@ -2330,6 +2330,24 @@
 	  '(repeat (cons :format "%v"
 			 (symbol :tag "Parameter")
 			 (sexp :tag "Value")))))
+
+(defcustom gnus-user-agent 'emacs-gnus-type
+  "Which information should be exposed in the User-Agent header.
+
+It can be one of the symbols `gnus' \(show only Gnus version\), `emacs-gnus'
+\(show only Emacs and Gnus versions\), `emacs-gnus-config' \(same as
+`emacs-gnus' plus system configuration\), `emacs-gnus-type' \(same as
+`emacs-gnus' plus system type\) or a custom string.  If you set it to a
+string, be sure to use a valid format, see RFC 2616."
+  :group 'gnus-message
+  :type '(choice
+	  (item :tag "Show Gnus and Emacs versions and system type"
+		emacs-gnus-type)
+	  (item :tag "Show Gnus and Emacs versions and system configuration"
+		emacs-gnus-config)
+	  (item :tag "Show Gnus and Emacs versions" emacs-gnus)
+	  (item :tag "Show only Gnus version" gnus)
+	  (string :tag "Other")))
 
 
 ;;; Internal variables
Index: gnus/lisp/mail-source.el
diff -u gnus/lisp/mail-source.el:6.48 gnus/lisp/mail-source.el:6.51
--- gnus/lisp/mail-source.el:6.48	Sat Jan  3 00:09:36 2004
+++ gnus/lisp/mail-source.el	Sun Jan  4 01:31:40 2004
@@ -1,5 +1,6 @@
 ;;; mail-source.el --- functions for fetching mail
-;; Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <[email protected]>
 ;; Keywords: news, mail
Index: gnus/lisp/message.el
diff -u gnus/lisp/message.el:6.390 gnus/lisp/message.el:6.392
--- gnus/lisp/message.el:6.390	Wed Dec 31 04:03:44 2003
+++ gnus/lisp/message.el	Sat Jan  3 16:18:58 2004
@@ -1,5 +1,5 @@
 ;;; message.el --- composing mail and news messages
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <[email protected]>
@@ -2673,17 +2673,23 @@
 		   (message-get-reply-headers t))))
     (message-carefully-insert-headers headers)))
 
-(defvar message-header-synonyms
+(defcustom message-header-synonyms
   '((To Cc Bcc))
   "List of lists of header synonyms.
 E.g., if this list contains a member list with elements `Cc' and `To',
 then `message-carefully-insert-headers' will not insert a `To' header
-when the message is already `Cc'ed to the recipient.")
+when the message is already `Cc'ed to the recipient."
+  :group 'message-headers
+  :link '(custom-manual "(message)Message Headers")
+  :type '(repeat sexp))
 
 (defun message-carefully-insert-headers (headers)
   "Insert the HEADERS, an alist, into the message buffer.
 Does not insert the headers when they are already present there
 or in the synonym headers, defined by `message-header-synonyms'."
+  ;; FIXME: Should compare only the address and not the full name.  Comparison
+  ;; should be done case-folded (and with `string=' rather than
+  ;; `string-match').
   (dolist (header headers)
     (let* ((header-name (symbol-name (car header)))
            (new-header (cdr header))
@@ -5584,7 +5590,13 @@
     ;; Find all relevant headers we need.
     (save-restriction
       (message-narrow-to-headers-or-head)
-      (setq to (message-fetch-field "to")
+      ;; Gmane renames "To".  Look at "Original-To", too, if it is present in
+      ;; message-header-synonyms.
+      (setq to (or (message-fetch-field "to")
+		   (and (loop for synonym in message-header-synonyms
+			      when (memq 'Original-To synonym)
+			      return t)
+			(message-fetch-field "original-to")))
 	    cc (message-fetch-field "cc")
 	    mct (message-fetch-field "mail-copies-to")
 	    author (or (message-fetch-field "mail-reply-to")
Index: gnus/lisp/mm-decode.el
diff -u gnus/lisp/mm-decode.el:6.103 gnus/lisp/mm-decode.el:6.104
--- gnus/lisp/mm-decode.el:6.103	Sun Dec 28 13:20:25 2003
+++ gnus/lisp/mm-decode.el	Sat Jan  3 20:27:43 2004
@@ -1,6 +1,6 @@
 ;;; mm-decode.el --- Functions for decoding MIME things
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002,
-;;        2003 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004
+;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <[email protected]>
 ;;	MORIOKA Tomohiko <[email protected]>
@@ -157,6 +157,18 @@
   :type 'boolean
   :group 'mime-display)
 
+(defcustom mm-enable-external t
+  "Indicate whether external MIME handlers should be used.
+
+If t, all defined external MIME handlers are used.  If nil, files are saved by
+`mailcap-save-binary-file'.  If it is the symbol `ask', you are prompted
+before the external MIME handler is invoked."
+  :version "21.4"
+  :type '(choice (const :tag "Always" t)
+		 (const :tag "Never" nil)
+		 (const :tag "Ask" ask))
+  :group 'mime-display)
+
 (defcustom mm-inline-media-tests
   '(("image/p?jpeg"
      mm-inline-image
@@ -633,7 +645,13 @@
     (if (mm-handle-displayed-p handle)
 	(mm-remove-part handle)
       (let* ((type (mm-handle-media-type handle))
-	     (method (mailcap-mime-info type)))
+	     (method (mailcap-mime-info type))
+	     (filename (or (mail-content-type-get
+			    (mm-handle-disposition handle) 'filename)
+			   (mail-content-type-get
+			    (mm-handle-type handle) 'name)
+			   "<file>"))
+	     (external mm-enable-external))
 	(if (and (mm-inlinable-p handle)
 		 (mm-inlined-p handle))
 	    (progn
@@ -648,8 +666,27 @@
 		  (forward-line 1)
 		  (mm-insert-inline handle (mm-get-part handle))
 		  'inline)
-	      (mm-display-external
-	       handle (or method 'mailcap-save-binary-file)))))))))
+	      (if (and method ;; If nil, we always use "save".
+		       (stringp method) ;; 'mailcap-save-binary-file
+		       (or (eq mm-enable-external t)
+			   (and (eq mm-enable-external 'ask)
+				(y-or-n-p
+				 (concat
+				  "Display part (" type
+				  ") using external program"
+				  ;; Can non-string method ever happen?
+				  (if (stringp method)
+				      (concat
+				       " \"" (format method filename) "\"")
+				    "")
+				  "? ")))))
+		  (setq external t)
+		(setq external nil))
+	      (if external
+		  (mm-display-external
+		   handle (or method 'mailcap-save-binary-file))
+		(mm-display-external
+		 handle 'mailcap-save-binary-file)))))))))
 
 (defun mm-display-external (handle method)
   "Display HANDLE using METHOD."
@@ -670,7 +707,8 @@
 	    (mm-set-buffer-file-coding-system mm-binary-coding-system)
 	    (insert-buffer-substring cur)
 	    (goto-char (point-min))
-	    (message "Viewing with %s" method)
+	    (when method
+	      (message "Viewing with %s" method))
 	    (let ((mm (current-buffer))
 		  (non-viewer (assq 'non-viewer
 				    (mailcap-mime-info
Index: gnus/lisp/spam-report.el
diff -u gnus/lisp/spam-report.el:6.7 gnus/lisp/spam-report.el:6.9
--- gnus/lisp/spam-report.el:6.7	Thu Dec  4 20:31:38 2003
+++ gnus/lisp/spam-report.el	Sat Jan  3 16:04:32 2004
@@ -1,5 +1,5 @@
 ;;; spam-report.el --- Reporting spam
-;; Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
 
 ;; Author: Teodor Zlatanov <[email protected]>
 ;; Keywords: network
@@ -39,14 +39,14 @@
 
 (defcustom spam-report-gmane-regex nil
   "Regexp matching Gmane newsgroups, e.g. \"^nntp\\+.*:gmane\\.\"
-If you are using spam.el, consider setting gnus-spam-process-newsgroups 
-or the gnus-group-spam-exit-processor-report-gmane group/topic parameter 
+If you are using spam.el, consider setting gnus-spam-process-newsgroups
+or the gnus-group-spam-exit-processor-report-gmane group/topic parameter
 instead."
   :type '(radio (const nil)
 		(regexp :format "%t: %v\n" :size 0 :value "^nntp\+.*:gmane\."))
   :group 'spam-report)
 
-(defcustom spam-report-gmane-spam-header 
+(defcustom spam-report-gmane-spam-header
   "^X-Report-Spam: http://\\([^/]+\\)\\(.*\\)$"
   "String matching Gmane spam-reporting header.  Two match groups are needed."
   :type 'regexp
@@ -61,9 +61,9 @@
   'spam-report-url-ping-plain
   "Function to use for url ping spam reporting."
   :type '(choice
-	  (const :tag "Connect directly" 
+	  (const :tag "Connect directly"
 		 spam-report-url-ping-plain)
-	  (const :tag "Use the external program specified in `mm-url-program'" 
+	  (const :tag "Use the external program specified in `mm-url-program'"
 		 spam-report-url-ping-mm-url))
   :group 'spam-report)
 
@@ -75,7 +75,7 @@
 		   (string-match spam-report-gmane-regex gnus-newsgroup-name)))
       (gnus-message 6 "Reporting spam article %d to spam.gmane.org..." article)
       (if spam-report-gmane-use-article-number
-	  (spam-report-url-ping "spam.gmane.org" 
+	  (spam-report-url-ping "spam.gmane.org"
 				(format "/%s:%d"
 					(gnus-group-real-name gnus-newsgroup-name)
 					article))
@@ -86,9 +86,9 @@
 	      (let* ((host (match-string 1))
 		     (report (match-string 2))
 		     (url (format "http://%s%s" host report)))
-		(gnus-message 10 "Reporting spam through URL %s..." url)
+		(gnus-message 7 "Reporting spam through URL %s..." url)
 		(spam-report-url-ping host report))
-	    (gnus-message 10 "Could not find X-Report-Spam in article %d..."
+	    (gnus-message 3 "Could not find X-Report-Spam in article %d..."
 			  article)))))))
 
 (defun spam-report-url-ping (host report)
@@ -101,7 +101,7 @@
   (let ((tcp-connection))
     (with-temp-buffer
       (or (setq tcp-connection
-		(open-network-stream 
+		(open-network-stream
 		 "URL ping"
 		 (buffer-name)
 		 host
Index: gnus/lisp/spam.el
diff -u gnus/lisp/spam.el:6.143 gnus/lisp/spam.el:6.146
--- gnus/lisp/spam.el:6.143	Fri Jan  2 17:00:42 2004
+++ gnus/lisp/spam.el	Sat Jan  3 16:18:58 2004
@@ -1,7 +1,5 @@
-;; TODO: spam scores, detection of spam in newsgroups, cross-server splitting, remote processing, training through files
-
 ;;; spam.el --- Identifying spam
-;; Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <[email protected]>
 ;; Keywords: network
@@ -34,6 +32,9 @@
 
 ;;; Several TODO items are marked as such
 
+;; TODO: spam scores, detection of spam in newsgroups, cross-server splitting,
+;; remote processing, training through files
+
 ;;; Code:
 
 (eval-when-compile (require 'cl))
@@ -42,7 +43,7 @@
 
 (require 'gnus-uu)			; because of key prefix issues
 ;;; for the definitions of group content classification and spam processors
-(require 'gnus)	
+(require 'gnus)
 (require 'message)		;for the message-fetch-field functions
 
 ;; for nnimap-split-download-body-default
@@ -101,13 +102,13 @@
   :group 'spam)
 
 (defcustom spam-split-symbolic-return nil
-  "Whether spam-split should work with symbols or group names."
+  "Whether `spam-split' should work with symbols or group names."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-split-symbolic-return-positive nil
-  "Whether spam-split should ALWAYS work with symbols or group
-  names.  Do not set this if you use spam-split in a fancy split
+  "Whether `spam-split' should ALWAYS work with symbols or group names.
+Do not set this if you use `spam-split' in a fancy split
   method."
   :type 'boolean
   :group 'spam)
@@ -118,27 +119,26 @@
   :group 'spam)
 
 (defcustom spam-mark-only-unseen-as-spam t
-  "Whether only unseen articles should be marked as spam in spam
-groups.  When nil, all unread articles in a spam group are marked as
+  "Whether only unseen articles should be marked as spam in spam groups.
+When nil, all unread articles in a spam group are marked as
 spam.  Set this if you want to leave an article unread in a spam group
 without losing it to the automatic spam-marking process."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-mark-ham-unread-before-move-from-spam-group nil
-  "Whether ham should be marked unread before it's moved out of a spam
-group according to ham-process-destination.  This variable is an
-official entry in the international Longest Variable Name
+  "Whether ham should be marked unread before it's moved.
+The article is moved out of a spam group according to ham-process-destination.
+This variable is an official entry in the international Longest Variable Name
 Competition."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-disable-spam-split-during-ham-respool nil
-  "Whether spam-split should be ignored while resplitting ham in
-a process destination.  This is useful to prevent ham from ending
-up in the same spam group after the resplit.  Don't set this to t
-if you have spam-split as the last rule in your split
-configuration."
+  "Whether `spam-split' should be ignored while resplitting ham in a process
+destination.  This is useful to prevent ham from ending up in the same spam
+group after the resplit.  Don't set this to t if you have spam-split as the
+last rule in your split configuration."
   :type 'boolean
   :group 'spam)
 
@@ -163,12 +163,12 @@
   :group 'spam)
 
 (defcustom spam-use-dig t
-  "Whether query-dig should be used instead of query-dns."
+  "Whether `query-dig' should be used instead of `query-dns'."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-use-blacklist nil
-  "Whether the blacklist should be used by spam-split."
+  "Whether the blacklist should be used by `spam-split'."
   :type 'boolean
   :group 'spam)
 
@@ -178,148 +178,148 @@
   :group 'spam)
 
 (defcustom spam-use-whitelist nil
-  "Whether the whitelist should be used by spam-split."
+  "Whether the whitelist should be used by `spam-split'."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-use-whitelist-exclusive nil
-  "Whether whitelist-exclusive should be used by spam-split.
+  "Whether whitelist-exclusive should be used by `spam-split'.
 Exclusive whitelisting means that all messages from senders not in the whitelist
 are considered spam."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-use-blackholes nil
-  "Whether blackholes should be used by spam-split."
+  "Whether blackholes should be used by `spam-split'."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-use-hashcash nil
-  "Whether hashcash payments should be detected by spam-split."
+  "Whether hashcash payments should be detected by `spam-split'."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-use-regex-headers nil
-  "Whether a header regular expression match should be used by spam-split.
+  "Whether a header regular expression match should be used by `spam-split'.
 Also see the variables `spam-regex-headers-spam' and `spam-regex-headers-ham'."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-use-regex-body nil
-  "Whether a body regular expression match should be used by spam-split.
+  "Whether a body regular expression match should be used by `spam-split'.
 Also see the variables `spam-regex-body-spam' and `spam-regex-body-ham'."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-use-bogofilter-headers nil
-  "Whether bogofilter headers should be used by spam-split.
+  "Whether bogofilter headers should be used by `spam-split'.
 Enable this if you pre-process messages with Bogofilter BEFORE Gnus sees them."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-use-bogofilter nil
-  "Whether bogofilter should be invoked by spam-split.
+  "Whether bogofilter should be invoked by `spam-split'.
 Enable this if you want Gnus to invoke Bogofilter on new messages."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-use-BBDB nil
-  "Whether BBDB should be used by spam-split."
+  "Whether BBDB should be used by `spam-split'."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-use-BBDB-exclusive nil
-  "Whether BBDB-exclusive should be used by spam-split.
-Exclusive BBDB means that all messages from senders not in the BBDB are 
+  "Whether BBDB-exclusive should be used by `spam-split'.
+Exclusive BBDB means that all messages from senders not in the BBDB are
 considered spam."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-use-ifile nil
-  "Whether ifile should be used by spam-split."
+  "Whether ifile should be used by `spam-split'."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-use-stat nil
-  "Whether spam-stat should be used by spam-split."
+  "Whether `spam-stat' should be used by `spam-split'."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-use-spamoracle nil
-  "Whether spamoracle should be used by spam-split."
+  "Whether spamoracle should be used by `spam-split'."
   :type 'boolean
   :group 'spam)
 
 (defcustom spam-install-hooks (or
 			       spam-use-dig
 			       spam-use-blacklist
-			       spam-use-whitelist 
-			       spam-use-whitelist-exclusive 
-			       spam-use-blackholes 
-			       spam-use-hashcash 
-			       spam-use-regex-headers 
-			       spam-use-regex-body 
-			       spam-use-bogofilter-headers 
-			       spam-use-bogofilter 
-			       spam-use-BBDB 
-			       spam-use-BBDB-exclusive 
-			       spam-use-ifile 
+			       spam-use-whitelist
+			       spam-use-whitelist-exclusive
+			       spam-use-blackholes
+			       spam-use-hashcash
+			       spam-use-regex-headers
+			       spam-use-regex-body
+			       spam-use-bogofilter-headers
+			       spam-use-bogofilter
+			       spam-use-BBDB
+			       spam-use-BBDB-exclusive
+			       spam-use-ifile
 			       spam-use-stat
 			       spam-use-spamoracle)
-  "Whether the spam hooks should be installed, default to t if one of
-the spam-use-* variables is set."
+  "Whether the spam hooks should be installed.
+Default to t if one of the spam-use-* variables is set."
   :group 'spam
   :type 'boolean)
 
 (defcustom spam-split-group "spam"
-  "Group name where incoming spam should be put by spam-split."
+  "Group name where incoming spam should be put by `spam-split'."
   :type 'string
   :group 'spam)
 
 ;;; TODO: deprecate this variable, it's confusing since it's a list of strings,
 ;;; not regular expressions
-(defcustom spam-junk-mailgroups (cons 
-				 spam-split-group 
+(defcustom spam-junk-mailgroups (cons
+				 spam-split-group
 				 '("mail.junk" "poste.pourriel"))
   "Mailgroups with spam contents.
 All unmarked article in such group receive the spam mark on group entry."
   :type '(repeat (string :tag "Group"))
   :group 'spam)
 
-(defcustom spam-blackhole-servers '("bl.spamcop.net" "relays.ordb.org" 
+(defcustom spam-blackhole-servers '("bl.spamcop.net" "relays.ordb.org"
 				    "dev.null.dk" "relays.visi.com")
   "List of blackhole servers."
   :type '(repeat (string :tag "Server"))
   :group 'spam)
 
 (defcustom spam-blackhole-good-server-regex nil
-  "String matching IP addresses that should not be checked in the blackholes"
+  "String matching IP addresses that should not be checked in the blackholes."
   :type '(radio (const nil)
 		(regexp :format "%t: %v\n" :size 0))
   :group 'spam)
 
 (defcustom spam-face 'gnus-splash-face
-  "Face for spam-marked articles"
+  "Face for spam-marked articles."
   :type 'face
   :group 'spam)
 
 (defcustom spam-regex-headers-spam '("^X-Spam-Flag: YES")
-  "Regular expression for positive header spam matches"
+  "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"
+  "Regular expression for positive header ham matches."
   :type '(repeat (regexp :tag "Regular expression to match ham header"))
   :group 'spam)
 
 (defcustom spam-regex-body-spam '()
-  "Regular expression for positive body spam matches"
+  "Regular expression for positive body spam matches."
   :type '(repeat (regexp :tag "Regular expression to match spam body"))
   :group 'spam)
 
 (defcustom spam-regex-body-ham '()
-  "Regular expression for positive body ham matches"
+  "Regular expression for positive body ham matches."
   :type '(repeat (regexp :tag "Regular expression to match ham body"))
   :group 'spam)
 
@@ -340,20 +340,20 @@
   :group 'spam-ifile)
 
 (defcustom spam-ifile-spam-category "spam"
-  "Name of the spam ifile category."  
+  "Name of the spam ifile category."
   :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."
+  "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
+Set this to t if you want to use the `spam-split' invocation of ifile as
 your main source of newsgroup names."
   :type 'boolean
   :group 'spam-ifile)
@@ -400,7 +400,7 @@
 
 (defcustom spam-bogofilter-database-directory nil
   "Directory path of the Bogofilter databases."
-  :type '(choice (directory 
+  :type '(choice (directory
 		  :tag "Location of the Bogofilter database directory")
 		 (const :tag "Use the default"))
   :group 'spam-bogofilter)
@@ -409,7 +409,7 @@
   "Spam spamoracle configuration."
   :group 'spam)
 
-(defcustom spam-spamoracle-database nil 
+(defcustom spam-spamoracle-database nil
   "Location of spamoracle database file. When nil, use the default
 spamoracle database."
   :type '(choice (directory :tag "Location of spamoracle database file.")
@@ -438,21 +438,22 @@
   "List of old spam articles, generated when a group is entered.")
 
 (defvar spam-split-disabled nil
-  "If non-nil, spam-split is disabled, and always returns nil.")
+  "If non-nil, `spam-split' is disabled, and always returns nil.")
 
 (defvar spam-split-last-successful-check nil
-  "spam-split will set this to nil or a spam-use-XYZ check if it
+  "`spam-split' will set this to nil or a spam-use-XYZ check if it
   finds ham or spam.")
 
 ;; convenience functions
-(defun spam-xor (a b) ; logical exclusive or
+(defun spam-xor (a b)
+  "Logical exclusive `or'."
   (and (or a b) (not (and a b))))
 
 (defun spam-group-ham-mark-p (group mark &optional spam)
   (when (stringp group)
     (let* ((marks (spam-group-ham-marks group spam))
-	   (marks (if (symbolp mark) 
-		      marks 
+	   (marks (if (symbolp mark)
+		      marks
 		    (mapcar 'symbol-value marks))))
       (memq mark marks))))
 
@@ -474,13 +475,13 @@
 (defun spam-group-spam-contents-p (group)
   (if (stringp group)
       (or (member group spam-junk-mailgroups)
-	  (memq 'gnus-group-spam-classification-spam 
+	  (memq 'gnus-group-spam-classification-spam
 		(gnus-parameter-spam-contents group)))
     nil))
-  
+
 (defun spam-group-ham-contents-p (group)
   (if (stringp group)
-      (memq 'gnus-group-spam-classification-ham 
+      (memq 'gnus-group-spam-classification-ham
 	    (gnus-parameter-spam-contents group))
     nil))
 
@@ -506,8 +507,8 @@
   (if (and (stringp group)
 	   (symbolp processor))
       (or (member processor (nth 0 (gnus-parameter-spam-process group)))
-	  (spam-group-processor-multiple-p 
-	   group 
+	  (spam-group-processor-multiple-p
+	   group
 	   (cdr-safe (assoc processor spam-list-of-processors))))
     nil))
 
@@ -566,9 +567,9 @@
 ;;; Summary entry and exit processing.
 
 (defun spam-summary-prepare ()
-  (setq spam-old-ham-articles 
+  (setq spam-old-ham-articles
 	(spam-list-articles gnus-newsgroup-articles 'ham))
-  (setq spam-old-spam-articles 
+  (setq spam-old-spam-articles
 	(spam-list-articles gnus-newsgroup-articles 'spam))
   (spam-mark-junk-as-spam-routine))
 
@@ -581,10 +582,10 @@
     ;; we have to iterate over the processors, or else we'll be too slow
     (dolist (classification '(spam ham))
       (let* ((old-articles (if (eq classification 'spam)
-			       spam-old-spam-articles 
+			       spam-old-spam-articles
 			     spam-old-ham-articles))
-	     (new-articles (spam-list-articles 
-			    gnus-newsgroup-articles 
+	     (new-articles (spam-list-articles
+			    gnus-newsgroup-articles
 			    classification))
 	     (changed-articles (gnus-set-difference old-articles new-articles)))
 	;; now that we have the changed articles, we go through the processors
@@ -595,14 +596,14 @@
 		unregister-list)
 	    (dolist (article changed-articles)
 	      (let ((id (spam-fetch-field-message-id-fast article)))
-		(when (spam-log-unregistration-needed-p 
+		(when (spam-log-unregistration-needed-p
 		       id 'process classification check)
 		  (push article unregister-list))))
 	    ;; call spam-register-routine with specific articles to unregister,
 	    ;; when there are articles to unregister and the check is enabled
 	    (when (and unregister-list (symbol-value check))
 	      (spam-register-routine classification check t unregister-list))))))
-      
+
     ;; find all the spam processors applicable to this group
     (dolist (processor-param spam-list-of-processors)
       (let ((processor (nth 0 processor-param))
@@ -612,13 +613,13 @@
 		   (spam-group-processor-p gnus-newsgroup-name processor))
 	  (spam-register-routine classification check))))
 
-    (if spam-move-spam-nonspam-groups-only      
+    (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 to %s" 
+      (gnus-message 5 "Marking spam as expired and moving it to %s"
 		    gnus-newsgroup-name)
-      (spam-mark-spam-as-expired-and-move-routine 
+      (spam-mark-spam-as-expired-and-move-routine
        (gnus-parameter-spam-process-destination gnus-newsgroup-name)))
 
     ;; now we redo spam-mark-spam-as-expired-and-move-routine to only
@@ -658,10 +659,10 @@
   ;; group parameters
   (when (spam-group-spam-contents-p gnus-newsgroup-name)
     (gnus-message 5 "Marking %s articles as spam"
-		  (if spam-mark-only-unseen-as-spam 
+		  (if spam-mark-only-unseen-as-spam
 		      "unseen"
 		    "unread"))
-    (let ((articles (if spam-mark-only-unseen-as-spam 
+    (let ((articles (if spam-mark-only-unseen-as-spam
 			gnus-newsgroup-unseen
 		      gnus-newsgroup-unreads)))
       (dolist (article articles)
@@ -680,7 +681,7 @@
 	(when (eq (gnus-summary-article-mark article) gnus-spam-mark)
 	  (gnus-summary-mark-article article gnus-expirable-mark)
 	  (push article tomove)))
-    
+
       ;; now do the actual copies
       (dolist (group groups)
 	(when (and tomove
@@ -690,11 +691,11 @@
 	  (when tomove
 	    (if (or (not backend-supports-deletions)
 		    (> (length groups) 1))
-		(progn 
+		(progn
 		  (gnus-summary-copy-article nil group)
 		  (setq deletep t))
 	      (gnus-summary-move-article nil group)))))
-    
+
       ;; now delete the articles, if there was a copy done, and the
       ;; backend allows it
       (when (and deletep backend-supports-deletions)
@@ -703,9 +704,9 @@
 	(when tomove
 	  (let ((gnus-novice-user nil))	; don't ask me if I'm sure
 	    (gnus-summary-delete-article nil))))
-    
+
       (gnus-summary-yank-process-mark))))
- 
+
 (defun spam-ham-copy-or-move-routine (copy groups)
   (gnus-summary-kill-process-mark)
   (let ((todo (spam-list-articles gnus-newsgroup-articles 'ham))
@@ -738,7 +739,7 @@
 		(gnus-summary-copy-article nil group)
 		(setq deletep t))
 	    (gnus-summary-move-article nil group))))) ; else move articles
-    
+
     ;; now delete the articles, unless a) copy is t, and there was a copy done
     ;;                                 b) a move was done to a single group
     ;;                                 c) backend-supports-deletions is nil
@@ -749,19 +750,19 @@
 	(when todo
 	  (let ((gnus-novice-user nil))	; don't ask me if I'm sure
 	    (gnus-summary-delete-article nil))))))
-  
+
   (gnus-summary-yank-process-mark))
- 
+
 (defun spam-ham-copy-routine (&rest groups)
   (if (and (car-safe groups) (listp (car-safe groups)))
       (apply 'spam-ham-copy-routine (car groups))
     (spam-ham-copy-or-move-routine t groups)))
- 
+
 (defun spam-ham-move-routine (&rest groups)
   (if (and (car-safe groups) (listp (car-safe groups)))
       (apply 'spam-ham-move-routine (car groups))
     (spam-ham-copy-or-move-routine nil groups)))
- 
+
 (eval-and-compile
   (defalias 'spam-point-at-eol (if (fboundp 'point-at-eol)
 				   'point-at-eol
@@ -789,9 +790,9 @@
 ;; (defun spam-get-article-as-filename (article)
 ;;   (let ((article-filename))
 ;;     (when (numberp article)
-;;       (nnml-possibly-change-directory 
+;;       (nnml-possibly-change-directory
 ;;        (gnus-group-real-name gnus-newsgroup-name))
-;;       (setq article-filename (expand-file-name 
+;;       (setq article-filename (expand-file-name
 ;;	  		        (int-to-string article) nnml-current-directory)))
 ;;     (if (file-exists-p article-filename)
 ;; 	article-filename
@@ -801,7 +802,7 @@
   "Fetch the `from' field quickly, using the internal gnus-data-list function"
   (if (and (numberp article)
 	   (assoc article (gnus-data-list nil)))
-      (mail-header-from 
+      (mail-header-from
        (gnus-data-header (assoc article (gnus-data-list nil))))
     nil))
 
@@ -810,7 +811,7 @@
   gnus-data-list function"
   (if (and (numberp article)
 	   (assoc article (gnus-data-list nil)))
-      (mail-header-subject 
+      (mail-header-subject
        (gnus-data-header (assoc article (gnus-data-list nil))))
     nil))
 
@@ -819,7 +820,7 @@
   gnus-data-list function"
   (if (and (numberp article)
 	   (assoc article (gnus-data-list nil)))
-      (mail-header-message-id 
+      (mail-header-message-id
        (gnus-data-header (assoc article (gnus-data-list nil))))
     nil))
 
@@ -853,10 +854,10 @@
 is the value of `spam-split-group', meaning that the message is
 definitely a spam.")
 
-(defvar spam-list-of-statistical-checks 
+(defvar spam-list-of-statistical-checks
   '(spam-use-ifile
-    spam-use-regex-body 
-    spam-use-stat 
+    spam-use-regex-body
+    spam-use-stat
     spam-use-bogofilter
     spam-use-spamoracle)
   "The spam-list-of-statistical-checks list contains all the mail
@@ -865,7 +866,7 @@
 ;;;TODO: modify to invoke self with each check if invoked without specifics
 (defun spam-split (&rest specific-checks)
   "Split this message into the `spam' group if it is spam.
-This function can be used as an entry in `nnmail-split-fancy',
+This function can be used as an entry in the variable `nnmail-split-fancy',
 for example like this: (: spam-split).  It can take checks as
 parameters.  A string as a parameter will set the
 spam-split-group to that string.
@@ -879,7 +880,7 @@
 	(when (stringp check)
 	  (setq spam-split-group-choice check)
 	  (setq specific-checks (delq check specific-checks))))
-      
+
       (let ((spam-split-group spam-split-group-choice))
 	(save-excursion
 	  (save-restriction
@@ -897,7 +898,7 @@
 		  (when (and (symbol-value (car pair))
 			     (or (null specific-checks)
 				 (memq (car pair) specific-checks)))
-		    (gnus-message 5 "spam-split: calling the %s function" 
+		    (gnus-message 5 "spam-split: calling the %s function"
 				  (symbol-name (cdr pair)))
 		    (setq decision (funcall (cdr pair)))
 		    ;; if we got a decision at all, save the current check
@@ -908,7 +909,7 @@
 		      (if spam-split-symbolic-return
 			  (setq decision spam-split-group)
 			(gnus-error
-			 5 
+			 5
 			 (format "spam-split got %s but %s is nil"
 				 (symbol-name decision)
 				 (symbol-name spam-split-symbolic-return))))))))
@@ -917,14 +918,14 @@
 		decision))))))))
 
 (defun spam-find-spam ()
-  "This function will detect spam in the current newsgroup using spam-split"
+  "This function will detect spam in the current newsgroup using spam-split."
   (interactive)
-  
+
   (let* ((group gnus-newsgroup-name)
 	 (autodetect (gnus-parameter-spam-autodetect group))
 	 (methods (gnus-parameter-spam-autodetect-methods group))
 	 (first-method (nth 0 methods)))
-  (when (and autodetect 
+  (when (and autodetect
 	     (not (equal first-method 'none)))
     (mapcar
      (lambda (article)
@@ -937,8 +938,8 @@
 		  (spam-split-symbolic-return-positive t)
 		  (split-return
 		   (with-temp-buffer
-		     (gnus-request-article-this-buffer 
-		      article 
+		     (gnus-request-article-this-buffer
+		      article
 		      group)
 		     (if (or (null first-method)
 			     (equal first-method 'default))
@@ -952,7 +953,7 @@
 		 (gnus-registry-add-group
 		  id group subject sender))
 
-	       (spam-log-processing-to-registry 
+	       (spam-log-processing-to-registry
 		id
 		'incoming
 		split-return
@@ -965,7 +966,7 @@
 (defvar spam-registration-functions
   ;; first the ham register, second the spam register function
   ;; third the ham unregister, fourth the spam unregister function
-  '((spam-use-blacklist  nil 
+  '((spam-use-blacklist  nil
 			 spam-blacklist-register-routine
 			 nil
 			 spam-blacklist-unregister-routine)
@@ -973,31 +974,31 @@
 			 nil
 			 spam-whitelist-unregister-routine
 			 nil)
-    (spam-use-BBDB	 spam-BBDB-register-routine 
+    (spam-use-BBDB	 spam-BBDB-register-routine
 			 nil
-			 spam-BBDB-unregister-routine 
+			 spam-BBDB-unregister-routine
 			 nil)
-    (spam-use-ifile	 spam-ifile-register-ham-routine 
+    (spam-use-ifile	 spam-ifile-register-ham-routine
 			 spam-ifile-register-spam-routine
-			 spam-ifile-unregister-ham-routine 
+			 spam-ifile-unregister-ham-routine
 			 spam-ifile-unregister-spam-routine)
-    (spam-use-spamoracle spam-spamoracle-learn-ham 
+    (spam-use-spamoracle spam-spamoracle-learn-ham
 			 spam-spamoracle-learn-spam
-			 spam-spamoracle-unlearn-ham 
+			 spam-spamoracle-unlearn-ham
 			 spam-spamoracle-unlearn-spam)
-    (spam-use-stat	 spam-stat-register-ham-routine 
+    (spam-use-stat	 spam-stat-register-ham-routine
 			 spam-stat-register-spam-routine
-			 spam-stat-unregister-ham-routine 
+			 spam-stat-unregister-ham-routine
 			 spam-stat-unregister-spam-routine)
     ;; note that spam-use-gmane is not a legitimate check
-    (spam-use-gmane      nil 
+    (spam-use-gmane      nil
 			 spam-report-gmane-register-routine
 			 ;; does Gmane support unregistration?
 			 nil
 			 nil)
-    (spam-use-bogofilter spam-bogofilter-register-ham-routine 
+    (spam-use-bogofilter spam-bogofilter-register-ham-routine
 			 spam-bogofilter-register-spam-routine
-			 spam-bogofilter-unregister-ham-routine 
+			 spam-bogofilter-unregister-ham-routine
 			 spam-bogofilter-unregister-spam-routine))
   "The spam-registration-functions list contains pairs
 associating a parameter variable with the ham and spam
@@ -1031,8 +1032,8 @@
       (nth 2 flist))))
 
 (defun spam-list-articles (articles classification)
-  (let ((mark-check (if (eq classification 'spam) 
-			'spam-group-spam-mark-p 
+  (let ((mark-check (if (eq classification 'spam)
+			'spam-group-spam-mark-p
 		      'spam-group-ham-mark-p))
 	list mark-cache-yes mark-cache-no)
     (dolist (article articles)
@@ -1042,7 +1043,7 @@
 	      (push article list)
 	    ;; else, we have to actually check the mark
 	    (if (funcall mark-check
-			 gnus-newsgroup-name 
+			 gnus-newsgroup-name
 			 mark)
 		(progn
 		  (push article list)
@@ -1050,9 +1051,9 @@
 	      (push mark mark-cache-no))))))
     list))
 
-(defun spam-register-routine (classification 
-			      check 
-			      &optional unregister 
+(defun spam-register-routine (classification
+			      check
+			      &optional unregister
 			      specific-articles)
   (when (and (spam-classification-valid-p classification)
 	     (spam-registration-check-valid-p check))
@@ -1060,8 +1061,8 @@
 	    (spam-registration-function classification check))
 	   (unregister-function
 	    (spam-unregistration-function classification check))
-	   (run-function (if unregister 
-			     unregister-function 
+	   (run-function (if unregister
+			     unregister-function
 			   register-function))
 	   (log-function (if unregister
 			     'spam-log-undo-registration
@@ -1071,8 +1072,8 @@
       (when run-function
 	;; make list of articles, using specific-articles if given
 	(setq articles (or specific-articles
-			   (spam-list-articles 
-			    gnus-newsgroup-articles 
+			   (spam-list-articles
+			    gnus-newsgroup-articles
 			    classification)))
 	;; process them
 	(gnus-message 5 "%s %d %s articles with classification %s, check %s"
@@ -1116,7 +1117,7 @@
     (if (and (stringp id)
 	     (spam-process-type-valid-p type))
 	(cdr-safe (gnus-registry-fetch-extra id type))
-      (progn 
+      (progn
 	(gnus-message 5 (format "%s called with bad ID, type, classification, or check"
 				"spam-log-registered-p"))
 	nil))))
@@ -1136,7 +1137,7 @@
 			 (eq check (nth 1 cell)))
 		(setq found t))))
 	  found)
-      (progn 
+      (progn
 	(gnus-message 5 (format "%s called with bad ID, type, classification, or check"
 				"spam-log-unregistration-needed-p"))
 	nil))))
@@ -1160,12 +1161,12 @@
 	   id
 	   type
 	   new-cell-list))
-      (progn 
+      (progn
 	(gnus-message 5 (format "%s called with bad ID, type, check, or group"
 				"spam-log-undo-registration"))
 	nil))))
 
-;;; set up IMAP widening if it's necessary  
+;;; set up IMAP widening if it's necessary
 (defun spam-setup-widening ()
   (dolist (check spam-list-of-statistical-checks)
     (when (symbol-value check)
@@ -1185,7 +1186,7 @@
 (defun spam-check-regex-headers (&optional body)
   (let ((type (if body "body" "header"))
 	(spam-split-group (if spam-split-symbolic-return
-			      'spam 
+			      'spam
 			    spam-split-group))
 	ret found)
     (dolist (h-regex spam-regex-headers-ham)
@@ -1216,7 +1217,7 @@
   "Check the Received headers for blackholed relays."
   (let ((headers (nnmail-fetch-field "received"))
 	(spam-split-group (if spam-split-symbolic-return
-			      'spam 
+			      'spam
 			    spam-split-group))
 	ips matches)
     (when headers
@@ -1233,7 +1234,7 @@
 	(dolist (ip ips)
 	  (unless (and spam-blackhole-good-server-regex
 		       ;; match the good-server-regex against the reversed (again) IP string
-		       (string-match 
+		       (string-match
 			spam-blackhole-good-server-regex
 			(spam-reverse-ip-string ip)))
 	    (unless matches
@@ -1241,7 +1242,7 @@
 		(if spam-use-dig
 		    (let ((query-result (query-dig query-string)))
 		      (when query-result
-			(gnus-message 5 "(DIG): positive blackhole check '%s'" 
+			(gnus-message 5 "(DIG): positive blackhole check '%s'"
 				      query-result)
 			(push (list ip server query-result)
 			      matches)))
@@ -1258,7 +1259,7 @@
 (condition-case nil
     (progn
       (require 'hashcash)
-      
+
       (defun spam-check-hashcash ()
 	"Check the headers for hashcash payments."
 	(mail-check-payment)))	 ;mail-check-payment returns a boolean
@@ -1267,7 +1268,7 @@
 		(defalias 'mail-check-payment 'ignore)
 		(defalias 'spam-check-hashcash 'ignore))))
 
-;;;; BBDB 
+;;;; BBDB
 
 ;;; original idea for spam-check-BBDB from Alexander Kotelnikov
 ;;; <[email protected]>
@@ -1278,29 +1279,29 @@
     (progn
       (require 'bbdb)
       (require 'bbdb-com)
-      
+
       (defun spam-enter-ham-BBDB (addresses &optional remove)
 	"Enter an address into the BBDB; implies ham (non-spam) sender"
 	(dolist (from addresses)
 	  (when (stringp from)
 	    (let* ((parsed-address (gnus-extract-address-components from))
 		   (name (or (nth 0 parsed-address) "Ham Sender"))
-		   (remove-function (if remove 
+		   (remove-function (if remove
 					'bbdb-delete-record-internal
 				      'ignore))
 		   (net-address (nth 1 parsed-address))
-		   (record (and net-address 
+		   (record (and net-address
 				(bbdb-search-simple nil net-address))))
 	      (when net-address
-		(gnus-message 5 "%s address %s %s BBDB" 
-			      (if remove "Deleting" "Adding") 
+		(gnus-message 5 "%s address %s %s BBDB"
+			      (if remove "Deleting" "Adding")
 			      from
 			      (if remove "from" "to"))
 		(if record
 		    (funcall remove-function record)
-		  (bbdb-create-internal name nil net-address nil nil 
+		  (bbdb-create-internal name nil net-address nil nil
 					"ham sender added by spam.el")))))))
-      
+
       (defun spam-BBDB-register-routine (articles &optional unregister)
 	(let (addresses)
 	  (dolist (article articles)
@@ -1316,12 +1317,12 @@
 	"Mail from people in the BBDB is classified as ham or non-spam"
 	(let ((who (nnmail-fetch-field "from"))
 	      (spam-split-group (if spam-split-symbolic-return
-				    'spam 
+				    'spam
 				  spam-split-group)))
 	  (when who
 	    (setq who (nth 1 (gnus-extract-address-components who)))
 	    (if (bbdb-search-simple nil who)
-		t 
+		t
 	      (if spam-use-BBDB-exclusive
 		  spam-split-group
 		nil))))))
@@ -1347,12 +1348,12 @@
   (if spam-ifile-database-path
       (format "--db-file=%s" spam-ifile-database-path)
     nil))
-    
+
 (defun spam-check-ifile ()
-  "Check the ifile backend for the classification of this message"
-  (let ((article-buffer-name (buffer-name)) 
+  "Check the ifile backend for the classification of this message."
+  (let ((article-buffer-name (buffer-name))
 	(spam-split-group (if spam-split-symbolic-return
-			      'spam 
+			      'spam
 			    spam-split-group))
 	category return)
     (with-temp-buffer
@@ -1390,7 +1391,7 @@
 	    (insert article-string))))
       (apply 'call-process-region
 	     (point-min) (point-max) spam-ifile-path
-	     nil nil nil 
+	     nil nil nil
 	     add-or-delete-option category
 	     (if db `(,db "-h") `("-h"))))))
 
@@ -1413,11 +1414,11 @@
     (progn
       (let ((spam-stat-install-hooks nil))
 	(require 'spam-stat))
-      
+
       (defun spam-check-stat ()
 	"Check the spam-stat backend for the classification of this message"
 	(let ((spam-split-group (if spam-split-symbolic-return
-				    'spam 
+				    'spam
 				  spam-split-group))
 	      (spam-stat-split-fancy-spam-group spam-split-group) ; override
 	      (spam-stat-buffer (buffer-name)) ; stat the current buffer
@@ -1450,7 +1451,7 @@
 
       (defun spam-maybe-spam-stat-load ()
 	(when spam-use-stat (spam-stat-load)))
-      
+
       (defun spam-maybe-spam-stat-save ()
 	(when spam-use-stat (spam-stat-save))))
 
@@ -1484,16 +1485,16 @@
 
 ;;; address can be a list, too
 (defun spam-enter-whitelist (address &optional remove)
-  "Enter ADDRESS (list or single) into the whitelist.  With a
-  non-nil REMOVE, remove them."
+  "Enter ADDRESS (list or single) into the whitelist.
+With a non-nil REMOVE, remove them."
   (interactive "sAddress: ")
   (spam-enter-list address spam-whitelist remove)
   (setq spam-whitelist-cache nil))
 
 ;;; address can be a list, too
 (defun spam-enter-blacklist (address &optional remove)
-  "Enter ADDRESS (list or single) into the blacklist.  With a
-  non-nil REMOVE, remove them."
+  "Enter ADDRESS (list or single) into the blacklist.
+With a non-nil REMOVE, remove them."
   (interactive "sAddress: ")
   (spam-enter-list address spam-blacklist remove)
   (setq spam-blacklist-cache nil))
@@ -1530,11 +1531,11 @@
 (defun spam-check-whitelist ()
   ;; FIXME!  Should it detect when file timestamps change?
   (let ((spam-split-group (if spam-split-symbolic-return
-			      'spam 
+			      'spam
 			    spam-split-group)))
     (unless spam-whitelist-cache
       (setq spam-whitelist-cache (spam-parse-list spam-whitelist)))
-    (if (spam-from-listed-p spam-whitelist-cache) 
+    (if (spam-from-listed-p spam-whitelist-cache)
 	t
       (if spam-use-whitelist-exclusive
 	  spam-split-group
@@ -1543,7 +1544,7 @@
 (defun spam-check-blacklist ()
   ;; FIXME!  Should it detect when file timestamps change?
   (let ((spam-split-group (if spam-split-symbolic-return
-			      'spam 
+			      'spam
 			    spam-split-group)))
     (unless spam-blacklist-cache
       (setq spam-blacklist-cache (spam-parse-list spam-blacklist)))
@@ -1581,7 +1582,7 @@
 (defun spam-filelist-register-routine (articles blacklist &optional unregister)
   (let ((de-symbol (if blacklist 'spam-use-whitelist 'spam-use-blacklist))
 	(declassification (if blacklist 'ham 'spam))
-	(enter-function 
+	(enter-function
 	 (if blacklist 'spam-enter-blacklist 'spam-enter-whitelist))
 	(remove-function
 	 (if blacklist 'spam-enter-whitelist 'spam-enter-blacklist))
@@ -1598,7 +1599,7 @@
 	      (setq sender-ignored t)))
 	  ;; remember the messages we need to unregister, unless remove is set
 	  (when (and
-		 (null unregister) 
+		 (null unregister)
 		 (spam-log-unregistration-needed-p
 		  id 'process declassification de-symbol))
 	    (push from unregister-list))
@@ -1640,7 +1641,7 @@
 (defun spam-check-bogofilter-headers (&optional score)
   (let ((header (nnmail-fetch-field spam-bogofilter-header))
 	(spam-split-group (if spam-split-symbolic-return
-			      'spam 
+			      'spam
 			    spam-split-group)))
     (when header			; return nil when no header
       (if score				; scoring mode
@@ -1675,37 +1676,37 @@
 	(save-excursion
 	  (set-buffer article-buffer-name)
 	  (apply 'call-process-region
-		 (point-min) (point-max) 
+		 (point-min) (point-max)
 		 spam-bogofilter-path
 		 nil temp-buffer-name nil
 		 (if db `("-d" ,db "-v") `("-v"))))
 	(setq return (spam-check-bogofilter-headers score))))
     return))
 
-(defun spam-bogofilter-register-with-bogofilter (articles 
-						 spam 
+(defun spam-bogofilter-register-with-bogofilter (articles
+						 spam
 						 &optional unregister)
   "Register an article, given as a string, as spam or non-spam."
   (dolist (article articles)
     (let ((article-string (spam-get-article-as-string article))
 	  (db spam-bogofilter-database-directory)
 	  (switch (if unregister
-		      (if spam 
+		      (if spam
 			  spam-bogofilter-spam-strong-switch
 			spam-bogofilter-ham-strong-switch)
-		    (if spam 
-			spam-bogofilter-spam-switch 
+		    (if spam
+			spam-bogofilter-spam-switch
 		      spam-bogofilter-ham-switch))))
       (when (stringp article-string)
 	(with-temp-buffer
 	  (insert article-string)
 
 	  (apply 'call-process-region
-		 (point-min) (point-max) 
+		 (point-min) (point-max)
 		 spam-bogofilter-path
 		 nil nil nil switch
 		 (if db `("-d" ,db "-v") `("-v"))))))))
-  
+
 (defun spam-bogofilter-register-spam-routine (articles &optional unregister)
   (spam-bogofilter-register-with-bogofilter articles t unregister))
 
@@ -1725,16 +1726,16 @@
   "Run spamoracle on an article to determine whether it's spam."
   (let ((article-buffer-name (buffer-name))
 	(spam-split-group (if spam-split-symbolic-return
-			      'spam 
+			      'spam
 			    spam-split-group)))
     (with-temp-buffer
       (let ((temp-buffer-name (buffer-name)))
 	(save-excursion
 	  (set-buffer article-buffer-name)
-	  (let ((status 
-		 (apply 'call-process-region 
+	  (let ((status
+		 (apply 'call-process-region
 			(point-min) (point-max)
-			spam-spamoracle-binary 
+			spam-spamoracle-binary
 			nil temp-buffer-name nil
 			(if spam-spamoracle-database
 			    `("-f" ,spam-spamoracle-database "mark")
@@ -1756,15 +1757,15 @@
 	(dolist (article articles)
 	  (insert (spam-get-article-as-string article)))
 	(let* ((arg (if (spam-xor unregister article-is-spam-p)
-			"-spam" 
+			"-spam"
 		      "-good"))
-	       (status 
+	       (status
 		(apply 'call-process-region
 		       (point-min) (point-max)
 		       spam-spamoracle-binary
 		       nil temp-buffer-name nil
 		       (if spam-spamoracle-database
-			   `("-f" ,spam-spamoracle-database 
+			   `("-f" ,spam-spamoracle-database
 			     "add" ,arg)
 			 `("add" ,arg)))))
 	  (when (not (eq 0 status))
@@ -1819,3 +1820,7 @@
 (provide 'spam)
 
 ;;; spam.el ends here.
+
+(provide 'spam)
+
+;;; spam.el ends here
Index: gnus/texi/ChangeLog
diff -u gnus/texi/ChangeLog:6.635 gnus/texi/ChangeLog:6.641
--- gnus/texi/ChangeLog:6.635	Fri Jan  2 21:47:04 2004
+++ gnus/texi/ChangeLog	Sat Jan  3 20:28:51 2004
@@ -1,3 +1,23 @@
+2004-01-03  Reiner Steib  <[email protected]>
+
+	* emacs-mime.texi (Display Customization): Add mm-enable-external.
+
+2004-01-03  Lars Magne Ingebrigtsen  <[email protected]>
+
+	* gnus.texi (Category Syntax):
+	gnus-agent-cat-enable-undownloaded-faces.
+
+2004-01-03  Reiner Steib  <[email protected]>
+
+	* message.texi, gnus.texi, gnus-faq.texi: Update copyright.
+
+	* gnus-faq.texi ([5.12]): Fix code example for FQDN in Message-Ids.
+
+	* message.texi (Message Headers): Add message-header-synonyms.
+
+	* gnus.texi (Other modes): New node.
+	(Oort Gnus): Refer to the above in "Dired integration".
+
 2004-01-02  Teodor Zlatanov  <[email protected]>
 
 	* gnus.texi (Top): updated menu with new manual nodes
Index: gnus/texi/emacs-mime.texi
diff -u gnus/texi/emacs-mime.texi:6.52 gnus/texi/emacs-mime.texi:6.53
--- gnus/texi/emacs-mime.texi:6.52	Mon Dec  8 03:25:22 2003
+++ gnus/texi/emacs-mime.texi	Sat Jan  3 20:28:51 2004
@@ -407,6 +407,22 @@
 @vindex mm-external-terminal-program
 The program used to start an external terminal.
 
+@item mm-enable-external
+@vindex mm-enable-external
+Indicate whether external MIME handlers should be used.
+
+If @code{t}, all defined external MIME handlers are used.  If
+@code{nil}, files are saved to disk (@code{mailcap-save-binary-file}).
+If it is the symbol @code{ask}, you are prompted before the external
+@acronym{MIME} handler is invoked.
+
+When you launch an attachment through mailcap (@pxref{mailcap}) an
+attempt is made to use a safe viewer with the safest options--this isn't
+the case if you save it to disk and launch it in a different way
+(command line or double-clicking).  Anyhow, if you want to be sure not
+to launch any external programs, set this variable to @code{nil} or
+@code{ask}.
+
 @end table
 
 @node Files and Directories
Index: gnus/texi/gnus-faq.texi
diff -u gnus/texi/gnus-faq.texi:6.17 gnus/texi/gnus-faq.texi:6.19
--- gnus/texi/gnus-faq.texi:6.17	Mon Sep 22 19:29:42 2003
+++ gnus/texi/gnus-faq.texi	Sat Jan  3 16:18:57 2004
@@ -1,6 +1,6 @@
 @c Insert  "\input texinfo" at 1st line before texing this file alone.
 @c -*-texinfo-*-
-@c Copyright (C) 1995, 2001, 2003 Free Software Foundation, Inc.
+@c Copyright (C) 1995, 2001, 2003, 2004 Free Software Foundation, Inc.
 @setfilename gnus-faq.info
 
 @c Frequently Asked Questions, FAQ - Introduction, Emacs for Heathens, Top
@@ -1845,17 +1845,25 @@
  name to put after the "@@". If the name of the machine
  where Gnus is running isn't suitable (it probably isn't
  at most private machines) you can tell Gnus what to use
- by saying:
- 
-
+ by saying
 @example
-(defun message-make-message-id()
-   (concat "<"(message-unique-id)"@@yourmachine.yourdomain.tld>"))
+(setq message-user-fqdn "yourmachine.yourdomain.tld")
 @end example
- 
-
 @noindent
- in ~/.gnus. If you have no idea what to insert for
+ in ~/.gnus.  If you use Gnus 5.9 or ealier, you can use this
+instead:
+@example
+(eval-after-load "message"
+  '(let (myfqdn "yourmachine.yourdomain.tld");; <-- Edit this!
+     (if (boundp 'message-user-fqdn)
+         (setq message-user-fqdn fqdn)
+       (gnus-message 1 "Redefining `message-make-fqdn'.")
+       (defun message-make-fqdn ()
+         "Return user's fully qualified domain name."
+         fqdn))))
+@end example
+
+ If you have no idea what to insert for
  "yourmachine.yourdomain.tld", you've got several
  choices. You can either ask your provider if he allows
  you to use something like
Index: gnus/texi/gnus.texi
diff -u gnus/texi/gnus.texi:6.596 gnus/texi/gnus.texi:6.600
--- gnus/texi/gnus.texi:6.596	Sat Jan  3 00:09:36 2004
+++ gnus/texi/gnus.texi	Sun Jan  4 01:31:40 2004
@@ -33,7 +33,7 @@
 \makeindex
 \begin{document}
 
-\newcommand{\gnusversionname}{Gnus v5.10.4}
+\newcommand{\gnusversionname}{Gnus v5.10.5}
 \newcommand{\gnuschaptername}{}
 \newcommand{\gnussectionname}{}
 
@@ -301,7 +301,7 @@
 \thispagestyle{empty}
 
 Copyright \copyright{} 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003
+2002, 2003, 2004
 Free Software Foundation, Inc.
 
 
@@ -397,7 +397,7 @@
 spool or your mbox file.  All at the same time, if you want to push your
 luck.
 
-This manual corresponds to Gnus v5.10.4.
+This manual corresponds to Gnus v5.10.5.
 
 @end ifinfo
 
@@ -839,6 +839,7 @@
 * Image Enhancements::          Modern versions of Emacs/XEmacs can display images.
 * Fuzzy Matching::              What's the big fuzz?
 * Thwarting Email Spam::        A how-to on avoiding unsolicited commercial email.
+* Other modes::                 Interaction with other modes.
 * Various Various::             Things that are really various.
 
 Formatting Variables
@@ -17628,11 +17629,17 @@
 @item gnus-agent-cat-length-when-long
 an integer that overrides the value of @code{gnus-agent-long-article}.
 
-@item gnus-agent-cat-disable-undownloaded-faces
-a symbol indicating whether the summary buffer should @emph{not} display
+@c @item gnus-agent-cat-disable-undownloaded-faces
+@c a symbol indicating whether the summary buffer should @emph{not} display
+@c undownloaded articles using the gnus-summary-*-undownloaded-face
+@c faces.  The symbol nil will enable the use of undownloaded faces while
+@c all other symbols disable them.
+
+@item gnus-agent-cat-enable-undownloaded-faces
+a symbol indicating whether the summary buffer should display
 undownloaded articles using the gnus-summary-*-undownloaded-face
-faces.  The symbol nil will enable the use of undownloaded faces while
-all other symbols disable them.
+faces.  The symbol nil will disable the use of undownloaded faces while
+all other symbols enable them.
 @end table
 
 The name of a category can not be changed once the category has been
@@ -20494,6 +20501,7 @@
 * Image Enhancements::          Modern versions of Emacs/XEmacs can display images.
 * Fuzzy Matching::              What's the big fuzz?
 * Thwarting Email Spam::        A how-to on avoiding unsolicited commercial email.
+* Other modes::                 Interaction with other modes.
 * Various Various::             Things that are really various.
 @end menu
 
@@ -23876,6 +23884,36 @@
 Save table: (spam-stat-save)
 @end smallexample
 
+@node Other modes
+@section Interaction with other modes
+
+@subsection Dired
+@cindex dired
+
+@code{gnus-dired-minor-mode} provided some useful functions for dired
+buffers.  It is enabled with
+@lisp
+(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
+@end lisp
+
+@table @kbd
+@item C-c C-m C-a
+@findex gnus-dired-attach
+Send dired's marked files as an attachment (@code{gnus-dired-attach}).
+You will be prompted for a message buffer.
+
+@item C-c C-m C-l
+@findex gnus-dired-find-file-mailcap
+Visit a file according to the appropriate mailcap entry
+(@code{gnus-dired-find-file-mailcap}).  With prefix, open file in a new
+buffer.
+
+@item C-c C-m C-p
+@findex gnus-dired-print
+Print file according to the mailcap entry (@code{gnus-dired-print}).  If
+there is no print command, print in a PostScript image.
+@end table
+
 @node Various Various
 @section Various Various
 @cindex mode lines
@@ -25479,13 +25517,10 @@
 @item
 Dired integration
 
-@code{gnus-dired-minor-mode} installs key bindings in dired buffers to send
-a file as an attachment (@kbd{C-c C-a}), open a file using the appropriate
-mailcap entry (@kbd{C-c C-l}), and print a file using the mailcap entry
-(@kbd{C-c P}).  It is enabled with
-@lisp
-(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
-@end lisp
+@code{gnus-dired-minor-mode} (see @ref{Other modes}) installs key
+bindings in dired buffers to send a file as an attachment, open a file
+using the appropriate mailcap entry, and print a file using the mailcap
+entry.
 
 @item
 Gnus can display RSS newsfeeds as a newsgroup.  @xref{RSS}.
@@ -26464,7 +26499,7 @@
 
 @item
 Try doing an @kbd{M-x gnus-version}.  If you get something that looks
-like @samp{Gnus v5.10.4} you have the right files loaded.  Otherwise
+like @samp{Gnus v5.10.5} you have the right files loaded.  Otherwise
 you have some old @file{.el} files lying around.  Delete these.
 
 @item
Index: gnus/texi/message.texi
diff -u gnus/texi/message.texi:6.95 gnus/texi/message.texi:6.98
--- gnus/texi/message.texi:6.95	Sat Jan  3 00:09:37 2004
+++ gnus/texi/message.texi	Sun Jan  4 01:31:41 2004
@@ -18,7 +18,7 @@
 
 This file documents Message, the Emacs message composition mode.
 
-Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 
+Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 
 Free Software Foundation, Inc.
 
 Permission is granted to copy, distribute and/or modify this document
@@ -88,7 +88,7 @@
 * Key Index::         List of Message mode keys.
 @end menu
 
-This manual corresponds to Message v5.10.4.  Message is distributed
+This manual corresponds to Message v5.10.5.  Message is distributed
 with the Gnus distribution bearing the same version number as this
 manual.
 
@@ -1415,6 +1415,13 @@
 (setq message-hidden-headers
       '(not "From" "Subject" "To" "Cc" "Newsgroups"))
 @end lisp
+
+@item message-header-synonyms
+@vindex message-header-synonyms
+A list of lists of header synonyms.  E.g., if this list contains a
+member list with elements @code{Cc} and @code{To}, then
+@code{message-carefully-insert-headers} will not insert a @code{To}
+header when the message is already @code{Cc}ed to the recipient.
 
 @end table