Merge from emacs--devo--0
[gnus] / lisp / gnus.el
index f88c2d8..8c7559b 100644 (file)
@@ -1,7 +1,8 @@
 ;;; gnus.el --- a newsreader for GNU Emacs
 
-;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, 1997,
-;; 1998, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, 1997, 1998,
+;;   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+;;   Free Software Foundation, Inc.
 
 ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
 ;;     Lars Magne Ingebrigtsen <larsi@gnus.org>
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 
 (eval '(run-hooks 'gnus-load-hook))
 
+;; For Emacs < 22.2.
+(eval-and-compile
+  (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
+
 (eval-when-compile (require 'cl))
 (require 'wid-edit)
 (require 'mm-util)
 (require 'nnheader)
 
+;; These are defined afterwards with gnus-define-group-parameter
+(defvar gnus-ham-process-destinations)
+(defvar gnus-parameter-ham-marks-alist)
+(defvar gnus-parameter-spam-marks-alist)
+(defvar gnus-spam-autodetect)
+(defvar gnus-spam-autodetect-methods)
+(defvar gnus-spam-newsgroup-contents)
+(defvar gnus-spam-process-destinations)
+(defvar gnus-spam-resend-to)
+(defvar gnus-ham-resend-to)
+(defvar gnus-spam-process-newsgroups)
+
+
 (defgroup gnus nil
   "The coffee-brewing, all singing, all dancing, kitchen sink newsreader."
   :group 'news
   :group 'mail)
 
+(defgroup gnus-start nil
+  "Starting your favorite newsreader."
+  :group 'gnus)
+
 (defgroup gnus-format nil
   "Dealing with formatting issues."
   :group 'gnus)
   "Article Registry."
   :group 'gnus)
 
-(defgroup gnus-start nil
-  "Starting your favorite newsreader."
-  :group 'gnus)
-
 (defgroup gnus-start-server nil
   "Server options at startup."
   :group 'gnus-start)
@@ -268,12 +284,8 @@ is restarted, and sometimes reloaded."
   :link '(custom-manual "(gnus)Various Various")
   :group 'gnus)
 
-(defgroup gnus-mime nil
-  "Variables for controlling the Gnus MIME interface."
-  :group 'gnus)
-
 (defgroup gnus-exit nil
-  "Exiting gnus."
+  "Exiting Gnus."
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
@@ -282,7 +294,7 @@ is restarted, and sometimes reloaded."
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "0.3"
+(defconst gnus-version-number "0.11"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "No Gnus v%s" gnus-version-number)
@@ -321,7 +333,8 @@ be set in `.emacs' instead."
   (defvar gnus-mode-line-image-cache t)
   (if (fboundp 'find-image)
       (defun gnus-mode-line-buffer-identification (line)
-       (let ((str (car-safe line)))
+       (let ((str (car-safe line))
+             (load-path (mm-image-load-path)))
          (if (and (stringp str)
                   (string-match "^Gnus:" str))
              (progn (add-text-properties
@@ -352,7 +365,7 @@ be set in `.emacs' instead."
 ;; We define these group faces here to avoid the display
 ;; update forced when creating new faces.
 
-(defface gnus-group-news-1-face
+(defface gnus-group-news-1
   '((((class color)
       (background dark))
      (:foreground "PaleTurquoise" :bold t))
@@ -361,9 +374,12 @@ be set in `.emacs' instead."
      (:foreground "ForestGreen" :bold t))
     (t
      ()))
-  "Level 1 newsgroup face.")
+  "Level 1 newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-1-face 'face-alias 'gnus-group-news-1)
 
-(defface gnus-group-news-1-empty-face
+(defface gnus-group-news-1-empty
   '((((class color)
       (background dark))
      (:foreground "PaleTurquoise"))
@@ -372,9 +388,12 @@ be set in `.emacs' instead."
      (:foreground "ForestGreen"))
     (t
      ()))
-  "Level 1 empty newsgroup face.")
+  "Level 1 empty newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-1-empty-face 'face-alias 'gnus-group-news-1-empty)
 
-(defface gnus-group-news-2-face
+(defface gnus-group-news-2
   '((((class color)
       (background dark))
      (:foreground "turquoise" :bold t))
@@ -383,9 +402,12 @@ be set in `.emacs' instead."
      (:foreground "CadetBlue4" :bold t))
     (t
      ()))
-  "Level 2 newsgroup face.")
+  "Level 2 newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-2-face 'face-alias 'gnus-group-news-2)
 
-(defface gnus-group-news-2-empty-face
+(defface gnus-group-news-2-empty
   '((((class color)
       (background dark))
      (:foreground "turquoise"))
@@ -394,9 +416,12 @@ be set in `.emacs' instead."
      (:foreground "CadetBlue4"))
     (t
      ()))
-  "Level 2 empty newsgroup face.")
+  "Level 2 empty newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-2-empty-face 'face-alias 'gnus-group-news-2-empty)
 
-(defface gnus-group-news-3-face
+(defface gnus-group-news-3
   '((((class color)
       (background dark))
      (:bold t))
@@ -405,9 +430,12 @@ be set in `.emacs' instead."
      (:bold t))
     (t
      ()))
-  "Level 3 newsgroup face.")
+  "Level 3 newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-3-face 'face-alias 'gnus-group-news-3)
 
-(defface gnus-group-news-3-empty-face
+(defface gnus-group-news-3-empty
   '((((class color)
       (background dark))
      ())
@@ -416,9 +444,12 @@ be set in `.emacs' instead."
      ())
     (t
      ()))
-  "Level 3 empty newsgroup face.")
+  "Level 3 empty newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-3-empty-face 'face-alias 'gnus-group-news-3-empty)
 
-(defface gnus-group-news-4-face
+(defface gnus-group-news-4
   '((((class color)
       (background dark))
      (:bold t))
@@ -427,9 +458,12 @@ be set in `.emacs' instead."
      (:bold t))
     (t
      ()))
-  "Level 4 newsgroup face.")
+  "Level 4 newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-4-face 'face-alias 'gnus-group-news-4)
 
-(defface gnus-group-news-4-empty-face
+(defface gnus-group-news-4-empty
   '((((class color)
       (background dark))
      ())
@@ -438,9 +472,12 @@ be set in `.emacs' instead."
      ())
     (t
      ()))
-  "Level 4 empty newsgroup face.")
+  "Level 4 empty newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-4-empty-face 'face-alias 'gnus-group-news-4-empty)
 
-(defface gnus-group-news-5-face
+(defface gnus-group-news-5
   '((((class color)
       (background dark))
      (:bold t))
@@ -449,9 +486,12 @@ be set in `.emacs' instead."
      (:bold t))
     (t
      ()))
-  "Level 5 newsgroup face.")
+  "Level 5 newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-5-face 'face-alias 'gnus-group-news-5)
 
-(defface gnus-group-news-5-empty-face
+(defface gnus-group-news-5-empty
   '((((class color)
       (background dark))
      ())
@@ -460,9 +500,12 @@ be set in `.emacs' instead."
      ())
     (t
      ()))
