*** empty log message ***
[gnus] / lisp / gnus.el
index d0a5973..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)The Group Buffer")
+  :group 'gnus)
+
+(defgroup gnus-group-foreign nil
+  "Foreign groups."
+  :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")
+  :group 'gnus-group)
+
+(defgroup gnus-group-select nil
+  "Selecting a Group."
+  :link '(custom-manual "(gnus)Selecting a Group")
+  :group 'gnus-group)
+
+(defgroup gnus-group-listing nil
+  "Showing slices of the group list."
+  :link '(custom-manual "(gnus)Listing Groups")
+  :group 'gnus-group)
+
+(defgroup gnus-group-visual nil
+  "Sorting the group buffer."
+  :link '(custom-manual "(gnus)Group Buffer Format")
+  :group 'gnus-group
+  :group 'gnus-visual)
+
+(defgroup gnus-group-various nil
+  "Various group options."
+  :link '(custom-manual "(gnus)Scanning New Messages")
+  :group 'gnus-group)
+
+;; These belong to gnus-sum.el.
+(defgroup gnus-summary nil
+  "Summary buffers."
+  :link '(custom-manual "(gnus)The Summary Buffer")
+  :group 'gnus)
+
+(defgroup gnus-summary-exit nil
+  "Leaving summary buffers."
+  :link '(custom-manual "(gnus)Exiting the Summary Buffer")
+  :group 'gnus-summary)
+
+(defgroup gnus-summary-marks nil
+  "Marks used in summary buffers."
+  :link '(custom-manual "(gnus)Marking Articles")
+  :group 'gnus-summary)
+
+(defgroup gnus-thread nil
+  "Ordering articles according to replies."
+  :link '(custom-manual "(gnus)Threading")
+  :group 'gnus-summary)
+
+(defgroup gnus-summary-format nil
+  "Formatting of the summary buffer."
+  :link '(custom-manual "(gnus)Summary Buffer Format")
+  :group 'gnus-summary)
+
+(defgroup gnus-summary-choose nil
+  "Choosing Articles."
+  :link '(custom-manual "(gnus)Choosing Articles")
+  :group 'gnus-summary)
+
+(defgroup gnus-summary-maneuvering nil
+  "Summary movement commands."
+  :link '(custom-manual "(gnus)Summary Maneuvering")
+  :group 'gnus-summary)
+
+(defgroup gnus-summary-mail nil
+  "Mail group commands."
+  :link '(custom-manual "(gnus)Mail Group Commands")
+  :group 'gnus-summary)
+
+(defgroup gnus-summary-sort nil
+  "Sorting the summary buffer."
+  :link '(custom-manual "(gnus)Sorting")
+  :group 'gnus-summary)
+
+(defgroup gnus-summary-visual nil
+  "Highlighting and menus in the summary buffer."
+  :link '(custom-manual "(gnus)Summary Highlighting")
+  :group 'gnus-visual
+  :group 'gnus-summary)
+
+(defgroup gnus-summary-various nil
+  "Various summary buffer options."
+  :link '(custom-manual "(gnus)Various Summary Stuff")
+  :group 'gnus-summary)
+
+;; Belongs to gnus-uu.el
+(defgroup gnus-extract-view nil
+  "Viewing extracted files."
+  :link '(custom-manual "(gnus)Viewing Files")
+  :group 'gnus-extract)
+
+;; Belongs to gnus-score.el
 (defgroup gnus-score nil
   "Score and kill file handling."
-  :group 'gnus )
+  :group 'gnus)
+
+(defgroup gnus-score-kill nil
+  "Kill files."
+  :group 'gnus-score)
+
+(defgroup gnus-score-adapt nil
+  "Adaptive score files."
+  :group 'gnus-score)
 
-(defconst gnus-version-number "0.84"
+(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
+  "Other Gnus options."
+  :link '(custom-manual "(gnus)Various Various")
+  :group 'gnus)
+
+(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 "Red Gnus v%s" gnus-version-number)
+(defconst gnus-version (format "Gnus v%s" gnus-version-number)
   "Version string for this version of Gnus.")
 
 (defcustom gnus-inhibit-startup-message nil
@@ -75,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)
@@ -126,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))
@@ -148,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))
@@ -170,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))
@@ -192,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))
@@ -214,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))
@@ -236,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))
@@ -258,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))
@@ -280,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))
@@ -304,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.")
@@ -320,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.")
 
@@ -331,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.")
 
@@ -342,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))
@@ -353,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.")
 
@@ -364,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.")
 
@@ -375,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))
@@ -403,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.")
 
@@ -416,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.")
 
@@ -427,7 +609,7 @@ be set in `.emacs' instead."
     (((class color)
       (background light))
      (:foreground "DarkGreen"))
-    (t 
+    (t
      ()))
   "Face used for normal interest read articles.")
 
@@ -439,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"))
@@ -513,7 +695,7 @@ be set in `.emacs' instead."
   ;; Fontify some.
   (put-text-property (point-min) (point-max) 'face 'gnus-splash-face)
   (goto-char (point-min))
-  (setq mode-line-buffer-identification gnus-version)
+  (setq mode-line-buffer-identification (concat " " gnus-version))
   (setq gnus-simple-splash t)
   (set-buffer-modified-p t))
 
@@ -529,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))
 
@@ -567,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
@@ -617,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))
@@ -634,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.
@@ -651,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
@@ -669,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))
 
@@ -689,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
@@ -702,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
 
@@ -730,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))
 
@@ -770,7 +941,7 @@ If the default site is too slow, try one of these:
    Asia:         nctuccca.edu.tw                /USENET/FAQ
                  hwarang.postech.ac.kr          /pub/usenet
                  ftp.hk.super.net               /mirror/faqs"
