Bump version to 0.9.
[gnus] / lisp / gnus.el
index da186a8..a61af6e 100644 (file)
@@ -1,7 +1,7 @@
 ;;; gnus.el --- a newsreader for GNU Emacs
 
 ;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, 1997, 1998,
 ;;; gnus.el --- a newsreader for GNU Emacs
 
 ;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, 1997, 1998,
-;;   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+;;   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>
 
 ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
 ;;     Lars Magne Ingebrigtsen <larsi@gnus.org>
 
 ;; 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
 
 ;; 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)
+;; the Free Software Foundation; either version 3, 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
 ;; 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
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
 
 (eval '(run-hooks 'gnus-load-hook))
 
 
 (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)
 (eval-when-compile (require 'cl))
 (require 'wid-edit)
 (require 'mm-util)
@@ -43,6 +47,8 @@
 (defvar gnus-spam-autodetect-methods)
 (defvar gnus-spam-newsgroup-contents)
 (defvar gnus-spam-process-destinations)
 (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)
 
 
 (defvar gnus-spam-process-newsgroups)
 
 
   :group 'news
   :group 'mail)
 
   :group 'news
   :group 'mail)
 
+(defgroup gnus-start nil
+  "Starting your favorite newsreader."
+  :group 'gnus)
+
 (defgroup gnus-format nil
   "Dealing with formatting issues."
   :group 'gnus)
 (defgroup gnus-format nil
   "Dealing with formatting issues."
   :group 'gnus)
   "Article Registry."
   :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)
 (defgroup gnus-start-server nil
   "Server options at startup."
   :group 'gnus-start)
@@ -279,10 +285,6 @@ is restarted, and sometimes reloaded."
   :link '(custom-manual "(gnus)Various Various")
   :group 'gnus)
 
   :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."
   :link '(custom-manual "(gnus)Exiting Gnus")
 (defgroup gnus-exit nil
   "Exiting Gnus."
   :link '(custom-manual "(gnus)Exiting Gnus")
@@ -293,7 +295,7 @@ is restarted, and sometimes reloaded."
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "0.4"
+(defconst gnus-version-number "0.9"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "No Gnus v%s" gnus-version-number)
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "No Gnus v%s" gnus-version-number)
@@ -563,7 +565,7 @@ be set in `.emacs' instead."
 (defface gnus-group-mail-1
   '((((class color)
       (background dark))
 (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))
     (((class color)
       (background light))
      (:foreground "DeepPink3" :bold t))
@@ -577,7 +579,7 @@ be set in `.emacs' instead."
 (defface gnus-group-mail-1-empty
   '((((class color)
       (background dark))
 (defface gnus-group-mail-1-empty
   '((((class color)
       (background dark))
-     (:foreground "aquamarine1"))
+     (:foreground "#e1ffe1"))
     (((class color)
       (background light))
      (:foreground "DeepPink3"))
     (((class color)
       (background light))
      (:foreground "DeepPink3"))
@@ -591,7 +593,7 @@ be set in `.emacs' instead."
 (defface gnus-group-mail-2
   '((((class color)
       (background dark))
 (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))
     (((class color)
       (background light))
      (:foreground "HotPink3" :bold t))
@@ -605,7 +607,7 @@ be set in `.emacs' instead."
 (defface gnus-group-mail-2-empty
   '((((class color)
       (background dark))
 (defface gnus-group-mail-2-empty
   '((((class color)
       (background dark))
-     (:foreground "aquamarine2"))
+     (:foreground "DarkSeaGreen1"))
     (((class color)
       (background light))
      (:foreground "HotPink3"))
     (((class color)
       (background light))
      (:foreground "HotPink3"))
@@ -619,7 +621,7 @@ be set in `.emacs' instead."
 (defface gnus-group-mail-3
   '((((class color)
       (background dark))
 (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))
     (((class color)
       (background light))
      (:foreground "magenta4" :bold t))
@@ -633,7 +635,7 @@ be set in `.emacs' instead."
 (defface gnus-group-mail-3-empty
   '((((class color)
       (background dark))
 (defface gnus-group-mail-3-empty
   '((((class color)
       (background dark))
-     (:foreground "aquamarine3"))
+     (:foreground "aquamarine1"))
     (((class color)
       (background light))
      (:foreground "magenta4"))
     (((class color)
       (background light))
      (:foreground "magenta4"))
@@ -647,7 +649,7 @@ be set in `.emacs' instead."
 (defface gnus-group-mail-low
   '((((class color)
       (background dark))
 (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))
     (((class color)
       (background light))
      (:foreground "DeepPink4" :bold t))
@@ -661,7 +663,7 @@ be set in `.emacs' instead."
 (defface gnus-group-mail-low-empty
   '((((class color)
       (background dark))
 (defface gnus-group-mail-low-empty
   '((((class color)
       (background dark))
-     (:foreground "aquamarine4"))
+     (:foreground "aquamarine2"))
     (((class color)
       (background light))
      (:foreground "DeepPink4"))
     (((class color)
       (background light))
      (:foreground "DeepPink4"))