-  "Level 5 empty newsgroup face.")
+  "Level 5 empty newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-5-empty-face 'face-alias 'gnus-group-news-5-empty)
 
-(defface gnus-group-news-6-face
+(defface gnus-group-news-6
   '((((class color)
       (background dark))
      (:bold t))
@@ -471,9 +514,12 @@ be set in `.emacs' instead."
      (:bold t))
     (t
      ()))
-  "Level 6 newsgroup face.")
+  "Level 6 newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-6-face 'face-alias 'gnus-group-news-6)
 
-(defface gnus-group-news-6-empty-face
+(defface gnus-group-news-6-empty
   '((((class color)
       (background dark))
      ())
@@ -482,9 +528,12 @@ be set in `.emacs' instead."
      ())
     (t
      ()))
-  "Level 6 empty newsgroup face.")
+  "Level 6 empty newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-6-empty-face 'face-alias 'gnus-group-news-6-empty)
 
-(defface gnus-group-news-low-face
+(defface gnus-group-news-low
   '((((class color)
       (background dark))
      (:foreground "DarkTurquoise" :bold t))
@@ -493,9 +542,12 @@ be set in `.emacs' instead."
      (:foreground "DarkGreen" :bold t))
     (t
      ()))
-  "Low level newsgroup face.")
+  "Low level newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-low-face 'face-alias 'gnus-group-news-low)
 
-(defface gnus-group-news-low-empty-face
+(defface gnus-group-news-low-empty
   '((((class color)
       (background dark))
      (:foreground "DarkTurquoise"))
@@ -504,108 +556,140 @@ be set in `.emacs' instead."
      (:foreground "DarkGreen"))
     (t
      ()))
-  "Low level empty newsgroup face.")
+  "Low level empty newsgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-low-empty-face 'face-alias 'gnus-group-news-low-empty)
 
-(defface gnus-group-mail-1-face
+(defface gnus-group-mail-1
   '((((class color)
       (background dark))
-     (:foreground "aquamarine1" :bold t))
+     (:foreground "#e1ffe1" :bold t))
     (((class color)
       (background light))
      (:foreground "DeepPink3" :bold t))
     (t
      (:bold t)))
-  "Level 1 mailgroup face.")
+  "Level 1 mailgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-1-face 'face-alias 'gnus-group-mail-1)
 
-(defface gnus-group-mail-1-empty-face
+(defface gnus-group-mail-1-empty
   '((((class color)
       (background dark))
-     (:foreground "aquamarine1"))
+     (:foreground "#e1ffe1"))
     (((class color)
       (background light))
      (:foreground "DeepPink3"))
     (t
      (:italic t :bold t)))
-  "Level 1 empty mailgroup face.")
+  "Level 1 empty mailgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-1-empty-face 'face-alias 'gnus-group-mail-1-empty)
 
-(defface gnus-group-mail-2-face
+(defface gnus-group-mail-2
   '((((class color)
       (background dark))
-     (:foreground "aquamarine2" :bold t))
+     (:foreground "DarkSeaGreen1" :bold t))
     (((class color)
       (background light))
      (:foreground "HotPink3" :bold t))
     (t
      (:bold t)))
-  "Level 2 mailgroup face.")
+  "Level 2 mailgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-2-face 'face-alias 'gnus-group-mail-2)
 
-(defface gnus-group-mail-2-empty-face
+(defface gnus-group-mail-2-empty
   '((((class color)
       (background dark))
-     (:foreground "aquamarine2"))
+     (:foreground "DarkSeaGreen1"))
     (((class color)
       (background light))
      (:foreground "HotPink3"))
     (t
      (:bold t)))
-  "Level 2 empty mailgroup face.")
+  "Level 2 empty mailgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-2-empty-face 'face-alias 'gnus-group-mail-2-empty)
 
-(defface gnus-group-mail-3-face
+(defface gnus-group-mail-3
   '((((class color)
       (background dark))
-     (:foreground "aquamarine3" :bold t))
+     (:foreground "aquamarine1" :bold t))
     (((class color)
       (background light))
      (:foreground "magenta4" :bold t))
     (t
      (:bold t)))
-  "Level 3 mailgroup face.")
+  "Level 3 mailgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-3-face 'face-alias 'gnus-group-mail-3)
 
-(defface gnus-group-mail-3-empty-face
+(defface gnus-group-mail-3-empty
   '((((class color)
       (background dark))
-     (:foreground "aquamarine3"))
+     (:foreground "aquamarine1"))
     (((class color)
       (background light))
      (:foreground "magenta4"))
     (t
      ()))
-  "Level 3 empty mailgroup face.")
+  "Level 3 empty mailgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-3-empty-face 'face-alias 'gnus-group-mail-3-empty)
 
-(defface gnus-group-mail-low-face
+(defface gnus-group-mail-low
   '((((class color)
       (background dark))
-     (:foreground "aquamarine4" :bold t))
+     (:foreground "aquamarine2" :bold t))
     (((class color)
       (background light))
      (:foreground "DeepPink4" :bold t))
     (t
      (:bold t)))
-  "Low level mailgroup face.")
+  "Low level mailgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-low-face 'face-alias 'gnus-group-mail-low)
 
-(defface gnus-group-mail-low-empty-face
+(defface gnus-group-mail-low-empty
   '((((class color)
       (background dark))
-     (:foreground "aquamarine4"))
+     (:foreground "aquamarine2"))
     (((class color)
       (background light))
      (:foreground "DeepPink4"))
     (t
      (:bold t)))
-  "Low level empty mailgroup face.")
+  "Low level empty mailgroup face."
+  :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-low-empty-face 'face-alias 'gnus-group-mail-low-empty)
 
 ;; Summary mode faces.
 
-(defface gnus-summary-selected-face '((t
-                                      (:underline t)))
-  "Face used for selected articles.")
+(defface gnus-summary-selected '((t (:underline t)))
+  "Face used for selected articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-selected-face 'face-alias 'gnus-summary-selected)
 
-(defface gnus-summary-cancelled-face
+(defface gnus-summary-cancelled
   '((((class color))
      (:foreground "yellow" :background "black")))
-  "Face used for cancelled articles.")
+  "Face used for cancelled articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-cancelled-face 'face-alias 'gnus-summary-cancelled)
 