-  :group 'gnus-group
+  :group 'gnus-group-various
   :type '(choice directory
                 (repeat directory)))
 
@@ -779,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"
@@ -787,19 +958,20 @@ 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
   "*The number of articles which indicates a large newsgroup.
 If the number of articles in a newsgroup is greater than this value,
 confirmation is required for selecting the newsgroup."
-  :group 'gnus-group
+  :group 'gnus-group-select
   :type 'integer)
 
 (defcustom gnus-use-long-file-name (not (memq system-type '(usg-unix-v xenix)))
@@ -820,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)
 
@@ -840,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
@@ -871,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
@@ -899,11 +1073,11 @@ 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."
-  :group 'gnus-summary
+  :group 'gnus-summary-exit
   :type 'hook)
 
 (defcustom gnus-novice-user t
@@ -921,12 +1095,12 @@ And that means *anything*."
 
 (defcustom gnus-interactive-catchup t
   "*If non-nil, require your confirmation when catching up a group."
-  :group 'gnus-group
+  :group 'gnus-group-select
   :type 'boolean)
 
 (defcustom gnus-interactive-exit t
   "*If non-nil, require your confirmation when exiting Gnus."
-  :group 'gnus-group
+  :group 'gnus-exit
   :type 'boolean)
 
 (defcustom gnus-extract-address-components 'gnus-extract-address-components
@@ -935,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")))
@@ -947,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
@@ -974,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)
@@ -996,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)
@@ -1005,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)
@@ -1015,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))
 
@@ -1024,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-group
+  :group 'nnmail-expire
   :type '(choice (const nil)
                 regexp))
 
@@ -1034,18 +1209,18 @@ 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-group
+  :group 'nnmail-expire
   :type '(choice (const nil)
                 regexp))
 
 (defcustom gnus-group-uncollapsed-levels 1
   "Number of group name elements to leave alone when making a short group name."
-  :group 'gnus-group
+  :group 'gnus-group-visual
   :type 'integer)
 
 (defcustom gnus-group-use-permanent-levels nil
   "*If non-nil, once you set a level, Gnus will use this level."
-  :group 'gnus-group
+  :group 'gnus-group-levels
   :type 'boolean)
 
 ;; Hooks.
@@ -1072,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
@@ -1099,7 +1270,18 @@ It is called with three parameters -- GROUP, LEVEL and OLDLEVEL."
   "Enable visual features.
 If `visual' is disabled, there will be no menus and few faces.  Most of
 the visual customization options below will be ignored.  Gnus will use
-less space and be faster as a result."
+less space and be faster as a result.
+
+This variable can also be a list of visual elements to switch on.  For
+instance, to switch off all visual things except menus, you can say:
+
+   (setq gnus-visual '(menu))
+
+Valid elements include `summary-highlight', `group-highlight',
+`article-highlight', `mouse-face', `summary-menu', `group-menu',
+`article-menu', `tree-highlight', `menu', `highlight', `browse-menu',
+`server-menu', `page-marker', `tree-menu', `binary-menu', `pick-menu',
+and `grouplens-menu'."
   :group 'gnus-meta
   :group 'gnus-visual
   :type '(set (const summary-highlight)
@@ -1185,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
@@ -1406,7 +1592,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
       gnus-score-find-trace gnus-score-file-name)
      ("gnus-cus" :interactive t gnus-group-customize gnus-score-customize)
      ("gnus-topic" :interactive t gnus-topic-mode)
-     ("gnus-topic" gnus-topic-remove-group)
+     ("gnus-topic" gnus-topic-remove-group gnus-topic-set-parameters)
      ("gnus-salt" :interactive t gnus-pick-mode gnus-binary-mode)
      ("gnus-uu" (gnus-uu-extract-map keymap) (gnus-uu-mark-map keymap))
      ("gnus-uu" :interactive t
@@ -1420,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
@@ -1434,10 +1620,10 @@ 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-win" gnus-configure-windows gnus-add-configuration)
      ("gnus-sum" gnus-summary-insert-line gnus-summary-read-group
       gnus-list-of-unread-articles gnus-list-of-read-articles
       gnus-offer-save-summaries gnus-make-thread-indent-array
@@ -1453,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
@@ -1463,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)
@@ -1545,7 +1732,7 @@ possible.
 
 This restriction may disappear in later versions of Gnus."
   :type 'string
-  :group 'gnus-summary)
+  :group 'gnus-summary-format)
 
 ;;;
 ;;; Skeleton keymaps
@@ -1553,16 +1740,22 @@ 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))))
 
-(defvar gnus-article-mode-map (make-keymap))
-(gnus-suppress-keymap gnus-article-mode-map)
-(defvar gnus-summary-mode-map (make-keymap))
-(gnus-suppress-keymap gnus-summary-mode-map)
-(defvar gnus-group-mode-map (make-keymap))
-(gnus-suppress-keymap gnus-group-mode-map)
+(defvar gnus-article-mode-map
+  (let ((keymap (make-keymap)))
+    (gnus-suppress-keymap keymap)
+    keymap))
+(defvar gnus-summary-mode-map
+  (let ((keymap (make-keymap)))
+    (gnus-suppress-keymap keymap)
+    keymap))
+(defvar gnus-group-mode-map
+  (let ((keymap (make-keymap)))
+    (gnus-suppress-keymap keymap)
+    keymap))
 
 \f
 
@@ -1756,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"))
@@ -1870,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))))
@@ -1893,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?
@@ -1944,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)
@@ -2120,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.
@@ -2144,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 ""))
@@ -2182,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."
@@ -2223,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) "")
@@ -2235,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
@@ -2256,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 "")
@@ -2265,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))
@@ -2278,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)