*** empty log message ***
[gnus] / lisp / gnus.el
index 304d05f..10cf215 100644 (file)
@@ -3,7 +3,7 @@
 
 ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
 ;;     Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
-;; Keywords: news
+;; Keywords: news, mail
 
 ;; This file is part of GNU Emacs.
 
 
 (require 'custom)
 (require 'gnus-load)
+(require 'message)
 
 (defgroup gnus nil
   "The coffee-brewing, all singing, all dancing, kitchen sink newsreader."
-  :group 'emacs)
+  :group 'news
+  :group 'mail)
 
 (defgroup gnus-start nil
   "Starting your favorite newsreader."
   :group 'gnus)
 
+(defgroup gnus-start-server nil
+  "Server options at startup."
+  :group 'gnus-start)
+
 ;; These belong to gnus-group.el.
 (defgroup gnus-group nil
   "Group buffers."
   :link '(custom-manual "(gnus)Foreign Groups")
   :group 'gnus-group)
 
+(defgroup gnus-group-new nil
+  "Automatic subscription of new groups."
+  :group 'gnus-group)
+
 (defgroup gnus-group-levels nil
   "Group levels."
   :link '(custom-manual "(gnus)Group Levels")
   :link '(custom-manual "(gnus)Various Summary Stuff")
   :group 'gnus-summary)
 
-;; Belongs to to gnus-uu.el
+;; Belongs to gnus-uu.el
 (defgroup gnus-extract-view nil
   "Viewing extracted files."
   :link '(custom-manual "(gnus)Viewing Files")
   :group 'gnus-extract)
 
-;; Other
+;; Belongs to gnus-score.el
 (defgroup gnus-score nil
   "Score and kill file handling."
-  :group 'gnus )
+  :group 'gnus)
 
-(defgroup gnus-exit nil
-  "Exiting gnus."
-  :link '(custom-manual "(gnus)Exiting Gnus")
+(defgroup gnus-score-kill nil
+  "Kill files."
+  :group 'gnus-score)
+
+(defgroup gnus-score-adapt nil
+  "Adaptive score files."
+  :group 'gnus-score)
+
+(defgroup gnus-score-default nil
+  "Default values for score files."
+  :group 'gnus-score)
+
+(defgroup gnus-score-expire nil
+  "Expiring score rules."
+  :group 'gnus-score)
+
+(defgroup gnus-score-decay nil
+  "Decaying score rules."
+  :group 'gnus-score)
+
+(defgroup gnus-score-files nil
+  "Score and kill file names."
+  :group 'gnus-score
+  :group 'gnus-files)
+
+(defgroup gnus-score-various nil
+  "Various scoring and killing options."
+  :group 'gnus-score)
+
+;; Other
+(defgroup gnus-visual nil
+  "Options controling the visual fluff."
+  :group 'gnus
+  :group 'faces)
+
+(defgroup gnus-files nil
+  "Files used by Gnus."
+  :group 'gnus)
+
+(defgroup gnus-dribble-file nil
+  "Auto save file."
+  :link '(custom-manual "(gnus)Auto Save")
+  :group 'gnus-files)
+
+(defgroup gnus-newsrc nil
+  "Storing Gnus state."
+  :group 'gnus-files)
+
+(defgroup gnus-server nil
+  "Options related to newsservers and other servers used by Gnus."
+  :group 'gnus)
+
+(defgroup gnus-message '((message custom-group))
+  "Composing replies and followups in Gnus."
+  :group 'gnus)
+
+(defgroup gnus-meta nil
+  "Meta variables controling major portions of Gnus.
+In general, modifying these variables does not take affect until Gnus
+is restarted, and sometimes reloaded."
   :group 'gnus)
 
 (defgroup gnus-various nil
   :link '(custom-manual "(gnus)Various Various")
   :group 'gnus)
 
-(defconst gnus-version-number "5.4.5"
+(defgroup gnus-exit nil
+  "Exiting gnus."
+  :link '(custom-manual "(gnus)Exiting Gnus")
+  :group 'gnus)
+
+(defconst gnus-version-number "5.4.29"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Gnus v%s" gnus-version-number)
@@ -186,7 +258,6 @@ be set in `.emacs' instead."
   (defalias 'gnus-topic-remove-excess-properties 'ignore)
   (defalias 'gnus-appt-select-lowest-window 'appt-select-lowest-window)
   (defalias 'gnus-mail-strip-quoted-names 'mail-strip-quoted-names)
-  (defalias 'gnus-make-local-hook 'make-local-hook)
   (defalias 'gnus-add-hook 'add-hook)
   (defalias 'gnus-character-to-event 'identity)
   (defalias 'gnus-add-text-properties 'add-text-properties)
@@ -237,7 +308,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-face
   '((((class color)
       (background dark))
      (:foreground "PaleTurquoise" :bold t))
@@ -259,7 +330,7 @@ be set in `.emacs' instead."
      ()))
   "Level 1 empty newsgroup face.")
 
-(defface gnus-group-news-2-face 
+(defface gnus-group-news-2-face
   '((((class color)
       (background dark))
      (:foreground "turquoise" :bold t))
@@ -281,7 +352,7 @@ be set in `.emacs' instead."
      ()))
   "Level 2 empty newsgroup face.")
 
-(defface gnus-group-news-3-face 
+(defface gnus-group-news-3-face
   '((((class color)
       (background dark))
      (:bold t))
@@ -303,7 +374,7 @@ be set in `.emacs' instead."
      ()))
   "Level 3 empty newsgroup face.")
 
-(defface gnus-group-news-low-face 
+(defface gnus-group-news-low-face
   '((((class color)
       (background dark))
      (:foreground "DarkTurquoise" :bold t))
@@ -325,7 +396,7 @@ be set in `.emacs' instead."
      ()))
   "Low level empty newsgroup face.")
 
-(defface gnus-group-mail-1-face 
+(defface gnus-group-mail-1-face
   '((((class color)
       (background dark))
      (:foreground "aquamarine1" :bold t))
@@ -347,7 +418,7 @@ be set in `.emacs' instead."
      (:italic t :bold t)))
   "Level 1 empty mailgroup face.")
 
-(defface gnus-group-mail-2-face 
+(defface gnus-group-mail-2-face
   '((((class color)
       (background dark))
      (:foreground "aquamarine2" :bold t))
@@ -369,7 +440,7 @@ be set in `.emacs' instead."
      (:bold t)))
   "Level 2 empty mailgroup face.")
 
-(defface gnus-group-mail-3-face 
+(defface gnus-group-mail-3-face
   '((((class color)
       (background dark))
      (:foreground "aquamarine3" :bold t))
@@ -391,7 +462,7 @@ be set in `.emacs' instead."
      ()))
   "Level 3 empty mailgroup face.")
 
-(defface gnus-group-mail-low-face 
+(defface gnus-group-mail-low-face
   '((((class color)
       (background dark))
      (:foreground "aquamarine4" :bold t))
@@ -415,11 +486,11 @@ be set in `.emacs' instead."
 
 ;; Summary mode faces.
 
-(defface gnus-summary-selected-face '((t 
+(defface gnus-summary-selected-face '((t
                                       (:underline t)))
   "Face used for selected articles.")
 
-(defface gnus-summary-cancelled-face 
+(defface gnus-summary-cancelled-face
   '((((class color))
      (:foreground "yellow" :background "black")))
   "Face used for cancelled articles.")
@@ -431,7 +502,7 @@ be set in `.emacs' instead."
     (((class color)
       (background light))
      (:foreground "firebrick" :bold t))
-    (t 
+    (t
      (:bold t)))
   "Face used for high interest ticked articles.")
 
@@ -442,7 +513,7 @@ be set in `.emacs' instead."
     (((class color)
       (background light))
      (:foreground "firebrick" :italic t))
-    (t 
+    (t
      (:italic t)))
   "Face used for low interest ticked articles.")
 
@@ -453,10 +524,10 @@ be set in `.emacs' instead."
     (((class color)
       (background light))
      (:foreground "firebrick"))
-    (t 
+    (t
      ()))
   "Face used for normal interest ticked articles.")
-  
+
 (defface gnus-summary-high-ancient-face
   '((((class color)
       (background dark))
@@ -464,7 +535,7 @@ be set in `.emacs' instead."
     (((class color)
       (background light))
      (:foreground "RoyalBlue" :bold t))
-    (t 
+    (t
      (:bold t)))
   "Face used for high interest ancient articles.")
 
@@ -475,7 +546,7 @@ be set in `.emacs' instead."
     (((class color)
       (background light))
      (:foreground "RoyalBlue" :italic t))
-    (t 
+    (t
      (:italic t)))
   "Face used for low interest ancient articles.")
 
@@ -486,25 +557,25 @@ be set in `.emacs' instead."
     (((class color)
       (background light))
      (:foreground "RoyalBlue"))
-    (t 
+    (t
      ()))
   "Face used for normal interest ancient articles.")
-  
+
 (defface gnus-summary-high-unread-face
-  '((t 
+  '((t
      (:bold t)))
   "Face used for high interest unread articles.")
 
 (defface gnus-summary-low-unread-face
-  '((t 
+  '((t
      (:italic t)))
   "Face used for low interest unread articles.")
 
 (defface gnus-summary-normal-unread-face
-  '((t 
+  '((t
      ()))
   "Face used for normal interest unread articles.")
-  
+
 (defface gnus-summary-high-read-face
   '((((class color)
       (background dark))
@@ -514,7 +585,7 @@ be set in `.emacs' instead."
       (background light))
      (:foreground "DarkGreen"
                  :bold t))
-    (t 
+    (t
      (:bold t)))
   "Face used for high interest read articles.")
 
@@ -527,7 +598,7 @@ be set in `.emacs' instead."
       (background light))
      (:foreground "DarkGreen"
                  :italic t))
-    (t 
+    (t
      (:italic t)))
   "Face used for low interest read articles.")
 
@@ -538,7 +609,7 @@ be set in `.emacs' instead."
     (((class color)
       (background light))
      (:foreground "DarkGreen"))
-    (t 
+    (t
      ()))
   "Face used for normal interest read articles.")
 
@@ -550,7 +621,7 @@ be set in `.emacs' instead."
 (eval-and-compile
   (autoload 'gnus-play-jingle "gnus-audio"))
 
-(defface gnus-splash-face 
+(defface gnus-splash-face
   '((((class color)
       (background dark))
      (:foreground "red"))
@@ -640,20 +711,21 @@ be set in `.emacs' instead."
 (require 'gnus-util)
 (require 'nnheader)
 
-(defgroup gnus-meta nil
-  "Meta variables controling major portions of Gnus.
-In general, modifying these variables does not take affect until Gnus
-is restarted, and sometimes reloaded."
-  :group 'gnus)
+(defcustom gnus-home-directory "~/"
+  "Directory variable that specifies the \"home\" directory.
+All other Gnus path variables are initialized from this variable."
+  :group 'gnus-files
+  :type 'directory)
 
-(defcustom gnus-directory (or (getenv "SAVEDIR") "~/News/")
+(defcustom gnus-directory (or (getenv "SAVEDIR")
+                             (nnheader-concat gnus-home-directory "News/"))
   "Directory variable from which all other Gnus file variables are derived."
-  :group 'gnus-meta
+  :group 'gnus-files
   :type 'directory)
 
 (defcustom gnus-default-directory nil
   "*Default directory for all Gnus buffers."
-  :group 'gnus-start
+  :group 'gnus-files
   :type '(choice (const :tag "current" nil)
                 directory))
 
@@ -678,7 +750,8 @@ used to 899, you would say something along these lines:
 
 (defcustom gnus-nntpserver-file "/etc/nntpserver"
   "A file with only the name of the nntp server in it."
-  :group 'gnus-start
+  :group 'gnus-files
+  :group 'gnus-server
   :type 'file)
 
 ;; This function is used to check both the environment variable
@@ -728,14 +801,14 @@ 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-start
+  :group 'gnus-server
   :type 'gnus-select-method)
 
-(defcustom gnus-message-archive-method 
+(defcustom gnus-message-archive-method
   `(nnfolder
     "archive"
     (nnfolder-directory ,(nnheader-concat message-directory "archive"))
-    (nnfolder-active-file 
+    (nnfolder-active-file
      ,(nnheader-concat message-directory "archive/active"))
     (nnfolder-get-new-mail nil)
     (nnfolder-inhibit-expiry t))
@@ -745,16 +818,13 @@ This should be a mail method.
 It's probably not a very effective to change this variable once you've
 run Gnus once.  After doing that, you must edit this server from the
 server buffer."
-  :group 'gnus-start
+  :group 'gnus-server
+  :group 'gnus-message
   :type 'gnus-select-method)
 
-(defgroup gnus-message '((message custom-group))
-  "Interface from gnus to message mode."
-  :group 'gnus)
-
 (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
+This can either be a string; a list of strings; or an alist
 of regexps/functions/forms to be evaluated to return a string (or a list
 of strings).  The functions are called with the name of the current
 group (or nil) as a parameter.
@@ -762,9 +832,9 @@ group (or nil) as a parameter.
 If you want to save your mail in one group and the news articles you
 write in another group, you could say something like:
 
- \(setq gnus-message-archive-group 
+ \(setq gnus-message-archive-group
         '((if (message-news-p)
-              \"misc-news\" 
+              \"misc-news\"
             \"misc-mail\")))
 
 Normally the group names returned by this variable should be
@@ -780,14 +850,14 @@ that case, just return a fully prefixed name of the group --
   "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."
-  :group 'gnus-start
+  :group 'gnus-server
   :type '(repeat string))
 
 (defcustom gnus-nntp-server nil
   "*The name of the host running the NNTP server.
 This variable is semi-obsolete.         Use the `gnus-select-method'
 variable instead."
-  :group 'gnus-start
+  :group 'gnus-server
   :type '(choice (const :tag "disable" nil)
                 string))
 
@@ -800,7 +870,7 @@ If, for instance, you want to read your mail with the nnml backend,
 you could set this variable:
 
 \(setq gnus-secondary-select-methods '((nnml \"\")))"
-:group 'gnus-start
+:group 'gnus-server
 :type '(repeat gnus-select-method))
 
 (defvar gnus-backup-default-subscribed-newsgroups
@@ -813,23 +883,13 @@ Should be set in paths.el, and shouldn't be touched by the user.")
 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."
-  :group 'gnus-start
+  :group 'gnus-message
   :type '(choice (const :tag "default" nil)
                 string))
 
-(defcustom gnus-local-organization nil
+(defvar gnus-local-organization nil
   "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
-return a string.
-
-In any case, if the string (either in the variable, in the environment
-variable, or returned by the function) is a file name, the contents of
-this file will be used as the organization."
-  :group 'gnus-start
-  :type '(choice (const :tag "default" nil)
-                string))
+Obsolete variable; use `message-user-organization' instead.")
 
 ;; Customization variables
 
@@ -841,7 +901,7 @@ nntp method, you might get acceptable results.
 
 The value of this variable must be a valid select method as discussed
 in the documentation of `gnus-select-method'."
-  :group 'gnus-start
+  :group 'gnus-server
   :type '(choice (const :tag "default" nil)
                 gnus-select-method))
 
@@ -890,7 +950,7 @@ If the default site is too slow, try one of these:
 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."
-  :group 'gnus-start
+  :group 'gnus-server
   :type '(choice (const :tag "off" nil)
                 (const :tag "subscribed" t)
                 (sexp :format "all"
@@ -898,12 +958,13 @@ newsgroups."
 
 (defcustom gnus-process-mark ?#
   "*Process mark."
-  :group 'gnus-start
+  :group 'gnus-group-visual
+  :group 'gnus-summary-marks
   :type 'character)
 
 (defcustom gnus-asynchronous nil
   "*If non-nil, Gnus will supply backends with data needed for async article fetching."
-  :group 'gnus-start
+  :group 'gnus-asynchronous
   :type 'boolean)
 
 (defcustom gnus-large-newsgroup 200
@@ -931,12 +992,13 @@ to nil while on all other systems it defaults to t."
 
 (defcustom gnus-kill-files-directory gnus-directory
   "*Name of the directory where kill files will be stored (default \"~/News\")."
-  :group 'gnus-score
+  :group 'gnus-score-files
+  :group 'gnus-score-kill
   :type 'directory)
 
 (defcustom gnus-save-score nil
   "*If non-nil, save group scoring info."
-  :group 'gnus-score
+  :group 'gnus-score-various
   :group 'gnus-start
   :type 'boolean)
 
@@ -951,6 +1013,7 @@ If a list, then the values `word' and `line' are meaningful.  The
 former will perform adaption on individual words in the subject
 header while `line' will perform adaption on several headers."
   :group 'gnus-meta
+  :group 'gnus-score-adapt
   :type '(set (const word) (const line)))
 
 (defcustom gnus-use-cache 'passive
@@ -982,7 +1045,7 @@ articles.  This is not a good idea."
   :group 'gnus-meta
   :type '(choice (const :tag "off" nil)
                 integer
-                (sexp :format "all" 
+                (sexp :format "all"
                       :value t)))
 
 (defcustom gnus-use-nocem nil
@@ -1010,7 +1073,7 @@ articles.  This is not a good idea."
   :group 'gnus-meta
   :type 'boolean)
 
-(defcustom gnus-summary-prepare-exit-hook 
+(defcustom gnus-summary-prepare-exit-hook
   '(gnus-summary-expire-articles)
   "A hook called when preparing to exit from the summary buffer.
 It calls `gnus-summary-expire-articles' by default."
@@ -1046,7 +1109,7 @@ 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."
-  :group 'gnus-start
+  :group 'gnus-summary-format
   :type '(radio (function-item gnus-extract-address-components)
                (function-item mail-extract-address-components)
                (function :tag "Other")))
@@ -1058,7 +1121,7 @@ slower."
 
 (defcustom gnus-shell-command-separator ";"
   "String used to separate to shell commands."
-  :group 'gnus-start
+  :group 'gnus-files
   :type 'string)
 
 (defcustom gnus-valid-select-methods
@@ -1085,7 +1148,7 @@ 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."
-  :group 'gnus-start
+  :group 'gnus-server
   :type '(repeat (group (string :tag "Name")
                        (radio-button-choice (const :format "%v " post)
                                             (const :format "%v " mail)
@@ -1107,7 +1170,7 @@ this variable.    I think."
          (string :tag "Address")
          (editable-list  :inline t
                          (list :format "%v"
-                               variable 
+                               variable
                                (sexp :tag "Value")))))
 
 (defcustom gnus-updated-mode-lines '(group article summary tree)
@@ -1116,7 +1179,7 @@ The list may contain the symbols `group', `article', `tree' and
 `summary'.  If the corresponding symbol is present, Gnus will keep
 that mode line updated with information that may be pertinent.
 If this variable is nil, screen refresh may be quicker."
-  :group 'gnus-start
+  :group 'gnus-various
   :type '(set (const group)
              (const article)
              (const summary)
@@ -1126,8 +1189,9 @@ If this variable is nil, screen refresh may be quicker."
 (defcustom gnus-mode-non-string-length nil
   "*Max length of mode-line non-string contents.
 If this is nil, Gnus will take space as is needed, leaving the rest
-of the modeline intact."
-  :group 'gnus-start
+of the modeline intact.  Note that the default of nil is unlikely
+to be desirable; see the manual for further details."
+  :group 'gnus-various
   :type '(choice (const nil)
                 integer))
 
@@ -1135,7 +1199,7 @@ of the modeline intact."
   "*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."
-  :group 'gnus-mail
+  :group 'nnmail-expire
   :type '(choice (const nil)
                 regexp))
 
@@ -1145,7 +1209,7 @@ 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
 course.)"
-  :group 'gnus-mail
+  :group 'nnmail-expire
   :type '(choice (const nil)
                 regexp))
 
@@ -1183,24 +1247,20 @@ following hook:
          (cond ((string-match \"control\" gnus-newsgroup-name)
                 (gnus-kill \"Subject\" \"rmgroup\")
                 (gnus-expunge \"X\"))))))"
-  :group 'gnus-score
+  :group 'gnus-score-kill
   :options '(gnus-apply-kill-file)
   :type 'hook)
 
 (defcustom gnus-group-change-level-function nil
   "Function run when a group level is changed.
 It is called with three parameters -- GROUP, LEVEL and OLDLEVEL."
-  :group 'gnus-start
+  :group 'gnus-group-level
   :type 'function)
 
 ;;; Face thingies.
 
-(defgroup gnus-visual nil
-  "Options controling the visual fluff."
-  :group 'gnus)
-
-(defcustom gnus-visual 
-  '(summary-highlight group-highlight article-highlight 
+(defcustom gnus-visual
+  '(summary-highlight group-highlight article-highlight
                      mouse-face
                      summary-menu group-menu article-menu
                      tree-highlight menu highlight
@@ -1307,8 +1367,12 @@ want."
             gnus-article-strip-leading-blank-lines
             gnus-article-strip-multiple-blank-lines
             gnus-article-strip-blank-lines
-            gnus-article-treat-overstrike
-            ))
+            gnus-article-treat-overstrike))
+
+(defcustom gnus-article-save-directory gnus-directory
+  "*Name of the directory articles will be saved in (default \"~/News\")."
+  :group 'gnus-article-saving
+  :type 'directory)
 
 \f
 ;;; Internal variables
@@ -1542,7 +1606,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
       gnus-uu-decode-uu-and-save-view gnus-uu-decode-unshar-view
       gnus-uu-decode-unshar-and-save-view gnus-uu-decode-save-view
       gnus-uu-decode-binhex-view)
-     ("gnus-uu" gnus-uu-delete-work-dir)
+     ("gnus-uu" gnus-uu-delete-work-dir gnus-quote-arg-for-sh-or-csh)
      ("gnus-msg" (gnus-summary-send-map keymap)
       gnus-article-mail gnus-copy-article-buffer gnus-extended-version)
      ("gnus-msg" :interactive t
@@ -1556,7 +1620,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
      ("gnus-picon" :interactive t gnus-article-display-picons
       gnus-group-display-picons gnus-picons-article-display-x-face
       gnus-picons-display-x-face)
-     ("gnus-gl" bbb-login bbb-logout bbb-grouplens-group-p 
+     ("gnus-gl" bbb-login bbb-logout bbb-grouplens-group-p
       gnus-grouplens-mode)
      ("smiley" :interactive t gnus-smiley-display)
      ("gnus-win" gnus-configure-windows gnus-add-configuration)
@@ -1575,7 +1639,8 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
       gnus-article-prepare gnus-article-set-window-start
       gnus-article-next-page gnus-article-prev-page
       gnus-request-article-this-buffer gnus-article-mode
-      gnus-article-setup-buffer gnus-narrow-to-page)
+      gnus-article-setup-buffer gnus-narrow-to-page
+      gnus-article-delete-invisible-text)
      ("gnus-art" :interactive t
       gnus-article-hide-headers gnus-article-hide-boring-headers
       gnus-article-treat-overstrike gnus-article-word-wrap
@@ -1585,7 +1650,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
       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-decode-rfc1522 article-decode-rfc1522)
      ("gnus-int" gnus-request-type)
@@ -1675,7 +1740,7 @@ This restriction may disappear in later versions of Gnus."
 
 (defun gnus-suppress-keymap (keymap)
   (suppress-keymap keymap)
-  (let ((keys `([delete] "\177" "\M-u"))) ;gnus-mouse-2 
+  (let ((keys `([delete] "\177" "\M-u"))) ;gnus-mouse-2
     (while keys
       (define-key keymap (pop keys) 'undefined))))
 
@@ -1683,7 +1748,7 @@ This restriction may disappear in later versions of Gnus."
   (let ((keymap (make-keymap)))
     (gnus-suppress-keymap keymap)
     keymap))
-(defvar gnus-summary-mode-map 
+(defvar gnus-summary-mode-map
   (let ((keymap (make-keymap)))
     (gnus-suppress-keymap keymap)
     keymap))
@@ -1884,7 +1949,7 @@ If ARG, insert string at point."
       (string-to-number
        (if (zerop major)
           (format "%s00%02d%02d"
-                  (cond 
+                  (cond
                    ((member alpha '("(ding)" "d")) "4.99")
                    ((member alpha '("September" "s")) "5.01")
                    ((member alpha '("Red" "r")) "5.03"))
@@ -1998,7 +2063,7 @@ that that variable is buffer-local to the summary buffers."
   (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))
-            (memq 'physical-address (assq (car method) 
+            (memq 'physical-address (assq (car method)
                                           gnus-valid-select-methods)))
        (append method (list (list (intern (concat method-name "-address"))
                                   (nth 1 method))))
@@ -2021,7 +2086,7 @@ that that variable is buffer-local to the summary buffers."
 
 (defun gnus-server-to-method (server)
   "Map virtual server names to select methods."
-  (or 
+  (or
    ;; Is this a method, perhaps?
    (and server (listp server) server)
    ;; Perhaps this is the native server?
@@ -2072,7 +2137,7 @@ that that variable is buffer-local to the summary buffers."
 
 (defun gnus-archive-server-wanted-p ()
   "Say whether the user wants to use the archive server."
-  (cond 
+  (cond
    ((or (not gnus-message-archive-method)
        (not gnus-message-archive-group))
     nil)
@@ -2248,6 +2313,15 @@ just the host name."
              group nil)))
     name))
 
+(defun gnus-narrow-to-body ()
+  "Narrow to the body of an article."
+  (narrow-to-region
+   (progn
+     (goto-char (point-min))
+     (or (search-forward "\n\n" nil t)
+        (point-max)))
+   (point-max)))
+
 \f
 ;;;
 ;;; Kill file handling.
@@ -2272,13 +2346,14 @@ Returns the number of articles marked as read."
 
 (defcustom gnus-kill-file-name "KILL"
   "Suffix of the kill files."
-  :group 'gnus-score
+  :group 'gnus-score-kill
+  :group 'gnus-score-files
   :type 'string)
 
 (defun gnus-newsgroup-kill-file (newsgroup)
   "Return the name of a kill file name for NEWSGROUP.
 If NEWSGROUP is nil, return the global kill file name instead."
-  (cond 
+  (cond
    ;; The global KILL file is placed at top of the directory.
    ((or (null newsgroup)
        (string-equal newsgroup ""))
@@ -2310,19 +2385,26 @@ If NEWSGROUP is nil, return the global kill file name instead."
   (memq option (assoc (format "%s" (car method))
                      gnus-valid-select-methods)))
 
+(defun gnus-similar-server-opened (method)
+  (let ((opened gnus-opened-servers))
+    (while (and method opened)
+      (when (and (equal (cadr method) (cadaar opened))
+                (not (equal method (caar opened))))
+       (setq method nil))
+      (pop opened))
+    (not method)))
+
 (defun gnus-server-extend-method (group method)
   ;; 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".
-  (let ((entry
-        (gnus-copy-sequence
-         (if (gnus-server-equal method gnus-select-method) gnus-select-method
-           (cdr (assoc (car method) gnus-server-alist))))))
-    (if (not entry)
-       method
-      (setcar (cdr entry) (concat (nth 1 entry) "+" group))
-      (nconc entry (cdr method)))))
+  (if (or (not (inline (gnus-similar-server-opened method)))
+         (not (cddr method)))
+      method
+    `(,(car method) ,(concat (cadr method) "+" group)
+      (,(intern (format "%s-address" (car method))) ,(cadr method))
+      ,@(cddr method))))
 
 (defun gnus-server-status (method)
   "Return the status of METHOD."
@@ -2351,9 +2433,9 @@ If NEWSGROUP is nil, return the global kill file name instead."
            gnus-select-method
          (setq method
                (cond ((stringp method)
-                      (gnus-server-to-method method))
-                     ((stringp (car method))
-                      (gnus-server-extend-method group method))
+                      (inline (gnus-server-to-method method)))
+                     ((stringp (cadr method))
+                      (inline (gnus-server-extend-method group method)))
                      (t
                       method)))
          (cond ((equal (cadr method) "")
@@ -2363,7 +2445,7 @@ If NEWSGROUP is nil, return the global kill file name instead."
                (t
                 (gnus-server-add-address method)))))))
 
-(defun gnus-check-backend-function (func group)
+(defsubst gnus-check-backend-function (func group)
   "Check whether GROUP supports function FUNC.
 GROUP can either be a string (a group name) or a select method."
   (ignore-errors
@@ -2384,7 +2466,7 @@ GROUP can either be a string (a group name) or a select method."
       (setq valids (cdr valids)))
     outs))
 
-(defun gnus-read-group (prompt)
+(defun gnus-read-group (prompt &optional default)
   "Prompt the user for a group name.
 Disallow illegal group names."
   (let ((prefix "")
@@ -2393,7 +2475,8 @@ Disallow illegal group names."
       (when (string-match
             "[: `'\"/]\\|^$"
             (setq group (read-string (concat prefix prompt)
-                                     "" 'gnus-group-history)))
+                                     (cons (or default "") 0)
+                                     'gnus-group-history)))
        (setq prefix (format "Illegal group name: \"%s\".  " group)
              group nil)))
     group))
@@ -2406,7 +2489,7 @@ Allow completion over sensible values."
          prompt (append gnus-valid-select-methods gnus-predefined-server-alist
                         gnus-server-alist)
          nil t nil 'gnus-method-history)))
-    (cond 
+    (cond
      ((equal method "")
       (setq method gnus-select-method))
      ((assoc method gnus-valid-select-methods)