-(defface gnus-summary-high-ticked-face
+(defface gnus-summary-high-ticked
   '((((class color)
       (background dark))
      (:foreground "pink" :bold t))
@@ -614,9 +698,12 @@ be set in `.emacs' instead."
      (:foreground "firebrick" :bold t))
     (t
      (:bold t)))
-  "Face used for high interest ticked articles.")
+  "Face used for high interest ticked articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-high-ticked-face 'face-alias 'gnus-summary-high-ticked)
 
-(defface gnus-summary-low-ticked-face
+(defface gnus-summary-low-ticked
   '((((class color)
       (background dark))
      (:foreground "pink" :italic t))
@@ -625,9 +712,12 @@ be set in `.emacs' instead."
      (:foreground "firebrick" :italic t))
     (t
      (:italic t)))
-  "Face used for low interest ticked articles.")
+  "Face used for low interest ticked articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-low-ticked-face 'face-alias 'gnus-summary-low-ticked)
 
-(defface gnus-summary-normal-ticked-face
+(defface gnus-summary-normal-ticked
   '((((class color)
       (background dark))
      (:foreground "pink"))
@@ -636,9 +726,12 @@ be set in `.emacs' instead."
      (:foreground "firebrick"))
     (t
      ()))
-  "Face used for normal interest ticked articles.")
+  "Face used for normal interest ticked articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-normal-ticked-face 'face-alias 'gnus-summary-normal-ticked)
 
-(defface gnus-summary-high-ancient-face
+(defface gnus-summary-high-ancient
   '((((class color)
       (background dark))
      (:foreground "SkyBlue" :bold t))
@@ -647,9 +740,12 @@ be set in `.emacs' instead."
      (:foreground "RoyalBlue" :bold t))
     (t
      (:bold t)))
-  "Face used for high interest ancient articles.")
+  "Face used for high interest ancient articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-high-ancient-face 'face-alias 'gnus-summary-high-ancient)
 
-(defface gnus-summary-low-ancient-face
+(defface gnus-summary-low-ancient
   '((((class color)
       (background dark))
      (:foreground "SkyBlue" :italic t))
@@ -658,9 +754,12 @@ be set in `.emacs' instead."
      (:foreground "RoyalBlue" :italic t))
     (t
      (:italic t)))
-  "Face used for low interest ancient articles.")
+  "Face used for low interest ancient articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-low-ancient-face 'face-alias 'gnus-summary-low-ancient)
 
-(defface gnus-summary-normal-ancient-face
+(defface gnus-summary-normal-ancient
   '((((class color)
       (background dark))
      (:foreground "SkyBlue"))
@@ -669,51 +768,72 @@ be set in `.emacs' instead."
      (:foreground "RoyalBlue"))
     (t
      ()))
-  "Face used for normal interest ancient articles.")
+  "Face used for normal interest ancient articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-normal-ancient-face 'face-alias 'gnus-summary-normal-ancient)
 
-(defface gnus-summary-high-undownloaded-face
+(defface gnus-summary-high-undownloaded
    '((((class color)
        (background light))
       (:bold t :foreground "cyan4"))
      (((class color) (background dark))
       (:bold t :foreground "LightGray"))
      (t (:inverse-video t :bold t)))
-  "Face used for high interest uncached articles.")
+  "Face used for high interest uncached articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-high-undownloaded-face 'face-alias 'gnus-summary-high-undownloaded)
 
-(defface gnus-summary-low-undownloaded-face
+(defface gnus-summary-low-undownloaded
    '((((class color)
        (background light))
       (:italic t :foreground "cyan4" :bold nil))
      (((class color) (background dark))
       (:italic t :foreground "LightGray" :bold nil))
      (t (:inverse-video t :italic t)))
-  "Face used for low interest uncached articles.")
+  "Face used for low interest uncached articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-low-undownloaded-face 'face-alias 'gnus-summary-low-undownloaded)
 
-(defface gnus-summary-normal-undownloaded-face
+(defface gnus-summary-normal-undownloaded
    '((((class color)
        (background light))
       (:foreground "cyan4" :bold nil))
      (((class color) (background dark))
       (:foreground "LightGray" :bold nil))
      (t (:inverse-video t)))
-  "Face used for normal interest uncached articles.")
+  "Face used for normal interest uncached articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-normal-undownloaded-face 'face-alias 'gnus-summary-normal-undownloaded)
 
-(defface gnus-summary-high-unread-face
+(defface gnus-summary-high-unread
   '((t
      (:bold t)))
-  "Face used for high interest unread articles.")
+  "Face used for high interest unread articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-high-unread-face 'face-alias 'gnus-summary-high-unread)
 
-(defface gnus-summary-low-unread-face
+(defface gnus-summary-low-unread
   '((t
      (:italic t)))
-  "Face used for low interest unread articles.")
+  "Face used for low interest unread articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-low-unread-face 'face-alias 'gnus-summary-low-unread)
 
-(defface gnus-summary-normal-unread-face
+(defface gnus-summary-normal-unread
   '((t
      ()))
-  "Face used for normal interest unread articles.")
+  "Face used for normal interest unread articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-normal-unread-face 'face-alias 'gnus-summary-normal-unread)
 
-(defface gnus-summary-high-read-face
+(defface gnus-summary-high-read
   '((((class color)
       (background dark))
      (:foreground "PaleGreen"
@@ -724,9 +844,12 @@ be set in `.emacs' instead."
                  :bold t))
     (t
      (:bold t)))
-  "Face used for high interest read articles.")
+  "Face used for high interest read articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-high-read-face 'face-alias 'gnus-summary-high-read)
 
-(defface gnus-summary-low-read-face
+(defface gnus-summary-low-read
   '((((class color)
       (background dark))
      (:foreground "PaleGreen"
@@ -737,9 +860,12 @@ be set in `.emacs' instead."
                  :italic t))
     (t
      (:italic t)))
-  "Face used for low interest read articles.")
+  "Face used for low interest read articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-low-read-face 'face-alias 'gnus-summary-low-read)
 
-(defface gnus-summary-normal-read-face
+(defface gnus-summary-normal-read
   '((((class color)
       (background dark))
      (:foreground "PaleGreen"))
@@ -748,7 +874,10 @@ be set in `.emacs' instead."
      (:foreground "DarkGreen"))
     (t
      ()))
-  "Face used for normal interest read articles.")
+  "Face used for normal interest read articles."
+  :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-normal-read-face 'face-alias 'gnus-summary-normal-read)
 
 
 ;;;
@@ -789,19 +918,21 @@ be set in `.emacs' instead."
 
 (defvar gnus-group-buffer "*Group*")
 
