*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 01:51:18 +0000 (01:51 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 01:51:18 +0000 (01:51 +0000)
13 files changed:
lisp/ChangeLog
lisp/gnus-uu.el
lisp/gnus-visual.el
lisp/gnus.el
lisp/nnbabyl.el
lisp/nnfolder.el
lisp/nnheader.el
lisp/nnmbox.el
lisp/nnmh.el
lisp/nnml.el
lisp/nnspool.el
lisp/nntp.el
texi/gnus.texi

index ff7e238..8ccf144 100644 (file)
@@ -1,9 +1,74 @@
+Wed Apr 19 03:28:37 1995  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+
+       * gnus.el: Major changes in server handling; new mode; and lots of
+       stuff all over in all files. 
+
+       * gnus.el: 0.51 is released.
+
+Mon Apr 17 08:38:57 1995  Lars Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus.el (gnus-clear-system): Kill nntp-server-buffer upon exit. 
+       
+       * gnus.el: Added "*" to the beginning of the docs strings of all
+       user variables.
+
+Sun Apr 16 03:18:15 1995  Lars Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus.el (gnus-post-news): Yank before running
+       news-reply-header-hook. 
+       (gnus-group-list-groups): Go to the right group after listing. 
+       (gnus-summary-respool-article): Allow respooling from newsgroups. 
+       (gnus-split-methods): New variable.
+       (gnus-read-save-file-name): New function.
+       (gnus-summary-save-in-rmail): Have all the saving functions use
+       this new function.
+
+       * gnus-visual.el (gnus-summary-make-menu-bar): Menu change.
+
+       * gnus.el (gnus-cancel-news): Don't ask experts.
+       (gnus-summary-mark-region-as-read): New command and keystroke. 
+
+Sun Apr 16 20:45:38 1995  Lars Magne Ingebrigtsen  <larsi@maud.ifi.uio.no>
+
+       * gnus.el (gnus-save-newsrc-file): Run save-newsrc-hook even if
+       the file is not saved.
+       (gnus-summary-insert-pseudos): Would interleave pseudos and real
+       articles. 
+       (gnus-cancel-news): Generate a better error message.
+
+       * nnmh.el (nnmh-request-list): Do not try to read unreadable
+       directories. 
+
+       * gnus.el (gnus-copy-sequence): Would choke on just a single cons
+       cell. 
+       (gnus-inews-article): Would insert two \n's too many.
+
+Sat Apr 15 04:29:22 1995  Lars Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus.el (gnus-use-long-file-name): One quote symbol too many. 
+       (gnus-article-x-face-command): New variable.
+       (gnus-article-display-x-face): New command and keystroke.
+       (gnus-newsgroup-active): New internal variable.
+       (gnus-update-read-articles): Use this variable to ensure that new
+       articles that have arrived while the summary buffer existed are
+       not inadvertantly marked as read.
+       (gnus-score-headers): Remove exluded score files from the list of
+       score file alists. Probably.
+
+       * nntp.el (nntp-news-default-headers): New variable.
+       (nntp-request-post-buffer): Use it.
+
+       * gnus.el (gnus-inews-insert-headers): Extended syntax of
+       gnus-required-headers. 
+
 Sun Apr 16 00:02:02 1995  Lars Magne Ingebrigtsen  <larsi@holmenkollen.ifi.uio.no>
 
        * gnus.el (gnus-summary-update-line): Don't mark ancient and read
        articles as low-scored.
        (gnus-inews-article): Would insert headers one line too early. 
 
+       * gnus.el: 0.50 is released.
+
 Sat Apr 15 22:16:26 1995  Lars Magne Ingebrigtsen  <larsi@holmenkollen.ifi.uio.no>
 
        * gnus.el (gnus-score-headers): Changed to allow score alists
index c02aaeb..deaf2c3 100644 (file)
@@ -47,8 +47,7 @@
     ("\\.\\(flc\\|fli\\|rle\\|iff\\|pfx\\|avi\\|sme\\|rpza\\|dl\\|qt\\|rsrc\\|mov\\)$" "xanim")
     ("\\.\\(tar\\|arj\\|zip\\|zoo\\|arc\\|gz\\|Z\\|lzh\\|ar\\|lha\\)$" 
      "gnus-uu-archive"))
-
-  "Default actions to be taken when the user asks to view a file.  
+  "*Default actions to be taken when the user asks to view a file.  
 To change the behaviour, you can either edit this variable or set
 `gnus-uu-user-view-rules' to something useful.
 
@@ -78,13 +77,13 @@ match here, it uses `gnus-uu-user-view-rules-end' to try to make a
 match.")
 
 (defvar gnus-uu-user-view-rules nil 
-  "Variable detailing what actions are to be taken to view a file.
+  "*Variable detailing what actions are to be taken to view a file.
 See the documentation on the `gnus-uu-default-view-rules' variable for 
 details.")
 
 (defvar gnus-uu-user-view-rules-end 
   '(("" "file"))
-  "Variable saying what actions are to be taken if no rule matched the file name.
+  "*Variable saying what actions are to be taken if no rule matched the file name.
 See the documentation on the `gnus-uu-default-view-rules' variable for 
 details.")
 
@@ -105,7 +104,7 @@ details.")
   (list "uncompress" "gunzip"))
 
 (defvar gnus-uu-user-archive-rules nil
-  "A list that can be set to override the default archive unpacking commands.
+  "*A list that can be set to override the default archive unpacking commands.
 To use, for instance, 'untar' to unpack tar files and 'zip -x' to
 unpack zip files, say the following:
   (setq gnus-uu-user-archive-rules 
@@ -113,7 +112,7 @@ unpack zip files, say the following:
       (\"\\\\.zip$\" \"zip -x\")))")
 
 (defvar gnus-uu-ignore-files-by-name nil
-  "A regular expression saying what files should not be viewed based on name.
+  "*A regular expression saying what files should not be viewed based on name.
 If, for instance, you want gnus-uu to ignore all .au and .wav files, 
 you could say something like
 
@@ -123,7 +122,7 @@ Note that this variable can be used in conjunction with the
 `gnus-uu-ignore-files-by-type' variable.")
 
 (defvar gnus-uu-ignore-files-by-type nil
-  "A regular expression saying what files that shouldn't be viewed, based on MIME file type.
+  "*A regular expression saying what files that shouldn't be viewed, based on MIME file type.
 If, for instance, you want gnus-uu to ignore all audio files and all mpegs, 
 you could say something like
 
@@ -176,53 +175,53 @@ Note that this variable can be used in conjunction with the
 ;; Various variables users may set 
 
 (defvar gnus-uu-tmp-dir "/tmp/" 
-  "Variable saying where gnus-uu is to do its work.
+  "*Variable saying where gnus-uu is to do its work.
 Default is \"/tmp/\".")
 
 (defvar gnus-uu-do-not-unpack-archives nil 
-  "Non-nil means that gnus-uu won't peek inside archives looking for files to dispay. 
+  "*Non-nil means that gnus-uu won't peek inside archives looking for files to dispay. 
 Default is nil.")
 
 (defvar gnus-uu-view-and-save nil 
-  "Non-nil means that the user will always be asked to save a file after viewing it.
+  "*Non-nil means that the user will always be asked to save a file after viewing it.
 If the variable is nil, the suer will only be asked to save if the
 viewing is unsuccessful. Default is nil.")
 
 (defvar gnus-uu-ignore-default-view-rules nil
-  "Non-nil means that gnus-uu will ignore the default viewing rules.
+  "*Non-nil means that gnus-uu will ignore the default viewing rules.
 Only the user viewing rules will be consulted. Default is nil.")
 
 (defvar gnus-uu-ignore-default-archive-rules nil 
-  "Non-nil means that gnus-uu will ignore the default archive unpacking commands.  
+  "*Non-nil means that gnus-uu will ignore the default archive unpacking commands.  
 Only the user unpacking commands will be consulted. Default is nil.")
 
 (defvar gnus-uu-kill-carriage-return t
-  "Non-nil means that gnus-uu will strip all carriage returns from articles.
+  "*Non-nil means that gnus-uu will strip all carriage returns from articles.
 Default is t.")
 
 (defvar gnus-uu-view-with-metamail nil
-  "Non-nil means that files will be viewed with metamail.
+  "*Non-nil means that files will be viewed with metamail.
 The gnus-uu viewing functions will be ignored and gnus-uu will try
 to guess at a content-type based on file name suffixes. Default
 it nil.")
 
 (defvar gnus-uu-unmark-articles-not-decoded nil
-  "Non-nil means that gnus-uu will mark articles that were unsuccessfully decoded as unread. 
+  "*Non-nil means that gnus-uu will mark articles that were unsuccessfully decoded as unread. 
 Default is nil.")
 
 (defvar gnus-uu-correct-stripped-uucode nil
-  "Non-nil means that gnus-uu will *try* to fix uuencoded files that have had traling spaces deleted. 
+  "*Non-nil means that gnus-uu will *try* to fix uuencoded files that have had traling spaces deleted. 
 Default is nil.")
 
 (defvar gnus-uu-save-in-digest nil
-  "Non-nil means that gnus-uu, when asked to save without decoding, will save in digests.
+  "*Non-nil means that gnus-uu, when asked to save without decoding, will save in digests.
 If this variable is nil, gnus-uu will just save everything in a 
 file without any embellishments. The digesting almost conforms to RFC1153 -
 no easy way to specify any meaningful volume and issue numbers were found, 
 so I simply dropped them.")
 
 (defvar gnus-uu-save-separate-articles nil
-  "Non-nil means that gnus-uu will save articles in separate files.")
+  "*Non-nil means that gnus-uu will save articles in separate files.")
 
 ;; Internal variables
 
index 9a397a4..70c741e 100644 (file)
 (require (if gnus-xemacs 'auc-menu 'easymenu))
 
 (defvar gnus-summary-selected-face 'underline
-  "Face used for highlighting the current article in the summary buffer.")
+  "*Face used for highlighting the current article in the summary buffer.")
 
 (defvar gnus-visual-summary-highlight
   '(((> score default) . bold)
     ((< score default) . italic))
-  "Alist of `(FORM . FACE)'.
+  "*Alist of `(FORM . FACE)'.
 Summary lines are highlighted with the FACE for the first FORM which
 evaluate to a non-nil value.  
 
@@ -149,22 +149,31 @@ To check for marks, e.g. to underline replied articles, use
    gnus-summary-mode-map
    ""
    '("Mark"
-     ["Tick" gnus-summary-tick-article-forward t]
-     ["Mark as read" gnus-summary-mark-as-read-forward t]
-     ["Mark as unread" gnus-summary-clear-mark-forward t]
-     ["Mark same subject and select" gnus-summary-kill-same-subject-and-select t]
-     ["Mark same subject" gnus-summary-kill-same-subject t]
-     ["Remove lines marked as read" gnus-summary-remove-lines-marked-as-read t]
-     ["Remove lines marked with..." gnus-summary-remove-lines-marked-with t]
-     ["Set expirable mark" gnus-summary-mark-as-expirable t]
-     ["Set bookmark" gnus-summary-set-bookmark t]
-     ["Remove bookmark" gnus-summary-remove-bookmark t]
-     ["Catchup" gnus-summary-catchup t]
-     ["Catchup all" gnus-summary-catchup-all t]
-     ["Catchup to here" gnus-summary-catchup-to-here t]
-     ["Raise score" gnus-summary-raise-score t]
-     ["Lower score" gnus-summary-lower-score t]
-     ["Set score" gnus-summary-set-score t]
+     ("Read"
+      ["Mark as read" gnus-summary-mark-as-read-forward t]
+      ["Mark same subject and select" gnus-summary-kill-same-subject-and-select t]
+      ["Mark same subject" gnus-summary-kill-same-subject t]
+      ["Catchup" gnus-summary-catchup t]
+      ["Catchup all" gnus-summary-catchup-all t]
+      ["Catchup to here" gnus-summary-catchup-to-here t]
+      ["Catchup region" gnus-summary-mark-region-as-read t])
+     ("Various"
+      ["Tick" gnus-summary-tick-article-forward t]
+      ["Mark as dormant" gnus-summary-mark-as-dormant t]
+      ["Remove marks" gnus-summary-clear-mark-forward t]
+      ["Set expirable mark" gnus-summary-mark-as-expirable t]
+      ["Set bookmark" gnus-summary-set-bookmark t]
+      ["Remove bookmark" gnus-summary-remove-bookmark t])
+     ("Score"
+      ["Raise score" gnus-summary-raise-score t]
+      ["Lower score" gnus-summary-lower-score t]
+      ["Set score" gnus-summary-set-score t])
+     ("Display"
+      ["Remove lines marked as read" gnus-summary-remove-lines-marked-as-read t]
+      ["Remove lines marked with..." gnus-summary-remove-lines-marked-with t]
+      ["Show dormant articles" gnus-summary-show-all-dormant t]
+      ["Hide dormant articles" gnus-summary-hide-all-dormant t]
+      ["Show expunged articles" gnus-summary-show-all-expunged t])
      ("Process mark"
       ["Set mark" gnus-summary-mark-as-processable t]
       ["Remove mark" gnus-summary-unmark-as-processable t]
@@ -208,6 +217,7 @@ To check for marks, e.g. to underline replied articles, use
       ["Overstrike" gnus-article-treat-overstrike t]
       ["Word wrap" gnus-article-word-wrap t]
       ["CR" gnus-article-remove-cr t]
+      ["Show X-Face" gnus-article-display-x-face t]
       ["Quoted-Printable" gnus-article-de-quoted-unreadable t])
      ("Extract"
       ["Uudecode" gnus-uu-decode-uu t]
@@ -265,20 +275,18 @@ To check for marks, e.g. to underline replied articles, use
       ["Sort by author" gnus-summary-sort-by-author t]
       ["Sort by subject" gnus-summary-sort-by-subject t]
       ["Sort by date" gnus-summary-sort-by-date t])
+     ("Exit"
+      ["Catchup and exit" gnus-summary-catchup-and-exit t]
+      ["Catchup and goto next" gnus-summary-catchup-and-goto-next-group t]
+      ["Exit group" gnus-summary-exit t]
+      ["Exit group without updating" gnus-summary-quit t]
+      ["Reselect group" gnus-summary-reselect-current-group t]
+      ["Rescan group" gnus-summary-rescan-group t])
      ["Fetch group FAQ" gnus-summary-fetch-faq t]
      ["Filter articles" gnus-summary-execute-command t]
-     ["Catchup and exit" gnus-summary-catchup-and-exit t]
-     ["Catchup and goto next" gnus-summary-catchup-and-goto-next-group t]
      ["Toggle line truncation" gnus-summary-toggle-truncation t]
      ["Expire expirable articles" gnus-summary-expire-articles t]
-     ["Show dormant articles" gnus-summary-show-all-dormant t]
-     ["Hide dormant articles" gnus-summary-hide-all-dormant t]
-     ["Show expunged articles" gnus-summary-show-all-expunged t]
-     ["Reselect group" gnus-summary-reselect-current-group t]
-     ["Rescan group" gnus-summary-rescan-group t]
      ["Describe group" gnus-summary-describe-group t]
-     ["Exit group" gnus-summary-exit t]
-     ["Exit group without updating" gnus-summary-quit t]
      ["Edit local kill file" gnus-summary-edit-local-kill t]
      ["Edit global kill file" gnus-summary-edit-global-kill t]
      ))
@@ -470,4 +478,4 @@ To check for marks, e.g. to underline replied articles, use
 
 (provide 'gnus-visual)
 
-;;; gnus-visual.el ends here
\ No newline at end of file
+;;; gnus-visual.el ends here
index f599500..fb1a1f5 100644 (file)
@@ -49,7 +49,7 @@
                      gnus-default-nntp-server)
                  (system-name))
        "nntp")
-  "Default method for selecting a newsgroup.
+  "*Default method for selecting a newsgroup.
 This variable should be a list, where the first element is how the
 news is to be fetched, the second is the address.  An optional third
 element can be included to specify a port number if nntp is used.
