*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 23:38:03 +0000 (23:38 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 23:38:03 +0000 (23:38 +0000)
20 files changed:
lisp/ChangeLog
lisp/custom-edit.el
lisp/custom.el
lisp/gnus-art.el
lisp/gnus-async.el
lisp/gnus-cache.el
lisp/gnus-cite.el
lisp/gnus-demon.el
lisp/gnus-dup.el
lisp/gnus-eform.el
lisp/gnus-group.el
lisp/gnus-int.el
lisp/gnus-kill.el
lisp/gnus-load.el
lisp/gnus-start.el
lisp/gnus-sum.el
lisp/gnus.el
lisp/widget-edit.el
lisp/widget.el
texi/gnus.texi

index bbedff7..9f0c082 100644 (file)
@@ -1,3 +1,33 @@
+Mon Oct  7 02:24:02 1996  Per Abrahamsen  <abraham@dina.kvl.dk>
+
+       * gnus-sum.el: Added customize support.
+
+Sat Oct  5 01:29:20 1996  Per Abrahamsen  <abraham@dina.kvl.dk>
+
+       * gnus-async.el: Added customize support.
+       * gnus-cache.el: Ditto.
+       * gnus-cite.el: Ditto.
+       * gnus-demon.el: Ditto.
+       * gnus-dup.el: Ditto.
+       * gnus-eform.el: Ditto.
+       * gnus-group.el: Ditto.
+       * gnus-int.el: Ditto.
+       * gnus-kill.el: Ditto.
+       * gnus-load.el (gnus-make-face, gnus-face-light-name-list,
+       gnus-face-dark-name-list): Removed.
+
+Fri Oct  4 07:17:09 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus-start.el (gnus-setup-news): Slaves should read the slave
+       files. 
+
+       * gnus-art.el (gnus-request-article-this-buffer): Removed
+       reference to doing-request.
+
+Thu Oct  3 05:06:53 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * gnus.el: Red Gnus v0.47 is released.
+
 Thu Oct  3 02:04:37 1996  Lars Magne Ingebrigtsen  <larsi@ylfing.ifi.uio.no>
 
        * gnus-int.el (gnus-request-head): Use the cache.
index f76b135..b682b5c 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, faces
-;; Version: 0.991
+;; Version: 0.992
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
index 45b4028..a3ace55 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, faces
-;; Version: 0.991
+;; Version: 0.992
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
index f075cb6..64255a7 100644 (file)
@@ -1196,8 +1196,7 @@ If given a prefix, show the hidden text instead."
 
          ;; We only request an article by message-id when we do not have the
          ;; headers for it, so we'll have to get those.
-         (when (and (not gnus-doing-request-article)
-                    (stringp article))
+         (when (stringp article)
            (let ((gnus-override-method gnus-refer-article-method))
              (gnus-read-header article)))
 
index 0121066..d6d9384 100644 (file)
 (require 'gnus-sum)
 (require 'nntp)
 
-(defvar gnus-asynchronous t
+(defgroup gnus-asynchronous nil
+  "Support for asynchronous operations."
+  :group 'gnus)
+
+(defcustom gnus-asynchronous t
   "*If nil, inhibit all Gnus asynchronicity.
-If non-nil, let the other asynch variables be heeded.")
+If non-nil, let the other asynch variables be heeded."
+  :group 'gnus-asynchronous
+  :type 'boolean)
 
-(defvar gnus-use-article-prefetch 30
+(defcustom gnus-use-article-prefetch 30
   "*If non-nil, prefetch articles in groups that allow this.
 If a number, prefetch only that many articles forward;
-if t, prefetch as many articles as possible.")
+if t, prefetch as many articles as possible."
+  :group 'gnus-asynchronous
+  :type '(choice (const :tag "off" nil)
+                (const :tag "all" t)
+                (integer :tag "some" 0)))
 
-(defvar gnus-prefetched-article-deletion-strategy '(read exit)
+(defcustom gnus-prefetched-article-deletion-strategy '(read exit)
   "List of symbols that say when to remove articles from the prefetch buffer.
 Possible values in this list are `read', which means that 
 articles are removed as they are read, and `exit', which means
 that all articles belonging to a group are removed on exit
-from that group.")
+from that group."
+  :group 'gnus-asynchronous
+  :type '(set (const read) (const exit)))
 
-(defvar gnus-use-header-prefetch nil
-  "*If non-nil, prefetch the headers to the next group.")
+(defcustom gnus-use-header-prefetch nil
+  "*If non-nil, prefetch the headers to the next group."
+  :group 'gnus-asynchronous
+  :type 'boolean)
 
-(defvar gnus-async-prefetch-article-p 'gnus-async-unread-p
-  "*Function called to say whether an article should be prefetched or not.
+(defcustom gnus-async-prefetch-article-p 'gnus-async-unread-p
+  "Function called to say whether an article should be prefetched or not.
 The function is called with one parameter -- the article data.
-It should return non-nil if the article is to be prefetched.")
+It should return non-nil if the article is to be prefetched."
+  :group 'gnus-asynchronous
+  :type 'function)
 
 ;;; Internal variables.
 
index 0480569..7e2d86a 100644 (file)
 (require 'gnus-start)
 (require 'gnus)
 
-(defvar gnus-cache-directory
+(defgroup gnus-cache nil
+  "Cache interface."
+  :group 'gnus)
+
+(defcustom gnus-cache-directory
   (nnheader-concat gnus-directory "cache/")
-  "*The directory where cached articles will be stored.")
+  "*The directory where cached articles will be stored."
+  :group 'gnus-cache
+  :type 'directory)
 
-(defvar gnus-cache-active-file 
+(defcustom gnus-cache-active-file 
   (concat (file-name-as-directory gnus-cache-directory) "active")
-  "*The cache active file.")
+  "*The cache active file."
+  :group 'gnus-cache
+  :type 'file)
 
-(defvar gnus-cache-enter-articles '(ticked dormant)
-  "*Classes of articles to enter into the cache.")
+(defcustom gnus-cache-enter-articles '(ticked dormant)
+  "Classes of articles to enter into the cache."
+  :group 'gnus-cache
+  :type '(set (const ticked) (const dormant) (const unread) (const read)))
 
-(defvar gnus-cache-remove-articles '(read)
-  "*Classes of articles to remove from the cache.")
+(defcustom gnus-cache-remove-articles '(read)
+  "Classes of articles to remove from the cache."
+  :group 'gnus-cache
+  :type '(set (const ticked) (const dormant) (const unread) (const read)))
 
-(defvar gnus-uncacheable-groups nil
+(defcustom gnus-uncacheable-groups nil
   "*Groups that match this regexp will not be cached.
 
 If you want to avoid caching your nnml groups, you could set this
-variable to \"^nnml\".")
+variable to \"^nnml\"."
+  :group 'gnus-cache
+  :type '(choice (const :tag "off" nil)
+                regexp))
 
 \f
 
index 6da934e..78f9103 100644 (file)
 
 ;;; Customization:
 
-(defvar gnus-cited-text-button-line-format "%(%{[...]%}%)\n"
-  "Format of cited text buttons.")
+(defgroup gnus-cite nil
+  "Citation."
+  :group 'article)
+  
+
+(defcustom gnus-cited-text-button-line-format "%(%{[...]%}%)\n"
+  "Format of cited text buttons."
+  :group 'gnus-cite
+  :type 'string)
 
-(defvar gnus-cited-lines-visible nil
-  "The number of lines of hidden cited text to remain visible.")
+(defcustom gnus-cited-lines-visible nil
+  "The number of lines of hidden cited text to remain visible."
+  :group 'gnus-cite
+  :type '(choice (const :tag "none" nil)
+                integer))
 
-(defvar gnus-cite-parse-max-size 25000
+(defcustom gnus-cite-parse-max-size 25000
   "Maximum article size (in bytes) where parsing citations is allowed.
-Set it to nil to parse all articles.")
+Set it to nil to parse all articles."
+  :group 'gnus-cite
+  :type '(choice (const :tag "all" nil)
+                integer))
 
-(defvar gnus-cite-prefix-regexp 
+(defcustom gnus-cite-prefix-regexp 
     "^[]>|:}+ ]*[]>|:}+]\\(.*>\\)?\\|^.*>"
-  "Regexp matching the longest possible citation prefix on a line.")
+  "Regexp matching the longest possible citation prefix on a line."
+  :group 'gnus-cite
+  :type 'regexp)
 
-(defvar gnus-cite-max-prefix 20
-  "Maximum possible length for a citation prefix.")
+(defcustom gnus-cite-max-prefix 20
+  "Maximum possible length for a citation prefix."
+  :group 'gnus-cite
+  :type 'integer)
 
-(defvar gnus-supercite-regexp 
+(defcustom gnus-supercite-regexp 
   (concat "^\\(" gnus-cite-prefix-regexp "\\)? *"
          ">>>>> +\"\\([^\"\n]+\\)\" +==")
   "Regexp matching normal Supercite attribution lines.
-The first grouping must match prefixes added by other packages.")
+The first grouping must match prefixes added by other packages."
+  :group 'gnus-cite
+  :type 'regexp)
 
-(defvar gnus-supercite-secondary-regexp "^.*\"\\([^\"\n]+\\)\" +=="
+(defcustom gnus-supercite-secondary-regexp "^.*\"\\([^\"\n]+\\)\" +=="
   "Regexp matching mangled Supercite attribution lines.
-The first regexp group should match the Supercite attribution.")
+The first regexp group should match the Supercite attribution."
+  :group 'gnus-cite
+  :type 'regexp)
 
-(defvar gnus-cite-minimum-match-count 2
-  "Minimum number of identical prefixes before we believe it's a citation.")
+(defcustom gnus-cite-minimum-match-count 2
+  "Minimum number of identical prefixes before we believe it's a citation."
+  :group 'gnus-cite
+  :type 'integer)
 
-(defvar gnus-cite-attribution-prefix "in article\\|in <"
-  "Regexp matching the beginning of an attribution line.")
+(defcustom gnus-cite-attribution-prefix "in article\\|in <"
+  "Regexp matching the beginning of an attribution line."
+  :group 'gnus-cite
+  :type 'regexp)
 
-(defvar gnus-cite-attribution-suffix
+(defcustom gnus-cite-attribution-suffix
   "\\(wrote\\|writes\\|said\\|says\\):[ \t]*$"
   "Regexp matching the end of an attribution line.
-The text matching the first grouping will be used as a button.")
+The text matching the first grouping will be used as a button."
+  :group 'gnus-cite
+  :type 'regexp)
+
+(defface gnus-cite-attribution-face '((t 
+                                      (:underline t)))
+  "Face used for attribution lines.")
 
-(defvar gnus-cite-attribution-face 'underline
+(defcustom gnus-cite-attribution-face 'gnus-cite-attribution-face
   "Face used for attribution lines.
-It is merged with the face for the cited text belonging to the attribution.")
-
-(defvar gnus-cite-face-list 
-  (cond ((not (eq gnus-display-type 'color))
-        '(italic))
-       ((eq gnus-background-mode 'dark)
-        (mapcar 'gnus-make-face 
-                gnus-face-light-name-list))
-       (t 
-        (mapcar 'gnus-make-face 
-                gnus-face-dark-name-list)))
+It is merged with the face for the cited text belonging to the attribution."
+  :group 'gnus-cite
+  :type 'face)
+
+(defface gnus-cite-face-1 '((((class color)
+                             (background dark))
+                            (:foreground "light blue"))
+                           (((class color)
+                             (background light))
+                            (:foreground "MidnightBlue"))
+                           (t 
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-2 '((((class color)
+                             (background dark))
+                            (:foreground "light cyan"))
+                           (((class color)
+                             (background light))
+                            (:foreground "firebrick"))
+                           (t 
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-3 '((((class color)
+                             (background dark))
+                            (:foreground "light yellow"))
+                           (((class color)
+                             (background light))
+                            (:foreground "dark green"))
+                           (t 
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-4 '((((class color)
+                             (background dark))
+                            (:foreground "light pink"))
+                           (((class color)
+                             (background light))
+                            (:foreground "OrangeRed"))
+                           (t 
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-5 '((((class color)
+                             (background dark))
+                            (:foreground "pale green"))
+                           (((class color)
+                             (background light))
+                            (:foreground "dark khaki"))
+                           (t 
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-6 '((((class color)
+                             (background dark))
+                            (:foreground "beige"))
+                           (((class color)
+                             (background light))
+                            (:foreground "dark violet"))
+                           (t 
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-7 '((((class color)
+                             (background dark))
+                            (:foreground "orange"))
+                           (((class color)
+                             (background light))
+                            (:foreground "SteelBlue4"))
+                           (t 
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-8 '((((class color)
+                             (background dark))
+                            (:foreground "magenta"))
+                           (((class color)
+                             (background light))
+                            (:foreground "magenta"))
+                           (t 
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-9 '((((class color)
+                             (background dark))
+                            (:foreground "violet"))
+                           (((class color)
+                             (background light))
+                            (:foreground "violet"))
+                           (t 
+                            (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-10 '((((class color)
+                              (background dark))
+                             (:foreground "medium purple"))
+                            (((class color)
+                              (background light))
+                             (:foreground "medium purple"))
+                            (t 
+                             (:italic t)))
+  "Citation face.")
+
+(defface gnus-cite-face-11 '((((class color)
+                              (background dark))
+                             (:foreground "turquoise"))
+                            (((class color)
+                              (background light))
+                             (:foreground "turquoise"))
+                            (t 
+                             (:italic t)))
+  "Citation face.")
+
+(defcustom gnus-cite-face-list 
+  '(gnus-cite-face-1 gnus-cite-face-2 gnus-cite-face-3 gnus-cite-face-4 
+    gnus-cite-face-5 gnus-cite-face-6 gnus-cite-face-7 gnus-cite-face-8 
+    gnus-cite-face-9 gnus-cite-face-10 gnus-cite-face-11)
   "List of faces used for highlighting citations. 
 
 When there are citations from multiple articles in the same message,
 Gnus will try to give each citation from each article its own face.
-This should make it easier to see who wrote what.")
+This should make it easier to see who wrote what."
+  :group 'gnus-cite
+  :type '(repeat face))
 
-(defvar gnus-cite-hide-percentage 50
-  "Only hide excess citation if above this percentage of the body.")
+(defcustom gnus-cite-hide-percentage 50
+  "Only hide excess citation if above this percentage of the body."
+  :group 'gnus-cite
+  :type 'number)
 
-(defvar gnus-cite-hide-absolute 10
-  "Only hide excess citation if above this number of lines in the body.")
+(defcustom gnus-cite-hide-absolute 10
+  "Only hide excess citation if above this number of lines in the body."
+  :group 'gnus-cite
+  :type 'integer)
 
 ;;; Internal Variables:
 
@@ -141,13 +285,6 @@ lines matches `gnus-cite-prefix-regexp' with the same prefix.
 Lines matching `gnus-cite-attribution-suffix' and perhaps
 `gnus-cite-attribution-prefix' are considered attribution lines."
   (interactive (list 'force))
-  ;; Create dark or light faces if necessary.
-  (cond ((eq gnus-cite-face-list 'light)
-        (setq gnus-cite-face-list
-              (mapcar 'gnus-make-face gnus-face-light-name-list)))
-       ((eq gnus-cite-face-list 'dark)
-        (setq gnus-cite-face-list
-              (mapcar 'gnus-make-face gnus-face-dark-name-list))))
   (save-excursion
     (set-buffer gnus-article-buffer)
     (gnus-cite-parse-maybe force)
index 7c57075..0a25cc3 100644 (file)
       (require 'itimer)
     (require 'timer)))
 
-(defvar gnus-demon-handlers nil
+(defgroup gnus-demon nil
+  "Demonic behaviour."
+  :group 'gnus)
+
+(defcustom gnus-demon-handlers nil
   "Alist of daemonic handlers to be run at intervals.
 Each handler is a list on the form
 
@@ -47,10 +51,22 @@ If IDLE is t, only call if Emacs has been idle for a while.  If IDLE
 is a number, only call when Emacs has been idle more than this number
 of `gnus-demon-timestep's.  If IDLE is nil, don't care about
 idleness.  If IDLE is a number and TIME is nil, then call once each
-time Emacs has been idle for IDLE `gnus-demon-timestep's.")
-
-(defvar gnus-demon-timestep 60
-  "*Number of seconds in each demon timestep.")
+time Emacs has been idle for IDLE `gnus-demon-timestep's."
+  :group 'gnus-demon
+  :type '(repeat (list function 
+                      (choice :tag "Time" 
+                              (const :tag "never" nil)
+                              (const :tag "one" t)
+                              (integer :tag "steps" 1))
+                      (choice :tag "Idle"
+                              (const :tag "don't care" nil)
+                              (const :tag "for a while" t)
+                              (integer :tag "steps" 1)))))
+
+(defcustom gnus-demon-timestep 60
+  "*Number of seconds in each demon timestep."
+  :group 'gnus-demon
+  :type 'integer)
 
 ;;; Internal variables.
 
index 5a2802d..eb1a1ef 100644 (file)
 (require 'gnus-art)
 (require 'gnus)
 
-(defvar gnus-save-duplicate-list nil
+(defgroup gnus-duplicate nil
+  "Suppression of duplicate articles."
+  :group 'gnus)
+
+(defcustom gnus-save-duplicate-list nil
   "*If non-nil, save the duplicate list when shutting down Gnus.
 If nil, duplicate suppression will only work on duplicates
-seen in the same session.")
-
-(defvar gnus-duplicate-list-length 10000
-  "*The number of Message-IDs to keep in the duplicate suppression list.")
-
-(defvar gnus-duplicate-file (nnheader-concat gnus-directory "suppression")
-  "*The name of the file to store the duplicate suppression list.")
+seen in the same session."
+  :group 'gnus-duplicate
+  :type 'boolean)
+
+(defcustom gnus-duplicate-list-length 10000
+  "*The number of Message-IDs to keep in the duplicate suppression list."
+  :group 'gnus-duplicate
+  :type 'integer)
+
+(defcustom gnus-duplicate-file (nnheader-concat gnus-directory "suppression")
+  "*The name of the file to store the duplicate suppression list."
+  :group 'gnus-duplicate
+  :type 'file)
 
 ;;; Internal variables
 
index 02f0008..7a9e6b4 100644 (file)
 ;;; Editing forms
 ;;;
 
-(defvar gnus-edit-form-mode-hook nil
-  "Hook run in `gnus-edit-form-mode' buffers.")
-
-(defvar gnus-edit-form-menu-hook nil
-  "Hook run when creating menus in `gnus-edit-form-mode' buffers.")
+(defgroup gnus-edit-form nil
+  "A mode for editing forms."
+  :group 'gnus)
+
+(defcustom gnus-edit-form-mode-hook nil
+  "Hook run in `gnus-edit-form-mode' buffers."
+  :group 'gnus-edit-form
+  :type 'hook)
+
+(defcustom gnus-edit-form-menu-hook nil
+  "Hook run when creating menus in `gnus-edit-form-mode' buffers."
+  :group 'gnus-edit-form
+  :type 'hook)
 
 ;;; Internal variables
 
index d033b76..bbcbd03 100644 (file)
 (require 'gnus-win)
 (require 'gnus-undo)
 
-(defvar gnus-group-archive-directory
+(defgroup gnus-group nil
+  "Group buffers."
+  :group 'gnus)
+
+(defcustom gnus-group-archive-directory
   "/ftp@ftp.hpc.uh.edu:/pub/emacs/ding-list/"
-  "*The address of the (ding) archives.")
+  "*The address of the (ding) archives."
+  :group 'gnus-group
+  :type 'directory)
 
-(defvar gnus-group-recent-archive-directory
+(defcustom gnus-group-recent-archive-directory
   "/ftp@ftp.hpc.uh.edu:/pub/emacs/ding-list-recent/"
-  "*The address of the most recent (ding) articles.")
+  "*The address of the most recent (ding) articles."
+  :group 'gnus-group
+  :type 'directory)
 
 ;; Suggested by Andrew Eskilsson <pi92ae@lelle.pt.hk-r.se>.
-(defvar gnus-no-groups-message "No news is horrible news"
-  "*Message displayed by Gnus when no groups are available.")
+(defcustom gnus-no-groups-message "No news is horrible news"
+  "*Message displayed by Gnus when no groups are available."
+  :group 'gnus-group
+  :type 'string)
 
-(defvar gnus-keep-same-level nil
+(defcustom gnus-keep-same-level nil
   "*Non-nil means that the next newsgroup after the current will be on the same level.
 When you type, for instance, `n' after reading the last article in the
 current newsgroup, you will go to the next newsgroup.  If this variable
@@ -57,31 +67,47 @@ next newsgroup with the same level, or, if no such newsgroup is
 available, the next newsgroup with the lowest possible level higher
 than the current level.
 If this variable is `best', Gnus will make the next newsgroup the one
-with the best level.")
-
-(defvar gnus-group-goto-unread t
-  "*If non-nil, movement commands will go to the next unread and subscribed group.")
-
-(defvar gnus-goto-next-group-when-activating t
-  "*If non-nil, the \\<gnus-group-mode-map>\\[gnus-group-get-new-news-this-group] command will advance point to the next group.")
-
-(defvar gnus-permanently-visible-groups nil
+with the best level."
+  :group 'gnus-group
+  :type '(choice (const nil)
+                (const best)
+                (sexp :tag "other" t)))
+
+(defcustom gnus-group-goto-unread t
+  "*If non-nil, movement commands will go to the next unread and subscribed group."
+  :group 'gnus-group
+  :type 'boolean)
+
+(defcustom gnus-goto-next-group-when-activating t
+  "*If non-nil, the \\<gnus-group-mode-map>\\[gnus-group-get-new-news-this-group] command will advance point to the next group."
+  :group 'gnus-group
+  :type 'boolean)
+
+(defcustom gnus-permanently-visible-groups nil
   "*Regexp to match groups that should always be listed in the group buffer.
 This means that they will still be listed when there are no unread
-articles in the groups.")
+articles in the groups."
+  :group 'gnus-group
+  :type 'regexp)
 
-(defvar gnus-list-groups-with-ticked-articles t
+(defcustom gnus-list-groups-with-ticked-articles t
   "*If non-nil, list groups that have only ticked articles.
-If nil, only list groups that have unread articles.")
+If nil, only list groups that have unread articles."
+  :group 'gnus-group
+  :type 'boolean)
 
-(defvar gnus-group-default-list-level gnus-level-subscribed
+(defcustom gnus-group-default-list-level gnus-level-subscribed
   "*Default listing level.
-Ignored if `gnus-group-use-permanent-levels' is non-nil.")
+Ignored if `gnus-group-use-permanent-levels' is non-nil."
+  :group 'gnus-group
+  :type 'integer)
 
-(defvar gnus-group-list-inactive-groups t
-  "*If non-nil, inactive groups will be listed.")
+(defcustom gnus-group-list-inactive-groups t
+  "*If non-nil, inactive groups will be listed."
+  :group 'gnus-group
+  :type 'boolean)
 
-(defvar gnus-group-sort-function 'gnus-group-sort-by-alphabet
+(defcustom gnus-group-sort-function 'gnus-group-sort-by-alphabet
   "*Function used for sorting the group buffer.
 This function will be called with group info entries as the arguments
 for the groups to be sorted.  Pre-made functions include
@@ -92,9 +118,18 @@ for the groups to be sorted.  Pre-made functions include
 
 This variable can also be a list of sorting functions. In that case,
 the most significant sort function should be the last function in the
-list.")
-
-(defvar gnus-group-line-format "%M\%S\%p\%P\%5y: %(%g%)%l\n"
+list."
+  :group 'gnus-group
+  :type '(radio (function-item gnus-group-sort-by-alphabet)
+               (function-item gnus-group-sort-by-real-name)
+               (function-item gnus-group-sort-by-unread)
+               (function-item gnus-group-sort-by-level)
+               (function-item gnus-group-sort-by-score)
+               (function-item gnus-group-sort-by-method)
+               (function-item gnus-group-sort-by-rank)
+               (function :tag "other" nil)))
+
+(defcustom gnus-group-line-format "%M\%S\%p\%P\%5y: %(%g%)%l\n"
   "*Format of group lines.
 It works along the same lines as a normal formatting string,
 with some simple extensions.
@@ -142,30 +177,42 @@ If you use %o or %O, reading the active file will be slower and quite
 a bit of extra memory will be used.  %D will also worsen performance.
 Also note that if you change the format specification to include any
 of these specs, you must probably re-start Gnus to see them go into
-effect.")
+effect."
+  :group 'gnus-group
+  :type 'string)
 
-(defvar gnus-group-mode-line-format "Gnus: %%b {%M\%:%S}"
+(defcustom gnus-group-mode-line-format "Gnus: %%b {%M\%:%S}"
   "*The format specification for the group mode line.
 It works along the same lines as a normal formatting string,
 with some simple extensions:
 
 %S   The native news server.
 %M   The native select method.
-%:   \":\" if %S isn't \"\".")
-
-(defvar gnus-group-mode-hook nil
-  "*A hook for Gnus group mode.")
-
-(defvar gnus-group-menu-hook nil
-  "*Hook run after the creation of the group mode menu.")
-
-(defvar gnus-group-catchup-group-hook nil
-  "*A hook run when catching up a group from the group buffer.")
-
-(defvar gnus-group-update-group-hook nil
-  "*A hook called when updating group lines.")
-
-(defvar gnus-group-prepare-function 'gnus-group-prepare-flat
+%:   \":\" if %S isn't \"\"."
+  :group 'gnus-group
+  :type 'string)
+
+(defcustom gnus-group-mode-hook nil
+  "Hook for Gnus group mode."
+  :group 'gnus-group
+  :type 'hook)
+
+(defcustom gnus-group-menu-hook nil
+  "Hook run after the creation of the group mode menu."
+  :group 'gnus-group
+  :type 'hook)
+
+(defcustom gnus-group-catchup-group-hook nil
+  "Hook run when catching up a group from the group buffer."
+  :group 'gnus-group
+  :type 'hook)
+
+(defcustom gnus-group-update-group-hook nil
+  "Hook called when updating group lines."
+  :group 'gnus-group
+  :type 'hook)
+
+(defcustom gnus-group-prepare-function 'gnus-group-prepare-flat
   "*A function that is called to generate the group buffer.
 The function is called with three arguments: The first is a number;
 all group with a level less or equal to that number should be listed,
@@ -173,30 +220,42 @@ if the second is non-nil, empty groups should also be displayed.  If
 the third is non-nil, it is a number.  No groups with a level lower
 than this number should be displayed.
 
-The only current function implemented is `gnus-group-prepare-flat'.")
-
-(defvar gnus-group-prepare-hook nil
-  "*A hook called after the group buffer has been generated.
-If you want to modify the group buffer, you can use this hook.")
-
-(defvar gnus-suspend-gnus-hook nil
-  "*A hook called when suspending (not exiting) Gnus.")
-
-(defvar gnus-exit-gnus-hook nil
-  "*A hook called when exiting Gnus.")
-
-(defvar gnus-after-exiting-gnus-hook nil
-  "*A hook called after exiting Gnus.")
-
-(defvar gnus-group-update-hook '(gnus-group-highlight-line)
-  "*A hook called when a group line is changed.
+The only current function implemented is `gnus-group-prepare-flat'."
+  :group 'gnus-group
+  :type 'function)
+
+(defcustom gnus-group-prepare-hook nil
+  "Hook called after the group buffer has been generated.
+If you want to modify the group buffer, you can use this hook."
+  :group 'gnus-group
+  :type 'hook)
+
+(defcustom gnus-suspend-gnus-hook nil
+  "Hook called when suspending (not exiting) Gnus."
+  :group 'gnus-group
+  :type 'hook)
+
+(defcustom gnus-exit-gnus-hook nil
+  "Hook called when exiting Gnus."
+  :group 'gnus-group
+  :type 'hook)
+
+(defcustom gnus-after-exiting-gnus-hook nil
+  "Hook called after exiting Gnus."
+  :group 'gnus-group
+  :type 'hook)
+
+(defcustom gnus-group-update-hook '(gnus-group-highlight-line)
+  "Hook called when a group line is changed.
 The hook will not be called if `gnus-visual' is nil.
 
 The default function `gnus-group-highlight-line' will
 highlight the line according to the `gnus-group-highlight'
-variable.")
+variable."
+  :group 'gnus-group
+  :type 'hook)
 
-(defvar gnus-useful-groups
+(defcustom gnus-useful-groups
   `(("(ding) mailing list mirrored at sunsite.auc.dk"
      "emacs.ding"
      (nntp "sunsite.auc.dk"
@@ -211,49 +270,223 @@ variable.")
                       (unless file
                         (error "Couldn't find doc group"))
                       file))))))
-  "Alist of useful group-server pairs.")
-
-(defvar gnus-group-highlight
-  (cond 
-   ((not (eq gnus-display-type 'color))
-    '((mailp . bold)
-      ((= unread 0) . italic)))
-   ((eq gnus-background-mode 'dark)
-    `(((and (not mailp) (eq level 1)) .
-       ,(custom-face-lookup "PaleTurquoise" nil nil t))
-      ((and (not mailp) (eq level 2)) .
-       ,(custom-face-lookup "turquoise" nil nil t))
-      ((and (not mailp) (eq level 3)) .
-       ,(custom-face-lookup "MediumTurquoise" nil nil t))
-      ((and (not mailp) (>= level 4)) .
-       ,(custom-face-lookup "DarkTurquoise" nil nil t))
-      ((and mailp (eq level 1)) .
-       ,(custom-face-lookup "aquamarine1" nil nil t))
-      ((and mailp (eq level 2)) .
-       ,(custom-face-lookup "aquamarine2" nil nil t))
-      ((and mailp (eq level 3)) .
-       ,(custom-face-lookup "aquamarine3" nil nil t))
-      ((and mailp (>= level 4)) .
-       ,(custom-face-lookup "aquamarine4" nil nil t))
-      ))
-   (t
-    `(((and (not mailp) (<= level 3)) .
-       ,(custom-face-lookup "ForestGreen" nil nil t))
-      ((and (not mailp) (eq level 4)) .
-       ,(custom-face-lookup "DarkGreen" nil nil t))
-      ((and (not mailp) (eq level 5)) .
-       ,(custom-face-lookup "CadetBlue4" nil nil t))
-      ((and mailp (eq level 1)) .
-       ,(custom-face-lookup "DeepPink3" nil nil t))
-      ((and mailp (eq level 2)) .
-       ,(custom-face-lookup "HotPink3" nil nil t))
-      ((and mailp (eq level 3)) .
-       ,(custom-face-lookup "dark magenta" nil nil t))
-      ((and mailp (eq level 4)) .
-       ,(custom-face-lookup "DeepPink4" nil nil t))
-      ((and mailp (> level 4)) .
-       ,(custom-face-lookup "DarkOrchid4" nil nil t))
-      )))
+  "Alist of useful group-server pairs."
+  :group 'gnus-group
+  :type '(repeat (list (string :tag "Description")
+                      (string :tag "Name")
+                      (sexp :tag "Method"))))
+
+(defface gnus-group-news-1-face 
+  '((((class color)
+      (background dark))
+     (:foreground "PaleTurquoise"))
+    (((class color)
+      (background light))
+     (:foreground "ForestGreen"))
+    (t
+     ()))
+  "Level 1 newsgroup face.")
+
+(defface gnus-group-news-1-empty-face
+  '((((class color)
+      (background dark))
+     (:foreground "PaleTurquoise" :italic t))
+    (((class color)
+      (background light))
+     (:foreground "ForestGreen" :italic t))
+    (t
+     (:italic t)))
+  "Level 1 empty newsgroup face.")
+
+(defface gnus-group-news-2-face 
+  '((((class color)
+      (background dark))
+     (:foreground "turquoise"))
+    (((class color)
+      (background light))
+     (:foreground "CadetBlue4"))
+    (t
+     ()))
+  "Level 2 newsgroup face.")
+
+(defface gnus-group-news-2-empty-face
+  '((((class color)
+      (background dark))
+     (:foreground "turquoise" :italic t))
+    (((class color)
+      (background light))
+     (:foreground "CadetBlue4" :italic t))
+    (t
+     (:italic t)))
+  "Level 2 empty newsgroup face.")
+
+(defface gnus-group-news-3-face 
+  '((((class color)
+      (background dark))
+     ())
+    (((class color)
+      (background light))
+     ())
+    (t
+     ()))
+  "Level 3 newsgroup face.")
+
+(defface gnus-group-news-3-empty-face
+  '((((class color)
+      (background dark))
+     ( :italic t))
+    (((class color)
+      (background light))
+     ( :italic t))
+    (t
+     (:italic t)))
+  "Level 3 empty newsgroup face.")
+
+(defface gnus-group-news-low-face 
+  '((((class color)
+      (background dark))
+     (:foreground "DarkTurquoise"))
+    (((class color)
+      (background light))
+     (:foreground "DarkGreen"))
+    (t
+     ()))
+  "Low level newsgroup face.")
+
+(defface gnus-group-news-low-empty-face
+  '((((class color)
+      (background dark))
+     (:foreground "DarkTurquoise" :italic t))
+    (((class color)
+      (background light))
+     (:foreground "DarkGreen" :italic t))
+    (t
+     (:italic t)))
+  "Low level empty newsgroup face.")
+
+(defface gnus-group-mail-1-face 
+  '((((class color)
+      (background dark))
+     (:foreground "aquamarine1" :bold t))
+    (((class color)
+      (background light))
+     (:foreground "DeepPink3" :bold t))
+    (t
+     (:bold t)))
+  "Level 1 mailgroup face.")
+
+(defface gnus-group-mail-1-empty-face
+  '((((class color)
+      (background dark))
+     (:foreground "aquamarine1" :bold t :italic t))
+    (((class color)
+      (background light))
+     (:foreground "DeepPink3" :bold t :italic t))
+    (t
+     (:italic t :bold t)))
+  "Level 1 empty mailgroup face.")
+
+(defface gnus-group-mail-2-face 
+  '((((class color)
+      (background dark))
+     (:foreground "aquamarine2" :bold t))
+    (((class color)
+      (background light))
+     (:foreground "HotPink3" :bold t))
+    (t
+     (:bold t)))
+  "Level 2 mailgroup face.")
+
+(defface gnus-group-mail-2-empty-face
+  '((((class color)
+      (background dark))
+     (:foreground "aquamarine2" :bold t :italic t))
+    (((class color)
+      (background light))
+     (:foreground "HotPink3" :bold t :italic t))
+    (t
+     (:italic t :bold t)))
+  "Level 2 empty mailgroup face.")
+
+(defface gnus-group-mail-3-face 
+  '((((class color)
+      (background dark))
+     (:foreground "aquamarine3" :bold t))
+    (((class color)
+      (background light))
+     (:foreground "dark magenta" :bold t))
+    (t
+     (:bold t)))
+  "Level 3 mailgroup face.")
+
+(defface gnus-group-mail-3-empty-face
+  '((((class color)
+      (background dark))
+     (:foreground "aquamarine3" :bold t :italic t))
+    (((class color)
+      (background light))
+     (:foreground "dark magenta" :bold t :italic t))
+    (t
+     (:italic t :bold t)))
+  "Level 3 empty mailgroup face.")
+
+(defface gnus-group-mail-low-face 
+  '((((class color)
+      (background dark))
+     (:foreground "aquamarine4" :bold t))
+    (((class color)
+      (background light))
+     (:foreground "DeepPink4" :bold t))
+    (t
+     (:bold t)))
+  "Low level mailgroup face.")
+
+(defface gnus-group-mail-low-empty-face
+  '((((class color)
+      (background dark))
+     (:foreground "aquamarine4" :italic t :bold t))
+    (((class color)
+      (background light))
+     (:foreground "DeepPink4" :italic t :bold t))
+    (t
+     (:italic t :bold t)))
+  "Low level empty mailgroup face.")
+
+(defcustom gnus-group-highlight
+  '(;; News.
+    ((and (= unread 0) (not mailp) (eq level 1)) .
+     gnus-group-news-1-empty-face)
+    ((and (not mailp) (eq level 1)) .
+     gnus-group-news-1-face)
+    ((and (= unread 0) (not mailp) (eq level 2)) .
+     gnus-group-news-2-empty-face)
+    ((and (not mailp) (eq level 2)) .
+     gnus-group-news-2-face)
+    ((and (= unread 0) (not mailp) (eq level 3)) .
+     gnus-group-news-3-empty-face)
+    ((and (not mailp) (eq level 3)) .
+     gnus-group-news-3-face)
+    ((and (= unread 0) (not mailp)) .
+     gnus-group-news-low-empty-face)
+    ((and (not mailp)) .
+     gnus-group-news-low-face)
+    ;; Mail.
+    ((and (= unread 0) (eq level 1)) .
+     gnus-group-mail-1-empty-face)
+    ((and (eq level 1)) .
+     gnus-group-mail-1-face)
+    ((and (= unread 0) (eq level 2)) .
+     gnus-group-mail-2-empty-face)
+    ((and (eq level 2)) .
+     gnus-group-mail-2-face)
+    ((and (= unread 0) (eq level 3)) .
+     gnus-group-mail-3-empty-face)
+    ((and (eq level 3)) .
+     gnus-group-mail-3-face)
+    ((and (= unread 0)) .
+     gnus-group-mail-low-empty-face)
+    ((and) .
+     gnus-group-mail-low-face))
   "Controls the highlighting of group buffer lines. 
 
 Below is a list of `Form'/`Face' pairs.  When deciding how a a
@@ -273,10 +506,14 @@ method: The select method used.
 mailp: Whether it's a mail group or not.
 level: The level of the group.
 score: The score of the group.
-ticked: The number of ticked articles.")
-
-(defvar gnus-new-mail-mark ?%
-  "Mark used for groups with new mail.")
+ticked: The number of ticked articles."
+  :group 'gnus-group
+  :type '(repeat (cons (sexp :tag "Form") face)))
+
+(defcustom gnus-new-mail-mark ?%
+  "Mark used for groups with new mail."
+  :group 'gnus-group
+  :type 'character)
 
 ;;; Internal variables
 
index 67db32f..acd065b 100644 (file)
 (require 'gnus-load)
 (require 'gnus)
 
-(defvar gnus-open-server-hook nil
-  "*A hook called just before opening connection to the news server.")
+(defcustom gnus-open-server-hook nil
+  "Hook called just before opening connection to the news server."
+  :group 'gnus-start
+  :type 'hook)
 
 ;;;
 ;;; Server Communication
index 898ccfe..d4555cf 100644 (file)
 (require 'gnus-art)
 (require 'gnus-range)
 
-(defvar gnus-kill-file-mode-hook nil
-  "*A hook for Gnus kill file mode.")
-
-(defvar gnus-kill-expiry-days 7
-  "*Number of days before expiring unused kill file entries.")
-
-(defvar gnus-kill-save-kill-file nil
-  "*If non-nil, will save kill files after processing them.")
-
-(defvar gnus-winconf-kill-file nil)
-
-(defvar gnus-kill-killed t
+(defcustom gnus-kill-file-mode-hook nil
+  "Hook for Gnus kill file mode."
+  :group 'gnus-score
+  :type 'hook)
+
+(defcustom gnus-kill-expiry-days 7
+  "*Number of days before expiring unused kill file entries."
+  :group 'gnus-score
+  :type 'integer)
+
+(defcustom gnus-kill-save-kill-file nil
+  "*If non-nil, will save kill files after processing them."
+  :group 'gnus-score
+  :type 'boolean)
+
+(defcustom gnus-winconf-kill-file nil
+  "What does this do, Lars?"
+  :group 'gnus-score
+  :type 'sexp)
+
+(defcustom gnus-kill-killed t
   "*If non-nil, Gnus will apply kill files to already killed articles.
 If it is nil, Gnus will never apply kill files to articles that have
 already been through the scoring process, which might very well save lots
-of time.")
+of time."
+  :group 'gnus-score
+  :type 'boolean)
 
 \f
 
index 6c6bd55..550099e 100644 (file)
@@ -432,23 +432,6 @@ It is called with three parameters -- GROUP, LEVEL and OLDLEVEL.")
 
 ;;; Face thingies.
 
-;; The following is just helper functions and data, not meant to be set
-;; by the user.
-(defun gnus-make-face (color)
-  ;; Create entry for face with COLOR.
-  (custom-face-lookup color nil nil nil nil nil))
-
-(defvar gnus-face-light-name-list
-  '("light blue" "light cyan" "light yellow" "light pink"
-    "pale green" "beige" "orange" "magenta" "violet" "medium purple"
-    "turquoise"))
-
-(defvar gnus-face-dark-name-list
-  '("MidnightBlue" "firebrick" "dark green" "OrangeRed" 
-    "dark khaki" "dark violet" "SteelBlue4"))
-; CornflowerBlue SeaGreen OrangeRed SteelBlue4 DeepPink3
-; DarkOlviveGreen4 
-
 (defvar gnus-visual 
   '(summary-highlight group-highlight article-highlight 
                      mouse-face
index a885aec..8375405 100644 (file)
@@ -767,8 +767,7 @@ If LEVEL is non-nil, the news will be set up at level LEVEL."
       (gnus-nocem-scan-groups))
 
     ;; Read any slave files.
-    (unless gnus-slave
-      (gnus-master-read-slave-newsrc))
+    (gnus-master-read-slave-newsrc)
 
     ;; Find the number of unread articles in each non-dead group.
     (let ((gnus-read-active-file (and (not level) gnus-read-active-file)))
index f19a952..e85fbad 100644 (file)
 (require 'gnus-undo)
 (require 'gnus)
 
-(defvar gnus-kill-summary-on-exit t
+(defgroup gnus-summary nil
+  "Summary buffers."
+  :group 'gnus)
+
+(defcustom gnus-kill-summary-on-exit t
   "*If non-nil, kill the summary buffer when you exit from it.
 If nil, the summary will become a \"*Dead Summary*\" buffer, and
-it will be killed sometime later.")
+it will be killed sometime later."
+  :group 'gnus-summary
+  :type 'boolean)
 
-(defvar gnus-fetch-old-headers nil
+(defcustom gnus-fetch-old-headers nil
   "*Non-nil means that Gnus will try to build threads by grabbing old headers.
 If an unread article in the group refers to an older, already read (or
 just marked as read) article, the old article will not normally be
@@ -49,9 +55,14 @@ headers to connect otherwise loose threads will be displayed.
 This variable can also be a number.  In that case, no more than that
 number of old headers will be fetched.
 
-The server has to support NOV for any of this to work.")
+The server has to support NOV for any of this to work."
+  :group 'gnus-summary
+  :type '(choice (const :tag "off" nil)
+                (const some)
+                number
+                (sexp :menu-tag "other" t)))
 
-(defvar gnus-summary-make-false-root 'adopt
+(defcustom gnus-summary-make-false-root 'adopt
   "*nil means that Gnus won't gather loose threads.
 If the root of a thread has expired or been read in a previous
 session, the information necessary to build a complete thread has been
@@ -72,15 +83,23 @@ If this variable is `adopt', Gnus will make one of the \"children\"
 the parent and mark all the step-children as such.
 If this variable is `empty', the \"children\" are printed with empty
 subject fields.         (Or rather, they will be printed with a string
-given by the `gnus-summary-same-subject' variable.)")
-
-(defvar gnus-summary-gather-exclude-subject "^ *$\\|^(none)$"
+given by the `gnus-summary-same-subject' variable.)"
+  :group 'gnus-summary
+  :type '(choice (const :tag "off" nil)
+                (const none)
+                (const dummy)
+                (const adopt)
+                (const empty)))
+
+(defcustom gnus-summary-gather-exclude-subject "^ *$\\|^(none)$"
   "*A regexp to match subjects to be excluded from loose thread gathering.
 As loose thread gathering is done on subjects only, that means that
 there can be many false gatherings performed.  By rooting out certain
-common subjects, gathering might become saner.")
+common subjects, gathering might become saner."
+  :group 'gnus-summary
+  :type 'regexp)
 
-(defvar gnus-summary-gather-subject-limit nil
+(defcustom gnus-summary-gather-subject-limit nil
   "*Maximum length of subject comparisons when gathering loose threads.
 Use nil to compare full subjects.  Setting this variable to a low
 number will help gather threads that have been corrupted by
@@ -89,68 +108,105 @@ unrelated articles that have subject that happen to begin with the
 same few characters will be incorrectly gathered.
 
 If this variable is `fuzzy', Gnus will use a fuzzy algorithm when
-comparing subjects.")
-
-(defvar gnus-simplify-ignored-prefixes nil
-  "*Regexp, matches for which are removed from subject lines when simplifying fuzzily.")
-
-(defvar gnus-build-sparse-threads nil
+comparing subjects."
+  :group 'gnus-summary
+  :type '(choice (const :tag "off" nil)
+                (const fuzzy)
+                (sexp :menu-tag "on" t)))
+
+(defcustom gnus-simplify-ignored-prefixes nil
+  "*Regexp, matches for which are removed from subject lines when simplifying fuzzily."
+  :group 'gnus-summary
+  :type '(choice (const :tag "off" nil)
+                regexp))
+
+(defcustom gnus-build-sparse-threads nil
   "*If non-nil, fill in the gaps in threads.
 If `some', only fill in the gaps that are needed to tie loose threads
 together.  If `more', fill in all leaf nodes that Gnus can find.  If
-non-nil and non-`some', fill in all gaps that Gnus manages to guess.")
-
-(defvar gnus-summary-thread-gathering-function 'gnus-gather-threads-by-subject
+non-nil and non-`some', fill in all gaps that Gnus manages to guess."
+  :group 'gnus-summary
+  :type '(choice (const :tag "off" nil)
+                (const some)
+                (const more)
+                (sexp :menu-tag "all" t)))
+
+(defcustom gnus-summary-thread-gathering-function 'gnus-gather-threads-by-subject
   "Function used for gathering loose threads.
 There are two pre-defined functions: `gnus-gather-threads-by-subject',
 which only takes Subjects into consideration; and
 `gnus-gather-threads-by-references', which compared the References
-headers of the articles to find matches.")
+headers of the articles to find matches."
+  :group 'gnus-summary
+  :type '(set (function-item gnus-gather-threads-by-subject)
+             (function-item gnus-gather-threads-by-references)
+             (function :tag "other")))
 
 ;; Added by Per Abrahamsen <amanda@iesd.auc.dk>.
-(defvar gnus-summary-same-subject ""
+(defcustom gnus-summary-same-subject ""
   "*String indicating that the current article has the same subject as the previous.
 This variable will only be used if the value of
-`gnus-summary-make-false-root' is `empty'.")
+`gnus-summary-make-false-root' is `empty'."
+  :group 'gnus-summary
+  :type 'string)
 
-(defvar gnus-summary-goto-unread t
+(defcustom gnus-summary-goto-unread t
   "*If non-nil, marking commands will go to the next unread article.
 If `never', \\<gnus-summary-mode-map>\\[gnus-summary-next-page] will go to the next article,
-whether it is read or not.")
+whether it is read or not."
+  :group 'gnus-summary
+  :type '(choice (const :tag "off" nil)
+                (const never)
+                (sexp :menu-tag "on" t)))
 
-(defvar gnus-summary-default-score 0
+(defcustom gnus-summary-default-score 0
   "*Default article score level.
-If this variable is nil, scoring will be disabled.")
+If this variable is nil, scoring will be disabled."
+  :group 'gnus-summary
+  :type '(choice (const :tag "disable")
+                integer))
 
-(defvar gnus-summary-zcore-fuzz 0
+(defcustom gnus-summary-zcore-fuzz 0
   "*Fuzziness factor for the zcore in the summary buffer.
 Articles with scores closer than this to `gnus-summary-default-score'
-will not be marked.")
+will not be marked."
+  :group 'gnus-summary
+  :type 'integer)
 
-(defvar gnus-simplify-subject-fuzzy-regexp nil
+(defcustom gnus-simplify-subject-fuzzy-regexp nil
   "*Strings to be removed when doing fuzzy matches.
 This can either be a regular expression or list of regular expressions
 that will be removed from subject strings if fuzzy subject
-simplification is selected.")
+simplification is selected."
+  :group 'gnus-summary
+  :type '(repeat regexp))
 
-(defvar gnus-show-threads t
-  "*If non-nil, display threads in summary mode.")
+(defcustom gnus-show-threads t
+  "*If non-nil, display threads in summary mode."
+  :group 'gnus-summary
+  :type 'boolean)
 
-(defvar gnus-thread-hide-subtree nil
+(defcustom gnus-thread-hide-subtree nil
   "*If non-nil, hide all threads initially.
 If threads are hidden, you have to run the command
 `gnus-summary-show-thread' by hand or use `gnus-select-article-hook'
-to expose hidden threads.")
+to expose hidden threads."
+  :group 'gnus-summary
+  :type 'boolean)
 
-(defvar gnus-thread-hide-killed t
-  "*If non-nil, hide killed threads automatically.")
+(defcustom gnus-thread-hide-killed t
+  "*If non-nil, hide killed threads automatically."
+  :group 'gnus-summary
+  :type 'boolean)
 
-(defvar gnus-thread-ignore-subject nil
+(defcustom gnus-thread-ignore-subject nil
   "*If non-nil, ignore subjects and do all threading based on the Reference header.
 If nil, which is the default, articles that have different subjects
-from their parents will start separate threads.")
+from their parents will start separate threads."
+  :group 'gnus-summary
+  :type 'boolean)
 
-(defvar gnus-thread-operation-ignore-subject t
+(defcustom gnus-thread-operation-ignore-subject t
   "*If non-nil, subjects will be ignored when doing thread commands.
 This affects commands like `gnus-summary-kill-thread' and
 `gnus-summary-lower-thread'.
@@ -158,15 +214,23 @@ This affects commands like `gnus-summary-kill-thread' and
 If this variable is nil, articles in the same thread with different
 subjects will not be included in the operation in question.  If this
 variable is `fuzzy', only articles that have subjects that are fuzzily
-equal will be included.")
-
-(defvar gnus-thread-indent-level 4
-  "*Number that says how much each sub-thread should be indented.")
-
-(defvar gnus-auto-extend-newsgroup t
-  "*If non-nil, extend newsgroup forward and backward when requested.")
-
-(defvar gnus-auto-select-first t
+equal will be included."
+  :group 'gnus-summary
+  :type '(choice (const :tag "off" nil)
+                (const fuzzy)
+                (sexp :tag "on" t)))
+
+(defcustom gnus-thread-indent-level 4
+  "*Number that says how much each sub-thread should be indented."
+  :group 'gnus-summary
+  :type 'integer)
+
+(defcustom gnus-auto-extend-newsgroup t
+  "*If non-nil, extend newsgroup forward and backward when requested."
+  :group 'gnus-summary
+  :type 'boolean)
+
+(defcustom gnus-auto-select-first t
   "*If nil, don't select the first unread article when entering a group.
 If this variable is `best', select the highest-scored unread article
 in the group.  If neither nil nor `best', select the first unread
@@ -174,9 +238,13 @@ article.
 
 If you want to prevent automatic selection of the first unread article
 in some newsgroups, set the variable to nil in
-`gnus-select-group-hook'.")
+`gnus-select-group-hook'."
+  :group 'gnus-summary
+  :type '(choice (const :tag "none" nil)
+                (const best)
+                (sexp :menu-tag "first" t)))
 
-(defvar gnus-auto-select-next t
+(defcustom gnus-auto-select-next t
   "*If non-nil, offer to go to the next group from the end of the previous.
 If the value is t and the next newsgroup is empty, Gnus will exit
 summary mode and go back to group mode.         If the value is neither nil
@@ -186,114 +254,222 @@ newsgroup will be selected without any confirmation, and if it is
 `almost-quietly', the next group will be selected without any
 confirmation if you are located on the last article in the group.
 Finally, if this variable is `slightly-quietly', the `Z n' command
-will go to the next group without confirmation.")
-
-(defvar gnus-auto-select-same nil
-  "*If non-nil, select the next article with the same subject.")
-
-(defvar gnus-summary-check-current nil
+will go to the next group without confirmation."
+  :group 'gnus-summary
+  :type '(choice (const :tag "off" nil)
+                (const quietly)
+                (const almost-quietly)
+                (const slightly-quietly)
+                (sexp :menu-tag "on" t)))
+
+(defcustom gnus-auto-select-same nil
+  "*If non-nil, select the next article with the same subject."
+  :group 'gnus-summary
+  :type 'boolean)
+
+(defcustom gnus-summary-check-current nil
   "*If non-nil, consider the current article when moving.
 The \"unread\" movement commands will stay on the same line if the
-current article is unread.")
+current article is unread."
+  :group 'gnus-summary
+  :type 'boolean)
 
-(defvar gnus-auto-center-summary t
+(defcustom gnus-auto-center-summary t
   "*If non-nil, always center the current summary buffer.
 In particular, if `vertical' do only vertical recentering.  If non-nil
-and non-`vertical', do both horizontal and vertical recentering.")
-
-(defvar gnus-show-all-headers nil
-  "*If non-nil, don't hide any headers.")
-
-(defvar gnus-single-article-buffer t
+and non-`vertical', do both horizontal and vertical recentering."
+  :group 'gnus-summary
+  :type '(choice (const "none" nil)
+                (const vertical)
+                (sexp :menu-tag "both" t)))
+
+(defcustom gnus-show-all-headers nil
+  "*If non-nil, don't hide any headers."
+  :group 'gnus-summary
+  :type 'boolean)
+
+(defcustom gnus-single-article-buffer t
   "*If non-nil, display all articles in the same buffer.
-If nil, each group will get its own article buffer.")
+If nil, each group will get its own article buffer."
+  :group 'gnus-summary
+  :type 'boolean)
 
-(defvar gnus-break-pages t
+(defcustom gnus-break-pages t
   "*If non-nil, do page breaking on articles.
 The page delimiter is specified by the `gnus-page-delimiter'
-variable.")
+variable."
+  :group 'gnus-summary
+  :type 'boolean)
 
-(defvar gnus-show-mime nil
+(defcustom gnus-show-mime nil
   "*If non-nil, do mime processing of articles.
 The articles will simply be fed to the function given by
-`gnus-show-mime-method'.")
+`gnus-show-mime-method'."
+  :group 'gnus-summary
+  :type 'boolean)
 
-(defvar gnus-move-split-methods nil
+(defcustom gnus-move-split-methods nil
   "*Variable used to suggest where articles are to be moved to.
-It uses the same syntax as the `gnus-split-methods' variable.")
+It uses the same syntax as the `gnus-split-methods' variable."
+  :group 'gnus-summary
+  :type '(repeat (choice (list function)
+                        (cons regexp (repeat string))
+                        sexp)))
 
 ;; Mark variables suggested by Thomas Michanek
 ;; <Thomas.Michanek@telelogic.se>.
-(defvar gnus-unread-mark ? 
-  "*Mark used for unread articles.")
-(defvar gnus-ticked-mark ?!
-  "*Mark used for ticked articles.")
-(defvar gnus-dormant-mark ??
-  "*Mark used for dormant articles.")
-(defvar gnus-del-mark ?r
-  "*Mark used for del'd articles.")
-(defvar gnus-read-mark ?R
-  "*Mark used for read articles.")
-(defvar gnus-expirable-mark ?E
-  "*Mark used for expirable articles.")
-(defvar gnus-killed-mark ?K
-  "*Mark used for killed articles.")
-(defvar gnus-souped-mark ?F
-  "*Mark used for killed articles.")
-(defvar gnus-kill-file-mark ?X
-  "*Mark used for articles killed by kill files.")
-(defvar gnus-low-score-mark ?Y
-  "*Mark used for articles with a low score.")
-(defvar gnus-catchup-mark ?C
-  "*Mark used for articles that are caught up.")
-(defvar gnus-replied-mark ?A
-  "*Mark used for articles that have been replied to.")
-(defvar gnus-cached-mark ?*
-  "*Mark used for articles that are in the cache.")
-(defvar gnus-saved-mark ?S
-  "*Mark used for articles that have been saved to.")
-(defvar gnus-ancient-mark ?O
-  "*Mark used for ancient articles.")
-(defvar gnus-sparse-mark ?Q
-  "*Mark used for sparsely reffed articles.")
-(defvar gnus-canceled-mark ?G
-  "*Mark used for canceled articles.")
-(defvar gnus-duplicate-mark ?M
-  "*Mark used for duplicate articles.")
-(defvar gnus-score-over-mark ?+
-  "*Score mark used for articles with high scores.")
-(defvar gnus-score-below-mark ?-
-  "*Score mark used for articles with low scores.")
-(defvar gnus-empty-thread-mark ? 
-  "*There is no thread under the article.")
-(defvar gnus-not-empty-thread-mark ?=
-  "*There is a thread under the article.")
-
-(defvar gnus-view-pseudo-asynchronously nil
-  "*If non-nil, Gnus will view pseudo-articles asynchronously.")
-
-(defvar gnus-view-pseudos nil
+
+(defgroup gnus-summary-marks nil
+  "Marks used in summary buffers."
+  :group 'gnus-summary)
+
+(defcustom gnus-unread-mark ? 
+  "*Mark used for unread articles."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-ticked-mark ?!
+  "*Mark used for ticked articles."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-dormant-mark ??
+  "*Mark used for dormant articles."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-del-mark ?r
+  "*Mark used for del'd articles."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-read-mark ?R
+  "*Mark used for read articles."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-expirable-mark ?E
+  "*Mark used for expirable articles."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-killed-mark ?K
+  "*Mark used for killed articles."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-souped-mark ?F
+  "*Mark used for killed articles."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-kill-file-mark ?X
+  "*Mark used for articles killed by kill files."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-low-score-mark ?Y
+  "*Mark used for articles with a low score."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-catchup-mark ?C
+  "*Mark used for articles that are caught up."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-replied-mark ?A
+  "*Mark used for articles that have been replied to."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-cached-mark ?*
+  "*Mark used for articles that are in the cache."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-saved-mark ?S
+  "*Mark used for articles that have been saved to."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-ancient-mark ?O
+  "*Mark used for ancient articles."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-sparse-mark ?Q
+  "*Mark used for sparsely reffed articles."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-canceled-mark ?G
+  "*Mark used for canceled articles."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-duplicate-mark ?M
+  "*Mark used for duplicate articles."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-score-over-mark ?+
+  "*Score mark used for articles with high scores."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-score-below-mark ?-
+  "*Score mark used for articles with low scores."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-empty-thread-mark ? 
+  "*There is no thread under the article."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-not-empty-thread-mark ?=
+  "*There is a thread under the article."
+  :group 'gnus-summary-marks
+  :type 'character)
+
+(defcustom gnus-view-pseudo-asynchronously nil
+  "*If non-nil, Gnus will view pseudo-articles asynchronously."
+  :group 'gnus-summary
+  :type 'boolean)
+
+(defcustom gnus-view-pseudos nil
   "*If `automatic', pseudo-articles will be viewed automatically.
 If `not-confirm', pseudos will be viewed automatically, and the user
-will not be asked to confirm the command.")
+will not be asked to confirm the command."
+  :group 'gnus-summary
+  :type '(choice (const :tag "off" nil)
+                (const automatic)
+                (const not-confirm)))
 
-(defvar gnus-view-pseudos-separately t
+(defcustom gnus-view-pseudos-separately t
   "*If non-nil, one pseudo-article will be created for each file to be viewed.
 If nil, all files that use the same viewing command will be given as a
-list of parameters to that command.")
+list of parameters to that command."
+  :group 'gnus-summary
+  :type 'boolean)
 
-(defvar gnus-insert-pseudo-articles t
-  "*If non-nil, insert pseudo-articles when decoding articles.")
+(defcustom gnus-insert-pseudo-articles t
+  "*If non-nil, insert pseudo-articles when decoding articles."
+  :group 'gnus-summary
+  :type 'boolean)
 
-(defvar gnus-summary-dummy-line-format
+(defcustom gnus-summary-dummy-line-format
   "*  %(:                          :%) %S\n"
   "*The format specification for the dummy roots in the summary buffer.
 It works along the same lines as a normal formatting string,
 with some simple extensions.
 
-%S  The subject")
+%S  The subject"
+  :group 'gnus-summary
+  :type 'string)
 
-(defvar gnus-summary-mode-line-format "Gnus: %%b [%A] %Z"
+(defcustom gnus-summary-mode-line-format "Gnus: %%b [%A] %Z"
   "*The format specification for the summary mode line.
 It works along the same lines as a normal formatting string,
 with some simple extensions:
@@ -311,18 +487,29 @@ with some simple extensions:
 %s  Current score file name
 %d  Number of dormant articles
 %r  Number of articles that have been marked as read in this session
-%E  Number of articles expunged by the score files")
+%E  Number of articles expunged by the score files"
+  :group 'gnus-summary
+  :type 'string)
 
-(defvar gnus-summary-mark-below 0
+(defcustom gnus-summary-mark-below 0
   "*Mark all articles with a score below this variable as read.
 This variable is local to each summary buffer and usually set by the
-score file.")
+score file."
+  :group 'gnus-summary
+  :type 'integer)
 
-(defvar gnus-article-sort-functions '(gnus-article-sort-by-number)
+(defcustom gnus-article-sort-functions '(gnus-article-sort-by-number)
   "*List of functions used for sorting articles in the summary buffer.
-This variable is only used when not using a threaded display.")
-
-(defvar gnus-thread-sort-functions '(gnus-thread-sort-by-number)
+This variable is only used when not using a threaded display."
+  :group 'gnus-summary
+  :type '(repeat (choice (function-item gnus-article-sort-by-number)
+                        (function-item gnus-article-sort-by-author)
+                        (function-item gnus-article-sort-by-subject)
+                        (function-item gnus-article-sort-by-date)
+                        (function-item gnus-article-sort-by-score)
+                        (function :tag "other"))))
+
+(defcustom gnus-thread-sort-functions '(gnus-thread-sort-by-number)
   "*List of functions used for sorting threads in the summary buffer.
 By default, threads are sorted by article number.
 
@@ -335,44 +522,70 @@ functions -- preferably first.
 Ready-made functions include `gnus-thread-sort-by-number',
 `gnus-thread-sort-by-author', `gnus-thread-sort-by-subject',
 `gnus-thread-sort-by-date', `gnus-thread-sort-by-score' and
-`gnus-thread-sort-by-total-score' (see `gnus-thread-score-function').")
-
-(defvar gnus-thread-score-function '+
+`gnus-thread-sort-by-total-score' (see `gnus-thread-score-function')."
+  :group 'gnus-summary
+  :type '(repeat (choice (function-item gnus-thread-sort-by-number)
+                        (function-item gnus-thread-sort-by-author)
+                        (function-item gnus-thread-sort-by-subject)
+                        (function-item gnus-thread-sort-by-date)
+                        (function-item gnus-thread-sort-by-score)
+                        (function-item gnus-thread-sort-by-total-score)
+                        (function :tag "other"))))
+
+(defcustom gnus-thread-score-function '+
   "*Function used for calculating the total score of a thread.
 
 The function is called with the scores of the article and each
 subthread and should then return the score of the thread.
 
-Some functions you can use are `+', `max', or `min'.")
+Some functions you can use are `+', `max', or `min'."
+  :group 'gnus-summary
+  :type 'function)
 
-(defvar gnus-summary-expunge-below nil
-  "All articles that have a score less than this variable will be expunged.")
+(defcustom gnus-summary-expunge-below nil
+  "All articles that have a score less than this variable will be expunged."
+  :group 'gnus-summary
+  :type '(choice (const :tag "off" nil)
+                integer))
 
-(defvar gnus-thread-expunge-below nil
+(defcustom gnus-thread-expunge-below nil
   "All threads that have a total score less than this variable will be expunged.
 See `gnus-thread-score-function' for en explanation of what a
-\"thread score\" is.")
+\"thread score\" is."
+  :group 'gnus-summary
+  :type '(choice (const :tag "off" nil)
+                integer))
 
-(defvar gnus-summary-mode-hook nil
+(defcustom gnus-summary-mode-hook nil
   "*A hook for Gnus summary mode.
-This hook is run before any variables are set in the summary buffer.")
+This hook is run before any variables are set in the summary buffer."
+  :group 'gnus-summary
+  :type 'hook)
 
-(defvar gnus-summary-menu-hook nil
-  "*Hook run after the creation of the summary mode menu.")
+(defcustom gnus-summary-menu-hook nil
+  "*Hook run after the creation of the summary mode menu."
+  :group 'gnus-summary
+  :type 'hook)
 
-(defvar gnus-summary-exit-hook nil
-  "*A hook called on exit from the summary buffer.")
+(defcustom gnus-summary-exit-hook nil
+  "*A hook called on exit from the summary buffer."
+  :group 'gnus-summary
+  :type 'hook)
 
-(defvar gnus-summary-prepare-hook nil
+(defcustom gnus-summary-prepare-hook nil
   "*A hook called after the summary buffer has been generated.
-If you want to modify the summary buffer, you can use this hook.")
+If you want to modify the summary buffer, you can use this hook."
+  :group 'gnus-summary
+  :type 'hook)
 
-(defvar gnus-summary-generate-hook nil
+(defcustom gnus-summary-generate-hook nil
   "*A hook run just before generating the summary buffer.
 This hook is commonly used to customize threading variables and the
-like.")
+like."
+  :group 'gnus-summary
+  :type 'hook)
 
-(defvar gnus-select-group-hook nil
+(defcustom gnus-select-group-hook nil
   "*A hook called when a newsgroup is selected.
 
 If you'd like to simplify subjects like the
@@ -387,157 +600,233 @@ following hook:
                      header
                      (gnus-simplify-subject
                       (mail-header-subject header) 're-only)))
-                 gnus-newsgroup-headers))))")
+                 gnus-newsgroup-headers))))"
+  :group 'gnus-summary
+  :type 'hook)
 
-(defvar gnus-select-article-hook nil
-  "*A hook called when an article is selected.")
+(defcustom gnus-select-article-hook nil
+  "*A hook called when an article is selected."
+  :group 'gnus-summary
+  :type 'hook)
 
-(defvar gnus-visual-mark-article-hook
+(defcustom gnus-visual-mark-article-hook
   (list 'gnus-highlight-selected-summary)
   "*Hook run after selecting an article in the summary buffer.
 It is meant to be used for highlighting the article in some way.  It
-is not run if `gnus-visual' is nil.")
-
-(defvar gnus-parse-headers-hook nil
-  "*A hook called before parsing the headers.")
-(add-hook 'gnus-parse-headers-hook 'gnus-decode-rfc1522)
-
-(defvar gnus-exit-group-hook nil
-  "*A hook called when exiting (not quitting) summary mode.")
-
-(defvar gnus-summary-update-hook
+is not run if `gnus-visual' is nil."
+  :group 'gnus-summary
+  :type 'hook)
+
+(defcustom gnus-parse-headers-hook 
+  (list 'gnus-decode-rfc1522)
+  "*A hook called before parsing the headers."
+  :group 'gnus-summary
+  :type 'hook)
+
+(defcustom gnus-exit-group-hook nil
+  "*A hook called when exiting (not quitting) summary mode."
+  :group 'gnus-summary
+  :type 'hook)
+
+(defcustom gnus-summary-update-hook
   (list 'gnus-summary-highlight-line)
   "*A hook called when a summary line is changed.
 The hook will not be called if `gnus-visual' is nil.
 
 The default function `gnus-summary-highlight-line' will
 highlight the line according to the `gnus-summary-highlight'
-variable.")
+variable."
+  :group 'gnus-summary
+  :type 'hook)
 
-(defvar gnus-mark-article-hook '(gnus-summary-mark-read-and-unread-as-read)
+(defcustom gnus-mark-article-hook '(gnus-summary-mark-read-and-unread-as-read)
   "*A hook called when an article is selected for the first time.
 The hook is intended to mark an article as read (or unread)
-automatically when it is selected.")
-
-(defvar gnus-group-no-more-groups-hook nil
-  "*A hook run when returning to group mode having no more (unread) groups.")
-
-(defvar gnus-summary-selected-face 'underline
-  "Face used for highlighting the current article in the summary buffer.")
-
-(defvar gnus-summary-highlight 
-  (cond
-   ((not (eq gnus-display-type 'color))
-    '(((> score default) . bold)
-      ((< score default) . italic)))
-   ((eq gnus-background-mode 'dark)
-    (list
-     (cons 
-      '(= mark gnus-canceled-mark)
-      (custom-face-lookup "yellow" "black" nil
-                         nil nil nil))
-     (cons '(and (> score default)
-                (or (= mark gnus-dormant-mark)
-                    (= mark gnus-ticked-mark)))
-          (custom-face-lookup 
-           "pink" nil nil t nil nil))
-     (cons '(and (< score default)
-                (or (= mark gnus-dormant-mark)
-                    (= mark gnus-ticked-mark)))
-          (custom-face-lookup "pink" nil nil 
-                              nil t nil))
-     (cons '(or (= mark gnus-dormant-mark)
-               (= mark gnus-ticked-mark))
-          (custom-face-lookup 
-           "pink" nil nil nil nil nil))
-
-     (cons
-      '(and (> score default) (= mark gnus-ancient-mark))
-      (custom-face-lookup "medium blue" nil nil t
-                         nil nil))
-     (cons 
-      '(and (< score default) (= mark gnus-ancient-mark))
-      (custom-face-lookup "SkyBlue" nil nil
-                         nil t nil))
-     (cons 
-      '(= mark gnus-ancient-mark)
-      (custom-face-lookup "SkyBlue" nil nil
-                         nil nil nil))
-     (cons '(and (> score default) (= mark gnus-unread-mark))
-          (custom-face-lookup "white" nil nil t
-                              nil nil))
-     (cons '(and (< score default) (= mark gnus-unread-mark))
-          (custom-face-lookup "white" nil nil
-                              nil t nil))
-     (cons '(= mark gnus-unread-mark)
-          (custom-face-lookup
-           "white" nil nil nil nil nil))
-
-     (cons '(> score default) 'bold)
-     (cons '(< score default) 'italic)))
-   (t
-    (list
-     (cons
-      '(= mark gnus-canceled-mark)
-      (custom-face-lookup
-       "yellow" "black" nil nil nil nil))
-     (cons '(and (> score default)
-                (or (= mark gnus-dormant-mark)
-                    (= mark gnus-ticked-mark)))
-          (custom-face-lookup "firebrick" nil nil
-                              t nil nil))
-     (cons '(and (< score default)
-                (or (= mark gnus-dormant-mark)
-                    (= mark gnus-ticked-mark)))
-          (custom-face-lookup "firebrick" nil nil
-                              nil t nil))
-     (cons 
-      '(or (= mark gnus-dormant-mark)
-          (= mark gnus-ticked-mark))
-      (custom-face-lookup 
-       "firebrick" nil nil nil nil nil))
-
-     (cons '(and (> score default) (= mark gnus-ancient-mark))
-          (custom-face-lookup "RoyalBlue" nil nil
-                              t nil nil))
-     (cons '(and (< score default) (= mark gnus-ancient-mark))
-          (custom-face-lookup "RoyalBlue" nil nil
-                              nil t nil))
-     (cons 
-      '(= mark gnus-ancient-mark)
-      (custom-face-lookup
-       "RoyalBlue" nil nil nil nil nil))
-
-     (cons '(and (> score default) (/= mark gnus-unread-mark))
-          (custom-face-lookup "DarkGreen" nil nil
-                              t nil nil))
-     (cons '(and (< score default) (/= mark gnus-unread-mark))
-          (custom-face-lookup "DarkGreen" nil nil
-                              nil t nil))
-     (cons
-      '(/= mark gnus-unread-mark)
-      (custom-face-lookup "DarkGreen" nil nil 
-                         nil nil nil))
-
-     (cons '(> score default) 'bold)
-     (cons '(< score default) 'italic))))
+automatically when it is selected."
+  :group 'gnus-summary
+  :type 'hook)
+
+(defcustom gnus-group-no-more-groups-hook nil
+  "*A hook run when returning to group mode having no more (unread) groups."
+  :group 'gnus-summary
+  :type 'hook)
+
+(defface gnus-summary-selected-face '((t 
+                                      (:underline t)))
+  "Face used for selected articles.")
+
+(defcustom gnus-summary-selected-face 'gnus-summary-selected-face
+  "Face used for highlighting the current article in the summary buffer."
+  :group 'gnus-summary
+  :type 'face)
+
+(defface gnus-summary-cancelled-face 
+  '((((class color))
+     (:foreground "yellow" :background "black")))
+  "Face used for cancelled articles.")
+
+(defface gnus-summary-high-ticked-face
+  '((((class color)
+      (background dark))
+     (:foreground "pink" :bold t))
+    (((class color)
+      (background light))
+     (:foreground "firebrick" :bold t))
+    (t 
+     (:bold t)))
+  "Face used for high interest ticked articles.")
+
+(defface gnus-summary-low-ticked-face
+  '((((class color)
+      (background dark))
+     (:foreground "pink" :italic t))
+    (((class color)
+      (background light))
+     (:foreground "firebrick" :italic t))
+    (t 
+     (:italic t)))
+  "Face used for low interest ticked articles.")
+
+(defface gnus-summary-normal-ticked-face
+  '((((class color)
+      (background dark))
+     (:foreground "pink"))
+    (((class color)
+      (background light))
+     (:foreground "firebrick"))
+    (t 
+     ()))
+  "Face used for normal interest ticked articles.")
+  
+(defface gnus-summary-high-ancient-face
+  '((((class color)
+      (background dark))
+     (:foreground "SkyBlue" :bold t))
+    (((class color)
+      (background light))
+     (:foreground "RoyalBlue" :bold t))
+    (t 
+     (:bold t)))
+  "Face used for high interest ancient articles.")
+
+(defface gnus-summary-low-ancient-face
+  '((((class color)
+      (background dark))
+     (:foreground "SkyBlue" :italic t))
+    (((class color)
+      (background light))
+     (:foreground "RoyalBlue" :italic t))
+    (t 
+     (:italic t)))
+  "Face used for low interest ancient articles.")
+
+(defface gnus-summary-normal-ancient-face
+  '((((class color)
+      (background dark))
+     (:foreground "SkyBlue"))
+    (((class color)
+      (background light))
+     (:foreground "RoyalBlue"))
+    (t 
+     ()))
+  "Face used for normal interest ancient articles.")
+  
+(defface gnus-summary-high-unread-face
+  '((((class color)
+      (background dark))
+     (:foreground "PaleGreen" :bold t))
+    (((class color)
+      (background light))
+     (:foreground "DarkGreen" :bold t))
+    (t 
+     (:bold t)))
+  "Face used for high interest unread articles.")
+
+(defface gnus-summary-low-unread-face
+  '((((class color)
+      (background dark))
+     (:foreground "PaleGreen" :italic t))
+    (((class color)
+      (background light))
+     (:foreground "DarkGreen" :italic t))
+    (t 
+     (:italic t)))
+  "Face used for low interest unread articles.")
+
+(defface gnus-summary-normal-unread-face
+  '((((class color)
+      (background dark))
+     (:foreground "PaleGreen"))
+    (((class color)
+      (background light))
+     (:foreground "DarkGreen"))
+    (t 
+     ()))
+  "Face used for normal interest unread articles.")
+  
+(defface gnus-summary-high-read-face
+  '((t 
+     (:bold t)))
+  "Face used for high interest read articles.")
+
+(defface gnus-summary-low-read-face
+  '((t 
+     (:italic t)))
+  "Face used for low interest read articles.")
+
+(defface gnus-summary-normal-read-face
+  '((t 
+     ()))
+  "Face used for normal interest read articles.")
+
+(defcustom gnus-summary-highlight 
+  '(((= mark gnus-canceled-mark)
+     . gnus-summary-cancelled-face)
+    ((and (> score default)
+         (or (= mark gnus-dormant-mark)
+             (= mark gnus-ticked-mark)))
+     . gnus-summary-high-ticked-face)
+    ((and (< score default)
+         (or (= mark gnus-dormant-mark)
+             (= mark gnus-ticked-mark)))
+     . gnus-summary-low-ticked-face)
+    ((or (= mark gnus-dormant-mark)
+        (= mark gnus-ticked-mark))
+     . gnus-summary-normal-ticked-face)
+    ((and (> score default) (= mark gnus-ancient-mark))
+     . gnus-summary-high-ancient-face)
+    ((and (< score default) (= mark gnus-ancient-mark))
+     . gnus-summary-low-ancient-face)
+    ((= mark gnus-ancient-mark)
+     . gnus-summary-normal-ancient-face)
+    ((and (> score default) (= mark gnus-unread-mark))
+     . gnus-summary-high-unread-face)
+    ((and (< score default) (= mark gnus-unread-mark))
+     . gnus-summary-low-unread-face)
+    ((and (= mark gnus-unread-mark))
+     . gnus-summary-normal-unread-face)
+    ((> score default) 
+     . gnus-summary-high-read-face)
+    ((< score default) 
+     . gnus-summary-low-read-face)
+    (t 
+     . gnus-summary-normal-read-face))
   "Controls the highlighting of summary buffer lines. 
 
-Below is a list of `Form'/`Face' pairs.  When deciding how a a
-particular summary line should be displayed, each form is
-evaluated.  The content of the face field after the first true form is
-used.  You can change how those summary lines are displayed, by
-editing the face field.  
+A list of (FORM . FACE) pairs.  When deciding how a a particular
+summary line should be displayed, each form is evaluated.  The content
+of the face field after the first true form is used.  You can change
+how those summary lines are displayed, by editing the face field.
 
-It is also possible to change and add form fields, but currently that
-requires an understanding of Lisp expressions.  Hopefully this will
-change in a future release.  For now, you can use the following
-variables in the Lisp expression:
+You can use the following variables in the FORM field.
 
-score:   The article's score
+score:   The articles score
 default: The default article score.
 below:   The score below which articles are automatically marked as read. 
-mark:    The article's mark.")
+mark:    The articles mark."
+  :group 'gnus-summary
+  :type '(repeat (cons (sexp :tag "Form" nil)
+                      face)))
 
 ;;; Internal variables
 
index 27fa7a7..87e1418 100644 (file)
@@ -42,7 +42,7 @@
   "Score and kill file handling."
   :group 'gnus )
 
-(defconst gnus-version-number "0.47"
+(defconst gnus-version-number "0.48"
   "Version number for this version of Gnus.")
 
 (defconst gnus-version (format "Red Gnus v%s" gnus-version-number)
index 2b6ae2d..eb4ede8 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: extensions
-;; Version: 0.991
+;; Version: 0.992
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
@@ -174,7 +174,7 @@ minibuffer."
   (add-text-properties (1- from) from (list 'rear-nonsticky t
                                            'end-open t
                                            'invisible t))
-  (when (or (string-match ".%v" (widget-get widget :format))
+  (when (or (string-match "\\(.\\|\n\\)%v" (widget-get widget :format))
            (widget-get widget :hide-front-space))
     ;; WARNING: This is going to lose horrible if the character just
     ;; before the field can be modified (e.g. if it belongs to a
@@ -188,7 +188,7 @@ minibuffer."
 
   (when (widget-get widget :size)
     (put-text-property to (1+ to) 'invisible t)
-    (when (or (string-match "%v." (widget-get widget :format))
+    (when (or (string-match "%v\\(.\\|\n\\)" (widget-get widget :format))
              (widget-get widget :hide-rear-space))
       ;; WARNING: This is going to lose horrible if the character just
       ;; after the field can be modified (e.g. if it belongs to a
@@ -1836,6 +1836,23 @@ It will read a directory name from the minibuffer when activated."
                         value))
   :match (lambda (widget value) (integerp value)))
 
+(define-widget 'character 'string
+  "An character."
+  :tag "Character"
+  :value 0
+  :size 1 
+  :format "%t: %v\n"
+  :type-error "This field should contain a character"
+  :value-to-internal (lambda (widget value)
+                      (if (integerp value) 
+                          (char-to-string value)
+                        value))
+  :value-to-external (lambda (widget value)
+                      (if (stringp value)
+                          (aref value 0)
+                        value))
+  :match (lambda (widget value) (integerp value)))
+
 (define-widget 'number 'sexp
   "A floating point number."
   :tag "Number"
index 25b7ce2..d6b4a66 100644 (file)
@@ -4,7 +4,7 @@
 ;;
 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
 ;; Keywords: help, extensions, faces, hypermedia
-;; Version: 0.991
+;; Version: 0.992
 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
 
 ;;; Commentary:
index 74c0623..6d67a1d 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename gnus
-@settitle Red Gnus 0.47 Manual
+@settitle Red Gnus 0.48 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -287,7 +287,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Red Gnus 0.47 Manual
+@title Red Gnus 0.48 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page