@@ -923,14 +925,14 @@ be set in `.emacs' instead."
 (defface gnus-splash
   '((((class color)
       (background dark))
 (defface gnus-splash
   '((((class color)
       (background dark))
-     (:foreground "#888888"))
+     (:foreground "#cccccc"))
     (((class color)
       (background light))
      (:foreground "#888888"))
     (t
      ()))
   "Face for the splash screen."
     (((class color)
       (background light))
      (:foreground "#888888"))
     (t
      ()))
   "Face for the splash screen."
-  :group 'gnus)
+  :group 'gnus-start)
 ;; backward-compatibility alias
 (put 'gnus-splash-face 'face-alias 'gnus-splash)
 
 ;; backward-compatibility alias
 (put 'gnus-splash-face 'face-alias 'gnus-splash)
 
@@ -1001,6 +1003,11 @@ be set in `.emacs' instead."
    ((and
      (fboundp 'find-image)
      (display-graphic-p)
    ((and
      (fboundp 'find-image)
      (display-graphic-p)
+     ;; 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))
      (let* ((data-directory (nnheader-find-etc-directory "images/gnus"))
            (image-load-path (cond (data-directory
                                    (list data-directory))
@@ -1034,23 +1041,23 @@ be set in `.emacs' instead."
    (t
     (insert
      (format "              %s
    (t
     (insert
      (format "              %s
-          _    ___ _             _
-          _ ___ __ ___  __    _ ___
-          __   _     ___    __  ___
-              _           ___     _
-             _  _ __             _
-             ___   __            _
-                   __           _
-                    _      _   _
-                   _      _    _
-                      _  _    _
-                  __  ___
-                 _   _ _     _
-                _   _
-              _    _
-             _    _
-            _
-          __
+         _    ___ _             _
+         _ ___ __ ___  __    _ ___
+         __   _     ___    __  ___
+             _           ___     _
+            _  _ __             _
+            ___   __            _
+                  __           _
+                   _      _   _
+                  _      _    _
+                     _  _    _
+                 __  ___
+                _   _ _     _
+               _   _
+             _    _
+            _    _
+           _
+         __
 
 "
             ""))
 
 "
             ""))
@@ -1250,6 +1257,11 @@ Check the NNTPSERVER environment variable and the
             (when (re-search-forward "[^ \t\n\r]+" nil t)
               (match-string 0))))))
 
             (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
 (defcustom gnus-select-method
   (condition-case nil
       (nconc
@@ -1283,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
 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.
   :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))
 
   :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
 (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
@@ -1328,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.
 
 (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)
 variable instead."
   :group 'gnus-server
   :type '(choice (const :tag "disable" nil)
@@ -1459,6 +1491,7 @@ 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"))))
   :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'.
 
 (defcustom gnus-group-fetch-control-use-browse-url nil
   "*Non-nil means that control messages are displayed using `browse-url'.
@@ -1471,7 +1504,7 @@ group."
 (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
 (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)
 newsgroups."
   :group 'gnus-server
   :type '(choice (const :tag "off" nil)
@@ -1494,7 +1527,7 @@ If it is nil, no confirmation is required."
   :type '(choice (const :tag "No limit" nil)
                 integer))
 
   :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.
 
   "*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.
 
@@ -1571,9 +1604,23 @@ articles.  This is not a good idea."
                       :value t)))
 
 (defcustom gnus-use-nocem nil
                       :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
   :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."
 
 (defcustom gnus-suppress-duplicates nil
   "*If non-nil, Gnus will mark duplicate copies of the same article as read."
@@ -1671,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 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)
   :group 'gnus-server
   :type '(repeat (group (string :tag "Name")
                        (radio-button-choice (const :format "%v " post)
@@ -1825,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
  "*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)
 course.)"
  :variable-group nnmail-expire
  :variable-type '(choice (const nil)
@@ -2771,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.
 
   ;; 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
    (lambda (package)
      (let ((interactive (nth 1 (memq ':interactive package))))
        (mapcar
@@ -2922,7 +2969,7 @@ 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-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-article-edit-mode gnus-article-edit-article
       gnus-article-edit-done gnus-article-decode-encoded-words
       gnus-start-date-timer gnus-stop-date-timer
@@ -3015,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
 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.
 
 you might not be arrested, but your summary buffer will look strange,
 which is bad enough.
 
@@ -3398,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.
 
 (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))))
 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))))
@@ -3483,36 +3530,34 @@ that that variable is buffer-local to the summary buffers."
                                   (nth 1 method))))
       method)))
 
                                   (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.
   (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)
 
     (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 ""))
 
     (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)
       (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)
       name)))
 
 (defsubst gnus-server-to-method (server)
@@ -3542,24 +3587,23 @@ that that variable is buffer-local to the summary buffers."
                                                       (cadar servers)))))
                  (pop servers))
                (car servers))
                                                       (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)
        result)))
 
 (defsubst gnus-server-get-method (group method)
@@ -3701,6 +3745,8 @@ server is native)."
   "Return the prefix of the current group name."
   (< 0 (length (gnus-group-real-prefix group))))
 
   "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) "*"))
 (defun gnus-summary-buffer-name (group)
   "Return the summary buffer name of GROUP."
   (concat "*Summary " (gnus-group-decoded-name group) "*"))