@@ -67,7 +67,7 @@ If you use this variable, you must set `gnus-nntp-server' to nil.")
 
 ;; Added by Sudish Joseph <joseph@cis.ohio-state.edu>.
 (defvar gnus-post-method nil
-  "Preferred method for posting USENET news.
+  "*Preferred method for posting USENET news.
 If this variable is nil, Gnus will use the current method to decide
 which method to use when posting.  If it is non-nil, it will override
 the current method. This method will not be used in mail groups and
@@ -77,7 +77,7 @@ The value must be a valid method as discussed in the documentation of
 `gnus-select-method'.")
 
 (defvar gnus-refer-article-method nil
-  "Preferred method for fetching an article by Message-ID.
+  "*Preferred method for fetching an article by Message-ID.
 If you are reading news from the local spool (with nnspool), fetching
 articles by Message-ID is painfully slow. By setting this method to an
 nntp method, you might get acceptable results.
@@ -86,7 +86,7 @@ The value of this variable must be a valid select method as discussed
 in the documentation of `gnus-select-method'")
 
 (defvar gnus-secondary-select-methods nil
-  "A list of secondary methods that will be used for reading news.
+  "*A list of secondary methods that will be used for reading news.
 This is a list where each element is a complete select methdod (see
 `gnus-select-method').  
 
@@ -96,17 +96,17 @@ you could set this variable:
 (setq gnus-secondary-select-methods '((nnml \"\"))")
 
 (defvar gnus-secondary-servers nil
-  "List of NNTP servers that the user can choose between interactively.
+  "*List of NNTP servers that the user can choose between interactively.
 To make Gnus query you for a server, you have to give `gnus' a
 non-numeric prefix - `C-u M-x gnus', in short.")
 
 (defvar gnus-nntp-server nil
-  "The name of the host running the NNTP server.
+  "*The name of the host running the NNTP server.
 This variable is semi-obsolete. Use the `gnus-select-method'
 variable instead.")
 
 (defvar gnus-nntp-service "nntp"
-  "NNTP service name (\"nntp\" or 119).
+  "*NNTP service name (\"nntp\" or 119).
 This is an obsolete variable, which is scarcely used. If you use an
 nntp server for your newsgroup and want to change the port number
 used to 899, you would say something along these lines:
@@ -114,16 +114,16 @@ used to 899, you would say something along these lines:
  (setq gnus-select-method '(nntp \"my.nntp.server\" 899))")
 
 (defvar gnus-startup-file "~/.newsrc"
-  "Your `.newsrc' file.
+  "*Your `.newsrc' file.
 `.newsrc-SERVER' will be used instead if that exists.")
 
 (defvar gnus-signature-file "~/.signature"
-  "Your signature file.
+  "*Your signature file.
 If the variable is a string that doesn't correspond to a file, the
 string itself is inserted.")
 
 (defvar gnus-signature-function nil
-  "A function that should return a signature file name.
+  "*A function that should return a signature file name.
 The function will be called with the name of the newsgroup being
 posted to.
 If the function returns a string that doesn't correspond to a file, the
@@ -132,52 +132,52 @@ If the function returns nil, the `gnus-signature-file' variable will
 be used instead.")
 
 (defvar gnus-init-file "~/.gnus"
-  "Your Gnus elisp startup file.
+  "*Your Gnus elisp startup file.
 If a file with the .el or .elc suffixes exist, it will be read
 instead.") 
 
 (defvar gnus-group-faq-directory
   "/anonymous@rtfm.mit.edu:/pub/usenet-by-group/"
-  "Directory where the group FAQs are stored.
+  "*Directory where the group FAQs are stored.
 This will most commonly be on a remote machine, and the file will be
 fetched by ange-ftp.")
 
 (defvar gnus-group-archive-directory
   "/ftp@sina.tcamc.uh.edu:/pub/emacs/ding-list/" 
-  "The address of the (ding) archives.")
+  "*The address of the (ding) archives.")
 
 (defvar gnus-default-subscribed-newsgroups nil
-  "This variable lists what newsgroups should be susbcribed the first time Gnus is used.
+  "*This variable lists what newsgroups should be subscribed the first time Gnus is used.
 It should be a list of strings.
 If it is `t', Gnus will not do anything special the first time it is
 started; it'll just use the normal newsgroups subscription methods.")
 
 (defvar gnus-post-prepare-function nil
-  "Function that is run after a post buffer has been prepared.
+  "*Function that is run after a post buffer has been prepared.
 It is called with the name of the newsgroup that is posted to. It
 might be used, for instance, for inserting signatures based on the
 newsgroup name. (In that case, `gnus-signature-file' and
 `mail-signature' should both be set to nil).")
 
 (defvar gnus-use-cross-reference t
-  "Non-nil means that cross referenced articles will be marked as read.
+  "*Non-nil means that cross referenced articles will be marked as read.
 If nil, ignore cross references.  If t, mark articles as read in
 subscribed newsgroups. If neither t nor nil, mark as read in all
 newsgroups.") 
 
 (defvar gnus-use-dribble-file t
-  "Non-nil means that Gnus will use a dribble file to store user updates.
+  "*Non-nil means that Gnus will use a dribble file to store user updates.
 If Emacs should crash without saving the .newsrc files, complete
 information can be restored from the dribble file.")
 
 (defvar gnus-use-followup-to 'use
-  "Specifies what to do with Followup-To header.
+  "*Specifies what to do with Followup-To header.
 If nil, ignore the header. If it is t, use its value, but ignore 
 `poster'. If it is neither nil nor t, which is the default, always use
 the value.") 
 
 (defvar gnus-followup-to-function nil
-  "A variable that contains a function that returns a followup address.
+  "*A variable that contains a function that returns a followup address.
 The function will be called in the buffer of the article that is being
 followed up. The buffer will be narrowed to the headers of the
 article. To pick header headers, one might use `mail-fetch-field'.  The
@@ -196,7 +196,7 @@ Here's an example `gnus-followup-to-function':
                   (mail-fetch-field \"from\"))))))")
 
 (defvar gnus-reply-to-function nil
-  "A variable that contains a function that returns a reply address.
+  "*A variable that contains a function that returns a reply address.
 See the `gnus-followup-to-function' variable for an explanation of how
 this variable is used.
 
@@ -207,16 +207,16 @@ with the header name, and the cdr should be a string with the header
 value.")
 
 (defvar gnus-large-newsgroup 200
-  "The number of articles which indicates a large newsgroup.
+  "*The number of articles which indicates a large newsgroup.
 If the number of articles in a newsgroup is greater than this value,
 confirmation is required for selecting the newsgroup.")
 
 ;; Suggested by Andrew Eskilsson <pi92ae@lelle.pt.hk-r.se>.
 (defvar gnus-no-groups-message "No news is horrible news"
-  "Message displayed by Gnus when no groups are available.")
+  "*Message displayed by Gnus when no groups are available.")
 
 (defvar gnus-author-copy (getenv "AUTHORCOPY")
-  "Save outgoing articles in this file.
+  "*Save outgoing articles in this file.
 Initialized from the AUTHORCOPY environment variable.
 
 If this variable begins with the character \"|\", outgoing articles
@@ -229,40 +229,40 @@ If the first character is not a pipe, articles are saved using the
 function specified by the `gnus-author-copy-saver' variable.")
 
 (defvar gnus-mail-self-blind nil
-  "Non-nil means insert a BCC header in all outgoing articles.
+  "*Non-nil means insert a BCC header in all outgoing articles.
 This will result in having a copy of the article mailed to yourself.
 The BCC header is inserted when the post buffer is initialized, so you
 can remove or alter the BCC header to override the default.")
 
 (defvar gnus-author-copy-saver (function rmail-output)
-  "A function called to save outgoing articles.
+  "*A function called to save outgoing articles.
 This function will be called with the same of the file to store the
 article in. The default function is `rmail-output' which saves in Unix
 mailbox format.")
 
 (defvar gnus-use-long-file-name (not (memq system-type '(usg-unix-v xenix)))
-  "Non-nil means that the default name of a file to save articles in is the group name.
+  "*Non-nil means that the default name of a file to save articles in is the group name.
 If it's nil, the directory form of the group name is used instead.
 
 If this variable is a list, and the list contains the element
-`not-score', long file names will not be used for score files, if it
+`not-score', long file names will not be used for score files; if it
 contains the element `not-save', long file names will not be used for
-saving, and if it contains the element `not-kill', long file names
+saving; and if it contains the element `not-kill', long file names
 will not be used for kill files.")
 
 (defvar gnus-article-save-directory (or (getenv "SAVEDIR") "~/News/")
-  "Name of the directory articles will be saved in (default \"~/News\").
+  "*Name of the directory articles will be saved in (default \"~/News\").
 Initialized from the SAVEDIR environment variable.")
 
 (defvar gnus-kill-files-directory (or (getenv "SAVEDIR") "~/News/")
-  "Name of the directory where kill files will be stored (default \"~/News\").
+  "*Name of the directory where kill files will be stored (default \"~/News\").
 Initialized from the SAVEDIR environment variable.")
 
 (defvar gnus-score-expiry-days 7
   "*Number of days before unused score file entries are expired.")
 
 (defvar gnus-default-article-saver (function gnus-summary-save-in-rmail)
-  "A function to save articles in your favorite format.
+  "*A function to save articles in your favorite format.
 The function must be interactively callable (in other words, it must
 be an Emacs command).
 
@@ -274,26 +274,38 @@ Gnus provides the following functions:
 * gnus-summary-save-in-file (article format).")
 
 (defvar gnus-rmail-save-name (function gnus-plain-save-name)
-  "A function generating a file name to save articles in Rmail format.
+  "*A function generating a file name to save articles in Rmail format.
 The function is called with NEWSGROUP, HEADERS, and optional LAST-FILE.")
 
 (defvar gnus-mail-save-name (function gnus-plain-save-name)
-  "A function generating a file name to save articles in Unix mail format.
+  "*A function generating a file name to save articles in Unix mail format.
 The function is called with NEWSGROUP, HEADERS, and optional LAST-FILE.")
 
 (defvar gnus-folder-save-name (function gnus-folder-save-name)
-  "A function generating a file name to save articles in MH folder.
+  "*A function generating a file name to save articles in MH folder.
 The function is called with NEWSGROUP, HEADERS, and optional LAST-FOLDER.")
 
 (defvar gnus-file-save-name (function gnus-numeric-save-name)
-  "A function generating a file name to save articles in article format.
-The function is called with NEWSGROUP, HEADERS, and optional LAST-FILE.")
+  "*A function generating a file name to save articles in article format.
+The function is called with NEWSGROUP, HEADERS, and optional
+LAST-FILE.")
+
+(defvar gnus-split-methods nil
+  "*Variable used to suggest where articles are to be saved.
+The syntax of this variable is the same as `nnmail-split-methods'.  
+
+For instance, if you would like to save articles related to Gnus in
+the file \"gnus-stuff\", and articles related to VM in \"vm-stuff\",
+you could set this variable to something like:
+
+ '(("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff")
+   ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff"))")
 
 (defvar gnus-score-file-suffix "SCORE"
-  "Suffix of the score files.")
+  "*Suffix of the score files.")
 
 (defvar gnus-fetch-old-headers nil
-  "Non-nil means that Gnus will try to build threads by grabbing old headers.
+  "*Non-nil means that Gnus will try to build threads by grabbing old headers.
 If an unread article in the group refers to an older, already read (or
 just marked as read) article, the old article will not normally be
 displayed in the Summary buffer.  If this variable is non-nil, Gnus
@@ -319,7 +331,7 @@ required.")
 And that means *anything*.")
 
 (defvar gnus-keep-same-level nil
-  "Non-nil means that the next newsgroup after the current will be on the same level.
+  "*Non-nil means that the next newsgroup after the current will be on the same level.
 When you type, for instance, `n' after reading the last article in the
 current newsgroup, you will go to the next newsgroup. If this variable
 is nil, the next newsgroup will be the next from the group
@@ -332,7 +344,7 @@ If this variable is `best', Gnus will make the next newsgroup the one
 with the best level.")
 
 (defvar gnus-summary-make-false-root 'adopt
-  "nil means that Gnus won't gather loose threads.
+  "*nil means that Gnus won't gather loose threads.
 If the root of a thread has expired or been read in a previous
 session, the information necessary to build a complete thread has been
 lost. Instead of having many small sub-threads from this original thread
@@ -367,15 +379,15 @@ comparing subjects.")
 
 ;; Added by Per Abrahamsen <amanda@iesd.auc.dk>.
 (defvar gnus-summary-same-subject ""
-  "String indicating that the current article has the same subject as the previous.
+  "*String indicating that the current article has the same subject as the previous.
 This variable will only be used if the value of
 `gnus-summary-make-false-root' is `empty'.")
 
 (defvar gnus-summary-goto-unread nil
-  "If non-nil, marking commands will go to the next unread article.")
+  "*If non-nil, marking commands will go to the next unread article.")
 
 (defvar gnus-check-new-newsgroups t
-  "Non-nil means that Gnus will add new newsgroups at startup.
+  "*Non-nil means that Gnus will add new newsgroups at startup.
 If this variable is `ask-server', Gnus will ask the server for new
 groups since the last time it checked. This means that the killed list
 is no longer necessary, so you could set `gnus-save-killed-list' to
@@ -393,12 +405,12 @@ If this variable is nil, then you have to tell Gnus explicitly to
 check for new newsgroups with \\<gnus-group-mode-map>\\[gnus-find-new-newsgroups].")
 
 (defvar gnus-check-bogus-newsgroups nil
-  "Non-nil means that Gnus will check and remove bogus newsgroup at startup.
+  "*Non-nil means that Gnus will check and remove bogus newsgroup at startup.
 If this variable is nil, then you have to tell Gnus explicitly to
 check for bogus newsgroups with \\<gnus-group-mode-map>\\[gnus-group-check-bogus-groups].")
 
 (defvar gnus-read-active-file t
-  "Non-nil means that Gnus will read the entire active file at startup.
+  "*Non-nil means that Gnus will read the entire active file at startup.
 If this variable is nil, Gnus will only know about the groups in your
 `.newsrc' file.
 
@@ -408,7 +420,7 @@ about new newsgroups that arrive.  To do that, set
 properly with all servers.") 
 
 (defvar gnus-activate-foreign-newsgroups nil
-  "If nil, Gnus will not check foreign newsgroups at startup.
+  "*If nil, Gnus will not check foreign newsgroups at startup.
 If it is non-nil, it should be a number between one and nine. Foreign
 newsgroups that have a level lower or equal to this number will be
 activated on startup. For instance, if you want to active all
@@ -420,7 +432,7 @@ but you won't be told how many unread articles there are in the
 groups.")
 
 (defvar gnus-save-newsrc-file t
-  "Non-nil means that Gnus will save the `.newsrc' file.
+  "*Non-nil means that Gnus will save the `.newsrc' file.
 Gnus always saves its own startup file, which is called
 \".newsrc.eld\".  The file called \".newsrc\" is in a format that can
 be readily understood by other newsreaders.  If you don't plan on
@@ -428,7 +440,7 @@ using other newsreaders, set this variable to nil to save some time on
 exit.")
 
 (defvar gnus-save-killed-list t
-  "If non-nil, save the list of killed groups to the startup file.
+  "*If non-nil, save the list of killed groups to the startup file.
 This will save both time (when starting and quitting) and space (both
 memory and disk), but it will also mean that Gnus has no record of
 which groups are new and which are old, so the automatic new
@@ -437,35 +449,35 @@ set `gnus-check-new-newsgroups' to `ask-server' or nil if you set this
 variable to nil.")
 
 (defvar gnus-interactive-catchup t
-  "If non-nil, require your confirmation when catching up a group.")
+  "*If non-nil, require your confirmation when catching up a group.")
 
 (defvar gnus-interactive-post t
-  "If non-nil, group name will be asked for when posting.")
+  "*If non-nil, group name will be asked for when posting.")
 
 (defvar gnus-interactive-exit t
-  "If non-nil, require your confirmation when exiting Gnus.")
+  "*If non-nil, require your confirmation when exiting Gnus.")
 
 (defvar gnus-kill-killed nil
-  "If non-nil, Gnus will apply kill files to already killed articles.
+  "*If non-nil, Gnus will apply kill files to already killed articles.
 If it is nil, Gnus will never apply kill files to articles that have
 already been through the scoring process, which might very well save lots
 of time.")
 
 (defvar gnus-extract-address-components 'gnus-extract-address-components
-  "Function for extracting address components from a From header.
+  "*Function for extracting address components from a From header.
 Two pre-defined function exist: `gnus-extract-address-components',
 which is the default, quite fast, and too simplistic solution, and
 `mail-extract-address-components', which works much better, but is
 slower.")
 
 (defvar gnus-score-interactive-default-score 1000
-  "Scoring commands will raise/lower the score with this number as the default.")
+  "*Scoring commands will raise/lower the score with this number as the default.")
 
 (defvar gnus-save-score nil
-  "If non-nil, save group scoring info.")
+  "*If non-nil, save group scoring info.")
 
 (defvar gnus-global-score-files nil
-  "List of global score files and directories.
+  "*List of global score files and directories.
 Set this variable if you want to use people's score files.  One entry
 for each score file or each score file directory.  Gnus will decide
 by itself what score files are applicable to which group.
@@ -479,22 +491,22 @@ score files in the \"/ftp.some-where:/pub/score\" directory.
          \"/ftp.some-where:/pub/score\"))")
 
 (defvar gnus-summary-default-score 0
-  "Default article score level.
+  "*Default article score level.
 If this variable is nil, scoring will be disabled.")
 
 (defvar gnus-group-default-list-level 5
-  "Default listing level.")
+  "*Default listing level.")
 
 (defvar gnus-user-login-name nil
-  "The login name of the user.
+  "*The login name of the user.
 Got from the function `user-login-name' if undefined.")
 
 (defvar gnus-user-full-name nil
-  "The full name of the user.
+  "*The full name of the user.
 Got from the NAME environment variable if undefined.")
 
 (defvar gnus-user-from-line nil
-  "Your full, complete e-mail address.  
+  "*Your full, complete e-mail address.  
 Overrides the other Gnus variables if it is non-nil.
 
 Here are two example values of this variable:
@@ -514,28 +526,28 @@ The articles will simply be fed to the function given by
 `gnus-show-mime-method'.")
 
 (defvar gnus-show-mime-method (function metamail-buffer)
-  "Function to process a MIME message.
+  "*Function to process a MIME message.
 The function is called from the article buffer.")
 
 (defvar gnus-show-threads t
   "*If non-nil, display threads in summary mode.")
 
 (defvar gnus-thread-hide-subtree nil
-  "If non-nil, hide all threads initially.
+  "*If non-nil, hide all threads initially.
 If threads are hidden, you have to run the command
 `gnus-summary-show-thread' by hand or use `gnus-select-article-hook'
 to expose hidden threads.")
 
 (defvar gnus-thread-hide-killed t
-  "If non-nil, hide killed threads automatically.")
+  "*If non-nil, hide killed threads automatically.")
 
 (defvar gnus-thread-ignore-subject nil
-  "If non-nil, ignore subjects and do all threading based on the Reference header.
+  "*If non-nil, ignore subjects and do all threading based on the Reference header.
 If nil, which is the default, articles that have different subjects
 from their parents will start separate threads.")
 
 (defvar gnus-thread-indent-level 4
-  "Number that says how much each sub-thread should be indented.")
+  "*Number that says how much each sub-thread should be indented.")
 
 ;; jwz: nuke newsgroups whose name is all digits - that means that
 ;; some loser has let articles get into the root of the news spool,
@@ -548,35 +560,34 @@ from their parents will start separate threads.")
                         "[][\"#'()     ;\\]"   ; bogus characters
                         )
                       "\\|"))
-  "A regexp to match uninteresting newsgroups in the active file.
+  "*A regexp to match uninteresting newsgroups in the active file.
 Any lines in the active file matching this regular expression are
 removed from the newsgroup list before anything else is done to it,
 thus making them effectively non-existant.")
 
 (defvar gnus-ignored-headers
   "^Path:\\|^Posting-Version:\\|^Article-I.D.:\\|^Expires:\\|^Date-Received:\\|^References:\\|^Control:\\|^Xref:\\|^Lines:\\|^Posted:\\|^Relay-Version:\\|^Message-ID:\\|^Nf-ID:\\|^Nf-From:\\|^Approved:\\|^Sender:\\|^Received:\\|^Mail-from:"
-  "All headers that match this regexp will be hidden.
+  "*All headers that match this regexp will be hidden.
 Also see `gnus-visible-headers'.")
 
 (defvar gnus-visible-headers "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^Followup-To:\\|^Reply-To:\\|^Organization:\\|^Summary:\\|^Keywords:\\|^To:\\|^Cc:"
-  "All headers that do not match this regexp will be hidden.
+  "*All headers that do not match this regexp will be hidden.
 Also see `gnus-ignored-headers'.")
 
 (defvar gnus-sorted-header-list
   '("^From:" "^Subject:" "^Summary:" "^Keywords:" "^Newsgroups:" "^To:" 
     "^Cc:" "^Date:" "^Organization:")
-  "This variable is a list of regular expressions.
+  "*This variable is a list of regular expressions.
 If it is non-nil, headers that match the regular expressions will
 be placed first in the article buffer in the sequence specified by
 this list.")
 
 (defvar gnus-required-headers
   '(From Date Newsgroups Subject Message-ID Organization Lines X-Newsreader)
-  "Headers to be generated or prompted for when posting an article.
-RFC977 and RFC1036 require From, Date, Newsgroups, Subject, Message-ID
-and Path headers.  Organization, Lines and X-Newsreader are optional.
-If you want Gnus not to insert some header, remove it from this
-list.") 
+  "*Headers to be generated or prompted for when posting an article.
+RFC977 and RFC1036 require From, Date, Newsgroups, Subject,
+Message-ID.  Organization, Lines and X-Newsreader are optional.  If
+you want Gnus not to insert some header, remove it from this list.")
 
 (defvar gnus-show-all-headers nil
   "*If non-nil, don't hide any headers.")
@@ -585,19 +596,19 @@ list.")
   "*If non-nil, don't remove any headers before saving.")
 
 (defvar gnus-inhibit-startup-message nil
-  "If non-nil, the startup message will not be displayed.")
+  "*If non-nil, the startup message will not be displayed.")
 
 (defvar gnus-auto-extend-newsgroup t
-  "If non-nil, extend newsgroup forward and backward when requested.")
+  "*If non-nil, extend newsgroup forward and backward when requested.")
 
 (defvar gnus-auto-select-first t
-  "If non-nil, select the first unread article when entering a group.
+  "*If non-nil, select the first unread article when entering a group.
 If you want to prevent automatic selection of the first unread article
 in some newsgroups, set the variable to nil in
 `gnus-select-group-hook'.") 
 
 (defvar gnus-auto-select-next t
-  "If non-nil, offer to go to the next group from the end of the previous.
+  "*If non-nil, offer to go to the next group from the end of the previous.
 If the value is t and the next newsgroup is empty, Gnus will exit
 summary mode and go back to group mode.  If the value is neither nil
 nor t, Gnus will select the following unread newsgroup.  In
@@ -605,7 +616,7 @@ particular, if the value is the symbol `quietly', the next unread
 newsgroup will be selected without any confirmations.")
 
 (defvar gnus-auto-select-same nil
-  "If non-nil, select the next article with the same subject.")
+  "*If non-nil, select the next article with the same subject.")
 
 (defvar gnus-auto-center-summary t
   "*If non-nil, always center the current summary buffer.")
@@ -621,7 +632,7 @@ Mail is sent using the function specified by the
 
 ;; Added by Ethan Bradford <ethanb@ptolemy.astro.washington.edu>.
 (defvar gnus-mail-courtesy-message
-  "The following message is a courtesy copy of an article\nthat has been posted as well.\n\n"
+  "*The following message is a courtesy copy of an article\nthat has been posted as well.\n\n"
   "This is inserted at the start of a mailed copy of a posted message.
 If this variable is nil, no such courtesy message will be added.")
 
@@ -631,7 +642,7 @@ The page delimiter is specified by the `gnus-page-delimiter'
 variable.")
 
 (defvar gnus-page-delimiter "^\^L"
-  "Regexp describing what to use as article page delimiters.
+  "*Regexp describing what to use as article page delimiters.
 The default value is \"^\^L\", which is a form linefeed at the
 beginning of a line.")
 
@@ -642,7 +653,7 @@ beginning of a line.")
   '((summary (0 1 0))
     (newsgroups (1 0 0))
     (article (0 3 10)))
-  "Specify window configurations for each action.
+  "*Specify window configurations for each action.
 The format of the variable is either a list of (ACTION (G S A)), where
 G, S, and A are the relative height of group, summary, and article
 windows, respectively, or a list of (ACTION FUNCTION), where FUNCTION
@@ -650,27 +661,27 @@ is a function that will be called with ACTION as an argument. ACTION
 can be `summary', `newsgroups', or `article'.")
 
 (defvar gnus-mail-reply-method (function gnus-mail-reply-using-mail)
-  "Function to compose a reply.
+  "*Function to compose a reply.
 Two pre-made functions are `gnus-mail-reply-using-mail' (sendmail) and
 `gnus-mail-reply-using-mhe' (MH-E).")
 
 (defvar gnus-mail-forward-method (function gnus-mail-forward-using-mail)
-  "Function to forward the current message to another user.
+  "*Function to forward the current message to another user.
 Two pre-made functions are `gnus-mail-forward-using-mail' (sendmail)
 and `gnus-mail-forward-using-mhe' (MH-E).") 
 
 (defvar gnus-mail-other-window-method 'gnus-mail-other-window-using-mail
-  "Function to compose mail in the other window.
+  "*Function to compose mail in the other window.
 Two pre-made functions are `gnus-mail-other-window-using-mail'
 (sendmail) and `gnus-mail-other-window-using-mhe' (MH-E).")
 
 (defvar gnus-mail-send-method send-mail-function
-  "Function to mail a message which is also being posted as an article.
+  "*Function to mail a message which is also being posted as an article.
 The message must have To or Cc header.  The default is copied from
 the variable `send-mail-function'.")
 
 (defvar gnus-subscribe-newsgroup-method 'gnus-subscribe-zombies
-  "Function called with a group name when new group is detected.
+  "*Function called with a group name when new group is detected.
 A few pre-made functions are supplied: `gnus-subscribe-randomly'
 inserts new groups at the beginning of the list of groups;
 `gnus-subscribe-alphabetically' inserts new groups in strict
@@ -682,7 +693,7 @@ for your decision.")
 ;; <h.b.furuseth@usit.uio.no>. 
 (defvar gnus-subscribe-options-newsgroup-method
   (function gnus-subscribe-alphabetically)
-  "This function is called to subscribe newsgroups mentioned on \"options -n\" lines.
+  "*This function is called to subscribe newsgroups mentioned on \"options -n\" lines.
 If, for instance, you want to subscribe to all newsgroups in the
 \"no\" and \"alt\" hierarchies, you'd put the following in your
 .newsrc file:
@@ -693,7 +704,7 @@ Gnus will the subscribe all new newsgroups in these hierarchies with
 the subscription method in this variable.")
 
 (defvar gnus-subscribe-hierarchical-interactive nil
-  "If non-nil, Gnus will offer to subscribe hierarchically.
+  "*If non-nil, Gnus will offer to subscribe hierarchically.
 When a new hierarchy appears, Gnus will ask the user:
 
 'alt.binaries': Do you want to subscribe to this hierarchy? ([d]ys):
@@ -703,7 +714,7 @@ subscribe to all newsgroups in the hierarchy and `s' will skip this
 hierarchy in its entirety.")
 
 (defvar gnus-group-sort-function 'gnus-group-sort-by-alphabet
-  "Function used for sorting the group buffer.
+  "*Function used for sorting the group buffer.
 This function will be called with group info entries as the arguments
 for the groups to be sorted.  Pre-made functions include
 `gnus-sort-by-alphabet', `gnus-sort-by-unread' and
@@ -712,48 +723,48 @@ for the groups to be sorted.  Pre-made functions include
 ;; Mark variables suggested by Thomas Michanek
 ;; <Thomas.Michanek@telelogic.se>. 
 (defvar gnus-unread-mark ? 
-  "Mark used for unread articles.")
+  "*Mark used for unread articles.")
 (defvar gnus-ticked-mark ?!
-  "Mark used for ticked articles.")
+  "*Mark used for ticked articles.")
 (defvar gnus-dormant-mark ??
-  "Mark used for dormant articles.")
+  "*Mark used for dormant articles.")
 (defvar gnus-dread-mark ?D
-  "Mark used for read articles.")
+  "*Mark used for read articles.")
 (defvar gnus-read-mark ?d
-  "Mark used for read articles.")
+  "*Mark used for read articles.")
 (defvar gnus-expirable-mark ?E
-  "Mark used for expirable articles.")
+  "*Mark used for expirable articles.")
 (defvar gnus-killed-mark ?K
-  "Mark used for killed articles.")
+  "*Mark used for killed articles.")
 (defvar gnus-kill-file-mark ?X
-  "Mark used for articles killed by kill files.")
+  "*Mark used for articles killed by kill files.")
 (defvar gnus-low-score-mark ?Y
-  "Mark used for articles with a low score.")
+  "*Mark used for articles with a low score.")
 (defvar gnus-catchup-mark ?C
-  "Mark used for articles that are caught up.")
+  "*Mark used for articles that are caught up.")
 (defvar gnus-replied-mark ?R
-  "Mark used for articles that have been replied to.")
+  "*Mark used for articles that have been replied to.")
 (defvar gnus-process-mark ?# 
-  "Process mark.")
+  "*Process mark.")
 (defvar gnus-ancient-mark ?A
-  "Mark used for ancient articles.")
+  "*Mark used for ancient articles.")
 (defvar gnus-canceled-mark ?G
-  "Mark used for cancelled articles.")
+  "*Mark used for cancelled articles.")
 (defvar gnus-score-over-mark ?+
-  "Score mark used for articles with high scores.")
+  "*Score mark used for articles with high scores.")
 (defvar gnus-score-below-mark ?-
-  "Score mark used for articles with low scores.")
+  "*Score mark used for articles with low scores.")
 
 (defvar gnus-view-pseudo-asynchronously nil
   "*If non-nil, Gnus will view pseudo-articles asynchronously.")
 
 (defvar gnus-view-pseudos nil
-  "If `automatic', pseudo-articles will be viewed automatically.
+  "*If `automatic', pseudo-articles will be viewed automatically.
 If `not-confirm', pseudos will be viewed automatically, and the user
 will not be asked to confirm the command.")
 
 (defvar gnus-group-line-format "%M%S%5y: %(%g%)\n"
-  "Format of groups lines.
+  "*Format of group lines.
 It works along the same lines as a normal formatting string,
 with some simple extensions.
 
@@ -798,7 +809,7 @@ of these specs, you must probably re-start Gnus to see them go into
 effect.") 
 
 (defvar gnus-summary-line-format "%U%R%z%I%(%[%4L: %-20,20n%]%) %s\n"
-  "The format specification of the lines in the summary buffer.
+  "*The format specification of the lines in the summary buffer.
 
 It works along the same lines as a normal formatting string,
 with some simple extensions.
@@ -846,28 +857,34 @@ possible.
 This restriction may disappear in later versions of Gnus.")
 
 (defvar gnus-summary-dummy-line-format "*   :                          : %S\n"
-  "The format specification for the dummy roots in the summary buffer.
+  "*The format specification for the dummy roots in the summary buffer.
 It works along the same lines as a normal formatting string,
 with some simple extensions.
 
 %S  The subject")
 
 (defvar gnus-summary-mode-line-format "(ding) %G/%A %Z"
-  "The format specification for the summary mode line.")
+  "*The format specification for the summary mode line.")
 
 (defvar gnus-article-mode-line-format "(ding) %G/%A %S"
-  "The format specification for the article mode line.")
+  "*The format specification for the article mode line.")
 
 (defvar gnus-group-mode-line-format "(ding) List of groups   {%M:%S}  "
-  "The format specification for the group mode line.")
+  "*The format specification for the group mode line.")
 
 (defvar gnus-valid-select-methods
   '(("nntp" post address prompt-address)
-    ("nnspool" post) ("nnvirtual" none virtual prompt-address) 
-    ("nnmbox" mail respool) ("nnml" mail respool)
-    ("nnmh" mail respool) ("nndir" none prompt-address) ("nndigest" none)
-    ("nndoc" none prompt-address) ("nnbabyl" mail respool)
-    ("nnkiboze" none virtual) ("nnfolder" mail respool))
+    ("nnspool" post)
+    ("nnvirtual" none virtual prompt-address address) 
+    ("nnmbox" mail respool) 
+    ("nnml" mail respool)
+    ("nnmh" mail respool) 
+    ("nndir" none prompt-address address)
+    ("nndigest" none) 
+    ("nndoc" none prompt-address) 
+    ("nnbabyl" mail respool) 
+    ("nnkiboze" none virtual) 
+    ("nnfolder" mail respool))
   "An alist of valid select methods.
 The first element of each list lists should be a string with the name
 of the select method. The other elements may be be the category of
@@ -877,7 +894,7 @@ If you implement a new select method, all you should have to change is
 this variable. I think.")
 
 (defvar gnus-updated-mode-lines '(group article summary)
-  "List of buffers that should update their mode lines.
+  "*List of buffers that should update their mode lines.
 The list may contain the symbols `group', `article' and `summary'. If
 the corresponding symbol is present, Gnus will keep that mode line
 updated with information that may be pertinent. 
@@ -885,23 +902,23 @@ If this variable is nil, screen refresh may be quicker.")
 
 ;; Added by Keinonen Kari <kk85613@cs.tut.fi>.
 (defvar gnus-mode-non-string-length 21
-  "Max length of mode-line non-string contents buffer contents.")
+  "*Max length of mode-line non-string contents buffer contents.")
 
 ;; Added by Per Abrahamsen <amanda@iesd.auc.dk>.
 (defvar gnus-mouse-face 'highlight
-  "Face used for mouse highlighting in Gnus.
+  "*Face used for mouse highlighting in Gnus.
 No mouse highlights will be done if `gnus-visual' is nil.")
 
 (defvar gnus-summary-mark-below nil
-  "Mark all articles with a score below this variable as read.
+  "*Mark all articles with a score below this variable as read.
 This variable is local to each summary buffer and usually set by the
 score file.")  
 
 (defvar gnus-orphan-score nil
-  "All orphans get this score added. Set in the score file.")
+  "*All orphans get this score added. Set in the score file.")
 
 (defvar gnus-thread-sort-functions '(gnus-thread-sort-by-number)
-  "List of functions used for sorting threads in the summary buffer.
+  "*List of functions used for sorting threads in the summary buffer.
 By default, threads are sorted by article number.
 
 Each function takes two threads and return non-nil if the first thread
@@ -917,7 +934,7 @@ The latter two only work on threads that have been scored prior to
 entering the newsgroup.")
 
 (defvar gnus-thread-score-function '+
-  "Function used for calculating the total score of a thread.
+  "*Function used for calculating the total score of a thread.
 
 The function is called with the scores of the article and each
 subthread and should then return the score of the thread.
@@ -925,7 +942,7 @@ subthread and should then return the score of the thread.
 Some functions you can use are `+', `max', or `min'.")
 
 (defvar gnus-score-find-score-files-function 'gnus-score-find-bnews
-  "Function used to find SCORE files.
+  "*Function used to find SCORE files.
 The function will be called with the group name as the argument, and
 should return a list of score files to apply to that group.  The score
 files do not actually have to exist.
@@ -939,48 +956,48 @@ gnus-score-find-bnews: Apply SCORE files whose names matches.
 See the documentation to these functions for more information.
 
 This variable can also be a list of functions to be called.  Each
-function should either return a list of score files, or the functions
-may also return lists of score alists.")
+function should either return a list of score files, or a list of
+score alists.")
 
 (defvar gnus-options-subscribe nil
-  "All new groups matching this regexp will be subscribed unconditionally.
+  "*All new groups matching this regexp will be subscribed unconditionally.
 Note that this variable deals only with new newsgroups.  This variable
 does not affect old newsgroups.")
 
 (defvar gnus-options-not-subscribe nil
-  "All new groups matching this regexp will be ignored.
+  "*All new groups matching this regexp will be ignored.
 Note that this variable deals only with new newsgroups.  This variable
 does not affect old (already subscribed) newsgroups.")
 
 (defvar gnus-auto-expirable-newsgroups nil
-  "Groups in which to automatically mark read articles as expirable.
+  "*Groups in which to automatically mark read articles as expirable.
 If non-nil, this should be a regexp that should match all groups in
-which to perform auto-expiry. This only makes sense for mail groups.")
+which to perform auto-expiry.  This only makes sense for mail groups.")
 
 
 ;; Hooks.
 
 (defvar gnus-group-mode-hook nil
-  "A hook for Gnus group mode.")
+  "*A hook for Gnus group mode.")
 
 (defvar gnus-summary-mode-hook nil
-  "A hook for Gnus summary mode.")
+  "*A hook for Gnus summary mode.")
 
 (defvar gnus-article-mode-hook nil
-  "A hook for Gnus article mode.")
+  "*A hook for Gnus article mode.")
 
 (defvar gnus-open-server-hook nil
-  "A hook called just before opening connection to the news server.")
+  "*A hook called just before opening connection to the news server.")
 
 (defvar gnus-startup-hook nil
-  "A hook called at startup.
+  "*A hook called at startup.
 This hook is called after Gnus is connected to the NNTP server.")
 
 (defvar gnus-get-new-news-hook nil
-  "A hook run just before Gnus checks for new news.")
+  "*A hook run just before Gnus checks for new news.")
 
 (defvar gnus-group-prepare-function 'gnus-group-prepare-flat
-  "A function that is called to generate the group buffer.
+  "*A function that is called to generate the group buffer.
 The function is called with three arguments: The first is a number;
 all group with a level less or equal to that number should be listed,
 if the second is non-nil, empty groups should also be displayed. If
@@ -990,19 +1007,19 @@ than this number should be displayed.
 The only current function implemented is `gnus-group-prepare-flat'.")
 
 (defvar gnus-group-prepare-hook nil
-  "A hook called after the group buffer has been generated.
+  "*A hook called after the group buffer has been generated.
 If you want to modify the group buffer, you can use this hook.")
 
 (defvar gnus-summary-prepare-hook nil
-  "A hook called after the summary buffer has been generated.
+  "*A hook called after the summary buffer has been generated.
 If you want to modify the summary buffer, you can use this hook.")
 
 (defvar gnus-article-prepare-hook nil
-  "A hook called after an article has been prepared in the article buffer.
+  "*A hook called after an article has been prepared in the article buffer.
 If you want to run a special decoding program like nkf, use this hook.")
 
 (defvar gnus-article-display-hook nil
-  "A hook called after the article is displayed in the article buffer.
+  "*A hook called after the article is displayed in the article buffer.
 The hook is designed to change the contents of the article
 buffer. Typical functions that this hook may contain are
 `gnus-article-hide-headers' (hide selected headers),
@@ -1011,8 +1028,13 @@ buffer. Typical functions that this hook may contain are
 (add-hook 'gnus-article-display-hook 'gnus-article-hide-headers-if-wanted)
 (add-hook 'gnus-article-display-hook 'gnus-article-treat-overstrike)
 
+(defconst gnus-article-x-face-command "uncompface | ikon2xbm | xv -"
+  "String or function to be executed to display an X-Face header.
+If it is a string, the command will be executed in a sub-shell
+asynchronously. The compressed face will be piped to this command.") 
+
 (defvar gnus-select-group-hook nil
-  "A hook called when a newsgroup is selected.
+  "*A hook called when a newsgroup is selected.
 
 If you'd like to simplify subjects like the
 `gnus-summary-next-same-subject' command does, you can use the
@@ -1030,12 +1052,12 @@ following hook:
 
 (defvar gnus-select-article-hook
   '(gnus-summary-show-thread)
-  "A hook called when an article is selected.
+  "*A hook called when an article is selected.
 The default hook shows conversation thread subtrees of the selected
 article automatically using `gnus-summary-show-thread'.")
 
 (defvar gnus-apply-kill-hook '(gnus-apply-kill-file)
-  "A hook called to apply kill files to a group.
+  "*A hook called to apply kill files to a group.
 This hook is intended to apply a kill file to the selected newsgroup.
 The function `gnus-apply-kill-file' is called by default.
 
@@ -1054,40 +1076,40 @@ following hook:
 
 (defvar gnus-visual-mark-article-hook 
   (list 'gnus-visual-highlight-selected-summary)
-  "Hook run after selecting an article in the summary buffer.
+  "*Hook run after selecting an article in the summary buffer.
 It is meant to be used for highlighting the article in some way.  It
 is not run if `gnus-visual' is nil.")
 
 (defvar gnus-prepare-article-hook (list 'gnus-inews-insert-signature)
-  "A hook called after preparing body, but before preparing header headers.
+  "*A hook called after preparing body, but before preparing header headers.
 The default hook (`gnus-inews-insert-signature') inserts a signature
 file specified by the variable `gnus-signature-file'.")
 
 (defvar gnus-inews-article-hook (list 'gnus-inews-do-fcc)
-  "A hook called before finally posting an article.
+  "*A hook called before finally posting an article.
 The default hook (`gnus-inews-do-fcc') does FCC processing (ie. saves
 the article to a file).")
 
 (defvar gnus-inews-article-header-hook nil
-  "A hook called after inserting the headers in an article to be posted.
+  "*A hook called after inserting the headers in an article to be posted.
 The hook is called from the *post-news* buffer, narrowed to the
 headers.")
 
 (defvar gnus-exit-group-hook nil
-  "A hook called when exiting (not quitting) summary mode.")
+  "*A hook called when exiting (not quitting) summary mode.")
 
 (defvar gnus-suspend-gnus-hook nil
-  "A hook called when suspending (not exiting) Gnus.")
+  "*A hook called when suspending (not exiting) Gnus.")
 
 (defvar gnus-exit-gnus-hook nil
-  "A hook called when exiting Gnus.")
+  "*A hook called when exiting Gnus.")
 
 (defvar gnus-save-newsrc-hook nil
-  "A hook called when saving the newsrc file.")
+  "*A hook called when saving the newsrc file.")
 
 (defvar gnus-visual-summary-update-hook 
   (list 'gnus-visual-summary-highlight-line)
-  "A hook called when a summary line is changed.
+  "*A hook called when a summary line is changed.
 The hook will not be called if `gnus-visual' is nil.
 
 The default function `gnus-visual-summary-highlight-line' will
@@ -1095,7 +1117,7 @@ highlight the line according to the `gnus-visual-summary-highlight'
 variable.")
 
 (defvar gnus-mark-article-hook (list 'gnus-summary-mark-unread-as-read)
-  "A hook called when an article is selected for the first time.
+  "*A hook called when an article is selected for the first time.
 The hook is intended to mark an article as read (or unread)
 automatically when it is selected.")
 
@@ -1103,7 +1125,7 @@ automatically when it is selected.")
 ;; paths.el.
 
 (defvar gnus-default-nntp-server nil
-  "Specify a default NNTP server.
+  "*Specify a default NNTP server.
 This variable should be defined in paths.el, and should never be set
 by the user.
 If you want to change servers, you should use `gnus-select-method'.
@@ -1115,13 +1137,13 @@ See the documentation to that variable.")
 Should be set in paths.el, and shouldn't be touched by the user.")
 
 (defvar gnus-local-domain nil
-  "Local domain name without a host name.
+  "*Local domain name without a host name.
 The DOMAINNAME environment variable is used instead if it is defined.
 If the `system-name' function returns the full Internet name, there is
 no need to set this variable.")
 
 (defvar gnus-local-organization nil
-  "String with a description of what organization (if any) the user belongs to.
+  "*String with a description of what organization (if any) the user belongs to.
 The ORGANIZATION environment variable is used instead if it is defined.
 If this variable contains a function, this function will be called
 with the current newsgroup name as the argument. The function should
@@ -1131,13 +1153,13 @@ variable, or returned by the function) is a file name, the contents of
 this file will be used as the organization.")
 
 (defvar gnus-use-generic-from nil
-  "If nil, the full host name will be the system name prepended to the domain name.
+  "*If nil, the full host name will be the system name prepended to the domain name.
 If this is a string, the full host name will be this string.
 If this is non-nil, non-string, the domain name will be used as the
 full host name.")
 
 (defvar gnus-use-generic-path nil
-  "If nil, use the NNTP server name in the Path header.
+  "*If nil, use the NNTP server name in the Path header.
 If stringp, use this; if non-nil, use no host name (user name only).")
 
 \f
@@ -1178,6 +1200,7 @@ of the last succesful match.")
 
 (defvar gnus-score-cache nil)
 (defvar gnus-scores-articles nil)
+(defvar gnus-scores-exclude-files nil)
 (defvar gnus-header-index nil)
 (defvar gnus-score-index nil)
 
@@ -1264,7 +1287,7 @@ variable (string, integer, character, etc).")
 (defconst gnus-maintainer "Lars Magne Ingebrigtsen <larsi@ifi.uio.no>"
   "The mail address of the Gnus maintainer.")
 
-(defconst gnus-version "(ding) Gnus v0.50"
+(defconst gnus-version "(ding) Gnus v0.51"
   "Version number for this version of Gnus.")
 
 (defvar gnus-info-nodes
@@ -1279,14 +1302,19 @@ variable (string, integer, character, etc).")
 (defvar gnus-group-buffer "*Group*")
 (defvar gnus-summary-buffer "*Summary*")
 (defvar gnus-article-buffer "*Article*")
+(defvar gnus-server-buffer "*Server*")
 
 (defvar gnus-buffer-list nil
   "Gnus buffers that should be killed on exit.")
 
+(defvar gnus-server-alist nil
+  "List of available servers.")
+
 (defvar gnus-variable-list
   '(gnus-newsrc-options gnus-newsrc-options-n
-    gnus-newsrc-last-checked-date
-    gnus-newsrc-assoc gnus-killed-list gnus-zombie-list)
+    gnus-newsrc-last-checked-date 
+    gnus-newsrc-assoc gnus-server-alist
+    gnus-killed-list gnus-zombie-list)
   "Gnus variables saved in the quick startup file.")
 
 (defvar gnus-overload-functions
@@ -1356,6 +1384,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
 (defvar gnus-newsgroup-last-folder nil)
 (defvar gnus-newsgroup-last-file nil)
 (defvar gnus-newsgroup-auto-expire nil)
+(defvar gnus-newsgroup-active nil)
 
 (defvar gnus-newsgroup-unreads nil
   "List of unread articles in the current newsgroup.")
@@ -1439,7 +1468,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
     gnus-newsgroup-dependencies gnus-newsgroup-selected-overlay
     gnus-newsgroup-scored gnus-newsgroup-kill-headers
     gnus-score-alist gnus-current-score-file gnus-summary-expunge-below 
-    gnus-summary-mark-below
+    gnus-summary-mark-below gnus-newsgroup-active gnus-scores-exclude-files
     gnus-newsgroup-history gnus-newsgroup-ancient)
   "Variables that are buffer-local to the summary buffers.")
 
@@ -1459,6 +1488,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
   (autoload 'mail-position-on-field "sendmail")
   (autoload 'mail-setup "sendmail")
   (autoload 'news-mail-other-window "rnewspost")
+  (autoload 'news-reply-yank-original "rnewspost")
 
   (autoload 'gnus-mail-reply-using-mhe "gnus-mh")
   (autoload 'gnus-mail-forward-using-mhe "gnus-mh")
@@ -2087,6 +2117,7 @@ If optional argument RE-ONLY is non-nil, strip `Re:' only."
        gnus-newsgroup-headers-hashtb-by-number nil
        gnus-newsgroup-name nil
        gnus-internal-global-score-files nil
+       gnus-server-alist nil
        gnus-current-select-method nil)
   ;; Kill the startup file.
   (and gnus-current-startup-file
@@ -2096,6 +2127,8 @@ If optional argument RE-ONLY is non-nil, strip `Re:' only."
   ;; Kill global KILL file buffer.
   (if (get-file-buffer (gnus-newsgroup-kill-file nil))
       (kill-buffer (get-file-buffer (gnus-newsgroup-kill-file nil))))
+  (and (buffer-name nntp-server-buffer)
+       (kill-buffer nntp-server-buffer))
   ;; Kill Gnus buffers.
   (while gnus-buffer-list
     (if (and (get-buffer (car gnus-buffer-list))
@@ -2370,9 +2403,13 @@ If nothing is specified, use the variable gnus-overload-functions."
 
 ;; Check whether to use long file names.
 (defun gnus-use-long-file-name (symbol)
+  ;; The variable has to be set...
   (and gnus-use-long-file-name
+       ;; If it isn't a list, then we return t.
        (or (not (listp gnus-use-long-file-name))
-          (not (memq 'symbol gnus-use-long-file-name)))))
+          ;; If it is a list, and the list contains `symbol', we
+          ;; return nil.  
+          (not (memq symbol gnus-use-long-file-name)))))
 
 ;; List and range functions
 
@@ -2384,12 +2421,14 @@ If nothing is specified, use the variable gnus-overload-functions."
 
 (defun gnus-copy-sequence (list)
   "Do a complete, total copy of a list."
-  (mapcar (lambda (elem) (if (consp elem) 
-                            (if (consp (cdr elem))
-                                (gnus-copy-sequence elem)
-                              (cons (car elem) (cdr elem)))
-                          elem))
-         list))
+  (if (and (consp list) (not (consp (cdr list))))
+      (cons (car list) (cdr list))
+    (mapcar (lambda (elem) (if (consp elem) 
+                              (if (consp (cdr elem))
+                                  (gnus-copy-sequence elem)
+                                (cons (car elem) (cdr elem)))
+                            elem))
+           list)))
 
 (defun gnus-set-difference (list1 list2)
   "Return a list of elements of LIST1 that do not appear in LIST2."
@@ -2714,6 +2753,7 @@ Note: LIST has to be sorted over `<'."
   (define-key gnus-group-mode-map "?" 'gnus-group-describe-briefly)
   (define-key gnus-group-mode-map "\C-c\C-i" 'gnus-info-find-node)
   (define-key gnus-group-mode-map "\M-e" 'gnus-group-edit-group)
+  (define-key gnus-group-mode-map "^" 'gnus-group-enter-server-mode)
   (define-key gnus-group-mode-map
     (if gnus-xemacs [button2] [mouse-2]) 'gnus-mouse-pick-group)
 
@@ -2904,8 +2944,10 @@ If argument UNREAD is non-nil, groups with no unread articles are also listed."
                          (not (gnus-goto-char 
                                (text-property-any 
                                 (point-min) (point-max) 'gnus-group 
-                                (intern group)))))
-               (setq newsrc (cdr newsrc))))))
+                                (intern (car (car newsrc)))))))
+               (setq newsrc (cdr newsrc)))
+             (or newsrc (progn (goto-char (point-max))
+                               (forward-line -1))))))
       ;; Adjust cursor point.
       (gnus-group-position-cursor))))
 
@@ -2980,8 +3022,11 @@ If REGEXP, only list groups matching REGEXP."
 
 (defun gnus-group-prefixed-name (group method)
   "Return the whole name from GROUP and METHOD."
+  (and (stringp method) (setq method (gnus-server-to-method method)))
   (concat (format "%s" (car method))
-         (if (assoc (format "%s" (car method)) (gnus-methods-using 'address))
+         (if (and 
+              (assoc (format "%s" (car method)) (gnus-methods-using 'address))
+              (not (string= (nth 1 method) "")))
              (concat "+" (nth 1 method)))
          ":" group))
 
@@ -3104,6 +3149,7 @@ moves the point to the colon."
            ""))
         (moderated (if (member group gnus-moderated-list) ?m ? ))
         (moderated-string (if (eq moderated ?m) "(m)" ""))
+        (method (gnus-server-get-method group method))
         (news-server (or (car (cdr method)) ""))
         (news-method (or (car method) ""))
         (news-method-string 
@@ -3384,6 +3430,13 @@ If EXCLUDE-GROUP, do not go to that group."
   (goto-char (point-min))
   (gnus-group-next-unread-group 1))
 
+(defun gnus-group-enter-server-mode ()
+  "Jump to the server buffer."
+  (interactive)
+  (gnus-server-setup-buffer)
+  (switch-to-buffer gnus-server-buffer)
+  (gnus-server-prepare))
+
 (defun gnus-group-make-group (name method address)
   "Add a new newsgroup.
 The user will be prompted for a NAME, for a select METHOD, and an
@@ -3393,18 +3446,23 @@ ADDRESS."
     (read-string "Group name: ")
     (let ((method
           (completing-read 
-           "Method: " gnus-valid-select-methods nil t)))
-      (list method
-           (if (memq 'prompt-address
-                     (assoc method gnus-valid-select-methods))
-               (read-string "Address: ")
-             "")))))
-  (let ((nname (gnus-group-prefixed-name name (list (intern method) address)))
-       info)
+           "Method: " (append gnus-valid-select-methods gnus-server-alist)
+           nil t)))
+      (if (assoc method gnus-valid-select-methods)
+         (list method
+               (if (memq 'prompt-address
+                         (assoc method gnus-valid-select-methods))
+                   (read-string "Address: ")
+                 ""))
+       (list method nil)))))
+  
+  (let* ((meth (if address (list (intern method) address) method))
+        (nname (gnus-group-prefixed-name name meth))
+        info)
     (and (gnus-gethash nname gnus-active-hashtb)
         (error "Group %s already exists" nname))
     (gnus-group-change-level 
-     (setq info (list t nname 3 nil nil (list (intern method) address)))
+     (setq info (list t nname 3 nil nil meth))
      3 9 (gnus-gethash (or (gnus-group-group-name) "dummy.group")
                       gnus-newsrc-hashtb) t)
     (gnus-sethash nname '(0 . 0) gnus-active-hashtb)
@@ -3416,6 +3474,7 @@ ADDRESS."
         (gnus-request-create-group nname))))
 
 (defun gnus-group-edit-group (group)
+  "Edit the group on the current line."
   (interactive (list (gnus-group-group-name)))
   (let (info)
     (if group (setq info (nth 2 (gnus-gethash group gnus-newsrc-hashtb)))
@@ -4380,6 +4439,7 @@ and the second element is the address."
   (define-key gnus-summary-mode-map "\M-\C-d" 'gnus-summary-down-thread)
   (define-key gnus-summary-mode-map "&" 'gnus-summary-execute-command)
   (define-key gnus-summary-mode-map "c" 'gnus-summary-catchup-and-exit)
+  (define-key gnus-summary-mode-map "\C-w" 'gnus-summary-mark-region-as-read)
   (define-key gnus-summary-mode-map "\C-t" 'gnus-summary-toggle-truncation)
   (define-key gnus-summary-mode-map "?" 'gnus-summary-mark-as-dormant)
   (define-key gnus-summary-mode-map "\C-c\M-\C-s" 'gnus-summary-show-all-expunged)
@@ -4414,7 +4474,7 @@ and the second element is the address."
     (if gnus-xemacs [button2] [mouse-2]) 'gnus-mouse-pick-article)
   (define-key gnus-summary-mode-map "m" 'gnus-summary-mail-other-window)
   (define-key gnus-summary-mode-map "a" 'gnus-summary-post-news)
-  (define-key gnus-summary-mode-map "x" 'gnus-summary-delete-marked-as-read)
+  (define-key gnus-summary-mode-map "x" 'gnus-summary-remove-lines-marked-as-read)
 ; (define-key gnus-summary-mode-map "X" 'gnus-summary-remove-lines-marked-with)
   (define-key gnus-summary-mode-map "s" 'gnus-summary-isearch-article)
   (define-key gnus-summary-mode-map "t" 'gnus-summary-toggle-header)
@@ -4557,6 +4617,7 @@ and the second element is the address."
   (define-key gnus-summary-article-map "hw" 'gnus-article-word-wrap)
   (define-key gnus-summary-article-map "hd" 'gnus-article-remove-cr)
   (define-key gnus-summary-article-map "hq" 'gnus-article-de-quoted-unreadable)
+  (define-key gnus-summary-article-map "hf" 'gnus-article-display-x-face)
   (define-key gnus-summary-article-map "m" 'gnus-summary-toggle-mime)
   (define-key gnus-summary-article-map "s" 'gnus-summary-isearch-article)
 
@@ -4952,12 +5013,17 @@ If NO-ARTICLE is non-nil, no article is selected initially."
   (if (gnus-select-newsgroup group show-all)
       (progn
        (gnus-set-global-variables)
+       ;; Save the active value in effect when the group was entered.
+       (setq gnus-newsgroup-active 
+             (gnus-copy-sequence
+              (gnus-gethash gnus-newsgroup-name gnus-active-hashtb)))
        ;; You can change the subjects in this hook.
        (run-hooks 'gnus-select-group-hook)
-       ;; Do Score Processing.
+       ;; Do score processing.
        (gnus-score-headers)
        ;; Update the format specifiers.
        (gnus-update-format-specifications)
+       ;; Generate the summary buffer.
        (gnus-summary-prepare)
        (if (zerop (buffer-size))
            (cond (gnus-newsgroup-dormant
@@ -5445,15 +5511,16 @@ If READ-ALL is non-nil, all articles in the group are selected."
   (let* ((entry (gnus-gethash group gnus-newsrc-hashtb))
         (info (nth 2 entry))
         articles header-marks)
-    (and (eq (car entry) t)
-        (or (gnus-activate-newsgroup (car info))
-            (progn
-              (kill-buffer (current-buffer))
-              (error "Couldn't request group %s: %s" 
-                     group (gnus-status-message group)))))
-    (setq gnus-current-select-method (or (nth 4 info) gnus-select-method))
-    (gnus-check-news-server (nth 4 info))
-    (or (gnus-request-group group t)
+    (gnus-check-news-server
+     (setq gnus-current-select-method (gnus-find-method-for-group group)))
+
+    (or (gnus-server-opened gnus-current-select-method)
+       (gnus-open-server gnus-current-select-method)
+       (error "Couldn't open server"))
+    
+    (or (and (eq (car entry) t)
+            (gnus-activate-newsgroup (car info)))
+       (gnus-request-group group t)
        (progn
          (kill-buffer (current-buffer))
          (error "Couldn't request group %s: %s" 
@@ -5779,7 +5846,8 @@ The resulting hash table is returned, or nil if no Xrefs were found."
                       (assoc (symbol-name (car (gnus-find-method-for-group 
                                                 from-newsgroup)))
                              gnus-valid-select-methods)))
-       name entry read info xref-hashtb idlist active num range exps method)
+       name entry read info xref-hashtb idlist active num range exps method
+       nth4)
     (save-excursion
       (set-buffer gnus-group-buffer)
       (if (setq xref-hashtb 
@@ -5790,19 +5858,21 @@ The resulting hash table is returned, or nil if no Xrefs were found."
                 ()
               (setq idlist (symbol-value group))
               ;; Dead groups are not updated.
-              (if (and (setq entry (gnus-gethash name gnus-newsrc-hashtb)
-                             info (nth 2 entry))
+              (if (and (prog1 
+                           (setq entry (gnus-gethash name gnus-newsrc-hashtb)
+                                 info (nth 2 entry))
+                         (if (stringp (setq nth4 (nth 4 info)))
+                             (setq nth4 (gnus-server-to-method nth4))))
                        ;; Only do the xrefs if the group has the same
                        ;; select method as the group we have just read.
                        (or (gnus-methods-equal-p 
-                            (nth 4 info)
-                            (gnus-find-method-for-group from-newsgroup))
+                            nth4 (gnus-find-method-for-group from-newsgroup))
                            virtual
-                           (equal (nth 4 info) 
+                           (equal nth4 
                                   (setq method (gnus-find-method-for-group 
                                                 from-newsgroup)))
-                           (and (equal (car (nth 4 info)) (car method))
-                                (equal (nth 1 (nth 4 info)) (nth 1 method))))
+                           (and (equal (car nth4) (car method))
+                                (equal (nth 1 nth4) (nth 1 method))))
                        gnus-use-cross-reference
                        (or (not (eq gnus-use-cross-reference t))
                            virtual
@@ -7384,17 +7454,24 @@ If N is a positive number, respool the N next articles.
 If N is a negative number, respool the N previous articles.
 If N is nil and any articles have been marked with the process mark,
 respool those articles instead.
-For this function to work, both the current newsgroup and the
-newsgroup that you want to move to have to support the `request-move'
-and `request-accept' functions. (Ie. mail newsgroups at present.)"
+
+Respooling can be done both from mail groups and \"real\" newsgroups.
+In the former case, the articles in question will be moved from the
+current group into whatever groups they are destined to.  In the
+latter case, they will be copied into the relevant groups."
   (interactive "P")
   (gnus-set-global-variables)
-  (or respool-method
-      (setq respool-method
-           (completing-read
-            "What method do you want to use when respooling? "
-            (gnus-methods-using 'respool) nil t)))
-  (gnus-summary-move-article n nil (intern respool-method)))
+  (let ((respool-methods (gnus-methods-using 'respool)))
+    (or respool-method
+       (setq respool-method
+             (completing-read
+              "What method do you want to use when respooling? "
+              respool-methods nil t)))
+    (if (assoc (symbol-name
+               (car (gnus-find-method-for-group gnus-newsgroup-name)))
+              respool-methods)
+       (gnus-summary-copy-article n nil (intern respool-method)))
+    (gnus-summary-move-article n nil (intern respool-method))))
 
 ;; Suggested by gregj@unidata.com (Gregory J. Grubbs).
 (defun gnus-summary-copy-article (n &optional to-newsgroup select-method)
@@ -7435,7 +7512,7 @@ functions. (Ie. mail newsgroups at present.)"
     (or (gnus-check-backend-function 'request-accept-article 
                                     (or select-method to-newsgroup))
        (error "%s does not support article copying" to-newsgroup))
-    (message "Moving to %s: %s..." (or select-method to-newsgroup) articles)
+    (message "Copying to %s: %s..." (or select-method to-newsgroup) articles)
     (while articles
       (if (setq art-group
                (save-excursion
@@ -8007,6 +8084,29 @@ The difference between N and the number of marks cleared is returned."
       (memq gnus-current-article gnus-newsgroup-expirable)
       (gnus-summary-mark-as-read gnus-current-article gnus-read-mark)))
 
+(defun gnus-summary-mark-region-as-read (point mark all)
+  "Mark all unread articles between point and mark as read.
+If given a prefix, mark all articles between point and mark as read,
+even ticked and dormant ones."
+  (interactive "r\nP")
+  (save-excursion
+    (goto-char point)
+    (beginning-of-line)
+    (while (and 
+           (< (point) mark)
+           (progn
+             (and
+              (or all
+                  (and
+                   (not (memq (gnus-summary-article-number)
+                              gnus-newsgroup-marked))
+                   (not (memq (gnus-summary-article-number)
+                              gnus-newsgroup-dormant))))
+              (gnus-summary-mark-article
+               (gnus-summary-article-number) gnus-dread-mark))
+             t)
+           (zerop (forward-line 1))))))
+
 ;; Fix by Per Abrahamsen <amanda@iesd.auc.dk>.
 (defalias 'gnus-summary-delete-marked-as-read 
   'gnus-summary-remove-lines-marked-as-read)
@@ -8598,6 +8698,44 @@ save those articles instead."
   (let ((gnus-default-article-saver 'gnus-summary-save-in-folder))
     (gnus-summary-save-article arg)))
 
+(defun gnus-read-save-file-name (prompt default-name)
+  (let ((methods gnus-split-methods)
+       split-name)
+    (if (not gnus-split-methods)
+       ()
+      (save-excursion
+       (set-buffer gnus-article-buffer)
+       (gnus-narrow-to-headers)
+       (while methods
+         (goto-char (point-min))
+         (and (condition-case () 
+                  (re-search-forward (car (car methods)) nil t)
+                (error nil))
+              (setq split-name (cons (nth 1 (car methods)) split-name)))
+         (setq methods (cdr methods)))
+       (widen)))
+    (cond ((null split-name)
+          (read-file-name
+           (concat prompt " (default "
+                   (file-name-nondirectory default-name) ") ")
+           (file-name-directory default-name)
+           default-name))
+         ((= 1 (length split-name))
+          (read-file-name
+           (concat prompt " (default " (car split-name) ") ")
+           gnus-article-save-directory
+           (concat gnus-article-save-directory (car split-name))))
+         (t
+          (setq split-name (mapcar (lambda (el) (list el))
+                                   (nreverse split-name)))
+          (let ((result (completing-read 
+                         (concat prompt " ")
+                         split-name nil nil)))
+            (concat gnus-article-save-directory
+                    (if (string= result "")
+                        (car (car split-name))
+                      result)))))))
+
 (defun gnus-summary-save-in-rmail (&optional filename)
   "Append this article to Rmail file.
 Optional argument FILENAME specifies file name.
@@ -8608,12 +8746,8 @@ is initialized from the SAVEDIR environment variable."
          (funcall gnus-rmail-save-name gnus-newsgroup-name
                   gnus-current-headers gnus-newsgroup-last-rmail)))
     (or filename
-       (setq filename
-             (read-file-name
-              (concat "Save in rmail file: (default "
-                      (file-name-nondirectory default-name) ") ")
-              (file-name-directory default-name)
-              default-name)))
+       (setq filename (gnus-read-save-file-name 
+                       "Save in rmail file:" default-name)))
     (gnus-make-directory (file-name-directory filename))
     (gnus-eval-in-buffer-window 
      gnus-article-buffer
@@ -8634,12 +8768,8 @@ is initialized from the SAVEDIR environment variable."
          (funcall gnus-mail-save-name gnus-newsgroup-name
                   gnus-current-headers gnus-newsgroup-last-mail)))
     (or filename
-       (setq filename
-             (read-file-name
-              (concat "Save in Unix mail file: (default "
-                      (file-name-nondirectory default-name) ") ")
-              (file-name-directory default-name)
-              default-name)))
+       (setq filename (gnus-read-save-file-name 
+                       "Save in Unix mail file:" default-name)))
     (setq filename
          (expand-file-name filename
                            (and default-name
@@ -8666,12 +8796,8 @@ is initialized from the SAVEDIR environment variable."
          (funcall gnus-file-save-name gnus-newsgroup-name
                   gnus-current-headers gnus-newsgroup-last-file)))
     (or filename
-       (setq filename
-             (read-file-name
-              (concat "Save in file: (default "
-                      (file-name-nondirectory default-name) ") ")
-              (file-name-directory default-name)
-              default-name)))
+       (setq filename (gnus-read-save-file-name 
+                       "Save in file:" default-name)))
     (gnus-make-directory (file-name-directory filename))
     (gnus-eval-in-buffer-window 
      gnus-article-buffer
@@ -8728,6 +8854,7 @@ is initialized from the SAVEDIR environment variable."
                          'gnus-mark gnus-unread-mark
                          'gnus-pseudo (car pslist)
                          'gnus-thread 0))
+         (forward-line -1)
          (gnus-sethash (int-to-string gnus-reffed-article-number)
                        (car pslist) gnus-newsgroup-headers-hashtb-by-number)
          (setq gnus-reffed-article-number (1- gnus-reffed-article-number))
@@ -9418,7 +9545,7 @@ please do mail it to me."
 
 ;; Written by Per Abrahamsen <amanda@iesd.auc.dk>.
 (defun gnus-article-treat-overstrike ()
-  ;; Prepare article for overstrike commands.
+  "Translate overstrikes into bold text."
   (interactive)
   (save-excursion
     (set-buffer gnus-article-buffer)
@@ -9456,6 +9583,7 @@ please do mail it to me."
          (end-of-line 2))))))
 
 (defun gnus-article-remove-cr ()
+  "Remove carriage returns from an article."
   (interactive)
   (save-excursion
     (set-buffer gnus-article-buffer)
@@ -9464,7 +9592,39 @@ please do mail it to me."
       (while (search-forward "\r" nil t)
        (replace-match "")))))
 
+(defun gnus-article-display-x-face ()
+  "Look for an X-Face header and display it if present."
+  (interactive)
+  (save-excursion
+    (set-buffer gnus-article-buffer)
+    (goto-char (point-min))
+    (if (or (not gnus-article-x-face-command)
+           (not (re-search-forward "^X-Face: " nil t)))
+       ()
+      (let ((face
+            (buffer-substring
+             (point) 
+             (progn
+               (forward-line 1)
+               (while (and (looking-at "[ \t]") 
+                           (zerop (forward-line 1))))
+               (point))))
+           (command gnus-article-x-face-command))
+       (if (symbolp command)
+           (and (or (fboundp command) (error "%s is not a function" command))
+                (funcall command face))
+         (let ((process (start-process "gnus-x-face" nil "sh" "-c" command)))
+           (if process
+               (progn
+                 (process-send-string process face)
+                 (process-send-eof process))
+             (error "Couldn't start process"))))))))
+             
 (defun gnus-article-de-quoted-unreadable ()
+  "Do a naive translation of a quoted-printable-encoded article.
+This is in no way, shape or form meant as a replacement for real MIME
+processing, but is simply a stop-gap measure until MIME support is
+written."
   (interactive)
   (save-excursion
     (save-restriction
@@ -10012,6 +10172,7 @@ If NEWSGROUP is nil, return the global kill file name instead."
                                        (gnus-score-load-file file)) 
                                      files))))
       (and eval (not global) (eval eval))
+      (setq gnus-scores-exclude-files exclude-files)
       (if orphan (setq gnus-orphan-score (car orphan)))
       (setq gnus-summary-mark-below 
            (or mark mark-and-expunge gnus-summary-mark-below))
@@ -10160,9 +10321,23 @@ If NEWSGROUP is nil, return the global kill file name instead."
     ;; Load the SCORE files.
     (while score-files
       (if (stringp (car score-files))
+         ;; It is a string, which means that it's a score file name,
+         ;; so we load the score file and add the score alist to
+         ;; the list of alists.
          (setq scores (nconc (gnus-score-load-file (car score-files)) scores))
+       ;; It is an alist, so we just add it to the list directly.
        (setq scores (nconc (car score-files) scores)))
       (setq score-files (cdr score-files)))
+    ;; Prune the score files that are to be excluded, if any.
+    (if (not gnus-scores-exclude-files)
+       ()
+      (let ((s scores)
+           c)
+       (while s
+         (and (setq c (rassq (car s) gnus-score-cache))
+              (member (car c) gnus-scores-exclude-files)
+              (setq scores (delq (car s) scores)))
+         (setq s (cdr s)))))
     (if (not (and gnus-summary-default-score
                  scores
                  (> (length gnus-newsgroup-headers)
@@ -11023,10 +11198,7 @@ Type \\[describe-mode] in the buffer to get a list of commands."
            (re-search-forward 
             (concat "^" (regexp-quote mail-header-separator) "$"))
            (forward-line 1)
-           (if yank 
-               (save-excursion
-                 (run-hooks 'news-reply-header-hook)
-                 (mail-yank-original nil)))
+           (and yank (save-excursion (news-reply-yank-original nil)))
            (if gnus-post-prepare-function
                (funcall gnus-post-prepare-function group))))))
   (setq gnus-article-check-size (cons (buffer-size) (gnus-article-checksum)))
@@ -11295,7 +11467,8 @@ will attempt to use the foreign server to post the article."
 (defun gnus-cancel-news ()
   "Cancel an article you posted."
   (interactive)
-  (if (gnus-yes-or-no-p "Do you really want to cancel this article? ")
+  (if (or gnus-expert-user
+         (gnus-yes-or-no-p "Do you really want to cancel this article? "))
       (let ((from nil)
            (newsgroups nil)
            (message-id nil)
@@ -11332,7 +11505,9 @@ will attempt to use the foreign server to post the article."
            (message "Canceling your article...")
            (if (gnus-inews-article)
                (message "Canceling your article... done")
-             (ding) (message "Failed to cancel your article"))
+             (ding) 
+             (message "Cancel failed; %s" 
+                      (gnus-status-message gnus-newsgroup-name)))
            ;; Kill the article buffer.
            (kill-buffer (current-buffer)))))))
 
@@ -11370,7 +11545,7 @@ will attempt to use the foreign server to post the article."
       (goto-char (point-min))
       (re-search-forward
        (concat "^" (regexp-quote mail-header-separator) "$"))
-      (replace-match "\n\n")
+      (replace-match "")
       ;; This hook may insert a signature.
       (run-hooks 'gnus-prepare-article-hook)
       ;; Run final inews hooks.  This hook may do FCC.
@@ -11402,7 +11577,7 @@ Headers in `gnus-required-headers' will be generated."
        (X-Newsreader gnus-version)
        (headers gnus-required-headers)
        (case-fold-search t)
-       header value)
+       header value elem)
     ;; First we remove any old Message-IDs. This might be slightly
     ;; fascist, but if the user really wants to generate Message-IDs
     ;; by herself, she should remove it from the `gnus-required-list'. 
@@ -11413,7 +11588,7 @@ Headers in `gnus-required-headers' will be generated."
                        (progn (forward-line 1) (point))))
     ;; Remove NNTP-posting-host.
     (goto-char (point-min))
-    (and (re-search-forward "nntp-posting-host^:" nil t)
+    (and (re-search-forward "^nntp-posting-host:" nil t)
         (delete-region (progn (beginning-of-line) (point))
                        (progn (forward-line 1) (point))))
     ;; Insert new Sender if the From is strange. 
@@ -11458,17 +11633,31 @@ Headers in `gnus-required-headers' will be generated."
     ;; Distribution. 
     (while headers
       (goto-char (point-min))
-      (setq header (car headers))
+      (setq elem (car headers))
+      (if (consp elem)
+         (setq header (car elem))
+       (setq header elem))
       (if (or (not (re-search-forward 
                    (concat "^" (downcase (symbol-name header)) ":") nil t))
              (progn
                (if (= (following-char) ? ) (forward-char 1) (insert " "))
                (looking-at "[ \t]*$")))
          (progn
-           (setq value (or (and (boundp header) (symbol-value header))
-                           (read-from-minibuffer
-                            (format "Empty header for %s; enter value: " 
-                                    header))))
+           (setq value 
+                 (or (if (consp elem)
+                         ;; The element is a cons.  Either the cdr is
+                         ;; a string to be inserted verbatim, or it
+                         ;; is a function, and we insert the value
+                         ;; returned from this function.
+                         (or (and (stringp (cdr elem)) (cdr elem))
+                             (and (fboundp (cdr elem)) (funcall (cdr elem))))
+                       ;; The element is a symbol.  We insert the
+                       ;; value of this symbol, if any.
+                       (and (boundp header) (symbol-value header)))
+                     ;; We couldn't generate a value for this header,
+                     ;; so we just ask the user.
+                     (read-from-minibuffer
+                      (format "Empty header for %s; enter value: " header))))
            (if (bolp)
                (save-excursion
                  (goto-char (point-max))
@@ -12183,6 +12372,8 @@ If CONFIRM is non-nil, the user will be asked for an NNTP server."
 (defun gnus-check-news-server (method)
   "If the news server is down, start it up again."
   (let ((method (if method method gnus-select-method)))
+    (and (stringp method)
+        (setq method (gnus-server-to-method method)))
     (if (gnus-server-opened method)
        ;; Stream is already opened.
        t
@@ -12204,6 +12395,8 @@ is returned insted of the status string."
        status message)))
 
 (defun gnus-get-function (method function)
+  (and (stringp method)
+       (setq method (gnus-server-to-method method)))
   (let ((func (intern (format "%s-%s" (car method) function))))
     (if (not (fboundp func)) 
        (progn
@@ -12212,9 +12405,11 @@ is returned insted of the status string."
              (error "No such function: %s" func))))
     func))
 
-;; Specifying port number suggested by Stephane Laveau <laveau@corse.inria.fr>.
+;;; Interface functions to the backends.
+
 (defun gnus-open-server (method)
-  (apply (gnus-get-function method 'open-server) (cdr method)))
+  (funcall (gnus-get-function method 'open-server)
+          (nth 1 method) (nthcdr 2 method)))
 
 (defun gnus-close-server (method)
   (funcall (gnus-get-function method 'close-server) (nth 1 method)))
@@ -12297,6 +12492,8 @@ is returned insted of the status string."
                respect-poster))))
 
 (defun gnus-request-post (method &optional force)
+  (and (stringp method)
+       (setq method (gnus-server-to-method method)))
   (and (not force) gnus-post-method
        (memq 'post (assoc (format "%s" (car method))
                          gnus-valid-select-methods))
@@ -12334,16 +12531,34 @@ is returned insted of the status string."
     (funcall (gnus-get-function method 'request-create-group) 
             (gnus-group-real-name group) (nth 1 method))))
 
-
 (defun gnus-find-method-for-group (group)
   (or gnus-override-method
       (and (not group)
           gnus-select-method)
-      (let ((info (nth 2 (gnus-gethash group gnus-newsrc-hashtb))))
+      (let ((info (nth 2 (gnus-gethash group gnus-newsrc-hashtb)))
+           method)
        (if (or (not info)
-               (not (nth 4 info)))
-           gnus-select-method
-         (nth 4 info)))))
+               (not (setq method (nth 4 info))))
+           (setq method gnus-select-method)
+         (setq method
+               (cond ((stringp method)
+                      (gnus-server-to-method method))
+                     ((stringp (car method))
+                      (gnus-server-extend-method group method))
+                     (t
+                      method))))
+       (let ((method-name (symbol-name (car method))))
+         (if (and (memq 'address (assoc method-name 
+                                        gnus-valid-select-methods))
+                  (not (assq (intern (concat method-name "-address"))
+                             method)))
+             (setq method 
+                   (append method 
+                           (list (list (intern (concat 
+                                                method-name "-address"))
+                                       (nth 1 method)))))))
+       method)))
+
 
 (defun gnus-check-backend-function (func group)
   (let ((method (if (stringp group) (car (gnus-find-method-for-group group))
@@ -12933,7 +13148,8 @@ newsgroup."
 UNREAD and TICKED lists.
 Note: UNSELECTED has to be sorted over `<'.
 Returns whether the updating was successful."
-  (let* ((active (gnus-gethash group gnus-active-hashtb))
+  (let* ((active (or gnus-newsgroup-active 
+                    (gnus-gethash group gnus-active-hashtb)))
         (entry (gnus-gethash group gnus-newsrc-hashtb))
         (number (car entry))
         (info (nth 2 entry))
@@ -13412,40 +13628,38 @@ If FORCE is non-nil, the .newsrc file is read."
   ;; from the variable gnus-newsrc-assoc.
   (and (or gnus-newsrc-assoc gnus-killed-list)
        gnus-current-startup-file
-       (save-excursion
-        (if (or (not gnus-dribble-buffer)
-                (not (buffer-name gnus-dribble-buffer))
-                (zerop (save-excursion
-                         (set-buffer gnus-dribble-buffer)
-                         (buffer-size))))
-            (message "(No changes need to be saved)")
-          (if gnus-save-newsrc-file
-              (let ((make-backup-files t)
-                    (version-control nil)
-                    (require-final-newline t)) ;Don't ask even if requested.
-                (message "Saving %s..." gnus-current-startup-file)
-                ;; Make backup file of master newsrc.
-                ;; You can stop or change version control of backup file.
-                ;; Suggested by jason@violet.berkeley.edu.
-                (run-hooks 'gnus-save-newsrc-hook)
-                (gnus-gnus-to-newsrc-format)
-                (message "Saving %s... done" gnus-current-startup-file)))
-          ;; Quickly loadable .newsrc.
-          (set-buffer (get-buffer-create " *Gnus-newsrc*"))
-          (gnus-add-current-to-buffer-list)
-          (buffer-disable-undo (current-buffer))
-          (erase-buffer)
-          (message "Saving %s.eld..." gnus-current-startup-file)
-          (gnus-gnus-to-quick-newsrc-format)
-          (let ((make-backup-files nil)
-                (version-control nil)
-                (require-final-newline t)) ;Don't ask even if requested.
+       (let ((make-backup-files t)
+            (version-control nil)
+            (require-final-newline t)) ;Don't ask even if requested.
+        ;; You can stop or change version control of backup file.
+        ;; Suggested by jason@violet.berkeley.edu.
+        (run-hooks 'gnus-save-newsrc-hook)
+        (save-excursion
+          (if (or (not gnus-dribble-buffer)
+                  (not (buffer-name gnus-dribble-buffer))
+                  (zerop (save-excursion
+                           (set-buffer gnus-dribble-buffer)
+                           (buffer-size))))
+              (message "(No changes need to be saved)")
+            (if gnus-save-newsrc-file
+                (progn
+                  (message "Saving %s..." gnus-current-startup-file)
+                  ;; Make backup file of master newsrc.
+                  (gnus-gnus-to-newsrc-format)
+                  (message "Saving %s... done" gnus-current-startup-file)))
+            ;; Quickly loadable .newsrc.
+            (set-buffer (get-buffer-create " *Gnus-newsrc*"))
+            (gnus-add-current-to-buffer-list)
+            (buffer-disable-undo (current-buffer))
+            (erase-buffer)
+            (message "Saving %s.eld..." gnus-current-startup-file)
+            (gnus-gnus-to-quick-newsrc-format)
             (write-region 1 (point-max) 
                           (concat gnus-current-startup-file ".eld") 
-                          nil 'nomesg))
-          (kill-buffer (current-buffer))
-          (message "Saving %s.eld... done" gnus-current-startup-file)
-          (gnus-dribble-delete-file)))))
+                          nil 'nomesg)
+            (kill-buffer (current-buffer))
+            (message "Saving %s.eld... done" gnus-current-startup-file)
+            (gnus-dribble-delete-file))))))
 
 (defun gnus-gnus-to-quick-newsrc-format ()
   "Insert Gnus variables such as gnus-newsrc-assoc in lisp format."
@@ -13548,6 +13762,292 @@ If FORCE is non-nil, the .newsrc file is read."
         (and (looking-at "[^ \t]+[ \t]+\\(.*\\)")
              (buffer-substring (match-beginning 1) (match-end 1))))))
 
+;;;
+;;; Server
+;;;
+
+(defvar gnus-server-mode-hook nil
+  "Hook run in `gnus-server-mode' buffers.")
+
+(defconst gnus-server-line-format "     {%(%h:%w%)}\n"
+  "Format of server lines.
+It works along the same lines as a normal formatting string,
+with some simple extensions.")
+
+(defvar gnus-server-mode-line-format "(ding) List of servers"
+  "The format specification for the server mode line.")
+
+(defconst gnus-server-line-format-alist
+  (list (list ?h 'how ?s)
+       (list ?n 'name ?s)
+       (list ?w 'where ?s)
+       ))
+
+(defconst gnus-server-mode-line-format-alist 
+  (list (list ?S 'news-server ?s)
+       (list ?M 'news-method ?s)
+       (list ?u 'user-defined ?s)))
+
+(defvar gnus-server-line-format-spec nil)
+(defvar gnus-server-mode-line-format-spec nil)
+(defvar gnus-server-killed-servers nil)
+
+(defvar gnus-server-mode-map nil)
+(put 'gnus-server-mode 'mode-class 'special)
+
+(if gnus-server-mode-map
+    nil
+  (setq gnus-server-mode-map (make-sparse-keymap))
+  (suppress-keymap gnus-server-mode-map)
+  (define-key gnus-server-mode-map " " 'gnus-server-read-server)
+  (define-key gnus-server-mode-map "q" 'gnus-server-exit)
+  (define-key gnus-server-mode-map "l" 'gnus-server-list-servers)
+  (define-key gnus-server-mode-map "k" 'gnus-server-kill-server)
+  (define-key gnus-server-mode-map "y" 'gnus-server-yank-server)
+  (define-key gnus-server-mode-map "c" 'gnus-server-copy-server)
+  (define-key gnus-server-mode-map "a" 'gnus-server-add-server)
+  (define-key gnus-server-mode-map "e" 'gnus-server-edit-server))
+
+(defun gnus-server-mode ()
+  "Major mode for listing and editing servers.
+
+All normal editing commands are switched off.
+\\<gnus-server-mode-map>
+
+For more in-depth information on this mode, read the manual (`\\[gnus-info-find-node]'). 
+
+The following commands are available:
+
+\\{gnus-server-mode-map}"
+  (interactive)
+;  (if gnus-visual (gnus-server-make-menu-bar))
+  (kill-all-local-variables)
+  (setq mode-line-modified "-- ")
+  (make-local-variable 'mode-line-format)
+  (setq mode-line-format (copy-sequence mode-line-format))
+  (and (equal (nth 3 mode-line-format) "   ")
+       (setcar (nthcdr 3 mode-line-format) ""))
+  (setq major-mode 'gnus-server-mode)
+  (setq mode-name "Server")
+;  (gnus-group-set-mode-line)
+  (setq mode-line-process nil)
+  (use-local-map gnus-server-mode-map)
+  (buffer-disable-undo (current-buffer))
+  (setq truncate-lines t)
+  (setq buffer-read-only t)
+  (run-hooks 'gnus-server-mode-hook))
+
+(defun gnus-server-insert-server-line (sformat name method)
+  (let* ((sformat (or sformat gnus-server-line-format-spec))
+        (how (car method))
+        (where (nth 1 method))
+        b)
+    (beginning-of-line)
+    (setq b (point))
+    ;; Insert the text.
+    (insert (eval sformat))
+    (add-text-properties 
+     b (1+ b) (list 'gnus-server (intern name)))))
+
+(defun gnus-server-setup-buffer ()
+  (if (get-buffer gnus-server-buffer)
+      ()
+    (save-excursion
+      (set-buffer (get-buffer-create gnus-server-buffer))
+      (gnus-server-mode))))
+
+(defun gnus-server-prepare ()
+  (setq gnus-server-mode-line-format-spec 
+       (gnus-parse-format gnus-server-mode-line-format 
+                          gnus-server-mode-line-format-alist))
+  (setq gnus-server-line-format-spec 
+       (gnus-parse-format gnus-server-line-format 
+                          gnus-server-line-format-alist))
+  (let ((alist gnus-server-alist)
+       (buffer-read-only nil))
+    (erase-buffer)
+    (while alist
+      (gnus-server-insert-server-line nil (car (car alist)) (cdr (car alist)))
+      (setq alist (cdr alist))))
+  (goto-char (point-min))
+  (gnus-server-position-cursor))
+
+(defun gnus-server-server-name ()
+  (let ((server (get-text-property 
+                (save-excursion (beginning-of-line) (point)) 'gnus-server)))
+    (and server (symbol-name server))))
+
+(defalias 'gnus-server-position-cursor 'gnus-goto-colon)
+
+(defvar gnus-winconf-edit-server nil)
+(defconst gnus-server-edit-buffer "*Gnus edit server*")
+
+(defun gnus-server-update-server (server)
+  (save-excursion
+    (set-buffer gnus-server-buffer)
+    (let ((buffer-read-only nil)
+         (info (cdr (assoc server gnus-server-alist))))
+      (gnus-dribble-enter 
+       (concat "(gnus-server-set-info \"" server "\" '"
+              (prin1-to-string info) ")"))
+      ;; Buffer may be narrowed.
+      (save-restriction
+       (widen)
+       (if (gnus-server-goto-server server)
+           (delete-region (progn (beginning-of-line) (point))
+                          (progn (forward-line 1) (point))))
+       (let ((entry (assoc server gnus-server-alist)))
+         (gnus-server-insert-server-line nil (car entry) (cdr entry))
+         (gnus-server-position-cursor))))))
+
+(defun gnus-server-set-info (info)
+  (gnus-dribble-enter 
+   (concat "(gnus-server-set-info '"
+          (prin1-to-string info) ")"))
+  (let* ((server (nth 1 info))
+        (entry (assoc server gnus-server-alist)))
+    (if entry (setcdr entry info)
+      (setq gnus-server-alist
+           (nconc gnus-server-alist (list (cons server info)))))))
+
+(defun gnus-server-to-method (server)
+  (cdr (assoc server gnus-server-alist)))
+
+(defun gnus-server-extend-method (group method)
+  (let ((entry
+        (gnus-copy-sequence (cdr (assoc (car method) gnus-server-alist)))))
+    (setcar (cdr entry) (concat (nth 1 entry) "+" group))
+    (nconc entry (cdr method))))
+
+(defun gnus-server-get-method (group method)
+  (cond ((stringp method)
+        (gnus-server-to-method method))
+       ((stringp (car method))
+        (gnus-server-extend-method group method))
+       (t
+        method)))
+
+;;; Interactive server functions.
+
+(defun gnus-server-kill-server (server)
+  "Kill the server on the current line."
+  (interactive (list (gnus-server-server-name)))
+  (or (gnus-server-goto-server server)
+      (if server (error "No such server: %s" server)
+       (error "No server on the current line")))
+  (let ((buffer-read-only nil))
+    (delete-region (progn (beginning-of-line) (point))
+                  (progn (forward-line 1) (point))))
+  (setq gnus-server-killed-servers 
+       (cons (assoc server gnus-server-alist) gnus-server-killed-servers))
+  (setq gnus-server-alist (delq (car gnus-server-killed-servers)
+                               gnus-server-alist))
+  (gnus-server-position-cursor))
+
+(defun gnus-server-yank-server ()
+  "Yank the previously killed server."
+  (interactive)
+  (or gnus-server-killed-servers
+      (error "No killed servers to be yanked"))
+  (let ((alist gnus-server-alist)
+       (server (gnus-server-server-name))
+       (killed (car gnus-server-killed-servers)))
+    (if (not server) 
+       (setq gnus-server-alist (nconc gnus-server-alist (list killed)))
+      (if (string= server (car (car gnus-server-alist)))
+         (setq gnus-server-alist (cons killed gnus-server-alist))
+       (while (and (cdr alist)
+                   (not (string= server (car (car (cdr alist))))))
+         (setq alist (cdr alist)))
+       (setcdr alist (cons killed (cdr alist)))))
+    (gnus-server-update-server (car killed))
+    (setq gnus-server-killed-servers (cdr gnus-server-killed-servers))
+    (gnus-server-position-cursor)))
+
+(defun gnus-server-exit ()
+  "Return to the group buffer."
+  (interactive)
+  (kill-buffer (current-buffer))
+  (switch-to-buffer gnus-group-buffer))
+
+(defun gnus-server-list-servers ()
+  "List all available servers."
+  (interactive)
+  (let ((cur (gnus-server-server-name)))
+    (gnus-server-prepare)
+    (if cur (gnus-server-goto-server cur)
+      (goto-char (point-max))
+      (forward-line -1))
+    (gnus-server-position-cursor)))
+
+(defun gnus-server-copy-server (from to)
+  (interactive
+   (list
+    (or (gnus-server-server-name)
+       (error "No server on the current line"))
+    (read-string "Copy to: ")))
+  (or from (error "No server on current line"))
+  (or (and to (not (string= to ""))) (error "No name to copy to"))
+  (and (assoc to gnus-server-alist) (error "%s already exists" to))
+  (or (assoc from gnus-server-alist) 
+      (error "%s: no such server" from))
+  (let ((to-entry (gnus-copy-sequence (assoc from gnus-server-alist))))
+    (setcar to-entry to)
+    (setcar (nthcdr 2 to-entry) to)
+    (setq gnus-server-killed-servers 
+         (cons to-entry gnus-server-killed-servers))
+    (gnus-server-yank-server)))
+
+(defun gnus-server-add-server (how where)
+  (interactive 
+   (list (intern (completing-read "Server method: "
+                                 gnus-valid-select-methods nil t))
+        (read-string "Server name: ")))
+  (setq gnus-server-killed-servers 
+       (cons (list where how where) gnus-server-killed-servers))
+  (gnus-server-yank-server))
+
+(defun gnus-server-goto-server (server)
+  "Jump to a server line."
+  (interactive
+   (list (completing-read "Goto server: " gnus-server-alist nil t)))
+  (let ((to (text-property-any (point-min) (point-max) 
+                              'gnus-server (intern server))))
+    (and to
+        (progn
+          (goto-char to) 
+          (gnus-server-position-cursor)))))
+
+(defun gnus-server-edit-server (server)
+  "Edit the server on the current line."
+  (interactive (list (gnus-server-server-name)))
+  (or server
+      (error "No server on current line"))
+  (setq gnus-winconf-edit-server (current-window-configuration))
+  (pop-to-buffer (get-buffer-create gnus-server-edit-buffer))
+  (gnus-add-current-to-buffer-list)
+  (emacs-lisp-mode)
+  (use-local-map (copy-keymap (current-local-map)))
+  (local-set-key "\C-c\C-c" 'gnus-server-edit-server-done)
+  (erase-buffer)
+  (insert ";; Type `C-c C-c' after you have edited the server.\n\n")
+  (insert "(gnus-server-set-info \n  "
+         (pp-to-string (list 'quote (cdr (assoc server gnus-server-alist))))
+         "  )\n"))
+
+(defun gnus-server-edit-server-done ()
+  (interactive)
+  (set-buffer (get-buffer-create gnus-server-edit-buffer))
+  (eval-current-buffer)
+  (kill-buffer (current-buffer))
+  (and gnus-winconf-edit-server
+       (set-window-configuration gnus-winconf-edit-server))
+  (setq gnus-winconf-edit-server nil)
+  (set-buffer gnus-server-buffer)
+  (gnus-server-update-server (gnus-server-server-name))
+  (gnus-server-position-cursor))
+
+
 (provide 'gnus)
 
 ;;; gnus.el ends here
index 9c1903d..c2c1d18 100644 (file)
@@ -39,7 +39,7 @@
   "The name of the active file for the mail box.")
 
 (defvar nnbabyl-get-new-mail t
-  "If non-nil, nnml will check the incoming mail file and split the mail.")
+  "If non-nil, nnbabyl will check the incoming mail file and split the mail.")
 
 \f
 
 (defconst nnbabyl-version "nnbabyl 0.1"
   "nnbabyl version.")
 
-(defvar nnbabyl-current-group nil
-  "Current nnbabyl news group directory.")
-
 (defconst nnbabyl-mbox-buffer " *nnbabyl mbox buffer*")
 
+(defvar nnbabyl-current-group nil)
 (defvar nnbabyl-status-string "")
-
 (defvar nnbabyl-group-alist nil)
 
+\f
+
+(defvar nnbabyl-current-server nil)
+(defvar nnbabyl-server-alist nil)
+(defvar nnbabyl-server-variables 
+  (list
+   (list 'nnbabyl-mbox-file nnbabyl-mbox-file)
+   (list 'nnbabyl-active-file nnbabyl-active-file)
+   (list 'nnbabyl-get-new-mail nnbabyl-get-new-mail)
+   '(nnbabyl-current-group nil)
+   '(nnbabyl-status-string "")
+   '(nnbabyl-group-alist nil)))
+
+\f
+
 ;;; Interface functions
 
 (defun nnbabyl-retrieve-headers (sequence &optional newsgroup server)
        (replace-match " " t t))
       'headers)))
 
-(defun nnbabyl-open-server (host &optional service)
-  (setq nnbabyl-status-string "")
-  (setq nnbabyl-group-alist nil)
-  (nnheader-init-server-buffer))
+(defun nnbabyl-open-server (server &optional defs)
+  (nnheader-init-server-buffer)
+  (if (equal server nnbabyl-current-server)
+      t
+    (if nnbabyl-current-server
+       (setq nnbabyl-server-alist 
+             (cons (list nnbabyl-current-server
+                         (nnheader-save-variables nnbabyl-server-variables))
+                   nnbabyl-server-alist)))
+    (let ((state (assoc server nnbabyl-server-alist)))
+      (if state 
+         (progn
+           (nnheader-restore-variables (nth 1 state))
+           (setq nnbabyl-server-alist (delq state nnbabyl-server-alist)))
+       (nnheader-set-init-variables nnbabyl-server-variables defs)))
+    (setq nnbabyl-current-server server)))
 
 (defun nnbabyl-close-server (&optional server)
   t)
 
 (defun nnbabyl-server-opened (&optional server)
-  (and nntp-server-buffer
-       (get-buffer nntp-server-buffer)))
+  (equal server nnbabyl-current-server))
 
 (defun nnbabyl-status-message (&optional server)
   nnbabyl-status-string)
index 7a63080..b9140fd 100644 (file)
 (defmacro nnfolder-article-string (article)
   (` (concat "\n" nnfolder-article-marker (int-to-string (, article)) "")))
 
+\f
+
+(defvar nnfolder-current-server nil)
+(defvar nnfolder-server-alist nil)
+(defvar nnfolder-server-variables 
+  (list 
+   (list 'nnfolder-directory nnfolder-directory)
+   (list 'nnfolder-active-file nnfolder-active-file)
+   (list 'nnfolder-newsgroups-file nnfolder-newsgroups-file)
+   (list 'nnfolder-get-new-mail nnfolder-get-new-mail)
+   '(nnfolder-current-group nil)
+   '(nnfolder-current-buffer nil)
+   '(nnfolder-status-string "")
+   '(nnfolder-group-alist nil)
+   '(nnfolder-buffer-alist nil)))
+
+\f
+
 ;;; Interface functions
 
 (defun nnfolder-retrieve-headers (sequence &optional newsgroup server)
        (replace-match " " t t))
       'headers)))
 
-(defun nnfolder-open-server (host &optional service)
-  (setq nnfolder-status-string "")
-  (setq nnfolder-group-alist nil)
-  (nnheader-init-server-buffer))
+(defun nnfolder-open-server (server &optional defs)
+  (nnheader-init-server-buffer)
+  (if (equal server nnfolder-current-server)
+      t
+    (if nnfolder-current-server
+       (setq nnfolder-server-alist 
+             (cons (list nnfolder-current-server
+                         (nnheader-save-variables nnfolder-server-variables))
+                   nnfolder-server-alist)))
+    (let ((state (assoc server nnfolder-server-alist)))
+      (if state 
+         (progn
+           (nnheader-restore-variables (nth 1 state))
+           (setq nnfolder-server-alist (delq state nnfolder-server-alist)))
+       (nnheader-set-init-variables nnfolder-server-variables defs)))
+    (setq nnfolder-current-server server)))
 
 (defun nnfolder-close-server (&optional server)
   t)
 
+(defun nnfolder-server-opened (&optional server)
+  (equal server nnfolder-current-server))
+
 (defun nnfolder-request-close ()
   (let ((alist nnfolder-buffer-alist))
     (while alist
   (setq nnfolder-buffer-alist nil
        nnfolder-group-alist nil))
 
-(defun nnfolder-server-opened (&optional server)
-  (and nntp-server-buffer
-       (buffer-name nntp-server-buffer)))
-
 (defun nnfolder-status-message (&optional server)
   nnfolder-status-string)
 
index 31a15a8..41c53ba 100644 (file)
     (setq case-fold-search t)          ;Should ignore case.
     t))
 
+(defun nnheader-set-init-variables (server defs)
+  (let ((s server)
+       val)
+    ;; First we set the server variables in the sequence required.  We
+    ;; use the definitions from the `defs' list where that is
+    ;; possible. 
+    (while s
+      (set (car (car s)) 
+          (if (setq val (assq (car (car s)) defs))
+              (nth 1 val)
+            (nth 1 (car s))))
+      (setq s (cdr s)))
+    ;; The we go through the defs list and set any variables that were
+    ;; not set in the first sweep.
+    (while defs
+      (if (not (assq (car (car defs)) server))
+         (set (car (car defs)) (eval (nth 1 (car defs)))))
+      (setq defs (cdr defs)))))
+
+(defun nnheader-save-variables (server)
+  (let (out)
+    (while server
+      (setq out (cons (list (car (car server)) 
+                           (symbol-value (car (car server))))
+                     out))
+      (setq server (cdr server)))
+    (nreverse out)))
+
+(defun nnheader-restore-variables (state)
+  (while state
+    (set (car (car state)) (nth 1 (car state)))
+    (setq state (cdr state))))
+
 (provide 'nnheader)
 
 ;;; nnheader.el ends here
index 800c8bb..d7d4475 100644 (file)
 
 (defvar nnmbox-group-alist nil)
 
+\f
+
+(defvar nnmbox-current-server nil)
+(defvar nnmbox-server-alist nil)
+(defvar nnmbox-server-variables 
+  (list
+   (list 'nnmbox-mbox-file nnmbox-mbox-file)
+   (list 'nnmbox-active-file nnmbox-active-file)
+   (list 'nnmbox-get-new-mail nnmbox-get-new-mail)
+   '(nnmbox-current-group nil)
+   '(nnmbox-status-string "")
+   '(nnmbox-group-alist nil)))
+
+\f
+
 ;;; Interface functions
 
 (defun nnmbox-retrieve-headers (sequence &optional newsgroup server)
        (replace-match " " t t))
       'headers)))
 
-(defun nnmbox-open-server (host &optional service)
-  (setq nnmbox-status-string "")
-  (setq nnmbox-group-alist nil)
-  (nnheader-init-server-buffer))
+(defun nnmbox-open-server (server &optional defs)
+  (nnheader-init-server-buffer)
+  (if (equal server nnmbox-current-server)
+      t
+    (if nnmbox-current-server
+       (setq nnmbox-server-alist 
+             (cons (list nnmbox-current-server
+                         (nnheader-save-variables nnmbox-server-variables))
+                   nnmbox-server-alist)))
+    (let ((state (assoc server nnmbox-server-alist)))
+      (if state 
+         (progn
+           (nnheader-restore-variables (nth 1 state))
+           (setq nnmbox-server-alist (delq state nnmbox-server-alist)))
+       (nnheader-set-init-variables nnmbox-server-variables defs)))
+    (setq nnmbox-current-server server)))
 
 (defun nnmbox-close-server (&optional server)
   t)
 
 (defun nnmbox-server-opened (&optional server)
-  (and nntp-server-buffer
-       (get-buffer nntp-server-buffer)))
+  (equal server nnmbox-current-server))
 
 (defun nnmbox-status-message (&optional server)
   nnmbox-status-string)
index 59f4dc5..1cc9a72 100644 (file)
   "Current news group directory.")
 
 (defvar nnmh-status-string "")
-
 (defvar nnmh-group-alist nil)
 
 \f
 
+(defvar nnmh-current-server nil)
+(defvar nnmh-server-alist nil)
+(defvar nnmh-server-variables 
+  (list
+   (list 'nnmh-directory nnmh-directory)
+   (list 'nnmh-get-new-mail nnmh-get-new-mail)
+   '(nnmh-current-directory nil)
+   '(nnmh-status-string "")
+   '(nnmh-group-alist)))
+
+\f
+
 ;;; Interface functions.
 
 (defun nnmh-retrieve-headers (sequence &optional newsgroup server)
        (replace-match " " t t))
       'headers)))
 
-(defun nnmh-open-server (host &optional service)
-  (setq nnmh-status-string "")
-  (nnheader-init-server-buffer))
+(defun nnmh-open-server (server &optional defs)
+  (nnheader-init-server-buffer)
+  (if (equal server nnmh-current-server)
+      t
+    (if nnmh-current-server
+       (setq nnmh-server-alist 
+             (cons (list nnmh-current-server
+                         (nnheader-save-variables nnmh-server-variables))
+                   nnmh-server-alist)))
+    (let ((state (assoc server nnmh-server-alist)))
+      (if state 
+         (progn
+           (nnheader-restore-variables (nth 1 state))
+           (setq nnmh-server-alist (delq state nnmh-server-alist)))
+       (nnheader-set-init-variables nnmh-server-variables defs)))
+    (setq nnmh-current-server server)))
 
 (defun nnmh-close-server (&optional server)
   t)
 
 (defun nnmh-server-opened (&optional server)
-  (and nntp-server-buffer
-       (get-buffer nntp-server-buffer)))
+  (equal server nnmh-current-server))
 
 (defun nnmh-status-message (&optional server)
   nnmh-status-string)
        (setq dir nnmh-directory)))
   (setq dir (expand-file-name dir))
   ;; Recurse down all directories.
-  (let ((dirs (directory-files dir t nil t)))
+  (let ((dirs (and (file-readable-p dir)
+                  (directory-files dir t nil t))))
     (while dirs 
       (if (and (not (string-match "/\\.\\.$" (car dirs)))
               (not (string-match "/\\.$" (car dirs)))
-              (file-directory-p (car dirs)))
+              (file-directory-p (car dirs))
+              (file-readable-p (car dirs)))
          (nnmh-request-list server (car dirs)))
       (setq dirs (cdr dirs))))
   ;; For each directory, generate an active file line.
index fbf9ca4..e00de71 100644 (file)
@@ -70,6 +70,25 @@ all. This may very well take some time.")
 
 \f
 
+;; Server variables.
+
+(defvar nnml-current-server nil)
+(defvar nnml-server-alist nil)
+(defvar nnml-server-variables 
+  (list 
+   (list 'nnml-directory nnml-directory)
+   (list 'nnml-active-file nnml-active-file)
+   (list 'nnml-newsgroups-file nnml-newsgroups-file)
+   (list 'nnml-get-new-mail nnml-get-new-mail)
+   (list 'nnml-nov-is-evil nnml-nov-is-evil)
+   '(nnml-current-directory nil)
+   '(nnml-status-string "")
+   '(nnml-nov-buffer-alist nil)
+   '(nnml-group-alist nil)
+   '(nnml-active-timestamp nil)))
+
+\f
+
 ;;; Interface functions.
 
 (defun nnml-retrieve-headers (sequence &optional newsgroup server)
@@ -120,16 +139,28 @@ all. This may very well take some time.")
          (replace-match " " t t))
        'headers))))
 
-(defun nnml-open-server (host &optional service)
-  (setq nnml-status-string "")
-  (nnheader-init-server-buffer))
+(defun nnml-open-server (server &optional defs)
+  (nnheader-init-server-buffer)
+  (if (equal server nnml-current-server)
+      t
+    (if nnml-current-server
+       (setq nnml-server-alist 
+             (cons (list nnml-current-server
+                         (nnheader-save-variables nnml-server-variables))
+                   nnml-server-alist)))
+    (let ((state (assoc server nnml-server-alist)))
+      (if state 
+         (progn
+           (nnheader-restore-variables (nth 1 state))
+           (setq nnml-server-alist (delq state nnml-server-alist)))
+       (nnheader-set-init-variables nnml-server-variables defs)))
+    (setq nnml-current-server server)))
 
 (defun nnml-close-server (&optional server)
   t)
 
 (defun nnml-server-opened (&optional server)
-  (and nntp-server-buffer
-       (get-buffer nntp-server-buffer)))
+  (equal server nnml-current-server))
 
 (defun nnml-status-message (&optional server)
   nnml-status-string)
index ea2969b..a265926 100644 (file)
@@ -80,6 +80,27 @@ messages will be shown to indicate the current status.")
 
 \f
 
+(defvar nnspool-current-server nil)
+(defvar nnspool-server-alist nil)
+(defvar nnspool-server-variables 
+  (list
+   (list 'nnspool-inews-program nnspool-inews-program)
+   (list 'nnspool-inews-switches nnspool-inews-switches)
+   (list 'nnspool-spool-directory nnspool-spool-directory)
+   (list 'nnspool-nov-directory nnspool-nov-directory)
+   (list 'nnspool-lib-dir nnspool-lib-dir)
+   (list 'nnspool-active-file nnspool-active-file)
+   (list 'nnspool-newsgroups-file nnspool-newsgroups-file)
+   (list 'nnspool-distributions-file nnspool-distributions-file)
+   (list 'nnspool-history-file nnspool-history-file)
+   (list 'nnspool-active-times-file nnspool-active-times-file)
+   (list 'nnspool-large-newsgroup nnspool-large-newsgroup)
+   (list 'nnspool-nov-is-evil nnspool-nov-is-evil)
+   '(nnspool-current-directory nil)
+   '(nnspool-current-group nil)
+   '(nnspool-status-string "")))
+
+\f
 ;;; Interface functions.
 
 (defun nnspool-retrieve-headers (sequence &optional newsgroup server)
@@ -126,26 +147,28 @@ Newsgroup must be selected before calling this function."
            (replace-match " " t t))
          'headers)))))
 
-(defun nnspool-open-server (host &optional service)
-  "Open local spool."
-  (setq nnspool-status-string "")
-  (cond ((and (file-directory-p nnspool-spool-directory)
-             (file-exists-p nnspool-active-file))
-        (nnheader-init-server-buffer))
-       (t
-        (setq nnspool-status-string
-              (format "NNSPOOL: cannot talk to %s." host))
-        nil)))
+(defun nnspool-open-server (server &optional defs)
+  (nnheader-init-server-buffer)
+  (if (equal server nnspool-current-server)
+      t
+    (if nnspool-current-server
+       (setq nnspool-server-alist 
+             (cons (list nnspool-current-server
+                         (nnheader-save-variables nnspool-server-variables))
+                   nnspool-server-alist)))
+    (let ((state (assoc server nnspool-server-alist)))
+      (if state 
+         (progn
+           (nnheader-restore-variables (nth 1 state))
+           (setq nnspool-server-alist (delq state nnspool-server-alist)))
+       (nnheader-set-init-variables nnspool-server-variables defs)))
+    (setq nnspool-current-server server)))
 
 (defun nnspool-close-server (&optional server)
-  "Close news server."
   t)
 
 (defun nnspool-server-opened (&optional server)
-  "Return server process status, T or NIL.
-If the stream is opened, return T, otherwise return NIL."
-  (and nntp-server-buffer
-       (buffer-name nntp-server-buffer)))
+  (equal server nnspool-current-server))
 
 (defun nnspool-status-message (&optional server)
   "Return server status response as string."
index e942036..248362e 100644 (file)
@@ -48,7 +48,7 @@ server must be specified as follows:
         (setq kanji-fileio-code 0))))
 
 If you'd like to change something depending on the server in this
-hook, use the variable `nntp-server-name'.")
+hook, use the variable `nntp-address'.")
 
 (defvar nntp-server-opened-hook nil
   "Hook used for sending commands to the server at startup.  The
@@ -59,6 +59,12 @@ allow posting from the server.  Note that this is only necessary to do
 on servers that use strict access control.")
 (add-hook 'nntp-server-opened-hook 'nntp-send-mode-reader)
 
+(defvar nntp-address nil
+  "The name of the NNTP server.")
+
+(defvar nntp-port-number "nntp"
+  "Port number to connect to.")
+
 (defvar nntp-large-newsgroup 50
   "The number of the articles which indicates a large newsgroup.
 If the number of the articles is greater than the value, verbose
@@ -93,13 +99,14 @@ by one.")
   "Number of seconds to wait before an nntp connection times out.
 If this variable is nil, which is the default, no timers are set.")
 
+(defvar nntp-news-default-headers nil
+  "If non-nil, override `mail-default-headers' when posting news.")
+
 \f
+
 (defconst nntp-version "nntp 4.0"
   "Version numbers of this version of NNTP.")
 
-(defvar nntp-server-name nil
-  "The name of the NNTP server.")
-
 (defvar nntp-server-buffer nil
   "Buffer associated with the NNTP server process.")
 
@@ -113,12 +120,34 @@ instead use `nntp-server-buffer'.")
 You'd better not use this variable in NNTP front-end program but
 instead call function `nntp-status-message' to get status message.")
 
-(defvar nntp-current-server "")
-(defvar nntp-server-alist nil)
 (defvar nntp-server-xover t)
 (defvar nntp-server-list-active-group t)
 (defvar nntp-current-group "")
 
+\f
+(defvar nntp-current-server nil)
+(defvar nntp-server-alist nil)
+(defvar nntp-server-variables 
+  (list
+   (list 'nntp-server-hook nntp-server-hook)
+   (list 'nntp-server-opened-hook nntp-server-opened-hook)
+   (list 'nntp-port-number nntp-port-number)
+   (list 'nntp-address nntp-address)
+   (list 'nntp-large-newsgroup nntp-large-newsgroup)
+   (list 'nntp-buggy-select nntp-buggy-select)
+   (list 'nntp-maximum-request nntp-maximum-request)
+   (list 'nntp-debug-read nntp-debug-read)
+   (list 'nntp-nov-is-evil nntp-nov-is-evil)
+   (list 'nntp-xover-commands nntp-xover-commands)
+   (list 'nntp-connection-timeout nntp-connection-timeout)
+   (list 'nntp-news-default-headers nntp-news-default-headers)
+   '(nntp-server-process nil)
+   '(nntp-status-string nil)
+   '(nntp-server-xover t)
+   '(nntp-server-list-active-group t)
+   '(nntp-current-group "")))
+
+\f
 ;;; Interface funtions.
 
 (defun nntp-retrieve-headers (sequence &optional newsgroup server)
@@ -185,38 +214,26 @@ instead call function `nntp-status-message' to get status message.")
          (replace-match "" t t))
        'headers))))
 
-(defun nntp-open-server (server &optional service)
-  "Open SERVER.
-If SERVER is nil, use value of environment variable `NNTPSERVER'.
-If SERVICE, this this as the port number."
-  (let ((server (or server (getenv "NNTPSERVER")))
-       (status nil)
-       (timer 
-        (and nntp-connection-timeout 
-             (run-at-time nntp-connection-timeout
-                          nil 'nntp-kill-connection server))))
-    (setq nntp-status-string "")
-    (message "nntp: Connecting to server on %s..." server)
-    (cond ((and server (nntp-open-server-internal server service))
-          (setq nntp-current-server server)
-          (setq status
-                (condition-case nil
-                    (nntp-wait-for-response "^[23].*\r$")
-                  (error nil)
-                  (quit nil)))
-          (or status (nntp-close-server-internal server))
-          (and nntp-server-process
-               (progn
-                 (set-process-sentinel 
-                  nntp-server-process 'nntp-default-sentinel)
-                 ;; You can send commands at startup like AUTHINFO here.
-                 ;; Added by Hallvard B Furuseth <h.b.furuseth@usit.uio.no>
-                 (run-hooks 'nntp-server-opened-hook))))
-         ((null server)
-          (setq nntp-status-string "NNTP server is not specified.")))
-    (and timer (cancel-timer timer))
-    (message "")
-    status))
+(defun nntp-open-server (server &optional defs)
+  (nnheader-init-server-buffer)
+  (if (nntp-server-opened server)
+      t
+    (or (assq 'nntp-address defs)
+       (setq defs (append defs (list (list 'nntp-address server)))))
+    (if (and nntp-current-server
+            (not (equal server nntp-current-server)))
+       (setq nntp-server-alist 
+             (cons (list nntp-current-server
+                         (nnheader-save-variables nntp-server-variables))
+                   nntp-server-alist)))
+    (let ((state (assoc server nntp-server-alist)))
+      (if state 
+         (progn
+           (nnheader-restore-variables (nth 1 state))
+           (setq nntp-server-alist (delq state nntp-server-alist)))
+       (nnheader-set-init-variables nntp-server-variables defs)))
+    (setq nntp-current-server server)
+    (nntp-open-server-semi-internal nntp-address)))
 
 (defun nntp-close-server (&optional server)
   "Close connection to SERVER."
@@ -237,19 +254,18 @@ If SERVICE, this this as the port number."
 
 (defun nntp-request-close ()
   "Close all server connections."
-  (while nntp-server-alist
-    (delete-process (car (cdr (car nntp-server-alist))))
-    (setq nntp-server-alist (cdr nntp-server-alist)))
-  (setq nntp-current-server "")
-  (setq nntp-server-process nil))
+  (let (proc)
+    (while nntp-server-alist
+      (setq proc (nth 1 (assq 'nntp-server-process (car nntp-server-alist))))
+      (and proc (delete-process proc))
+      (setq nntp-server-alist (cdr nntp-server-alist)))
+    (setq nntp-current-server nil)))
 
 (defun nntp-server-opened (&optional server)
   "Say whether a connection to SERVER has been opened."
-  (if (or server nntp-current-server)
-      (let ((process (nth 1 (assoc (or server nntp-current-server)
-                                  nntp-server-alist))))
-       (and process 
-            (memq (process-status process) '(open run))))))
+  (and (equal server nntp-current-server)
+       nntp-server-process
+       (memq (process-status nntp-server-process) '(open run))))
 
 (defun nntp-status-message (&optional server)
   "Return server status as a string."
@@ -300,44 +316,39 @@ If SERVICE, this this as the port number."
 
 (defun nntp-request-group (group &optional server dont-check)
   "Select GROUP."
-  (if (not (nntp-possibly-change-server nil server))
-      ()
-    (if dont-check
-       (nntp-send-command "^.*\r$" "GROUP" group)
-      (if nntp-server-list-active-group
-         (save-excursion
-           (nntp-list-active-group group server)
-           (set-buffer nntp-server-buffer)
-           (goto-char (point-min))
-           ;; We look at the output from `nntp-list-active-group' to
-           ;; see whether the server supports this command.  If it
-           ;; does, we transform the output.  
-           (cond ((looking-at "2[0-9]+")
-                  (forward-line 1)
-                  (if (looking-at "[^ ] +\\([0-9]\\) +\\([0-9]\\)")
-                      (let ((end (progn (goto-char (match-beginning 1))
-                                        (read (current-buffer))))
-                            (beg (read (current-buffer))))
-                        (and (> beg end)
-                             (setq end 0
-                                   beg 0))
-                        (erase-buffer)
-                        (insert (format "211 %s %d %d %d\n"
-                                        group (max (- (1+ end) beg) 0)
-                                        beg end)))))
-                 ;; The server does not support the command.
-                 ((looking-at "5[0-9]+")
-                  (setq nntp-server-list-active-group nil)
-                  (setcar (nthcdr 
-                           3 (assoc nntp-current-server nntp-server-alist))
-                          nntp-server-xover)
-                  (nntp-send-command "^.*\r$" "GROUP" group))
-                 ;; The server supports it, but the group doesn't
-                 ;; exist. 
-                 ((looking-at "4[0-9]+")
-                  (erase-buffer)
-                  nil)))
-       (nntp-send-command "^.*\r$" "GROUP" group)))))
+  (if dont-check
+      (nntp-send-command "^.*\r$" "GROUP" group)
+    (if nntp-server-list-active-group
+       (save-excursion
+         (nntp-list-active-group group server)
+         (set-buffer nntp-server-buffer)
+         (goto-char (point-min))
+         ;; We look at the output from `nntp-list-active-group' to
+         ;; see whether the server supports this command.  If it
+         ;; does, we transform the output.  
+         (cond ((looking-at "2[0-9]+")
+                (forward-line 1)
+                (if (looking-at "[^ ] +\\([0-9]\\) +\\([0-9]\\)")
+                    (let ((end (progn (goto-char (match-beginning 1))
+                                      (read (current-buffer))))
+                          (beg (read (current-buffer))))
+                      (and (> beg end)
+                           (setq end 0
+                                 beg 0))
+                      (erase-buffer)
+                      (insert (format "211 %s %d %d %d\n"
+                                      group (max (- (1+ end) beg) 0)
+                                      beg end)))))
+               ;; The server does not support the command.
+               ((looking-at "5[0-9]+")
+                (setq nntp-server-list-active-group nil)
+                (nntp-send-command "^.*\r$" "GROUP" group))
+               ;; The server supports it, but the group doesn't
+               ;; exist. 
+               ((looking-at "4[0-9]+")
+                (erase-buffer)
+                nil)))
+      (nntp-send-command "^.*\r$" "GROUP" group))))
 
 (defun nntp-list-active-group (group &optional server)
   (nntp-send-command "^.*\r$" "LIST ACTIVE" group))
@@ -420,8 +431,10 @@ post to this group instead.  If RESPECT-POSTER, heed the special
   (if (assq 'to-address (nth 4 info))
       (nnmail-request-post-buffer 
        post group subject header article-buffer info follow-to respect-poster)
-    (let (from date to followup-to newsgroups message-of
-              references distribution message-id)
+    (let ((mail-default-headers 
+          (or nntp-news-default-headers mail-default-headers))
+         from date to followup-to newsgroups message-of
+         references distribution message-id)
       (save-excursion
        (set-buffer (get-buffer-create "*post-news*"))
        (news-reply-mode)
@@ -516,15 +529,17 @@ It will prompt for a password."
     ;; server that the process that sent the signal is connected to.
     ;; If you get my drift.
     (while (and servers 
-               (not (equal proc (nth 1 (car servers)))))
+               (not (equal proc (nth 1 (assq 'nntp-server-process
+                                             (car servers))))))
       (setq servers (cdr servers)))
     (message "nntp: Connection closed to server %s." 
             (or (car (car servers)) "(none)"))
     (ding)))
 
 (defun nntp-kill-connection (server)
-  (let ((proc (nth 1 (assoc server nntp-server-alist))))
-    (if proc (delete-process (process-name proc)))
+  (let ((proc (nth 1 (assq 'nntp-server-process 
+                          (assoc server nntp-server-alist)))))
+    (and proc (delete-process (process-name proc)))
     (nntp-close-server server)
     (setq nntp-status-string 
          (message "Connection timed out to server %s." server))
@@ -676,8 +691,6 @@ It will prompt for a password."
                (setq commands (cdr commands)))
              (if (eq t nntp-server-xover)
                  (setq nntp-server-xover nil))
-             (setcar (nthcdr 2 (assoc nntp-current-server nntp-server-alist))
-                     nntp-server-xover)
              nntp-server-xover))
        (if nntp-server-xover (nntp-decode-text) (erase-buffer))))))
 
@@ -692,8 +705,8 @@ It will prompt for a password."
     ;; Command line must be terminated by a CR-LF.
     (if (not (nntp-server-opened nntp-current-server))
        (progn
-         (nntp-close-server nntp-current-server)
-         (if (not (nntp-open-server nntp-current-server))
+         (nntp-close-server nntp-address)
+         (if (not (nntp-open-server nntp-address))
              (error (nntp-status-message)))
          (save-excursion
            (set-buffer nntp-server-buffer)
@@ -732,6 +745,41 @@ It will prompt for a password."
     ;; We cannot erase buffer, because reply may be received.
     (delete-region begin end)))
 
+(defun nntp-open-server-semi-internal (server &optional service)
+  "Open SERVER.
+If SERVER is nil, use value of environment variable `NNTPSERVER'.
+If SERVICE, this this as the port number."
+  (let ((server (or server (getenv "NNTPSERVER")))
+       (status nil)
+       (timer 
+        (and nntp-connection-timeout 
+             (run-at-time nntp-connection-timeout
+                          nil 'nntp-kill-connection server))))
+    (setq nntp-status-string "")
+    (message "nntp: Connecting to server on %s..." server)
+    (cond ((and server (nntp-open-server-internal server service))
+          (setq nntp-address server)
+          (setq status
+                (condition-case nil
+                    (nntp-wait-for-response "^[23].*\r$")
+                  (error nil)
+                  (quit nil)))
+          (or status (nntp-close-server-internal server))
+          (and nntp-server-process
+               (progn
+                 (set-process-sentinel 
+                  nntp-server-process 'nntp-default-sentinel)
+                 ;; You can send commands at startup like AUTHINFO here.
+                 ;; Added by Hallvard B Furuseth <h.b.furuseth@usit.uio.no>
+                 (run-hooks 'nntp-server-opened-hook))))
+         ((null server)
+          (setq nntp-status-string "NNTP server is not specified.")))
+    (and timer (cancel-timer timer))
+    (message "")
+    (or status
+       (setq nntp-current-server nil))
+    status))
+
 (defun nntp-open-server-internal (server &optional service)
   "Open connection to news server on SERVER by SERVICE (default is nntp)."
   (let (proc)
@@ -745,7 +793,7 @@ It will prompt for a password."
       (if (setq proc
                (condition-case nil
                    (open-network-stream 
-                    "nntpd" (current-buffer) server (or service "nntp"))
+                    "nntpd" (current-buffer) server nntp-port-number)
                  (error nil)))
          (progn
            (setq nntp-server-process proc)
@@ -753,9 +801,7 @@ It will prompt for a password."
            (process-kill-without-query proc)
            (setq nntp-server-xover t)
            (setq nntp-server-list-active-group t)
-           (setq nntp-server-name server)
-           (setq nntp-server-alist (cons (list server nntp-server-process t t)
-                                         nntp-server-alist))
+           (setq nntp-address server)
            ;; It is possible to change kanji-fileio-code in this hook.
            (run-hooks 'nntp-server-hook)
            nntp-server-process)))))
@@ -766,9 +812,7 @@ It will prompt for a password."
   (if nntp-server-process
       (delete-process nntp-server-process))
   (setq nntp-server-process nil)
-  (setq nntp-server-alist (delq (assoc nntp-current-server nntp-server-alist)
-                               nntp-server-alist))
-  (setq nntp-current-server ""))
+  (setq nntp-address ""))
 
 (defun nntp-accept-response ()
   "Read response of server.
@@ -805,30 +849,10 @@ defining this function as macro."
   (car list))
 
 (defun nntp-possibly-change-server (newsgroup server)
-  (let (result changed-server)
-    ;; First see if we need to change the server - or even open a new 
-    ;; server.  
-    (if (and server (not (string= server nntp-current-server)))
-       (progn  
-         ;; Fix by Sudish Joseph <joseph@cis.ohio-state.edu>.
-         (if (or (assoc server nntp-server-alist)
-                 (nntp-open-server server))
-             ;; `nntp-open-server' may change `nntp-server-alist', so
-             ;; we assoc again.
-             (let ((info (assoc server nntp-server-alist)))
-               (setq nntp-current-server server)
-               ;; Variable for backwards compatability.
-               (setq nntp-server-name server)
-               (setq nntp-server-process (nth 1 info))
-               (setq nntp-server-xover (nth 2 info))
-               (setq nntp-server-list-active-group (nth 3 info))
-               (setq changed-server t)
-               (setq result t))))
-      (setq result t))
-    ;; The we see whether it is necessary to change newsgroup.
-    (and newsgroup result 
-        (or (not (string= newsgroup nntp-current-group))
-            changed-server)
+  (let ((result t))
+    ;; We see whether it is necessary to change newsgroup.
+    (and newsgroup 
+        (or (not (string= newsgroup nntp-current-group)))
         (progn
           (setq result (nntp-request-group newsgroup server))
           (setq nntp-current-group newsgroup)))
index 2983c97..4dab8fb 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 @comment %**start of header (This is for running Texinfo on a region.)
 @setfilename gnus
-@settitle Gnus 0.50 Manual
+@settitle Gnus 0.51 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -20,7 +20,7 @@
 
 This file documents Gnus, the GNU Emacs newsreader.
 
-Copyright (C) 1989, 1990, 1993, 1995 Free Software Foundation, Inc.
+Copyright (C) 1995 Free Software Foundation, Inc.
 
 Permission is granted to make and distribute verbatim copies of
 this manual provided the copyright notice and this permission notice
@@ -48,7 +48,7 @@ into another language, under the above conditions for modified versions.
 @author by Lars Magne Ingebrigtsen
 @page
 @vskip 0pt plus 1filll
-Copyright @copyright{} 1989, 1990, 1993 Free Software Foundation, Inc. 
+Copyright @copyright{} 1995 Free Software Foundation, Inc. 
 
 Permission is granted to make and distribute verbatim copies of
 this manual provided the copyright notice and this permission notice
@@ -81,10 +81,11 @@ luck.
 * The Group Buffer::        Selecting, subscribing and killing groups.
 * The Summary Buffer::      Reading, saving and posting articles.
 * The Article Buffer::      Displaying and handling articles.
+* The Server Buffer::       Making and editing virtual servers.
 * Various::                 General purpose settings.
 * Customization::           Tailoring Gnus to your needs.
 * Troubleshooting::         What you might try if things do not work.
-* Reporting Bugs::          Bugs? What bugs?!
+* The End::                 Farewell, and goodbye.
 * Index::                   Variable, function and concept index.
 * Key Index::               Key Index.
 @end menu
@@ -200,7 +201,12 @@ me.
 The new Gnus version couldn't have been done without the help of all the
 people on the (ding) mailing list.  Every day for months I have gotten
 tens of nice bug reports from them, filling me with joy, every single
-one of them.  Smooches.
+one of them.  Smooches.  The people on the list have been tried beyond
+endurance, what with my "oh, that's a neat idea <type type>, yup, I'll
+release it right away <ship off> no wait, that doesn't work at all <type
+type>, yup, I'll ship that one off right away <ship off> no, wait, that
+aboslutely does not work" policy for releases.  Microsoft - bah.  I'm
+@emph{much} worse.
 
 I would like to take this opportunity to thank the Academy for...  oops,
 wrong show.
@@ -226,8 +232,11 @@ GNU XEmacs support has been added by Fabrice Popineau.
 Various bits and pieces, especially dealing with .newsrc files, was
 suggested and added by Hallvard B Furuseth.
 @item 
-Stainless Steel Rat, Brian Edmonds, Jack Vinson, Daniel Quinlan, Ilja
-Weis, Andrew Eskilsson have all contributed code and suggestions. 
+Brian Edmonds has written @code{gnus-bbdb}, as well as other bits and
+pieces. 
+@item 
+Stainless Steel Rat, Jack Vinson, Daniel Quinlan, Ilja Weis and Andrew
+Eskilsson have all contributed code and suggestions.
 @end itemize
 
 
@@ -382,6 +391,14 @@ default, way of getting news.
 @item foreign
 You can also have any number of foreign groups at the same time.  These
 are groups that use different backends for getting news.
+@item head
+@cindex head
+The top part of an article, where administration information (etc.) is
+put. 
+@item body
+@cindex
+The rest of an article. Everything that is not in the head is in the
+body. 
 @item header
 @cindex header
 A line from the head of an article. 
@@ -400,10 +417,18 @@ HEAD format.
 Each group is subscribed at some @dfn{level} or other (1-9).  The ones
 that have a lower level are "more" subscribed than the groups with a
 higher level.  In fact, groups on levels 1-5 are considered
-"subscribed"; 6-7 are "unsubscribed"; 8 are zombies; and 9 are killed.
-Commands for listing groups and scanning for new articles will all use
-the numeric prefix as @dfn{working level}.  
+@dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9
+are @dfn{killed}.  Commands for listing groups and scanning for new
+articles will all use the numeric prefix as @dfn{working level}.
+@item killed groups
+@cindex killed groups
+No information on killed groups is stored or updated, which makes killed
+groups much easier to handle than subscribed groups.
+@item zombie groups
+@cindex zombie groups
+Just like killed groups, only slightly less dead.
 @item active file
+@cindex active file
 The news server has to keep track of what articles it carries, and what
 groups exist.  All this information in stored in the active file, which
 is rather large, as you might surmise.
@@ -436,18 +461,19 @@ variables.
 
 @vindex gnus-select-method
 The @code{gnus-select-method} variable controls how Gnus finds news.
-This variable should be a list where the first element says "how" and
-the second element says "where".  This method is is your native method.
-All groups that are not fetched with this method are foreign groups.
+This variable should be a list where the first element says @dfn{how}
+and the second element says @dfn{where}.  This method is is your native
+method.  All groups that are not fetched with this method are foreign
+groups.
 
 For instance, if you want to get your daily dosage of news from the
-@sc{nntp} server @samp{news.friendly.server}, you'd say:
+@samp{news.somewhere.edu} @sc{nntp} server, you'd say:
 
 @lisp
-(setq gnus-select-method '(nntp "news.friendly.server"))
+(setq gnus-select-method '(nntp "news.somewhere.edu"))
 @end lisp
 
-If you want to use a local spool, say:
+If you want to read directly from the local spool, say:
 
 @lisp
 (setq gnus-select-method '(nnspool ""))
@@ -673,7 +699,7 @@ if you set this variable to @code{nil} (@pxref{New Groups}).
 @vindex gnus-startup-file
 The @code{gnus-startup-file} variable says where the startup files are.
 The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup
-file being whatever that one is with a @samp{".eld"} appended.
+file being whatever that one is with a @samp{.eld} appended.
 
 @vindex gnus-save-newsrc-hook
 @code{gnus-save-newsrc-hook} is called before saving the @file{.newsrc}
@@ -900,7 +926,7 @@ expected, hopefully.
 Go to the next group that has unread articles
 (@code{gnus-group-next-unread-group}).
 @item p
-@item DEL
+@itemx DEL
 @kindex DEL (Group)
 @kindex p (Group)
 @findex gnus-group-prev-unread-group
@@ -1036,14 +1062,14 @@ tickles you fancy.
 
 @table @kbd
 @item S t
-@item u
+@itemx u
 @kindex S t (Group)
 @kindex u (Group)
 @findex gnus-group-unsubscribe-current-group
 Toggle subscription to the current group
 (@code{gnus-group-unsubscribe-current-group}).  
 @item S s
-@item U
+@itemx U
 @kindex S s (Group)
 @kindex U (Group)
 @findex gnus-group-unsubscribe-group
@@ -1051,19 +1077,19 @@ Prompt for a group to subscribe, and then subscribe it.  If it was
 subscribed already, unsubscribe it instead
 (@code{gnus-group-unsubscribe-group}).
 @item S k
-@item C-k
+@itemx C-k
 @kindex S k (Group)
 @kindex C-k (Group)
 @findex gnus-group-kill-group
 Kill the current group (@code{gnus-group-kill-group}).
 @item S y
-@item C-y
+@itemx C-y
 @kindex S y (Group)
 @kindex C-y (Group)
 @findex gnus-group-yank-group
 Yank the last killed group (@code{gnus-group-yank-group}).
 @item S w
-@item C-w
+@itemx C-w
 @kindex S w (Group)
 @kindex C-w (Group)
 @findex gnus-group-kill-region
@@ -1115,6 +1141,11 @@ will go to the next group of the same level (or lower).  This might be
 handy if you want to read the most important groups before you read the
 rest.
 
+@vindex gnus-group-default-list-level
+All groups with a level less than or equal to
+@code{gnus-group-default-list-level} will be listed in the group buffer
+by default.
+
 @node Foreign Groups
 @section Foreign Groups
 @cindex foreign groups
@@ -1243,28 +1274,9 @@ The two first entries in this method should, of course, be the same as
 
 Quite simple, eh? <duck> @strong{Ouch}.
 
-Let's take time out for a poem by Reznikoff:
-
-@quotation
-Te Deum
-@sp 1
-Not because of victories @*
-I sing,@*
-having none,@*
-but for the common sunshine,@*
-the breeze,@*
-the largess of the spring.
-@sp 1
-Not for victory@*
-but for the day's work done@*
-as well as I was able;@*
-not for a seat upon the dais@*
-but at the common table.@*
-@end quotation
-
 @node nntp
-@subsection @sc{nntp}
-@cindex nntp
+@subsection nntp
+@cindex @sc{nntp}
 
 Subscribing to a foreign group from an @sc{nntp} server is rather easy.
 You just specify @code{nntp} as method and the address of the @sc{nntp}
@@ -1460,9 +1472,9 @@ nndir will use @sc{nov} files if they are present.
 
 nndoc is a cute little thing that will let you read a single file as a
 newsgroup.  The file has to be divided into articles by the use of Unix
-mbox "From " lines.  nndoc will not try to change the file or insert any
-extra headers into it - it will simply, like, let you use the file as
-the basis for a group.  And that's it.
+mbox @samp{From } lines.  nndoc will not try to change the file or
+insert any extra headers into it - it will simply, like, let you use the
+file as the basis for a group.  And that's it.
 
 @node nndigest
 @subsection nndigest
@@ -1519,7 +1531,7 @@ programs, if you want to.
 @code{nnmail-spool-file} says where to look for new mail.  If this
 variable is @code{nil}, the mail backends will never attempt to fetch
 mail by themselves.  It is quite likely that Gnus supports POP-mail.
-Set this variable to begin with the string @samp{"po:"}, and everything
+Set this variable to begin with the string @samp{po:}, and everything
 should go smoothly, even though I have never tested this.
 
 @vindex nnmail-prepare-incoming-hook
@@ -1530,7 +1542,7 @@ the new incoming mail, and can be used for, well, anything, really.
 @code{nnmail-tmp-directory} says where to move the incoming mail to
 while processing it.  This is usually done in the same directory that
 the mail backend habitates (ie. @file{~/Mail/}), but if this variable is
-non-nil, it will be used instead.
+non-@code{nil}, it will be used instead.
 
 Gnus gives you all the opportunity you could possibly want for shooting
 yourself in the foot.  Let's say you create a group that will contain
@@ -1568,7 +1580,7 @@ how the incoming mail is to be split into groups.
 
 This variable is a list of lists, where the first element of each of
 these lists is the name of the mail group (they do not have to be called
-something beginning with @samp{"mail"}, by the way), and the second
+something beginning with @samp{mail}, by the way), and the second
 element is a regular expression used on the header of each mail to
 determine if it belongs in this mail group.
 
@@ -1706,8 +1718,8 @@ If you start using any of the mail backends, they have the annoying
 habit of assuming that you want to read mail with them.  This might not
 be unreasonable, but it might not be what you want.
 
-If you set @code{nnmail-spool-file} to nil, none of the backends will
-ever attempt to read incoming mail, which should help.
+If you set @code{nnmail-spool-file} to @code{nil}, none of the backends
+will ever attempt to read incoming mail, which should help.
 
 @vindex nnbabyl-get-new-mail
 @vindex nnmbox-get-new-mail
@@ -1765,7 +1777,7 @@ format.  It should be used with some caution.
 If you use this backend, Gnus will split all incoming mail into files;
 one file for each mail, and put the articles into the correct
 directories under the directory specified by the @code{nnml-directory}
-variable.  The default value is @samp{"~/Mail/"}.
+variable.  The default value is @file{~/Mail/}.
 
 You do not have to create any directories beforehand; Gnus will take
 care of all that.
@@ -1825,7 +1837,7 @@ These commands all list various slices of the groups that are available.
 
 @table @kbd
 @item l
-@item G s
+@itemx G s
 @kindex G s (Group)
 @kindex l (Group)
 @findex gnus-group-list-groups
@@ -1834,7 +1846,7 @@ List all groups that have unread articles
 command will list only groups of level ARG and lower.  By default, it
 only lists groups of level five or lower (ie. just subscribed groups).
 @item L
-@item G u
+@itemx G u
 @kindex G u (Group)
 @kindex L (Group)
 @findex gnus-group-list-all-groups
@@ -1944,7 +1956,7 @@ Go to the previous group (@code{gnus-group-prev-group}).
 Unsubscribe to the current group, or, as will be the case here,
 subscribe to it (@code{gnus-browse-unsubscribe-current-group}). 
 @item l
-@item q
+@itemx q
 @kindex q (Browse)
 @kindex l (Browse)
 @findex gnus-browse-exit
@@ -2088,8 +2100,8 @@ unnatural way.
 @chapter The Summary Buffer
 @cindex summary buffer
 
-A line for each article is displayed in the Summay buffer.  You can move
-around, read articles, post articles and reply to them.
+A line for each article is displayed in the summary buffer.  You can
+move around, read articles, post articles and reply to articles.
 
 @menu
 * Summary Buffer Format::       Deciding how the summar buffer is to look.
@@ -2125,11 +2137,12 @@ around, read articles, post articles and reply to them.
 @findex gnus-extract-address-components
 @vindex gnus-extract-address-components
 Gnus will use the value of the @code{gnus-extract-address-components}
-variable as a function for getting the name and address parts of a From
-header.  Two pre-defined function exist:
-@code{gnus-extract-address-components}, which is the default, quite fast, and
-too simplistic solution, and @code{mail-extract-address-components}, which
-works very nicely, but is slower.
+variable as a function for getting the name and address parts of a
+@code{From} header.  Two pre-defined function exist:
+@code{gnus-extract-address-components}, which is the default, quite
+fast, and too simplistic solution, and
+@code{mail-extract-address-components}, which works very nicely, but is
+slower.
 
 @vindex gnus-summary-same-subject
 @code{gnus-summary-same-subject} is a string indicating that the current
@@ -2150,66 +2163,64 @@ The following format specification characters are understood:
 
 @table @samp
 @item N 
-Article number
+Article number.
 @item S
-Subject string
+Subject string.
 @item s
 Subject if the article is the root, @code{gnus-summary-same-subject}
 otherwise. 
 @item F
-Full From line
+Full @code{From} line.
 @item n
-The name (from the @code{From} header field)
+The name (from the @code{From} header).
 @item A
-The address (from the @code{From} header field)
+The address (from the @code{From} header).
 @item L
-Number of lines in the article
+Number of lines in the article.
 @item c
-Number of characters in the article
+Number of characters in the article.
 @item I
-Indentation based on thread level
+Indentation based on thread level (@pxref{Customizing Threading}).
 @item T
 Nothing if the article is a root and lots of spaces if it isn't (it
-pushes everything after it off the screen)
+pushes everything after it off the screen).
 @item \[
 Opening bracket, which is normally @samp{\[}, but can also be @samp{<}
 for adopted articles.
 @item \]
-Closing bracked, which is normally @samp{\]}, but can also be @samp{<}
+Closing bracked, which is normally @samp{\]}, but can also be @samp{>}
 for adopted articles.
 @item <
 One space for each thread level.
 @item >
 Twenty minus thread level spaces.
 @item U
-Unread
-@item X
-Expirable
+Unread.
 @item R
-Replied
+Replied.
 @item i
-Score
+Score as a number.
 @item z
-Zcore
+Zcore, @samp{+} if above the default level and @samp{-} if below the
+default level. 
 @item x
-Xref
+@code{Xref}.
 @item D
-Date
+@code{Date}.
 @item M
-Message-ID
+@code{Message-Id}.
 @item r
-References
+@code{References}.
 @item t
-Number of articles in the current subthread.
-@item x
-Xref
+Number of articles in the current subthread.  Using this spec will slow
+down summary buffer generation somewhat.
 @item u
 User defined specifier.  The next character in the format string should
 be a letter.  @sc{gnus} will call the function
-gnus-user-format-function-X, where X is the letter following @samp{%u}.
-The function will be passed the current header as argument.  The
-function should return a string, which will be inserted into the summary
-just like information from any other summary specifier.
+@code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter
+following @samp{%u}.  The function will be passed the current header as
+argument.  The function should return a string, which will be inserted
+into the summary just like information from any other summary specifier.
 @end table
 
 Text between @samp{%(} and @samp{%)} will be highlighted with
@@ -2233,25 +2244,25 @@ This restriction may disappear in later versions of Gnus.
 
 @vindex gnus-summary-mode-line-format
 You can also change the format of the summary mode bar.  Set
-@code{gnus-summary-mode-line-format} to whatever you like.  Here's what
-elements you have to play with:
+@code{gnus-summary-mode-line-format} to whatever you like.  Here are the
+elements you can play with:
 
 @table @samp
 @item G
-Group name
+Group name.
 @item A
-Current article number
+Current article number.
 @item V
-Gnus version
+Gnus version.
 @item U
-Number of unread articles in this group
+Number of unread articles in this group.
 @item e
-Number of unselected articles in this group
+Number of unselected articles in this group.
 @item Z
 A string with the number of unread and unselected articles represented
-either as @samp{<%U(+%u) more>} if there are both unselected articles,
-and just as @samp{<%U more>} if there are just unread articles and no
-unselected ones.
+either as @samp{<%U(+%u) more>} if there are both anread and unselected
+articles, and just as @samp{<%U more>} if there are just unread articles
+and no unselected ones.
 @item g
 Shortish group name. For instance, @samp{rec.arts.anime} will be
 shortened to @samp{r.a.anime}. 
@@ -2275,21 +2286,21 @@ None of these commands select articles.
 
 @table @kbd
 @item G M-n
-@item M-n
+@itemx M-n
 @kindex M-n (Summary)
 @kindex G M-n (Summary)
 @findex gnus-summary-next-unread-subject
 Go to the next summary line of an unread article
 (@code{gnus-summary-next-unread-subject}). 
 @item G M-p
-@item M-p
+@itemx M-p
 @kindex M-p (Summary)
 @kindex G M-p (Summary)
 @findex gnus-summary-prev-unread-subject
 Go to the previous summary line of an unread article
 (@code{gnus-summary-prev-unread-subject}). 
 @item G g
-@item j
+@itemx j
 @kindex j (Summary)
 @kindex G g (Summary)
 @findex gnus-summary-goto-subject
@@ -2303,10 +2314,9 @@ commands, Gnus will offer to go to the next group.  If
 @code{gnus-auto-select-next} is @code{t} and the next group is empty,
 Gnus will exit summary mode and return to the group buffer.  If this
 variable is neither @code{t} nor @code{nil}, Gnus will select the next
-group, no matter if it has any unread articles or not.  As a special
-case, if this variable equals @code{quietly}, Gnus will select the next
-group without asking for confirmation.  Also see
-@code{gnus-keep-same-level}.
+group, no matter whether it has any unread articles or not.  As a
+special case, if this variable is @code{quietly}, Gnus will select the
+next group without asking for confirmation.  Also @xref{Group Levels}.
 
 If Gnus asks you to press a key to confirm going to the next group, you
 can use the @kbd{C-n} and @kbd{C-p} keys to move around the group
@@ -2316,7 +2326,7 @@ to the group buffer.
 @vindex gnus-auto-center-summary
 If @code{gnus-auto-center-summary} is non-@code{nil}, Gnus will keep the
 point in the summary buffer centered at all times.  This makes things
-quite tidy, but if you have a slow network connection, or do simply not
+quite tidy, but if you have a slow network connection, or simply do not
 like this un-Emacsism, you can set this variable to @code{nil} to get
 the normal Emacs scrolling action.
 
@@ -2334,24 +2344,24 @@ and they all select and display an article.
 Select the current article, or, if that one's read already, the next
 unread article (@code{gnus-summary-next-page}).
 @item G n
-@item n
+@itemx n
 @kindex n (Summary)
 @kindex G n (Summary)
 @findex gnus-summary-next-unread-article
 Go to next unread article (@code{gnus-summary-next-unread-article}).
 @item G p
-@item p
+@itemx p
 @kindex p (Summary)
 @findex gnus-summary-prev-unread-article
 Go to previous unread article (@code{gnus-summary-prev-unread-article}).
 @item G N
-@item N
+@itemx N
 @kindex N (Summary)
 @kindex G N (Summary)
 @findex gnus-summary-next-article
 Go to the next article (@code{gnus-summary-next-article}).
 @item G P
-@item P
+@itemx P
 @kindex P (Summary)
 @kindex G P (Summary)
 @findex gnus-summary-prev-article
@@ -2367,29 +2377,28 @@ Go to the next article with the same subject
 Go to the previous article with the same subject
 (@code{gnus-summary-prev-same-subject}). 
 @item G f
-@item .
+@itemx .
 @kindex G f  (Summary)
 @kindex .  (Summary)
 @findex gnus-summary-first-unread-article
 Go to the first unread article
 (@code{gnus-summary-first-unread-article}).
 @item G b
-@item ,
+@itemx ,
 @kindex G b (Summary)
 @kindex , (Summary)
 Go to the article with the highest score
 (@code{gnus-summary-best-unread-article}). 
 @item G l
-@item l
+@itemx l
 @kindex l (Summary)
 @kindex G l (Summary)
 @findex gnus-summary-goto-last-article
-Go to the summary line of the previous article
-(@code{gnus-summary-goto-last-article}).
+Go to the previous article read (@code{gnus-summary-goto-last-article}).
 @item G p
-@kindex G p
+@kindex G p (Summary)
 @findex gnus-summary-pop-article
-Pop an article off the summary history and go to the previous article
+Pop an article off the summary history and go to this article
 (@code{gnus-summary-pop-article}).  This command differs from the
 command above in that you can pop as many previous articles off the
 history as you like.
@@ -2410,9 +2419,8 @@ This hook is called whenever an article is selected.  By default it
 exposes any threads hidden under the selected article.
 @item gnus-mark-article-hook
 @vindex gnus-mark-article-hook
-This hook is called when an article is selected for the first time.  It
-is intended to be used for marking articles as read automatically when
-articles are selected.
+This hook is called whenever an article is selected.  It is intended to
+be used for marking articles as read.
 @item gnus-visual-mark-article-hook
 @vindex gnus-visual-mark-article-hook
 This hook is run after selecting an article.  It is meant to be used for
@@ -2429,14 +2437,14 @@ highlight the current article in the summary buffer.
 @item gnus-visual-summary-highlight
 @vindex gnus-visual-summary-highlight
 Summary lines are highlighted according to this variable, which is a
-list where the elements are on the format @code{FORM . FACE}.  If you
+list where the elements are on the format @code{(FORM . FACE)}.  If you
 would, for instance, like ticked articles to be italic and high-scored
 articles to be bold, you could set this variable to something like
 @lisp
 (((eq mark gnus-ticked-mark) . italic)
  ((> score default) . bold))
 @end lisp
-As you may have guessed, if @var{FORM} returns a non-nil value,
+As you may have guessed, if @var{FORM} returns a non-@code{nil} value,
 @var{FACE} will be applied to the line.
 @end table
 
@@ -2461,14 +2469,14 @@ Scoll the current article back one page (@code{gnus-summary-prev-page}).
 Scroll the current article one line forward
 (@code{gnus-summary-scroll-up}).
 @item A <
-@item <
+@itemx <
 @kindex < (Summary)
 @kindex A < (Summary)
 @findex gnus-summary-beginning-of-article
 Scroll to the beginning of the article
 (@code{gnus-summary-beginning-of-article}).
 @item A >
-@item >
+@itemx >
 @kindex > (Summary)
 @kindex A > (Summary)
 @findex gnus-summary-end-of-article
@@ -2476,7 +2484,7 @@ Scroll to the end of the article (@code{gnus-summary-end-of-article}).
 @end table
 
 @node Reply Followup and Post
-@section Reply Followup and Post
+@section Reply, Followup and Post
 @cindex reply
 @cindex followup
 @cindex post
@@ -2502,14 +2510,14 @@ Commands for composing a mail message:
 
 @table @kbd
 @item S r
-@item r
+@itemx r
 @kindex S r (Summary)
 @kindex r (Summary)
 @findex gnus-summary-reply
 Mail a reply to the author of the current article
 (@code{gnus-summary-reply}). 
 @item S R
-@item R
+@itemx R
 @kindex R (Summary)
 @kindex S R (Summary)
 @findex gnus-summary-reply-with-original
@@ -2521,7 +2529,7 @@ original message (@code{gnus-summary-reply-with-original}).
 Forward the current article to some other person
 (@code{gnus-summary-mail-forward}). 
 @item S m
-@item m
+@itemx m
 @kindex m (Summary)
 @kindex S m (Summary)
 @findex gnus-summary-mail-other-window
@@ -2531,7 +2539,8 @@ Send a mail to some other person
 @kindex S M-f (Summary)
 @findex gnus-uu-digest-and-forward
 Digest the current series and forward the result using mail
-(@code{gnus-uu-digest-and-forward}). 
+(@code{gnus-uu-digest-and-forward}).  This command uses the
+process/prefix convention (@pxref{Process/Prefix}). 
 @end table
 
 Variables for customizing outgoing mail:
@@ -2540,11 +2549,12 @@ Variables for customizing outgoing mail:
 @item gnus-reply-to-function
 @vindex gnus-reply-to-function
 Gnus uses the normal methods to determine where replies are to go, but
-you can change the behaviour to suit your needs by fiddling with the
-@code{gnus-reply-to-function} variable.
+you can change the behaviour to suit your needs by fiddling with this
+variable.
 
-If you want the replies to go to the "sender" instead of the "from" in
-the group "mail.stupid-list", you could do something like this:
+If you want the replies to go to the @samp{Sender} instead of the
+@samp{From} in the group @samp{mail.stupid-list}, you could do something
+like this:
 
 @lisp
 (setq gnus-reply-to-function
@@ -2555,13 +2565,13 @@ the group "mail.stupid-list", you could do something like this:
               nil))))
 @end lisp
 
-This function will be called narrow to the headers of the article that
-is being replied to.
+This function will be called narrowed to the head of the article that is
+being replied to.
 
 As you can see, this function should return a string if it has an
 opinion as to what the To header should be.  If it does not, it should
-just return nil, and the normal methods for determining the To header
-will be used.
+just return @code{nil}, and the normal methods for determining the To
+header will be used.
 
 This function can also return a list.  In that case, each list element
 should be a cons, where the car should be the name of an header
@@ -2583,20 +2593,20 @@ Commands for posting an article:
 
 @table @kbd
 @item S p
-@item a
+@itemx a
 @kindex a (Summary)
 @kindex S p (Summary)
 @findex gnus-summary-post-news
 Post an article to the current group
 (@code{gnus-summary-post-news}).
 @item S f
-@item f
+@itemx f
 @kindex f (Summary)
 @kindex S f (Summary)
 @findex gnus-summary-followup
 Post a followup to the current article (@code{gnus-summary-followup}).
 @item S F
-@item F
+@itemx F
 @kindex S F (Summary)
 @kindex F (Summary)
 @findex gnus-summary-followup-with-original
@@ -2605,25 +2615,63 @@ Post a followup to the current article and include the original message
 @item S u
 @kindex S u (Summary)
 @findex gnus-uu-post-news
-Uuencode a file, split it up into parts, and post it as a series
-(@code{gnus-uu-post-news}). 
+Uuencode a file, split it into parts, and post it as a series
+(@code{gnus-uu-post-news}) (@pxref{Uuencoding & Posting})
 @end table
 
-Variables for customizing outgoing articles:
+@vindex gnus-required-headers
+@code{gnus-required-headers} a list of header symbols.  These headers
+will either be automatically generated, or, if that's impossible, they
+will be prompted for.  The following symbols are legal:
 
 @table @code
-@item gnus-required-headers
-@vindex gnus-required-headers
-Gnus determines which headers it should generate in outgoing posts by
-consulting the this variable.  All headers mentioned in this list will
-either be generated automatically or prompted for before an article is
-posted. 
+@item From
+This required header will be filled out with the result of the
+@code{gnus-inews-user-name} function, which depends on the
+@code{gnus-user-from-line}, @code{gnus-user-login-name},
+@code{gnus-local-domain} and @code{user-mail-address} variables.
+@item Subject
+This required header will be prompted for if not present already. 
+@item Newsgroups
+This required header says which newsgroups the article is to be posted
+to.  If it isn't present already, it will be prompted for.
+@item Organization
+This optional header will be filled out depending on the
+@code{gnus-local-organization} variable.
+@item Lines
+This optional header will be computed by Gnus.
+@item Message-ID
+This required header will be generated by Gnus.  A unique ID will be
+created based on date, time, user name and system name.
+@item X-Newsreader
+This optional header will be filled out with the Gnus version numbers. 
+@end table
+
+In addition, you can enter conses into this list.  The car of this cons
+should be a symbol who's name is the name of the header, and the cdr can
+either a string to be entered verbatim as the value of this header, or
+it can be a function to be called.  This function should return a string
+to be inserted.  For instance, if you want to insert @samp{Mime-Version:
+1.0}, you should enter @code{(Mime-Version . "1.0")} into the list.  If
+you want to insert a funny quote, you could enter something like
+@code{(X-Yow . yow)} into the list.  The function @code{yow} will then
+be called without any arguments. 
 
+Other variables for customizing outgoing articles:
+
+@table @code
 @item gnus-post-method
 @vindex gnus-post-method
 If non-@code{nil}, Gnus will use this method instead of the default
 select method when posting.
 
+@item nntp-news-default-headers
+@vindex nntp-news-default-headers
+If non-@code{nil}, this variable will override
+@code{mail-default-headers} when posting.  This variable should then be
+a string.  This string will be inserted, as is, in the head of all
+outgoing articles.
+
 @item gnus-use-followup-to
 @vindex gnus-use-followup-to
 If @code{nil}, always ignore the Followup-To header.  If it is @code{t},
@@ -2634,12 +2682,14 @@ value.
 
 @item gnus-followup-to-function
 @vindex gnus-followup-to-function
-Gnus uses the normal methods to determine where follow-ups are to go,
-but you can change the behaviour to suit your needs by fiddling with
-this variable.
+This variable is most useful in mail groups, where "following up" really
+means sending a mail to a list address.  Gnus uses the normal methods to
+determine where follow-ups are to go, but you can change the behaviour
+to suit your needs by fiddling with this variable.
 
-If you want the followups to go to the "sender" instead of the "from" in
-the group "mail.stupid-list", you could do something like this:
+If you want the followups to go to the @samp{Sender} instead of the
+@samp{From} in the group @samp{mail.stupid-list}, you could do something
+like this:
 
 @lisp
 (setq gnus-followup-to-function
@@ -2650,7 +2700,7 @@ the group "mail.stupid-list", you could do something like this:
               nil))))
 @end lisp
 
-This functions will be called from the buffer of the article that is
+This function will be called narrowed to header of the article that is
 being followed up.
 
 @item gnus-signature-function
@@ -2683,11 +2733,11 @@ which inserts the @dfn{quote line}.  The default value is:
 This will create lines like:
 
 @example
-In article <larszngay8jrql6a@@eyesore.no> Lars Mars <lars@@eyesore.no> writes:
+In article <zngay8jrql@@eyesore.no> Lars Mars <lars@@eyesore.no> writes:
 @end example
 
-Having the Message-Id in this line is probably overkill, so I would
-suggest this hook instead:
+Having the @code{Message-Id} in this line is probably overkill, so I
+would suggest this hook instead:
 
 @lisp
 (setq news-reply-header-hook
@@ -2708,8 +2758,8 @@ handles FCC processing (ie. saving the article to a file.)
 @vindex gnus-inews-article-header-hook
 This hook is called after inserting the required headers in an article
 to be posted.  The hook is called from the @code{*post-news*} buffer,
-narrowed to the headers, and is intended for people who would like to
-insert additional headers, or just change headers in some way.
+narrowed to the head, and is intended for people who would like to
+insert additional headers, or just change headers in some way or other.
 @end table
 
 
@@ -2731,14 +2781,16 @@ Post a followup and send a reply to the current article and include the
 original message (@code{gnus-summary-followup-and-reply-with-original}).
 @end table
 
-Here's a list of variables that are relevant for both mailing and
-posting: 
+Here's a list of variables that are relevant to both mailing and
+posting:
 
 @table @code
 @item gnus-signature-file
-@item mail-signature
+@itemx mail-signature
 @vindex mail-signature
 @vindex gnus-signature-file
+@cindex double signature
+@cindex signature
 If @code{gnus-signature-file} is non-@code{nil}, it should be the name
 of a file containing a signature (@samp{~/.signature} by default).  This
 signature will be appended to all outgoing post.  Most people find it
@@ -2749,9 +2801,9 @@ two signatures.
 
 Note that RFC1036 says that a signature should be preceded by the three
 characters @samp{-- } on a line by themselves.  This is to make it
-easier for the recipient to automatically filter the signature away.  So
-don't remove those characters, even though you might feel that they ruin
-you beautiful design, like, totally.
+easier for the recipient to automatically recognize and process the
+signature.  So don't remove those characters, even though you might feel
+that they ruin you beautiful design, like, totally.
 
 Also note that no signature should be more than four lines long.
 Including ASCII graphics is an efficient way to get everybody to believe
@@ -2761,42 +2813,42 @@ that you are silly and have nothing important to say.
 @vindex mail-yank-prefix
 @cindex yanking
 @cindex quoting
-When you are replying or following up an article, you normally want to
-quote the person you are replying to.  Inserting quoted text is done by
+When you are replying to or following up an article, you normally want
+to quote the person you are answering.  Inserting quoted text is done by
 @dfn{yanking}, and each quoted line you yank will have
-@code{mail-yank-prefix} prepended to it.  This is @samp{   } by default,
+@code{mail-yank-prefix} prepended to it.  This is @samp{ } by default,
 which isn't very pretty.  Most everybody prefers that lines are
 prepended with @samp{> }, so @code{(setq mail-yank-prefix "> ")} in your
-@file{.emacs} file. 
+@file{.emacs} file.
 
 @item mail-yank-ignored-headers
 @vindex mail-yank-ignored-headers
-When you yank a message, you do not want to include any headers from
-this message, so @code{(setq mail-yank-ignored-headers ":")}.  
+When you yank a message, you do not want to quote any headers, so
+@code{(setq mail-yank-ignored-headers ":")}.
 
 @item user-mail-address
 @vindex user-mail-address
 If all of @code{gnus-user-login-name}, @code{gnus-use-generic-from} and
-@code{gnus-local-domain} are nil, Gnus will use @code{user-mail-address}
-as the address part of the From header. 
+@code{gnus-local-domain} are @code{nil}, Gnus will use
+@code{user-mail-address} as the address part of the @code{From} header.
 
 @item gnus-user-from-line
 @vindex gnus-user-from-line
 Your full, complete e-mail address.  This variable overrides the other
-Gnus variables if it is non-nil. 
+Gnus variables if it is non-@code{nil}.
 
-Here are two example values of this variable:
-@samp{"Lars Magne Ingebrigtsen <larsi@@ifi.uio.no>"}
-and @samp{"larsi@@ifi.uio.no (Lars Magne Ingebrigtsen)"}. 
-The first version is recommended, but the name has to be quoted if it
-contains non-alphanumerical characters - @samp{"\"Lars M. Ingebrigtsen\"
-<larsi@@ifi.uio.no>"}.
+Here are two example values of this variable: @samp{"larsi@@ifi.uio.no
+(Lars Magne Ingebrigtsen)"} and @samp{"Lars Magne Ingebrigtsen
+<larsi@@ifi.uio.no>"}. The latter version is recommended, but the name
+has to be quoted if it contains non-alphanumerical characters -
+@samp{"\"Lars M. Ingebrigtsen\" <larsi@@ifi.uio.no>"}.
 
 @item mail-default-headers
 @vindex mail-default-headers
 This is a string that will be inserted into the header of all outgoing
 mail messages and news articles.  Convenient to use to insert standard
-headers. 
+headers.  If @code{nntp-news-default-headers} is non-@code{nil}, that
+variable will override this one when posting articles.
 
 @item gnus-auto-mail-to-author
 @vindex gnus-auto-mail-to-author
@@ -2809,6 +2861,12 @@ your response.  Other people loathe this method and will hate you dearly
 for it, because it means that they will first get a mail, and then have
 to read the same article later when they read the news.  It is
 @code{nil} by default.
+
+@item gnus-mail-courtesy-message
+@vindex gnus-mail-courtesy-message
+This is a string that will be prepended to all mails that are the result
+of using the variable described above.  
+
 @end table
 
 @node Cancelling and Superseding
@@ -2817,7 +2875,7 @@ to read the same article later when they read the news.  It is
 @cindex superseding articles
 
 Have you ever written something, and then decided that you really,
-really, really hadn't posted that? 
+really, really wish you hadn't posted that?
 
 Well, you can't cancel mail, but you can cancel posts.
 
@@ -2826,11 +2884,11 @@ Well, you can't cancel mail, but you can cancel posts.
 Find the article you wish to cancel (you can only cancel your own
 articles, so don't try any funny stuff).  Then press @kbd{C} or @kbd{S
 c} (@code{gnus-summary-cancel-article}).  Your article will be
-cancelled.
+cancelled - machines all over the world will be deleting your article. 
 
 Be aware, however, that not all sites honor cancels, so your article may
-live on in some parts of the world, while most sites will delete the
-cancelled article.
+live on here and there, while most sites will delete the article in
+question.
 
 If you discover that you have made some mistakes and want to do some
 corrections, you can post a @dfn{superseding} article that will replace
@@ -2866,7 +2924,7 @@ Just remember, kids: There is no 'c' in 'supersede'.
 
 There are several marks you can set on an article. 
 
-You have marks that decide the "readed-ness" (whoo, neato-keano
+You have marks that decide the @dfn{readed-ness} (whoo, neato-keano
 neologism ohoy!) of the article.  Alphabetic marks generally mean
 @dfn{read}, while non-alphabetic characters generally mean @dfn{unread}.
 
@@ -2878,7 +2936,9 @@ In addition, you also have marks that do not affect readedness.
 * Other Marks::          Marks that do not affect readedness.
 @end menu
 
+@ifinfo
 There's a plethora of commands for manipulating these marks:
+@end ifinfo
 
 @menu
 * Setting Marks::           How to set and remove marks.
@@ -2928,20 +2988,20 @@ Articles that are actually read are marked with @samp{d}
 Articles that were marked as read in previous sessions are now
 @dfn{ancient} and marked with @samp{A} (@code{gnus-ancient-mark}). 
 @item K
-Marked as killed ((@code{gnus-killed-mark})).
+Marked as killed (@code{gnus-killed-mark}).
 @item X
 Marked as killed by kill files (@code{gnus-kill-file-mark}).
 @item Y
 Marked as read by having a too low score (@code{gnus-low-score-mark}).
 @item C
-Marked as read by a catch-up (@code{gnus-catchup-mark}).
+Marked as read by a catchup (@code{gnus-catchup-mark}).
 @item G
 Cancelled article (@code{gnus-cancelled-mark})
 @end table
 
-All these mark just mean that the article is marked as read,
-really.  They are interpreted differently by the adaptive scoring scheme,
-however. 
+All these marks just mean that the article is marked as read, really.
+They are interpreted differently by the adaptive scoring scheme,
+however.
 
 One more special mark, though:
 
@@ -2969,6 +3029,9 @@ before you've finished reading the thesis.  You can then set a bookmark
 in the article, and Gnus will jump to this bookmark the next time it
 encounters the article.
 
+All articles that you have replied to or made a followup to will be
+marked with an @samp{R} in the second column (@code{gnus-replied-mark}). 
+
 Finally we have the @dfn{process mark}.  A variety of commands react to
 the presence of the process mark.  For instance, @kbd{X u}
 (@code{gnus-uu-decode-uu}) will uudecode and view all articles that have
@@ -2983,27 +3046,27 @@ All the marking commands understand the numeric prefix.
 
 @table @kbd
 @item M t
-@item !
+@itemx !
 @kindex ! (Summary)
 @kindex M t (Summary)
 @findex gnus-summary-tick-article-forward
 Tick the current article (@code{gnus-summary-tick-article-forward}).
 @item M ?
-@item ?
+@itemx ?
 @kindex ? (Summary)
 @kindex M ? (Summary)
 @findex gnus-summary-mark-as-dormant
 Mark the current article as dormant
 (@code{gnus-summary-mark-as-dormant}).
 @item M d
-@item d
+@itemx d
 @kindex M d (Summary)
 @kindex d (Summary)
 @findex gnus-summary-mark-as-read-forward
 Mark the current article as read
 (@code{gnus-summary-mark-as-read-forward}).
 @item M k
-@item k
+@itemx k
 @kindex k (Summary)
 @kindex M k (Summary)
 @findex gnus-summary-kill-same-subject-and-select
@@ -3011,7 +3074,7 @@ Mark all articles that have the same subject as the current one as read,
 and then select the next unread article
 (@code{gnus-summary-kill-same-subject-and-select}).
 @item M K
-@item C-k
+@itemx C-k
 @kindex M K (Summary)
 @kindex C-k (Summary)
 @findex gnus-summary-kill-same-subject
@@ -3028,16 +3091,22 @@ Catchup all articles in the current group (@code{gnus-summary-catchup-all}).
 @item M H
 @kindex M H (Summary)
 @findex gnus-summary-catchup-to-here
-Catchup the current group to point (@code{gnus-summary-catchup-to-here}).
+Catchup the current group to point
+(@code{gnus-summary-catchup-to-here}). 
+@item C-w
+@kindex C-w (Summary)
+@findex gnus-summary-mark-region-as-read
+Mark all articles between point and mark as read
+(@code{gnus-summary-mark-region-as-read}). 
 @item M c
-@item M-u
+@itemx M-u
 @kindex M c (Summary)
 @kindex M-u (Summary)
 @findex gnus-summary-clear-mark-forward
-Clear tick and read marks from the current article
+Clear all readedness-marks from the current article
 (@code{gnus-summary-clear-mark-forward}).
 @item M e
-@item E
+@itemx E
 @kindex M e (Summary)
 @kindex E (Summary)
 @findex gnus-summary-mark-as-expirable
@@ -3054,16 +3123,14 @@ Set a bookmark in the current article
 Remove the bookmark from the current article
 (@code{gnus-summary-remove-bookmark}).
 @item M M-r
-@item M-d
+@itemx x
 @kindex M M-r (Summary)
 @kindex M-d (Summary)
 @findex gnus-summary-remove-lines-marked-as-read
 Expunge all deleted articles from the summary buffer
 (@code{gnus-summary-remove-lines-marked-as-read}). 
 @item M M-C-r
-@item M-C-d
 @kindex M M-C-r (Summary)
-@kindex M-C-d (Summary)
 @findex gnus-summary-remove-lines-marked-with
 Ask for a mark and then expunge all articles that have been marked with
 that mark (@code{gnus-summary-remove-lines-marked-with}).
@@ -3093,7 +3160,7 @@ over the numeric prefix) (@code{gnus-summary-clear-above}).
 @kindex M s u (Summary)
 @findex gnus-summary-tick-above
 Tick all articles with scores over the default score (or over the
-numeric prefix) (@code{gnus-summary-clear-above}).
+numeric prefix) (@code{gnus-summary-tick-above}).
 @item M s m
 @kindex M s m (Summary)
 @findex gnus-summary-mark-above
@@ -3113,7 +3180,7 @@ one line up or down.
 
 @table @kbd
 @item M p p
-@item #
+@itemx #
 @kindex # (Summary)
 @kindex M p p (Summary)
 @findex gnus-summary-mark-as-processable
@@ -3121,11 +3188,11 @@ Mark the current article with the process mark
 (@code{gnus-summary-mark-as-processable}). 
 @findex gnus-summary-unmark-as-processable
 @item M p u 
-@item M-#
+@itemx M-#
 @kindex M p u (Summary)
 @kindex M-# (Summary)
-Remove the process mark from the current article
-(@code{gnus-summary-unmark-as-processable}). 
+Remove the process mark, if any, from the current article
+(@code{gnus-summary-unmark-as-processable}).
 @item M p U
 @kindex M p U (Summary)
 @findex gnus-summary-unmark-all-processable
@@ -3253,9 +3320,9 @@ will be hidden.
 @item gnus-thread-ignore-subject
 @vindex gnus-thread-ignore-subject
 Sometimes somebody changes the subject in the middle of a thread.  If
-this variable is non-@code{nil}, the change in subject is ignored.  If
-it is @code{nil}, which is the default, a change in the subject will
-result in a new thread.
+this variable is non-@code{nil}, the subject change is ignored.  If it
+is @code{nil}, which is the default, a change in the subject will result
+in a new thread.
 @item gnus-thread-indent-level
 @vindex gnus-thread-indent-level
 This is a number that says how much each subthread should be indented.
@@ -3268,7 +3335,7 @@ The default is @samp{4}.
 
 @table @kbd
 @item T k
-@item M-C-k
+@itemx M-C-k
 @kindex T k (Summary)
 @kindex M-C-k (Summary)
 @findex gnus-summary-kill-thread
@@ -3277,7 +3344,7 @@ Mark all articles in the current subtread as read
 remove all marks instead.  If the prefix argument is negative, tick
 articles instead.
 @item T l
-@item M-C-l
+@itemx M-C-l
 @kindex T l (Summary)
 @kindex M-C-l (Summary)
 @findex gnus-summary-lower-thread
@@ -3347,20 +3414,21 @@ group and return you to the group buffer.
 
 @table @kbd
 @item Z Z
-@item q
+@itemx q
+@kindex Z Z (Summary)
 @kindex q (Summary)
 @findex gnus-summary-exit
 Exit the current group and update all information on the group
 (@code{gnus-summary-exit}).
 @item Z E
-@item Q
+@itemx Q
 @kindex Z E (Summary)
 @kindex Q (Summary)
 @findex gnus-summary-exit-no-update
 Exit the current group without updating any information on the group
 (@code{gnus-summary-exit-no-update}).
 @item Z c
-@item c
+@itemx c
 @kindex Z c (Summary)
 @kindex c (Summary)
 @findex gnus-summary-catchup-and-exit
@@ -3383,14 +3451,14 @@ Mark all articles as read and go to the next group
 group.  
 
 @vindex gnus-use-cross-reference
-When you exit the summary buffer, the data on the current group will be
-updated (which articles you have read, which articles you have replied
-to, etc.) If the @code{gnus-use-cross-reference} variable is @code{t},
-articles that are cross-referenced to this group, and are marked as
-read, will also be marked as read in the other subscribed groups they
-were cross-posted to.  If this variable is neither @code{nil} nor
-@code{t}, the article will be marked as read in both subscribed and
-unsubscribed groups.
+The data on the current group will be updated (which articles you have
+read, which articles you have replied to, etc.) when you exit the
+summary buffer.  If the @code{gnus-use-cross-reference} variable is
+@code{t}, articles that are cross-referenced to this group and are
+marked as read, will also be marked as read in the other subscribed
+groups they were cross-posted to.  If this variable is neither
+@code{nil} nor @code{t}, the article will be marked as read in both
+subscribed and unsubscribed groups.
 
 Marking cross-posted articles as read ensures that you'll never have to
 read the same article more than once.  Unless, of course, somebody has
@@ -3405,16 +3473,17 @@ separately to several groups is not.
 One thing that may cause Gnus to not do the cross-posting thing
 correctly is if you use an @sc{nntp} server that supports @sc{xover}
 (which is very nice, because it speeds things up considerably) which
-does not include the Xref header in its @sc{nov} lines.  This is Evil,
-but it's common.  Gnus tries to Do The Right Thing even with @sc{xover}
-by registering the Xref lines of all articles you actually read, but if
-you kill the articles, or just mark them as read without reading them,
-Gnus will not get a chance to snoop the Xref lines out of these
-articles, and will be unable to use the cross reference mechanism.
+does not include the @code{Xref} header in its @sc{nov} lines.  This is
+Evil, but all too common, alas, alack.  Gnus tries to Do The Right Thing
+even with @sc{xover} by registering the @code{Xref} lines of all
+articles you actually read, but if you kill the articles, or just mark
+them as read without reading them, Gnus will not get a chance to snoop
+the @code{Xref} lines out of these articles, and will be unable to use
+the cross reference mechanism.
 
 @vindex gnus-nov-is-evil
-If you want Gnus to get the Xrefs right all the time, you have to set
-@code{gnus-nov-is-evil} to @code{t}, which slows things down
+If you want Gnus to get the @code{Xref}s right all the time, you have to
+set @code{gnus-nov-is-evil} to @code{t}, which slows things down
 considerably.
 
 C'est la vie.
@@ -3423,9 +3492,8 @@ C'est la vie.
 @section Process/Prefix
 @cindex process/prefix convention
 
-Many functions, among them functions for moving articles, decoding
-articles and saving articles use what is known as the
-@dfn{Process/Prefix convention}.
+Many functions, among them functions for moving, decoding and saving
+articles, use what is known as the @dfn{Process/Prefix convention}.
 
 This is a method for figuring out what articles that the user wants the
 command to be performed on.
@@ -3463,7 +3531,7 @@ unwanted headers before saving the article.
 
 @table @kbd
 @item V o o
-@item o
+@itemx o
 @kindex V o o (Summary)
 @kindex o (Summary)
 @findex gnus-summary-save-article
@@ -3488,7 +3556,7 @@ Save the current article in plain file format
 @kindex V o h (Summary)
 @findex gnus-summary-save-article-folder
 Save the current article in mh folder format
-(@code{gnus-summary-save-article-file}). 
+(@code{gnus-summary-save-article-folder}). 
 @item V o p
 @kindex V o p (Summary)
 @findex gnus-summary-pipe-output
@@ -3501,8 +3569,8 @@ All these commands use the process/prefix convention
 
 @vindex gnus-default-article-saver
 You can customize the @code{gnus-default-article-saver} variable to make
-Gnus what you want it to.  You can use any of the four ready-made
-functions below, or you can create your own. 
+Gnus do what you want it to.  You can use any of the four ready-made
+functions below, or you can create your own.
 
 @table @code
 @item gnus-summary-save-in-rmail
@@ -3580,7 +3648,7 @@ encoded in some way or other.  Gnus can decode them for you.
 All these functions use the process/prefix convention
 (@pxref{Process/Prefix}) for finding out what articles to work on, with
 the extension that a "single article" means "a single series".  Gnus can
-find out by itself what articles belong to one series, decode all the
+find out by itself what articles belong to a series, decode all the
 articles and unpack/view/save the resulting file(s).
 
 Gnus guesses what articles are in the series according to the following
@@ -3612,8 +3680,9 @@ commands, and you have to mark the articles manually with @key{#}.
 Uudecodes the current series (@code{gnus-uu-decode-uu}).
 @item X U
 @kindex X U (Summary)
-@findex gnus-uu-decode-and-save
-Uudecodes and saves the current series (@code{gnus-uu-decode-and-save}).
+@findex gnus-uu-decode-uu-and-save
+Uudecodes and saves the current series
+(@code{gnus-uu-decode-uu-and-save}).
 @item X v u
 @kindex X v u (Summary)
 @findex gnus-uu-decode-uu-view
@@ -3628,16 +3697,17 @@ Uudecodes, views and saves the current series
 Remember that these all react to the presence of articles marked with
 the process mark.  If, for instance, you'd like to uncode and save an
 entire newsgroup, you'd typically do @kbd{M p a}
-(@code{gnus-uu-mark-all}) and then @kbd{X U} (@code{gnus-uu-decode-uu}).
+(@code{gnus-uu-mark-all}) and then @kbd{X U}
+(@code{gnus-uu-decode-uu-and-save}).
 
 All this is very much different from how @code{gnus-uu} worked with
 @sc{gnus 4.1}, where you had explicit keystrokes for everything under
-the sun.  This version of @code{gnus-uu} generally assumes that you
-either mark articles in some way (@pxref{Setting Process Marks}) and
-then press @kbd{X u}.
+the sun.  This version of @code{gnus-uu} generally assumes that you mark
+articles in some way (@pxref{Setting Process Marks}) and then press
+@kbd{X u}.
 
 Note: When trying to decode articles that have names matching
-@code{gnus-uu-notify-files}, which hard-coded to
+@code{gnus-uu-notify-files}, which is hard-coded to
 @samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will
 automatically post an article on @samp{comp.unix.wizards} saying that
 you have just viewed the file in question.  This feature can't be turned
@@ -3676,6 +3746,7 @@ Adjective, not verb.
 @menu 
 * Rule Variables::          Variables that say how a file is to be viewed.
 * Other Decode Variables::  Other decode variables.
+* Uuencoding & Posting::    Variables for customizing uuencoding.
 @end menu
 
 @node Rule Variables
@@ -3707,7 +3778,7 @@ This variable is consulted if Gnus couldn't make any matches from the
 user and default view rules.
 @item gnus-uu-user-archive-rules
 @vindex gnus-uu-user-archive-rules
-This variable can be used to say what comamnds should be used to unpack
+This variable can be used to say what commands should be used to unpack
 archives.
 @end table
 
@@ -3763,14 +3834,14 @@ unsuccessfully decoded as unread.
 @item gnus-uu-correct-stripped-uucode
 @vindex gnus-uu-correct-stripped-uucode
 Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix
-uuencoded files that have had traling spaces deleted.
+uuencoded files that have had trailing spaces deleted.
 
 @item gnus-uu-view-with-metamail
 @vindex gnus-uu-view-with-metamail
 Non-@code{nil} means that @code{gnus-uu} will ignore the viewing
 commands defined by the rule variables and just fudge a @sc{mime}
-content type based on the file name.  The result will be fed to metamail
-for viewing.
+content type based on the file name.  The result will be fed to
+@code{metamail} for viewing.
 
 @item gnus-uu-save-in-digest
 @vindex gnus-uu-save-in-digest
@@ -3781,6 +3852,13 @@ embellishments.  The digesting almost conforms to RFC1153 - no easy way
 to specify any meaningful volume and issue numbers were found, so I
 simply dropped them.
 
+@end table
+
+@node Uuencoding & Posting
+@subsubsection Uuencoding & Posting
+
+@table @code
+
 @item gnus-uu-post-include-before-composing
 @vindex gnus-uu-post-include-before-composing
 Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode
@@ -3813,7 +3891,7 @@ Default is @code{t}.
 
 @node Viewing Files
 @subsection Viewing Files
-@cindex vieving files
+@cindex viewing files
 @cindex pseudo-articles
 
 After decoding, if the file is some sort of archive, Gnus will attempt
@@ -3826,7 +3904,7 @@ of archives, it'll all be unpacked.
 
 Finally, Gnus will normally insert a @dfn{pseudo-article} for each
 extracted file into the summary buffer.  If you go to these "articles",
-the user will be prompted for a command to run (usually Gnus will make a
+you will be prompted for a command to run (usually Gnus will make a
 suggestion), and then the command will be run.
 
 @vindex gnus-view-pseudo-asynchronously
@@ -3847,10 +3925,10 @@ be asked for a confirmation before viewing is done.
 @item A w
 @kindex A w (Summary)
 @findex gnus-summary-stop-page-breaking
-Remove page breaking from the current article
-(@code{gnus-summary-stop-page-breaking}). 
+Remove page breaks from the current article
+(@code{gnus-summary-stop-page-breaking}).
 @item A s 
-@item A s (Summary)
+@kindex A s (Summary)
 @findex gnus-summary-isearch-article
 Perform an isearch in the article buffer
 (@code{gnus-summary-isearch-article}). 
@@ -3906,15 +3984,24 @@ Remove CR (@code{gnus-article-remove-cr}).
 @kindex A h q (Summary)
 @findex gnus-article-de-quoted-unreadable
 Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}).
+@item A h f
+@kindex A h f (Summary)
+@findex gnus-article-display-x-face
+@findex gnus-article-x-face-command
+Look for and display any X-Face headers
+(@code{gnus-article-display-x-face}).  The command executed by this
+function is given by the @code{gnus-article-x-face-command} variable.
+If this variable is a string, this string will be executed in a
+sub-shell.  If it is a function, this function will be called with the
+face as the argument.
 @end table
 
-
 @node Summary Sorting
 @section Summary Sorting
 @cindex summary sorting
 
 You can have the summary buffer sorted in various ways, even though I
-can't really se why you'd want that.
+can't really see why you'd want that.
 
 @table @kbd
 @item V s n
@@ -3936,8 +4023,8 @@ Sort by date (@code{gnus-summary-sort-by-date}).
 @end table
 
 These functions will work both when you use threading and when you don't
-use threading.  In the former case, all summary lines will be sorted,
-line by line.  In the latter case, sorting will be done on a
+use threading.  In the latter case, all summary lines will be sorted,
+line by line.  In the former case, sorting will be done on a
 root-by-root basis, which might not be what you were looking for.  To
 toggle whether to use threading, type @kbd{T T} (@pxref{Thread
 Commands}).
@@ -3952,28 +4039,28 @@ Commands}).
 If you'd like to read the parent of the current article, and it is not
 displayed in the article buffer, you might still be able to.  That is,
 if the current group is fetched by @sc{nntp}, the parent hasn't expired
-and the References in the current article are not mangled, you can just
-press @kbd{^} or @kbd{A r} (@code{gnus-summary-refer-parent-article}).
-If everything goes well, you'll get the parent.  If the parent is
-already displayed in the summary buffer, point will just move to this
-article.
+and the @code{References} in the current article are not mangled, you
+can just press @kbd{^} or @kbd{A r}
+(@code{gnus-summary-refer-parent-article}).  If everything goes well,
+you'll get the parent.  If the parent is already displayed in the
+summary buffer, point will just move to this article.
 
 @findex gnus-summary-refer-article
 @kindex M-^ (Summary)
 You can also ask the @sc{nntp} server for an arbitrary article, no
 matter what group it belongs to.  @kbd{V r}
-(@code{gnus-summary-refer-article}) will ask you for a message-id, which
-is one of those long thingies that look something like
-@samp{<38o6up$6f2@@hymir.ifi.uio.no>}.  You have to get it all exactly
-right.  No fuzzy searches, I'm afraid.
+(@code{gnus-summary-refer-article}) will ask you for a
+@code{Message-Id}, which is one of those long thingies that look
+something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}.  You have to get
+it all exactly right.  No fuzzy searches, I'm afraid.
 
 @vindex gnus-refer-article-method
 If the group you are reading is located on a backend that does not
-support fetching by Message-ID very well (like @code{nnspool}), you can
-set @code{gnus-refer-article-method} to an @sc{nntp} method.  It would,
-perhaps, be best if the @sc{nntp} server you consult is the same as the
-one that keeps the spool you are reading from updated, but that's not
-really necessary.
+support fetching by @code{Message-Id} very well (like @code{nnspool}),
+you can set @code{gnus-refer-article-method} to an @sc{nntp} method.  It
+would, perhaps, be best if the @sc{nntp} server you consult is the same
+as the one that keeps the spool you are reading from updated, but that's
+not really necessary.
 
 @node Score Files
 @section Score Files
@@ -3993,10 +4080,9 @@ files.  Articles that have a score lower than
 Gnus will read any @dfn{score files} that apply to the current group
 before generating the summary buffer.
 
-There are several commands reachable from the summary buffer that
-inserts commands for scoring articles based on the current article.  You
-can, for instance, ask Gnus to lower or increase the score of all
-articles with a certain subject.
+There are several commands in the summary buffer that inserts score
+entries based on the current article.  You can, for instance, ask Gnus
+to lower or increase the score of all articles with a certain subject.
 
 There are two sorts of scoring entries: Permanent and temporary.
 Temporary score entries are self-expiring entries.  Any entries that are
@@ -4018,16 +4104,16 @@ silently to help keep the sizes of the score files down.
 @subsection Summary Score Commands
 @cindex score commands
 
-All score commands that alter score entries do not actually work towards
-a real score file.  That would be to inefficient.  Gnus maintains a
-cache of previously loaded score files, one of which is considered the
+The score commands that alter score entries do not actually modify real
+score files.  That would be too inefficient.  Gnus maintains a cache of
+previously loaded score files, one of which is considered the
 @dfn{current score file alist}.  The score commands simply insert
-entries into this list, and upon group exit, this list is saved.  
+entries into this list, and upon group exit, this list is saved.
 
-The current score file is always the group's local score file, even if
-no such score file actually exists.  To insert score commands into some
-other score file (eg. @file{all.SCORE}), you must first make this score
-file the current one.
+The current score file is by default the group's local score file, even
+if no such score file actually exists.  To insert score commands into
+some other score file (eg. @file{all.SCORE}), you must first make this
+score file the current one.
 
 General score commands that don't actually change the score file:
 
@@ -4130,9 +4216,9 @@ Increase the current thread temporarily
 (@code{gnus-summary-temporarily-raise-by-thread}).
 @item I t p
 @kindex I t p (Summary)
-@findex gnus-summary-raise-by-subject
+@findex gnus-summary-raise-by-thread
 Increase the current thread permanently
-(@code{gnus-summary-raise-by-subject}).
+(@code{gnus-summary-raise-by-thread}).
 @item I x t
 @kindex I x t (Summary)
 @findex gnus-summary-temporarily-raise-by-xref
@@ -4187,7 +4273,7 @@ operation.
 @item L b p
 @kindex L b p (Summary)
 @findex gnus-summary-lower-by-body
-Lower bsed on a match on the article body
+Lower based on a match on the article body
 (@code{gnus-summary-lower-by-body}).  This is a very slow operation.
 @item L i t
 @kindex L i t (Summary)
@@ -4206,9 +4292,9 @@ Lower the current thread temporarily
 (@code{gnus-summary-temporarily-lower-by-thread}).
 @item L t p
 @kindex L t p (Summary)
-@findex gnus-summary-lower-by-subject
+@findex gnus-summary-lower-by-thread
 Lower the current thread permanently
-(@code{gnus-summary-lower-by-subject}).
+(@code{gnus-summary-lower-by-thread}).
 @item L x t
 @kindex L x t (Summary)
 @findex gnus-summary-temporarily-lower-by-xref
@@ -4246,8 +4332,8 @@ group again to kill more articles, it won't work.  You have to set this
 variable to @code{t} to do that.
 @item gnus-kill-files-directory
 @vindex gnus-kill-files-directory
-All kill files will be stored in this directory, which is initialized
-from the @samp{SAVEDIR} environment variable by default.
+All kill and score files will be stored in this directory, which is
+initialized from the @samp{SAVEDIR} environment variable by default.
 @item gnus-score-file-suffix
 @vindex gnus-score-file-suffix
 Suffix to add to the group name to arrive at the score file name
@@ -4256,9 +4342,9 @@ Suffix to add to the group name to arrive at the score file name
 @vindex gnus-score-interactive-default-score
 Score used by all the interactive raise/lower commands to raise/lower
 score with.  Default is 1000, which may seem excessive, but this is to
-ensure that the adaptive scoring scheme gets enough room to play
-with.  We don't want the small changes that successive adaptive changes
-to overwrite manually entered data.
+ensure that the adaptive scoring scheme gets enough room to play with.
+We don't want the small changes from the adaptive scoring to overwrite
+manually entered data.
 @item gnus-summary-default-score
 @vindex gnus-summary-default-score
 Default score of an article, which is 0 by default.
@@ -4283,27 +4369,34 @@ Only apply the group's own score file.
 @item gnus-score-find-bnews
 @findex gnus-score-find-bnews
 Apply all score files that match, using bnews syntax.  For instance, if
-the current group is @samp{gnu.emacs.gnus}, @samp{gnu.all.SCORE},
-@samp{all.emacs.all.SCORE} and @samp{not.alt.all.SCORE} would all
-apply.  In short, the instances of @samp{all} in the score file names are
+the current group is @samp{gnu.emacs.gnus}, @samp{all.emacs.all.SCORE},
+@samp{not.alt.all.SCORE} and @samp{gnu.all.SCORE} would all apply.  In
+short, the instances of @samp{all} in the score file names are
 translated into @samp{.*}, and then a regexp match is done.
 @item gnus-score-find-hierarchical
 @findex gnus-score-find-hierarchical
 Apply all score files from all the parent groups.
 @end table
+This variable can also be a list of functions.  In that case, all these
+functions will be called, and all the returned lists of score files will
+be applied.  These functions can also return lists of score alists
+directly.  In that case, the functions that return these non-file score
+alists should probably be placed before the "real" score file functions,
+to ensure that the last score file returned is the local score file.
+Phu. 
 @item gnus-kill-expiry-days
 @vindex gnus-kill-expiry-days
 This variable says how many days should pass before an unused score file
-entry should be expired.  The default is 7.
+entry is expired.  The default is 7.
 @end table
 
 @node Score File Format
 @subsection Score File Format
 @cindex score file format
 
-A score file is an emacs-lisp file that normally contains just a single
-form.  Casual users are not expected to edit these files, everthing can
-be changed from the summary buffer.
+A score file is an @code{emacs-lisp} file that normally contains just a
+single form.  Casual users are not expected to edit these files;
+everything can be changed from the summary buffer.
 
 Anyway, if you'd like to dig into it yourself, here's an example:
 
@@ -4348,8 +4441,8 @@ perform the match on the head of the article, and @samp{All} will
 perform the match on the entire article.  Note that using any of these
 last three keys will slow down group entry @emph{considerably}.  
 
-Following this key is a random number of element score entries, where
-each score entry have one to four elements.
+Following this key is a random number of score entries, where each score
+entry has one to four elements.
 @enumerate
 @item 
 The first element is the @dfn{match element}.  On most headers this will
@@ -4358,20 +4451,21 @@ integer.
 @item 
 If the second element is present, it should be a number - the @dfn{score
 element}.  This number should be an integer in the neginf to posinf
-interval.  If this element is not present, the
+interval.  This number is added to the score of the article if the match
+is successful.  If this element is not present, the
 @code{gnus-score-interactive-default-score} number will be used instead.
 @item 
 If the third element is present, it should be a number - the @dfn{date
-element}.  This date says when the last time this score entry provided a
-match, which provides a mechanism for expiring the score entries.  It
-this element is not present, the score entry is premanent.  The date is
-represented by the number of days since December 31, 1 CE.
+element}.  This date says when the last time this score entry matched,
+which provides a mechanism for expiring the score entries.  It this
+element is not present, the score entry is permanent.  The date is
+represented by the number of days since December 31, 1 ce.
 @item 
 If the fourth element is present, it should be a symbol - the @dfn{type
-element}.  This element specifies what function should be performed to
-see whether this score entry matches the article.  What match types that
-can be used depends on what header you wish to perform the match on.
-@itemize @bullet
+element}.  This element specifies what function should be used to see
+whether this score entry matches the article.  What match types that can
+be used depends on what header you wish to perform the match on.
+@table @dfn
 @item From, Subject, References, Xref, Message-ID
 For most header types, there are the @code{r} and @code{R} (regexp) as
 well as @code{s} and @code{S} (substring) types.  If this element is not
@@ -4390,9 +4484,9 @@ like, it would feel kinda silly not to provide this function.  Just in
 case.  You never know.  Better safe than sorry.  Once burnt, twice shy.
 Don't judge a book by its cover.  Never not have sex on a first date.
 @item Head, Body, All
-These three match keys use the same match types as the From (etc) header
-uses. 
-@end itemize
+These three match keys use the same match types as the @code{From} (etc)
+header uses.
+@end table
 @end enumerate
 
 @item mark
@@ -4406,9 +4500,13 @@ The value of this entry should be a number.  Any articles with a score
 lower than this number will be marked as read and removed from the
 summary buffer.
 @item files
-The value of this entry should any number of file names.  These files
+The value of this entry should be any number of file names.  These files
 are assumed to be score files as well, and will be loaded the same way
 this one was.
+@item exclude-files
+The clue of this entry should be any number of files.  This files will
+not be loaded, even though they would normally be so, for some reason or
+other. 
 @item eval
 The value of this entry will be @code{eval}el.  This element will be
 ignored when handling global score files. 
@@ -4448,10 +4546,10 @@ you were wondering.
 @subsection Scoring Tips
 @cindex scoring tips
 
-@itemize @bullet
+@table @dfn
 @item Crossposts
 If you want to lower the score of crossposts, the line to match on is
-the Xref header.  
+the @code{Xref} header.
 @lisp
 ("xref" (" talk.politics.misc:" -1000))
 @end lisp
@@ -4478,7 +4576,7 @@ in your @file{all.SCORE} file:
 ((mark -100))
 @end lisp
 You may also consider doing something similar with @code{expunge}.  
-@end itemize
+@end table
 
 @node Reverse Scoring
 @subsection Reverse Scoring
@@ -4504,7 +4602,7 @@ rest as read, and expunge them to boot.
 
 Sure, other newsreaders have "global kill files".  These are usually
 nothing more than a single kill file that applies to all groups, stored
-under the user's home directory.  Bah!  Puny, weak newsreaders!
+in the user's home directory.  Bah!  Puny, weak newsreaders!
 
 What I'm talking about here are Global Score Files.  Score files from
 all over the world, from users everywhere, uniting all nations in one
@@ -4512,13 +4610,13 @@ big, happy score file union!  Ange-score!  New and untested!
 
 @vindex gnus-global-score-files
 All you have to do to use other people's score files is to set the
-@code{gnus-global-score-files}.  One entry for each score file, or each
-score file directory.  Gnus will decide by itself what score files are
-applicable to which group.
+@code{gnus-global-score-files} variable.  One entry for each score file,
+or each score file directory.  Gnus will decide by itself what score
+files are applicable to which group.
 
-Say you want to use the single score file
-@file{/ftp@@ftp.ifi.uio.no:/pub/larsi/ding/score/soc.motss.SCORE} and all
-score files in the @file{/ftp@@ftp.some-where:/pub/score} directory.  
+Say you want to use all score files in the
+@file{/ftp@@ftp.some-where:/pub/score} directory and the single score
+file @file{/ftp@@ftp.ifi.uio.no:/pub/larsi/ding/score/soc.motss.SCORE}:
 
 @lisp
 (setq gnus-global-score-files
@@ -4549,12 +4647,12 @@ head:
 @item 
 Articles that are heavily crossposted are probably junk. 
 @item
-To lower a single inappropriate article, lower by message-id. 
+To lower a single inappropriate article, lower by @code{Message-Id}.
 @item
 Particularly brilliant authors can be raised on a permanent basis. 
 @item
 Authors that repeatedly post off-charter for the group can safely be
-lowered out of existance.
+lowered out of existence.
 @item
 Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest
 articles completely.
@@ -4574,17 +4672,17 @@ holding our breath yet?
 @cindex kill files
 
 (ding) Gnus still supports those pesky old kill files.  In fact, the
-kill file netries can now be expiring, which is something I wrote before
-Per thought of doing score files, so I've left the code there.
+kill file entries can now be expiring, which is something I wrote before
+Per thought of doing score files, so I've left the code in there.
 
 In short, kill processing is a lot slower (and I do mean @emph{a lot})
 than score processing, so it might be a good idea to rewrite your kill
 files into score files.
 
-Anyway, a kill file is a normal elisp file.  You can put any forms into
-this file, which means that you can use kill files as some sort of
-primitive hook function to be run on group entry, even though that isn't
-really a very good idea.
+Anyway, a kill file is a normal @code{emacs-lisp} file.  You can put any
+forms into this file, which means that you can use kill files as some
+sort of primitive hook function to be run on group entry, even though
+that isn't a very good idea.
 
 Normal kill files look like this:
 
@@ -4607,9 +4705,17 @@ Edit this group's kill file (@code{gnus-summary-edit-local-kill}).
 @item V K
 @kindex V K (Summary)
 @findex gnus-summary-edit-global-kill
-Edit the general kill file (@code{gnus-summary-edit-local-kill}).
+Edit the general kill file (@code{gnus-summary-edit-global-kill}).
 @end table
 
+@vindex gnus-kill-file-name
+A kill file for the group @samp{soc.motss} is normally called
+@file{soc.motss.KILL}.  The suffix appended to the group name to get
+this file name is detailed by the @code{gnus-kill-file-name} variable.
+The "global" kill file (not in the score file sense of "global", of
+course) is called just @file{KILL}.
+
+
 @node Mail Group Commands
 @section Mail Group Commands
 @cindex mail group commands
@@ -4647,14 +4753,14 @@ Copy the article from one group (mail group or not) to a mail group
 @findex gnus-summary-respool-article
 Respool the mail article (@code{gnus-summary-move-article}).
 @item V m w
-@item e
+@itemx e
 @kindex V m w (Summary)
 @kindex e (Summary)
 @findex gnus-summary-edit-article
 @kindex C-c C-c (Article)
-Edit the current article (@code{gnus-summary-edit-article}).  Type
-@kbd{C-c C-c} (@kbd{gnus-summary-edit-article-done}) to finish editing
-and make the changes permanent.
+Edit the current article (@code{gnus-summary-edit-article}).  To finish
+editing and make the changes permanent, type @kbd{C-c C-c}
+(@kbd{gnus-summary-edit-article-done}).
 @end table
 
 @node Various Summary Stuff
@@ -4668,7 +4774,7 @@ and make the changes permanent.
 
 @vindex gnus-summary-prepare-hook
 @code{gnus-summary-prepare-hook} is called after the summary buffer has
-been generated.  You might use it to, for instance, hilight lines or
+been generated.  You might use it to, for instance, highlight lines or
 modify the look of the buffer in some other ungodly manner.  I don't
 care.
 
@@ -4683,13 +4789,13 @@ care.
 Try to fetch the FAQ (list of frequently asked questions) for the
 current group (@code{gnus-summary-fetch-faq}).  Gnus will try to get the
 FAQ from @code{gnus-group-faq-directory}, which is usually a directory
-on a remote machine. ange-ftp will be used for fetching the file.
+on a remote machine. @code{ange-ftp} will be used for fetching the file.
 @item V d
 @kindex V d (Summary)
 @findex gnus-summary-describe-group
 Give a brief description of the current group
-(@code{gnus-summary-describe-group}).  If given a prefix, force reading
-new description from the server. 
+(@code{gnus-summary-describe-group}).  If given a prefix, force
+rereading the description from the server.
 @item V ?
 @kindex V ? (Summary)
 @findex gnus-summary-describe-briefly
@@ -4719,8 +4825,8 @@ Search through all previous articles for a regexp
 @kindex V & (Summary)
 @findex gnus-summary-execute-command
 This command will prompt you for a header field, a regular expression to
-be matched this field, and a command to be executed if the match is
-made (@code{gnus-summary-execute-command}). 
+match on this field, and a command to be executed if the match is made
+(@code{gnus-summary-execute-command}).
 @item V u
 @kindex V u (Summary)
 @findex gnus-summary-universal-argument
@@ -4736,7 +4842,7 @@ the process mark (@code{gnus-summary-universal-argument}).
 @kindex V D (Summary)
 @findex gnus-summary-enter-digest-group
 If the current article is a digest, you might use this command to enter
-you into a group based onthe current digest to ease reading
+you into a group based on the current digest to ease reading
 (@code{gnus-summary-enter-digest-group}).  @xref{nndigest}.
 @item V T
 @kindex V T (Summary)
@@ -4753,12 +4859,12 @@ Exit this group, and then enter it again
 (@code{gnus-summary-reselect-current-group}).  If given a prefix, select
 all articles, both read and unread.
 @item V g
-@item M-g
+@itemx M-g
 @kindex V g (Summary)
 @kindex M-g (Summary)
 @findex gnus-summary-rescan-group
-Exit group, check for new articles in the group, and select the group
-(@code{gnus-summary-rescan-group}).  If given a prefix, select all
+Exit the group, check for new articles in the group, and select the
+group (@code{gnus-summary-rescan-group}).  If given a prefix, select all
 articles, both read and unread.
 @end table
 
@@ -4782,27 +4888,27 @@ one.  All the summary buffer share the same article buffer.
 @cindex hiding headers
 @cindex deleting headers
 
-The top section of each article is the @dfn{header}.  (The rest is the
-@dfn{body}, but you may have guessed that already.) 
+The top section of each article is the @dfn{head}.  (The rest is the
+@dfn{body}, but you may have guessed that already.)
 
 @vindex gnus-show-all-headers
-There is a lot of useful information in the header: the name of the
-person who wrote the article, the date and the subject of the article.
-That well and nice, but there's also lots of information most people do
-not want to see - what systems the article has passed through before
-reaching you, the message id, the references, etc. ad nauseum - and
-you'll probably want to get rid of some of those lines.  If you want to
-keep all those lines in the article buffer, you can set
-@code{gnus-show-all-headers} to @code{t}.
+There is a lot of useful information in the head: the name of the person
+who wrote the article, the date it was written and the subject of the
+article.  That's well and nice, but there's also lots of information
+most people do not want to see - what systems the article has passed
+through before reaching you, the @code{Message-Id}, the
+@code{References}, etc. ad nauseum - and you'll probably want to get rid
+of some of those lines.  If you want to keep all those lines in the
+article buffer, you can set @code{gnus-show-all-headers} to @code{t}.
 
-Gnus provides you with two variables for sifting header lines:
+Gnus provides you with two variables for sifting headers:
 
 @table @code
 @item gnus-visible-headers
 @vindex gnus-visible-headers
 If this variable is non-@code{nil}, it should be a regular expression
-that says what header lines you wish to keep in the article buffer.  All
-header lines that does not match this variable will be hidden.
+that says what headers you wish to keep in the article buffer.  All
+headers that do not match this variable will be hidden.
 
 For instance, if you only want to see the name of the person who wrote
 the article and the subject, you'd say:
@@ -4816,10 +4922,10 @@ the article and the subject, you'd say:
 This variable is the reverse of @code{gnus-visible-headers}.  If this
 variable is set (and @code{gnus-visible-headers} is @code{nil}), it
 should be a regular expression that matches all lines that you want to
-hide.  All lines that does not match this variable will remain visible.
+hide.  All lines that do not match this variable will remain visible.
 
-For instance, if you just want to get rid of the references line and the
-xref line, you might say:
+For instance, if you just want to get rid of the @code{References} line
+and the @code{Xref} line, you might say:
 
 @lisp
 (setq gnus-ignored-headers "^References:\\|^Xref:")
@@ -4833,7 +4939,7 @@ variable will have no effect.
 Gnus can also sort the headers for you.  (It does this by default.)  You
 can control the sorting by setting the @code{gnus-sorted-header-list}
 variable.  It is a list of regular expressions that says in what order
-the header lines are to be displayed.
+the headers are to be displayed.
 
 For instance, if you want the name of the author of the article first,
 and then the subject, you might say something like:
@@ -4865,16 +4971,16 @@ other naughty stuff in innocent-looking articles.
 Gnus handles @sc{mime} by shoving the articles through
 @code{gnus-show-mime-method}, which is @code{metamail-buffer} by
 default.  Set @code{gnus-show-mime} to @code{t} if you want to use
-@sc{mime} all the time; it might be best just use the toggling functions
-from the summary buffer to avoid getting nasty surprises (for instance,
-you enter the group @samp{alt.sing-a-long} and, before you know it,
-@sc{mime} has decoded the sounds file in the article and some horrible
-sing-a-long song comes streaming out out your speakers, and you can't
-find the volume button, because there isn't one, and people are starting
-to look at you, and you try to stop the program, but you can't, and you
-can't find the program to control the volume, and everybody else in the
-room suddenly decides to look at you disdainfully, and you'll feel
-rather stupid.)
+@sc{mime} all the time; it might be best to just use the toggling
+functions from the summary buffer to avoid getting nasty surprises. (For
+instance, you enter the group @samp{alt.sing-a-long} and, before you
+know it, @sc{mime} has decoded the sound file in the article and some
+horrible sing-a-long song comes streaming out out your speakers, and you
+can't find the volume button, because there isn't one, and people are
+starting to look at you, and you try to stop the program, but you can't,
+and you can't find the program to control the volume, and everybody else
+in the room suddenly decides to look at you disdainfully, and you'll
+feel rather stupid.)
 
 Any similarity to real events and people is purely coincidental.  Ahem.
 
@@ -4895,14 +5001,18 @@ Other useful functions you might add to this hook is
 @code{gnus-article-hide-citation} (which hides all cited text);
 @code{gnus-article-hide-signature} (which, umn, hides the signature);
 @code{gnus-article-subcite} (which tries to clean up the mess supercite
-makes in The Hands Of The Mad; @code{gnus-article-treat-overstrike}
-(which treats @samp{^H_} in a reasonable manner); and
-@code{gnus-article-remove-cr} (which removes trailing carriage returns).
+makes in The Hands Of The Mad); @code{gnus-article-treat-overstrike}
+(which treats @samp{^H_} in a reasonable manner);
+@code{gnus-article-remove-cr} (which removes trailing carriage returns);
+@code{gnus-article-de-quoted-unreadble} (which does a naive decoding of
+articles encoded with Quoted-Printable); and
+@code{gnus-article-display-x-face} (which displays any X-Face headers).
 
 You can, of course, write your own functions.  The functions are called
-in the article buffer, and you can do anything you like, pretty much.
+from the article buffer, and you can do anything you like, pretty much.
 There is no information that you have to keep in the buffer - you can
-change everything.
+change everything.  However, you shouldn't delete anu headers.  Instead
+make them invisible if you want to make them go away.
 
 @node Article Keymap
 @section Article Keymap
@@ -4910,8 +5020,8 @@ change everything.
 Most of the keystrokes in the summary buffer can also be used in the
 article buffer.  They should behave as if you typed them in the summary
 buffer, which means that you don't actually have to have a summary
-buffer displayed when you're reading.  You can do it all from the
-article buffer.
+buffer displayed while reading.  You can do it all from the article
+buffer.
 
 A few additional keystrokes are available:
 
@@ -4927,9 +5037,9 @@ Scroll backwards one page (@code{gnus-article-prev-page}).
 @item C-c ^
 @kindex C-c ^ (Article)
 @findex gnus-article-refer-article
-If point is in the neighborhood of a message-id and you press @kbd{r},
-Gnus will try to get that article from the server.  (Only available with
-nntp).  (@code{gnus-article-refer-article}).
+If point is in the neighborhood of a @code{Message-Id} and you press
+@kbd{r}, Gnus will try to get that article from the server
+(@code{gnus-article-refer-article}).
 @item C-c C-m
 @kindex C-c C-m (Article)
 @findex gnus-article-mail
@@ -4964,8 +5074,8 @@ the contents of the article buffer.
 @vindex gnus-article-display-hook
 @item gnus-article-display-hook
 This hook is called as the last thing when displaying an article, and is
-intended for modifying the contents of the buffer, highlight, hiding
-headers, and the like.
+intended for modifying the contents of the buffer, doing highlights,
+hiding headers, and the like.
 @vindex gnus-article-mode-line-format
 @item gnus-article-mode-line-format
 This variable is a format string along the same lines as
@@ -4983,6 +5093,135 @@ This is the delimeter mentioned above.  By default, it is @samp{^L}
 (form linefeed).
 @end table
 
+@node The Server Buffer
+@chapter The Server Buffer
+
+Traditionally, a @dfn{server} is a machine or a piece of software that
+one connects to, and then requests information from.  Gnus does not
+connect directly to any real servers, but does all transactions through
+one backend or other.  But that's just putting one layer more between
+the actual media and Gnus, so we might just as well say that each
+backend represents a virtual server.
+
+For instance, the @code{nntp} backend may be used to connect to several
+different actual nntp servers, or, perhaps, to many different ports on
+the same actual nntp server.  You tell Gnus which backend to use, and
+what parameters to set by specifying a @dfn{select method}.  
+
+These select methods specifications can sometimes become quite
+complicated - say, for instance, that you want to read from the nntp
+server @samp{news.funet.fi} on port number @samp{13}, which hangs if
+queried for @sc{nov} headers and has a buggy select.  Ahem.  Anyways, if
+you had to specify that for each group that used this server, that would
+be too much work, so Gnus offers a way of putting names to methods,
+which is what you do in the server buffer.
+
+@menu
+* Server Buffer Format::   You can customize the look of this buffer.
+* Server Commands::        Commands to manipulate servers.
+* Example Methods::        Examples server specifications.
+* Servers & Methods::      You can use server names as select methods.
+@end menu
+
+@node Server Buffer Format
+@section Server Buffer Format
+@cindex server buffer format
+
+@vindex gnus-server-line-format
+You can change the look of the server buffer lines by changing the
+@code{gnus-server-line-format} variable.  This is a @code{format}-like
+variable, with some simple extensions:
+
+@table @samp
+@item h 
+How the news is fetched - the backend name.
+@item n
+The name of this server.
+@item w
+Where the news is to be fetched from - the address.
+@end table
+
+@node Server Commands
+@section Server Commands
+@cindex server commands
+
+@table @kbd
+@item SPC
+Browse the current server (@code{gnus-server-read-server}).
+@item q
+Return to the group buffer (@code{gnus-server-exit}).
+@item l
+List all servers (@code{gnus-server-list-servers}).
+@item k
+Kill the current server (@code{gnus-server-kill-server}).
+@item y
+Yank the previously killed server (@code{gnus-server-yank-server}).
+@item c
+Copy the current server (@code{gnus-server-copy-server}).
+@item a
+Add a new server (@code{gnus-server-add-server}).
+@item e
+Edit a server (@code{gnus-server-edit-server}).
+@end table
+
+@node Example Methods
+@section Example Methods
+
+Most select methods are pretty simple and self-explanatory: 
+
+@lisp
+(nntp "news.funet.fi")
+@end lisp
+
+Reading directly from the spool is even simpler:
+
+@lisp
+(nnspool "")
+@end lisp
+
+As you can see, the first element in a select method is the name of the
+backend, and the second is the @dfn{address}, or @dfn{name}, if you
+will. 
+
+After these two elements, there may be a random number of @var{(variable
+form)} pairs.
+
+To go back to the first example - imagine that you want to read from
+port @code{15} from that machine.  This is what the select method should
+look like then:
+
+@lisp
+(nntp "news.funet.fi" (nntp-port-number 15))
+@end lisp
+
+You should read the documention to each backend to find out what
+variables are relevant, but here's an @code{nnmh} example. 
+
+@code{nnmh} is a mail backend that reads a spool-like structure.  Say
+you have two structures that you wish to access: One is your private
+mail spool, and the other is a public one.  Here's the possible spec for
+you private mail:
+
+@lisp
+(nnmh "private" (nnmh-directory "~/private/mail/"))
+@end lisp
+
+(This server is then called @samp{private}, but you may have guessed
+that. 
+
+Here's the method for the public spool:
+
+@lisp
+(nnmh "public" 
+      (nnmh-directory "/usr/information/spool/") 
+      (nnmh-get-new-mail nil))
+@end lisp
+
+@node Servers & Methods
+@section Servers & Methods
+
+
+
 @node Various
 @chapter Various
 
@@ -5000,7 +5239,7 @@ This is the delimeter mentioned above.  By default, it is @samp{^L}
 @item gnus-novice-user
 @vindex gnus-novice-user
 If this variable is non-@code{nil}, you are either a newcomer to the
-usenet world, or you are very cautious, which is a nice thing to be,
+World of Usenet, or you are very cautious, which is a nice thing to be,
 really.  You will be given questions of the type "Are you sure you want
 to do this?" before doing anything dangerous.
 @item gnus-expert-user
@@ -5080,13 +5319,13 @@ variable is @code{nil}, screen refresh may be quicker.
 
 @item gnus-mode-non-string-length
 @vindex gnus-mode-non-string-length
-By default, Gnus displays information of article in the mode lines of
-the summary and article buffers.  The information Gnus wishes to display
-(eg. the subject of the article) is often longer than the mode lines,
-and therefore have to be cut off at some point.  This variable says how
-long the other info on the line is (ie. the non-info part).  If you put
-additional elements on the mode line (eg. a clock), you should modify
-this variable:
+By default, Gnus displays information on the current article in the mode
+lines of the summary and article buffers.  The information Gnus wishes
+to display (eg. the subject of the article) is often longer than the
+mode lines, and therefore have to be cut off at some point.  This
+variable says how long the other elements on the line is (ie. the
+non-info part).  If you put additional elements on the mode line (eg. a
+clock), you should modify this variable:
 @c Hook written by Keinonen Kari <kk85613@cs.tut.fi>.
 @lisp
 (add-hook 'display-time-hook
@@ -5134,8 +5373,7 @@ Set this to @code{nil}, which will inhibit Gnus from requesting the
 entire active file from the server.  This file is often v.  large.  You
 also have to set @code{gnus-check-new-news} and
 @code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus
-doesn't suddenly decide to fetch the active file anyway.  Note that this
-will make it difficult for you to get hold of new groups.
+doesn't suddenly decide to fetch the active file anyway.
 @item gnus-nov-is-evil
 This one has to be @code{nil}.  If not, grabbing article headers from
 the @sc{nntp} server will not be very fast.  Not all @sc{nntp} servers
@@ -5181,8 +5419,8 @@ lines, which might save some time.
 @node Little Disk Space
 @section Little Disk Space
 
-The startup files can get rather large, so you may want to keep their
-sizes down a bit if you are running out of space.
+The startup files can get rather large, so you may want to cut their
+sizes a bit if you are running out of space.
 
 @table @code
 @item gnus-save-newsrc-file
@@ -5190,34 +5428,23 @@ If this is @code{nil}, Gnus will never save @file{.newsrc} - it will
 only save @file{.newsrc.eld}.  This means that you will not be able to
 use any other newsreaders than Gnus.
 @item gnus-save-killed-list
-If this is @code{nil}, Gnus will not save the list of dead groups.  That
-means that Gnus will not know whether groups are new or old, which makes
-automatic handling of new groups impossible.  You should also set
-@code{gnus-check-new-newsgroups} to @code{ask-server} and
-@code{gnus-check-bogus-newsgroups} to @code{nil} if you set this
+If this is @code{nil}, Gnus will not save the list of dead groups.  You
+should also set @code{gnus-check-new-newsgroups} to @code{ask-server}
+and @code{gnus-check-bogus-newsgroups} to @code{nil} if you set this
 variable to @code{nil}.
 @end table
 
-@vindex gnus-kill-file-name
-A kill file for the group @samp{soc.motss} is normally called
-@file{soc.motss.KILL}.  The suffix appended to the group name to get
-this file name is detailed by the @code{gnus-kill-file-name} variable.
-The "global" kill file (not in the score file sense of "global", of
-course) is called just @file{KILL}.
-
-In short: avoid killing.  Scoring is more fun.
-
 @node Slow Machine
 @section Slow Machine
 
 If you have a slow machine, or are just really impatient, there are a
 few things you can do to make Gnus run faster.
 
-Set @code{gnus-read-active-file}, @code{gnus-check-new-newsgroups},
+Set@code{gnus-check-new-newsgroups} and
 @code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster.
 
 Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and
-@code{nntp-xover-is-evil} to @code{nil} to make entering and exiting the
+@code{gnus-nov-is-evil} to @code{nil} to make entering and exiting the
 summary buffer faster.
 
 Set @code{gnus-article-display-hook} to @code{nil} to make article
@@ -5227,31 +5454,31 @@ processing a bit faster.
 @chapter Troubleshooting
 @cindex troubleshooting
 
-(ding) Gnus work so well straight out of the box, so I can't imagine any
-problems, really.  
+(ding) Gnus works @emph{so} well straight out of the box - I can't
+imagine any problems, really.
 
 Ahem.
 
+@enumerate
+@item
 Make sure your computer is switched on.
-
+@item
 Make sure that you really load the current Gnus version.  If you have
 been running @sc{gnus}, you need to exit Emacs and start it up again before
 Gnus will work.
-
+@item
 Try doing an @kbd{M-x gnus-version}.  If you get something that looks
 like @samp{(ding) Gnus v0.46; nntp 4.0} you have the right files loaded.
 If, on the other hand, you get something like @samp{NNTP 3.x} or
-@samp{nntp flee}, you have some old .el files lying around.  Delete
-these. 
-
+@samp{nntp flee}, you have some old @file{.el} files lying around.
+Delete these.
+@item
 Read the help group (@kbd{M h} in the group buffer) for a FAQ and a
 how-to. 
+@end enumerate
 
-If all else fails, report the problem as a bug (@pxref{Reporting
-Bugs}). 
+If all else fails, report the problem as a bug,
 
-@node Reporting Bugs
-@chapter Reporting Bugs
 @cindex bugs
 @cindex reporting bugs
 
@@ -5265,6 +5492,33 @@ precise description as to how to reproduce the bug.
 @c If you just need help, you are better off asking on
 @c @samp{gnu.emacs.gnus}.  
 
+@node The End
+@chapter The End
+
+Well, that's the manual - you can get on with your life now.  Keep in
+touch.  Say hello to your cats from me.  
+
+My @strong{ghod} - I just can't stand goodbyes.  Sniffle.
+
+Ol' Chuck Reznikoff said it pretty well, so I leave the floor to him:
+
+@quotation
+@strong{Te Deum}
+@sp 1
+Not because of victories @*
+I sing,@*
+having none,@*
+but for the common sunshine,@*
+the breeze,@*
+the largess of the spring.
+@sp 1
+Not for victory@*
+but for the day's work done@*
+as well as I was able;@*
+not for a seat upon the dais@*
+but at the common table.@*
+@end quotation
+
 @node Index
 @chapter Index
 @printindex cp