-(eval-and-compile
-  (autoload 'gnus-play-jingle "gnus-audio"))
+(autoload 'gnus-play-jingle "gnus-audio")
 
-(defface gnus-splash-face
+(defface gnus-splash
   '((((class color)
       (background dark))
-     (:foreground "#888888"))
+     (:foreground "#cccccc"))
     (((class color)
       (background light))
      (:foreground "#888888"))
     (t
      ()))
-  "Face for the splash screen.")
+  "Face for the splash screen."
+  :group 'gnus-start)
+;; backward-compatibility alias
+(put 'gnus-splash-face 'face-alias 'gnus-splash)
 
 (defun gnus-splash ()
   (save-excursion
@@ -862,6 +993,8 @@ be set in `.emacs' instead."
   (cdr (assq gnus-logo-color-style gnus-logo-color-alist))
   "Colors used for the Gnus logo.")
 
+(declare-function image-size "image.c" (spec &optional pixels frame))
+
 (defun gnus-group-startup-message (&optional x y)
   "Insert startup message in current buffer."
   ;; Insert the message.
@@ -870,7 +1003,17 @@ be set in `.emacs' instead."
    ((and
      (fboundp 'find-image)
      (display-graphic-p)
-     (let* ((data-directory (nnheader-find-etc-directory "gnus"))
+     ;; Make sure the library defining `image-load-path' is loaded
+     ;; (`find-image' is autoloaded) (and discard the result).  Else, we may
+     ;; get "defvar ignored because image-load-path is let-bound" when calling
+     ;; `find-image' below.
+     (or (find-image '(nil (:type xpm :file "gnus.xpm"))) t)
+     (let* ((data-directory (nnheader-find-etc-directory "images/gnus"))
+           (image-load-path (cond (data-directory
+                                   (list data-directory))
+                                  ((boundp 'image-load-path)
+                                   (symbol-value 'image-load-path))
+                                  (t load-path)))
            (image (find-image
                    `((:type xpm :file "gnus.xpm"
                             :color-symbols
@@ -880,11 +1023,11 @@ be set in `.emacs' instead."
                              ("background" . ,(face-background 'default))))
                      (:type pbm :file "gnus.pbm"
                             ;; Account for the pbm's blackground.
-                            :background ,(face-foreground 'gnus-splash-face)
+                            :background ,(face-foreground 'gnus-splash)
                             :foreground ,(face-background 'default))
                      (:type xbm :file "gnus.xbm"
                             ;; Account for the xbm's blackground.
-                            :background ,(face-foreground 'gnus-splash-face)
+                            :background ,(face-foreground 'gnus-splash)
                             :foreground ,(face-background 'default))))))
        (when image
         (let ((size (image-size image)))
@@ -898,23 +1041,23 @@ be set in `.emacs' instead."
    (t
     (insert
      (format "              %s
-          _    ___ _             _
-          _ ___ __ ___  __    _ ___
-          __   _     ___    __  ___
-              _           ___     _
-             _  _ __             _
-             ___   __            _
-                   __           _
-                    _      _   _
-                   _      _    _
-                      _  _    _
-                  __  ___
-                 _   _ _     _
-                _   _
-              _    _
-             _    _
-            _
-          __
+         _    ___ _             _
+         _ ___ __ ___  __    _ ___
+         __   _     ___    __  ___
+             _           ___     _
+            _  _ __             _
+            ___   __            _
+                  __           _
+                   _      _   _
+                  _      _    _
+                     _  _    _
+                 __  ___
+                _   _ _     _
+               _   _
+             _    _
+            _    _
+           _
+         __
 
 "
             ""))
@@ -928,7 +1071,7 @@ be set in `.emacs' instead."
           (rest (- wheight pheight)))
       (insert (make-string (max 0 (* 2 (/ rest 3))) ?\n)))
     ;; Fontify some.
-    (put-text-property (point-min) (point-max) 'face 'gnus-splash-face)
+    (put-text-property (point-min) (point-max) 'face 'gnus-splash)
     (setq gnus-simple-splash t)))
   (goto-char (point-min))
   (setq mode-line-buffer-identification (concat " " gnus-version))
@@ -959,11 +1102,22 @@ For example:
      (\"mail\\\\.me\" (gnus-use-scoring  t))
      (\"list\\\\..*\" (total-expire . t)
                  (broken-reply-to . t)))"
-  :version "21.4"
+  :version "22.1"
   :group 'gnus-group-various
   :type '(repeat (cons regexp
                       (repeat sexp))))
 
+(defcustom gnus-parameters-case-fold-search 'default
+  "If it is t, ignore case of group names specified in `gnus-parameters'.
+If it is nil, don't ignore case.  If it is `default', which is for the
+backward compatibility, use the value of `case-fold-search'."
+  :version "22.1"
+  :group 'gnus-group-various
+  :type '(choice :format "%{%t%}:\n %[Value Menu%] %v"
+                (const :tag "Use `case-fold-search'" default)
+                (const nil)
+                (const t)))
+
 (defvar gnus-group-parameters-more nil)
 
 (defmacro gnus-define-group-parameter (param &rest rest)
@@ -1103,6 +1257,11 @@ Check the NNTPSERVER environment variable and the
             (when (re-search-forward "[^ \t\n\r]+" nil t)
               (match-string 0))))))
 
+;; `M-x customize-variable RET gnus-select-method RET' should work without
+;; starting or even loading Gnus.
+;;;###autoload(when (fboundp 'custom-autoload)
+;;;###autoload  (custom-autoload 'gnus-select-method "gnus"))
+
 (defcustom gnus-select-method
   (condition-case nil
       (nconc
@@ -1136,16 +1295,36 @@ If you use this variable, you must set `gnus-nntp-server' to nil.
 There is a lot more to know about select methods and virtual servers -
 see the manual for details."
   :group 'gnus-server
+  :group 'gnus-start
+  :initialize 'custom-initialize-default
   :type 'gnus-select-method)
 
 (defcustom gnus-message-archive-method "archive"
   "*Method used for archiving messages you've sent.
-This should be a mail method."
+This should be a mail method.
+
+See also `gnus-update-message-archive-method'."
   :group 'gnus-server
   :group 'gnus-message
   :type '(choice (const :tag "Default archive method" "archive")
                 gnus-select-method))
 
+(defcustom gnus-update-message-archive-method nil
+  "Non-nil means always update the saved \"archive\" method.
+
+The archive method is initially set according to the value of
+`gnus-message-archive-method' and is saved in the \"~/.newsrc.eld\" file
+so that it may be used as a real method of the server which is named
+\"archive\" ever since.  If it once has been saved, it will never be
+updated if the value of this variable is nil, even if you change the
+value of `gnus-message-archive-method' afterward.  If you want the
+saved \"archive\" method to be updated whenever you change the value of
+`gnus-message-archive-method', set this variable to a non-nil value."
+  :version "23.1" ;; No Gnus
+  :group 'gnus-server
+  :group 'gnus-message
+  :type 'boolean)
+
 (defcustom gnus-message-archive-group nil
   "*Name of the group in which to save the messages you've written.
 This can either be a string; a list of strings; or an alist
@@ -1181,7 +1360,7 @@ non-numeric prefix - `C-u M-x gnus', in short."
 
 (defcustom gnus-nntp-server nil
   "*The name of the host running the NNTP server.
-This variable is semi-obsolete.         Use the `gnus-select-method'
+This variable is semi-obsolete.  Use the `gnus-select-method'
 variable instead."
   :group 'gnus-server
   :type '(choice (const :tag "disable" nil)
@@ -1309,20 +1488,23 @@ If the default site is too slow, try one of these:
                        (gnus-replace-in-string name "\\." "-") "-charter.html")))
   "*An alist of (HIERARCHY . FORM) pairs used to construct the URL of a charter.
 When FORM is evaluated `name' is bound to the name of the group."
+  :version "22.1"
   :group 'gnus-group-various
   :type '(repeat (cons (string :tag "Hierarchy") (sexp :tag "Form"))))
+(put 'gnus-group-charter-alist 'risky-local-variable t)
 
 (defcustom gnus-group-fetch-control-use-browse-url nil
   "*Non-nil means that control messages are displayed using `browse-url'.
 Otherwise they are fetched with ange-ftp and displayed in an ephemeral
 group."
+  :version "22.1"
   :group 'gnus-group-various
   :type 'boolean)
 
 (defcustom gnus-use-cross-reference t
   "*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
+subscribed newsgroups.  If neither t nor nil, mark as read in all
 newsgroups."
   :group 'gnus-server
   :type '(choice (const :tag "off" nil)
@@ -1345,7 +1527,7 @@ If it is nil, no confirmation is required."
   :type '(choice (const :tag "No limit" nil)
                 integer))
 
-(defcustom gnus-use-long-file-name (not (memq system-type '(usg-unix-v xenix)))
+(defcustom gnus-use-long-file-name (not (memq system-type '(usg-unix-v)))
   "*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.
 
@@ -1422,9 +1604,23 @@ articles.  This is not a good idea."
                       :value t)))
 
 (defcustom gnus-use-nocem nil
-  "*If non-nil, Gnus will read NoCeM cancel messages."
+  "*If non-nil, Gnus will read NoCeM cancel messages.
+You can also set this variable to a positive number as a group level.
+In that case, Gnus scans NoCeM messages when checking new news if this
+value is not exceeding a group level that you specify as the prefix
+argument to some commands, e.g. `gnus', `gnus-group-get-new-news', etc.
+Otherwise, Gnus does not scan NoCeM messages if you specify a group
+level to those commands."
   :group 'gnus-meta
-  :type 'boolean)
+  :type '(choice
+         (const :tag "off" nil)
+         (const :tag "on" t)
+         (list :convert-widget
+               (lambda (widget)
+                 (list 'integer :tag "group level"
+                       :value (if (boundp 'gnus-level-default-subscribed)
+                                  gnus-level-default-subscribed
+                                3))))))
 
 (defcustom gnus-suppress-duplicates nil
   "*If non-nil, Gnus will mark duplicate copies of the same article as read."
@@ -1522,7 +1718,7 @@ of the select method.  The other elements may be the category of
 this method (i. e., `post', `mail', `none' or whatever) or other
 properties that this method has (like being respoolable).
 If you implement a new select method, all you should have to change is
-this variable. I think."
+this variable.  I think."
   :group 'gnus-server
   :type '(repeat (group (string :tag "Name")
                        (radio-button-choice (const :format "%v " post)
@@ -1676,7 +1872,7 @@ which to perform auto-expiry.  This only makes sense for mail groups."
  "*Groups in which to perform expiry of all read articles.
 Use with extreme caution.  All groups that match this regexp will be
 expiring - which means that all read articles will be deleted after
-\(say) one week.        (This only goes for mail groups and the like, of
+\(say) one week.  (This only goes for mail groups and the like, of
 course.)"
  :variable-group nnmail-expire
  :variable-type '(choice (const nil)
@@ -1769,7 +1965,7 @@ total number of articles in the group.")
                  (list
                   (regexp :tag "Group Name Regular Expression")
                   (boolean :tag "Ignored")))
+
  :parameter-type '(boolean :tag "Group Ignored by the Registry")
  :parameter-document
  "Whether the Gnus Registry should ignore this group.")
@@ -1778,6 +1974,7 @@ total number of articles in the group.")
 (defcustom gnus-install-group-spam-parameters t
   "*Disable the group parameters for spam detection.
 Enable if `G c' in XEmacs is giving you trouble, and make sure to submit a bug report."
+  :version "22.1"
   :type 'boolean
   :group 'gnus-start)
 
@@ -1805,11 +2002,12 @@ registry.")
    :variable gnus-spam-newsgroup-contents
    :variable-default nil
    :variable-document
-   "*Groups in which to automatically mark new articles as spam on
-summary entry.  If non-nil, this should be a list of group name
-regexps that should match all groups in which to do automatic spam
-tagging, associated with a classification (spam, ham, or neither).
-This only makes sense for mail groups."
+   "*Group classification (spam, ham, or neither).  Only
+meaningful when spam.el is loaded.  If non-nil, this should be a
+list of group name regexps associated with a classification for
+each one.  In spam groups, new articles are marked as spam on
+summary entry.  There is other behavior associated with ham and
+no classification when spam.el is loaded - see the manual."
    :variable-group spam
    :variable-type '(repeat
                    (list :tag "Group contents spam/ham classification"
@@ -1826,7 +2024,9 @@ This only makes sense for mail groups."
                                  (const :tag "Unclassified" nil)))
    :parameter-document
    "The spam classification (spam, ham, or neither) of this group.
-When a spam group is entered, all unread articles are marked as spam.")
+When a spam group is entered, all unread articles are marked as
+spam.  There is other behavior associated with ham and no
+classification when spam.el is loaded - see the manual.")
 
   (gnus-define-group-parameter
    spam-resend-to
@@ -1914,8 +2114,8 @@ Only applicable to non-spam (unclassified and ham) groups.")
   (gnus-define-group-parameter
    spam-process
    :type list
-   :parameter-type 
-   '(choice 
+   :parameter-type
+   '(choice
      :tag "Spam Summary Exit Processor"
      :value nil
      (list :tag "Spam Summary Exit Processor Choices"
@@ -1964,11 +2164,11 @@ a backend on summary exit.  If non-nil, this should be a list of group
 name regexps that should match all groups in which to do automatic
 spam processing, associated with the appropriate processor."
    :variable-group spam
-   :variable-type 
+   :variable-type
    '(repeat :tag "Spam/Ham Processors"
            (list :tag "Spam Summary Exit Processor Choices"
                  (regexp :tag "Group Regexp")
-                 (set 
+                 (set
                   :tag "Spam/Ham Summary Exit Processor"
                   (const :tag "Spam: Bogofilter"    (spam spam-use-bogofilter))
                   (const :tag "Spam: Blacklist"     (spam spam-use-blacklist))
@@ -2011,7 +2211,7 @@ spam processing, associated with the appropriate processor."
   (gnus-define-group-parameter
    spam-autodetect
    :type list
-   :parameter-type 
+   :parameter-type
    '(boolean :tag "Spam autodetection")
    :function-document
    "Should spam be autodetected (with spam-split) in this group?"
@@ -2022,7 +2222,7 @@ spam processing, associated with the appropriate processor."
    Only unseen articles will be examined, unless
    spam-autodetect-recheck-messages is set."
    :variable-group spam
-   :variable-type 
+   :variable-type
    '(repeat
      :tag "Autodetection setting"
      (list
@@ -2036,7 +2236,7 @@ spam-autodetect-recheck-messages is set.")
   (gnus-define-group-parameter
    spam-autodetect-methods
    :type list
-   :parameter-type 
+   :parameter-type
    '(choice :tag "Spam autodetection-specific methods"
      (const none)
      (const default)
@@ -2069,7 +2269,7 @@ Requires the spam-autodetect parameter.  Only unseen articles
 will be examined, unless spam-autodetect-recheck-messages is
 set."
    :variable-group spam
-   :variable-type 
+   :variable-type
    '(repeat
      :tag "Autodetection methods"
      (list
@@ -2097,7 +2297,7 @@ set."
        (variable-item spam-use-bogofilter-headers)
        (variable-item spam-use-bogofilter)))))
      :parameter-document
-   "Spam autodetection methods.  
+   "Spam autodetection methods.
 Requires the spam-autodetect parameter.  Only unseen articles
 will be examined, unless spam-autodetect-recheck-messages is
 set.")
@@ -2105,7 +2305,7 @@ set.")
   (gnus-define-group-parameter
    spam-process-destination
    :type list
-   :parameter-type 
+   :parameter-type
    '(choice :tag "Destination for spam-processed articles at summary exit"
            (string :tag "Move to a group")
            (repeat :tag "Move to multiple groups"
@@ -2123,7 +2323,7 @@ to do spam-processed article moving, associated with the destination
 group or nil for explicit expiration.  This only makes sense for
 mail groups."
    :variable-group spam
-   :variable-type 
+   :variable-type
    '(repeat
      :tag "Spam-processed articles destination"
      (list
@@ -2136,11 +2336,11 @@ mail groups."
        (const :tag "Expire" nil))))
    :parameter-document
    "Where spam-processed articles will go at summary exit.")
-  
+
   (gnus-define-group-parameter
    ham-process-destination
    :type list
-   :parameter-type 
+   :parameter-type
    '(choice
      :tag "Destination for ham articles at summary exit from a spam group"
      (string :tag "Move to a group")
@@ -2160,7 +2360,7 @@ to do ham article moving, associated with the destination
 group or nil for explicit ignoring.  This only makes sense for
 mail groups, and only works in spam groups."
    :variable-group spam
-   :variable-type 
+   :variable-type
    '(repeat
      :tag "Ham articles destination"
      (list
@@ -2261,7 +2461,8 @@ following hook:
   "Function run when a group level is changed.
 It is called with three parameters -- GROUP, LEVEL and OLDLEVEL."
   :group 'gnus-group-levels
-  :type 'function)
+  :type '(choice (const nil)
+                function))
 
 ;;; Face thingies.
 
@@ -2344,7 +2545,7 @@ face."
 When set, Gnus will prefer using the locally stored content rather
 than re-fetching it from the server.  You also need to enable
 `gnus-agent' for this to have any affect."
-  :version "21.4"
+  :version "22.1"
   :group 'gnus-agent
   :type 'boolean)
 
@@ -2363,7 +2564,7 @@ covered by that variable."
 You may customize gnus-agent to disable its use.  However, some
 back ends have started to use the agent as a client-side cache.
 Disabling the agent may result in noticeable loss of performance."
-  :version "21.4"
+  :version "22.1"
   :group 'gnus-agent
   :type 'boolean)
 
@@ -2387,24 +2588,45 @@ This should be an alist for Emacs, or a plist for XEmacs."
                         (symbol :tag "Parameter")
                         (sexp :tag "Value")))))
 
-(defcustom gnus-user-agent 'emacs-gnus-type
+(defcustom gnus-user-agent '(emacs gnus type)
   "Which information should be exposed in the User-Agent header.
 
-It can be one of the symbols `gnus' \(show only Gnus version\), `emacs-gnus'
-\(show only Emacs and Gnus versions\), `emacs-gnus-config' \(same as
-`emacs-gnus' plus system configuration\), `emacs-gnus-type' \(same as
-`emacs-gnus' plus system type\) or a custom string.  If you set it to a
-string, be sure to use a valid format, see RFC 2616."
-  :version "21.4"
+Can be a list of symbols or a string.  Valid symbols are `gnus'
+\(show Gnus version\) and `emacs' \(show Emacs version\).  In
+addition to the Emacs version, you can add `codename' \(show
+\(S\)XEmacs codename\) or either `config' \(show system
+configuration\) or `type' \(show system type\).  If you set it to
+a string, be sure to use a valid format, see RFC 2616."
+
+  :version "22.1"
   :group 'gnus-message
-  :type '(choice
-         (item :tag "Show Gnus and Emacs versions and system type"
-               emacs-gnus-type)
-         (item :tag "Show Gnus and Emacs versions and system configuration"
-               emacs-gnus-config)
-         (item :tag "Show Gnus and Emacs versions" emacs-gnus)
-         (item :tag "Show only Gnus version" gnus)
-         (string :tag "Other")))
+  :type '(choice (list (set :inline t
+                           (const gnus  :tag "Gnus version")
+                           (const emacs :tag "Emacs version")
+                           (choice :tag "system"
+                                   (const type   :tag "system type")
+                                   (const config :tag "system configuration"))
+                           (const codename :tag "Emacs codename")))
+                (string)))
+
+;; Convert old (< 2005-01-10) symbol type values:
+(when (symbolp gnus-user-agent)
+  (setq gnus-user-agent
+       (cond ((eq gnus-user-agent 'emacs-gnus-config)
+              '(emacs gnus config))
+             ((eq gnus-user-agent 'emacs-gnus-type)
+              '(emacs gnus type))
+             ((eq gnus-user-agent 'emacs-gnus)
+              '(emacs gnus))
+             ((eq gnus-user-agent 'gnus)
+              '(gnus))
+             (t gnus-user-agent)))
+  (gnus-message 1 "Converted `gnus-user-agent' to `%s'." gnus-user-agent)
+  (sit-for 1)
+  (if (get 'gnus-user-agent 'saved-value)
+      (customize-save-variable 'gnus-user-agent gnus-user-agent)
+    (gnus-message 1 "Edit your init file to make this change permanent.")
+    (sit-for 2)))
 
 \f
 ;;; Internal variables
@@ -2596,7 +2818,7 @@ gnus-registry.el will populate this if it's loaded.")
 
   ;; This little mapcar goes through the list below and marks the
   ;; symbols in question as autoloaded functions.
-  (mapcar
+  (mapc
    (lambda (package)
      (let ((interactive (nth 1 (memq ':interactive package))))
        (mapcar
@@ -2747,14 +2969,15 @@ gnus-registry.el will populate this if it's loaded.")
       gnus-article-hide-pem gnus-article-hide-signature
       gnus-article-strip-leading-blank-lines gnus-article-date-local
       gnus-article-date-original gnus-article-date-lapsed
-;;      gnus-article-show-all-headers
+      ;;gnus-article-show-all-headers
       gnus-article-edit-mode gnus-article-edit-article
       gnus-article-edit-done gnus-article-decode-encoded-words
       gnus-start-date-timer gnus-stop-date-timer
       gnus-mime-view-all-parts)
      ("gnus-int" gnus-request-type)
      ("gnus-start" gnus-newsrc-parse-options gnus-1 gnus-no-server-1
-      gnus-dribble-enter gnus-read-init-file gnus-dribble-touch)
+      gnus-dribble-enter gnus-read-init-file gnus-dribble-touch
+      gnus-check-reasonable-setup)
      ("gnus-dup" gnus-dup-suppress-articles gnus-dup-unsuppress-article
       gnus-dup-enter-articles)
      ("gnus-range" gnus-copy-sequence)
@@ -2767,7 +2990,7 @@ gnus-registry.el will populate this if it's loaded.")
       gnus-async-prefetch-article gnus-async-prefetch-remove-group
       gnus-async-halt-prefetch)
      ("gnus-agent" gnus-open-agent gnus-agent-get-function
-      gnus-agent-save-groups gnus-agent-save-active gnus-agent-method-p
+      gnus-agent-save-active gnus-agent-method-p
       gnus-agent-get-undownloaded-list gnus-agent-fetch-session
       gnus-summary-set-agent-mark gnus-agent-save-group-info
       gnus-agent-request-article gnus-agent-retrieve-headers)
@@ -2839,7 +3062,7 @@ with some simple extensions.
 The %U (status), %R (replied) and %z (zcore) specs have to be handled
 with care.  For reasons of efficiency, Gnus will compute what column
 these characters will end up in, and \"hard-code\" that.  This means that
-it is invalid to have these specs after a variable-length spec.         Well,
+it is invalid to have these specs after a variable-length spec.  Well,
 you might not be arrested, but your summary buffer will look strange,
 which is bad enough.
 
@@ -3222,7 +3445,7 @@ GROUP can either be a string (a group name) or a select method."
 
 (defun gnus-group-read-only-p (&optional group)
   "Check whether GROUP supports editing or not.
-If GROUP is nil, `gnus-newsgroup-name' will be checked instead.         Note
+If GROUP is nil, `gnus-newsgroup-name' will be checked instead.  Note
 that that variable is buffer-local to the summary buffers."
   (let ((group (or group gnus-newsgroup-name)))
     (not (gnus-check-backend-function 'request-replace-article group))))
@@ -3307,36 +3530,34 @@ that that variable is buffer-local to the summary buffers."
                                   (nth 1 method))))
       method)))
 
-(defsubst gnus-method-to-server (method)
+(defsubst gnus-method-to-server (method &optional nocache)
   (catch 'server-name
     (setq method (or method gnus-select-method))
 
     ;; Perhaps it is already in the cache.
-    (mapc (lambda (name-method)
-            (if (equal (cdr name-method) method)
-                (throw 'server-name (car name-method))))
-          gnus-server-method-cache)
+    (unless nocache
+      (mapc (lambda (name-method)
+             (if (equal (cdr name-method) method)
+                 (throw 'server-name (car name-method))))
+           gnus-server-method-cache))
 
     (mapc
      (lambda (server-alist)
        (mapc (lambda (name-method)
-               (when (gnus-methods-equal-p (cdr name-method) method)
-                 (unless (member name-method gnus-server-method-cache)
-                   (push name-method gnus-server-method-cache))
-                 (throw 'server-name (car name-method))))
-             server-alist))
-     (let ((alists (list gnus-server-alist
-                         gnus-predefined-server-alist)))
-       (if gnus-select-method
-           (push (list (cons "native" gnus-select-method)) alists))
-       alists))
+              (when (gnus-methods-equal-p (cdr name-method) method)
+                (unless (member name-method gnus-server-method-cache)
+                  (push name-method gnus-server-method-cache))
+                (throw 'server-name (car name-method))))
+            server-alist))
+     (list gnus-server-alist
+          gnus-predefined-server-alist))
 
     (let* ((name (if (member (cadr method) '(nil ""))
-                     (format "%s" (car method))
-                   (format "%s:%s" (car method) (cadr method))))
-           (name-method (cons name method)))
+                    (format "%s" (car method))
+                  (format "%s:%s" (car method) (cadr method))))
+          (name-method (cons name method)))
       (unless (member name-method gnus-server-method-cache)
-        (push name-method gnus-server-method-cache))
+       (push name-method gnus-server-method-cache))
       name)))
 
 (defsubst gnus-server-to-method (server)
@@ -3366,24 +3587,23 @@ that that variable is buffer-local to the summary buffers."
                                                       (cadar servers)))))
                  (pop servers))
                (car servers))
-              ;; This could be some sort of foreign server that I
-              ;; simply haven't opened (yet).  Do a brute-force scan
-              ;; of the entire gnus-newsrc-alist for the server name
-              ;; of every method.  As a side-effect, loads the
-              ;; gnus-server-method-cache so this only happens once,
-              ;; if at all.
-              (let (match)
-                (mapcar 
-                 (lambda (info)
-                   (let ((info-method (gnus-info-method info)))
-                     (unless (stringp info-method)
-                       (let ((info-server (gnus-method-to-server info-method)))
-                         (when (equal server info-server)
-                           (setq match info-method))))))
-                 (cdr gnus-newsrc-alist))
-                match))))
-        (when result
-          (push (cons server result) gnus-server-method-cache))
+             ;; This could be some sort of foreign server that I
+             ;; simply haven't opened (yet).  Do a brute-force scan
+             ;; of the entire gnus-newsrc-alist for the server name
+             ;; of every method.  As a side-effect, loads the
+             ;; gnus-server-method-cache so this only happens once,
+             ;; if at all.
+             (let ((alist (cdr gnus-newsrc-alist))
+                   method match)
+               (while alist
+                 (setq method (gnus-info-method (pop alist)))
+                 (when (and (not (stringp method))
+                            (equal server (gnus-method-to-server method)))
+                   (setq match method
+                         alist nil)))
+               match))))
+       (when result
+         (push (cons server result) gnus-server-method-cache))
        result)))
 
 (defsubst gnus-server-get-method (group method)
@@ -3525,6 +3745,8 @@ server is native)."
   "Return the prefix of the current group name."
   (< 0 (length (gnus-group-real-prefix group))))
 
+(declare-function gnus-group-decoded-name "gnus-group" (string))
+
 (defun gnus-summary-buffer-name (group)
   "Return the summary buffer name of GROUP."
   (concat "*Summary " (gnus-group-decoded-name group) "*"))
@@ -3604,7 +3826,10 @@ You should probably use `gnus-find-method-for-group' instead."
 
 (defun gnus-parameters-get-parameter (group)
   "Return the group parameters for GROUP from `gnus-parameters'."
-  (let (params-list)
+  (let ((case-fold-search (if (eq gnus-parameters-case-fold-search 'default)
+                             case-fold-search
+                           gnus-parameters-case-fold-search))
+       params-list)
     (dolist (elem gnus-parameters)
       (when (string-match (car elem) group)
        (setq params-list
@@ -3647,7 +3872,7 @@ The function `gnus-group-find-parameter' will do that for you."
     (if simple-results
        ;; Found results; return them.
        (car simple-results)
-      ;; We didn't found it there, try `gnus-parameters'.
+      ;; We didn't find it there, try `gnus-parameters'.
       (let ((result nil)
            (head nil)
            (tail gnus-parameters))
@@ -3688,6 +3913,7 @@ If you call this function inside a loop, consider using the faster
 (defun gnus-group-get-parameter (group &optional symbol allow-list)
   "Return the group parameters for GROUP.
 If SYMBOL, return the value of that symbol in the group parameters.
+If ALLOW-LIST, also allow list as a result.
 Most functions should use `gnus-group-find-parameter', which
 also examines the topic parameters."
   (let ((params (gnus-info-params (gnus-get-info group))))
@@ -3697,7 +3923,8 @@ also examines the topic parameters."
 
 (defun gnus-group-parameter-value (params symbol &optional
                                          allow-list present-p)
-  "Return the value of SYMBOL in group PARAMS."
+  "Return the value of SYMBOL in group PARAMS.
+If ALLOW-LIST, also allow list as a result."
   ;; We only wish to return group parameters (dotted lists) and
   ;; not local variables, which may have the same names.
   ;; But first we handle single elements...
@@ -3892,7 +4119,7 @@ If NEWSGROUP is nil, return the global kill file name instead."
     (not method)))
 
 (defun gnus-server-extend-method (group method)
-  ;; This function "extends" a virtual server. If the server is
+  ;; This function "extends" a virtual server.  If the server is
   ;; "hello", and the select method is ("hello" (my-var "something"))
   ;; in the group "alt.alt", this will result in a new virtual server
   ;; called "hello+alt.alt".
@@ -3931,8 +4158,13 @@ If NEWSGROUP is nil, return the global kill file name instead."
   (or gnus-override-method
       (and (not group)
           gnus-select-method)
-      (and (not (gnus-group-entry group)) ;; a new group
-          (gnus-group-name-to-method group))
+      (and (not (gnus-group-entry group))
+          ;; Killed or otherwise unknown group.
+          (or
+           ;; If we know a virtual server by that name, return its method.
+           (gnus-server-to-method (gnus-group-server group))
+           ;; Guess a new method as last resort.
+           (gnus-group-name-to-method group)))
       (let ((info (or info (gnus-get-info group)))
            method)
        (if (or (not info)
@@ -3963,7 +4195,7 @@ If NEWSGROUP is nil, return the global kill file name instead."
       (setq valids (cdr valids)))
     outs))
 
-(eval-when-compile
+(eval-and-compile
   (autoload 'message-y-or-n-p "message" nil nil 'macro))
 
 (defun gnus-read-group (prompt &optional default)
@@ -4034,14 +4266,16 @@ Allow completion over sensible values."
 
 ;;; Agent functions
 
-(defun gnus-agent-method-p (method)
+(defun gnus-agent-method-p (method-or-server)
   "Say whether METHOD is covered by the agent."
-  (or (eq (car gnus-agent-method-p-cache) method)
-      (setq gnus-agent-method-p-cache 
-            (cons method
-                  (member (if (stringp method) 
-                              method 
-                            (gnus-method-to-server method)) gnus-agent-covered-methods))))
+  (or (eq (car gnus-agent-method-p-cache) method-or-server)
+      (let* ((method (if (stringp method-or-server)
+                        (gnus-server-to-method method-or-server)
+                      method-or-server))
+            (server (gnus-method-to-server method t)))
+       (setq gnus-agent-method-p-cache
+             (cons method-or-server
+                   (member server gnus-agent-covered-methods)))))
   (cdr gnus-agent-method-p-cache))
 
 (defun gnus-online (method)
@@ -4123,9 +4357,6 @@ current display is used."
                       (delete-frame gnus-other-frame-object))
                     (setq gnus-other-frame-object nil)))))))
 
-;;(setq thing ?                                ; this is a comment
-;;      more 'yes)
-
 ;;;###autoload
 (defun gnus (&optional arg dont-connect slave)
   "Read network news.
@@ -4144,5 +4375,5 @@ prompt the user for the name of an NNTP server to use."
 
 (provide 'gnus)
 
-;;; arch-tag: acebeeab-f331-4f8f-a7ea-89c58c84f636
+;; arch-tag: acebeeab-f331-4f8f-a7ea-89c58c84f636
 ;;; gnus.el ends here