@@ -3826,7 +3872,7 @@ The function `gnus-group-find-parameter' will do that for you."
     (if simple-results
        ;; Found results; return them.
        (car simple-results)
     (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))
       (let ((result nil)
            (head nil)
            (tail gnus-parameters))
@@ -3867,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.
 (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))))
 Most functions should use `gnus-group-find-parameter', which
 also examines the topic parameters."
   (let ((params (gnus-info-params (gnus-get-info group))))
@@ -3876,7 +3923,8 @@ also examines the topic parameters."
 
 (defun gnus-group-parameter-value (params symbol &optional
                                          allow-list present-p)
 
 (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...
   ;; 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...
@@ -4071,7 +4119,7 @@ If NEWSGROUP is nil, return the global kill file name instead."
     (not method)))
 
 (defun gnus-server-extend-method (group method)
     (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".
   ;; "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".
@@ -4110,8 +4158,13 @@ If NEWSGROUP is nil, return the global kill file name instead."
   (or gnus-override-method
       (and (not group)
           gnus-select-method)
   (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)
       (let ((info (or info (gnus-get-info group)))
            method)
        (if (or (not info)
@@ -4213,14 +4266,16 @@ Allow completion over sensible values."
 
 ;;; Agent functions
 
 
 ;;; Agent functions
 
-(defun gnus-agent-method-p (method)
+(defun gnus-agent-method-p (method-or-server)
   "Say whether METHOD is covered by the agent."
   "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)
   (cdr gnus-agent-method-p-cache))
 
 (defun gnus-online (method)
@@ -4302,9 +4357,6 @@ current display is used."
                       (delete-frame gnus-other-frame-object))
                     (setq gnus-other-frame-object nil)))))))
 
                       (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.
 ;;;###autoload
 (defun gnus (&optional arg dont-connect slave)
   "Read network news.