emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/gnus/gnus-sum.el


From: Miles Bader
Subject: [Emacs-diffs] Changes to emacs/lisp/gnus/gnus-sum.el
Date: Sat, 04 Sep 2004 09:49:11 -0400

Index: emacs/lisp/gnus/gnus-sum.el
diff -c emacs/lisp/gnus/gnus-sum.el:1.39 emacs/lisp/gnus/gnus-sum.el:1.40
*** emacs/lisp/gnus/gnus-sum.el:1.39    Mon Sep  1 15:45:24 2003
--- emacs/lisp/gnus/gnus-sum.el Sat Sep  4 13:13:43 2004
***************
*** 1,5 ****
  ;;; gnus-sum.el --- summary mode commands for Gnus
! ;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
  ;;        Free Software Foundation, Inc.
  
  ;; Author: Lars Magne Ingebrigtsen <address@hidden>
--- 1,5 ----
  ;;; gnus-sum.el --- summary mode commands for Gnus
! ;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
  ;;        Free Software Foundation, Inc.
  
  ;; Author: Lars Magne Ingebrigtsen <address@hidden>
***************
*** 26,32 ****
  
  ;;; Code:
  
! (eval-when-compile (require 'cl))
  
  (require 'gnus)
  (require 'gnus-group)
--- 26,34 ----
  
  ;;; Code:
  
! (eval-when-compile
!   (require 'cl)
!   (defvar tool-bar-map))
  
  (require 'gnus)
  (require 'gnus-group)
***************
*** 36,47 ****
  (require 'gnus-undo)
  (require 'gnus-util)
  (require 'mm-decode)
- ;; Recursive :-(.
- ;; (require 'gnus-art)
  (require 'nnoo)
  (autoload 'gnus-summary-limit-include-cached "gnus-cache" nil t)
  (autoload 'gnus-cache-write-active "gnus-cache")
  (autoload 'mm-uu-dissect "mm-uu")
  
  (defcustom gnus-kill-summary-on-exit t
    "*If non-nil, kill the summary buffer when you exit from it.
--- 38,56 ----
  (require 'gnus-undo)
  (require 'gnus-util)
  (require 'mm-decode)
  (require 'nnoo)
+ 
  (autoload 'gnus-summary-limit-include-cached "gnus-cache" nil t)
  (autoload 'gnus-cache-write-active "gnus-cache")
+ (autoload 'gnus-mailing-list-insinuate "gnus-ml" nil t)
+ (autoload 'turn-on-gnus-mailing-list-mode "gnus-ml" nil t)
  (autoload 'mm-uu-dissect "mm-uu")
+ (autoload 'gnus-article-outlook-deuglify-article "deuglify"
+   "Deuglify broken Outlook (Express) articles and redisplay."
+   t)
+ (autoload 'gnus-article-outlook-unwrap-lines "deuglify" nil t)
+ (autoload 'gnus-article-outlook-repair-attribution "deuglify" nil t)
+ (autoload 'gnus-article-outlook-rearrange-citation "deuglify" nil t)
  
  (defcustom gnus-kill-summary-on-exit t
    "*If non-nil, kill the summary buffer when you exit from it.
***************
*** 105,110 ****
--- 114,124 ----
                 (const adopt)
                 (const empty)))
  
+ (defcustom gnus-summary-make-false-root-always nil
+   "Always make a false dummy root."
+   :group 'gnus-thread
+   :type 'boolean)
+ 
  (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
***************
*** 132,144 ****
    "List of functions taking a string argument that simplify subjects.
  The functions are applied recursively.
  
! Useful functions to put in this list include: `gnus-simplify-subject-re',
! `gnus-simplify-subject-fuzzy' and `gnus-simplify-whitespace'."
    :group 'gnus-thread
    :type '(repeat function))
  
  (defcustom gnus-simplify-ignored-prefixes nil
!   "*Regexp, matches for which are removed from subject lines when simplifying 
fuzzily."
    :group 'gnus-thread
    :type '(choice (const :tag "off" nil)
                 regexp))
--- 146,159 ----
    "List of functions taking a string argument that simplify subjects.
  The functions are applied recursively.
  
! Useful functions to put in this list include:
! `gnus-simplify-subject-re', `gnus-simplify-subject-fuzzy',
! `gnus-simplify-whitespace', and `gnus-simplify-all-whitespace'."
    :group 'gnus-thread
    :type '(repeat function))
  
  (defcustom gnus-simplify-ignored-prefixes nil
!   "*Remove matches for this regexp from subject lines when simplifying 
fuzzily."
    :group 'gnus-thread
    :type '(choice (const :tag "off" nil)
                 regexp))
***************
*** 197,202 ****
--- 212,231 ----
    :type '(choice (const :tag "disable")
                 integer))
  
+ (defcustom gnus-summary-default-high-score 0
+   "*Default threshold for a high scored article.
+ An article will be highlighted as high scored if its score is greater
+ than this score."
+   :group 'gnus-score-default
+   :type 'integer)
+ 
+ (defcustom gnus-summary-default-low-score 0
+   "*Default threshold for a low scored article.
+ An article will be highlighted as low scored if its score is smaller
+ than this score."
+   :group 'gnus-score-default
+   :type 'integer)
+ 
  (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'
***************
*** 219,229 ****
  
  (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."
    :group 'gnus-thread
!   :type 'boolean)
  
  (defcustom gnus-thread-hide-killed t
    "*If non-nil, hide killed threads automatically."
--- 248,264 ----
  
  (defcustom gnus-thread-hide-subtree nil
    "*If non-nil, hide all threads initially.
+ This can be a predicate specifier which says which threads to hide.
  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."
    :group 'gnus-thread
!   :type '(radio (sexp :format "Non-nil\n"
!                     :match (lambda (widget value)
!                              (not (or (consp value) (functionp value))))
!                     :value t)
!               (const nil)
!               (sexp :tag "Predicate specifier" :size 0)))
  
  (defcustom gnus-thread-hide-killed t
    "*If non-nil, hide killed threads automatically."
***************
*** 262,297 ****
    :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 t, select the first unread article.
! 
! This variable can also be a function to place point on a likely
! subject line.  Useful values include `gnus-summary-first-unread-subject',
! `gnus-summary-first-unread-article' and
! `gnus-summary-best-unread-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'."
    :group 'gnus-group-select
    :type '(choice (const :tag "none" nil)
!                (const best)
!                (sexp :menu-tag "first" t)
!                (function-item gnus-summary-first-unread-subject)
!                (function-item gnus-summary-first-unread-article)
!                (function-item gnus-summary-best-unread-article)))
  
  (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
! nor t, Gnus will select the following unread newsgroup.        In
  particular, if the value is the symbol `quietly', the next unread
  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."
    :group 'gnus-summary-maneuvering
    :type '(choice (const :tag "off" nil)
--- 297,340 ----
    :type 'boolean)
  
  (defcustom gnus-auto-select-first t
!   "*If non-nil, select the article under point.
! Which article this is is controlled by the `gnus-auto-select-subject'
! variable.
! 
! If you want to prevent automatic selection of articles in some
! newsgroups, set the variable to nil in `gnus-select-group-hook'."
    :group 'gnus-group-select
    :type '(choice (const :tag "none" nil)
!                (sexp :menu-tag "first" t)))
! 
! (defcustom gnus-auto-select-subject 'unread
!   "*Says what subject to place under point when entering a group.
! 
! This variable can either be the symbols `first' (place point on the
! first subject), `unread' (place point on the subject line of the first
! unread article), `best' (place point on the subject line of the
! higest-scored article), `unseen' (place point on the subject line of
! the first unseen article), 'unseen-or-unread' (place point on the subject
! line of the first unseen article or, if all article have been seen, on the
! subject line of the first unread article), or a function to be called to
! place point on some subject line."
!   :group 'gnus-group-select
!   :type '(choice (const best)
!                (const unread)
!                (const first)
!                (const unseen)
!                (const unseen-or-unread)))
  
  (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
! nor t, Gnus will select the following unread newsgroup.  In
  particular, if the value is the symbol `quietly', the next unread
  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 
`\\<gnus-summary-mode-map>\\[gnus-summary-catchup-and-goto-next-group]' command
  will go to the next group without confirmation."
    :group 'gnus-summary-maneuvering
    :type '(choice (const :tag "off" nil)
***************
*** 307,312 ****
--- 350,372 ----
    :group 'gnus-summary-maneuvering
    :type 'boolean)
  
+ (defcustom gnus-auto-goto-ignores 'unfetched
+   "*Says how to handle unfetched articles when maneuvering.
+ 
+ This variable can either be the symbols nil (maneuver to any
+ article), `undownloaded' (maneuvering while unplugged ignores articles
+ that have not been fetched), `always-undownloaded' (maneuvering always
+ ignores articles that have not been fetched), `unfetched' (maneuvering
+ ignores articles whose headers have not been fetched).
+ 
+ NOTE: The list of unfetched articles will always be nil when plugged
+ and, when unplugged, a subset of the undownloaded article list."
+   :group 'gnus-summary-maneuvering
+   :type '(choice (const :tag "None" nil)
+                  (const :tag "Undownloaded when unplugged" undownloaded)
+                  (const :tag "Undownloaded" always-undownloaded)
+                  (const :tag "Unfetched" unfetched)))
+ 
  (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
***************
*** 324,329 ****
--- 384,392 ----
                 (integer :tag "height")
                 (sexp :menu-tag "both" t)))
  
+ (defvar gnus-auto-center-group t
+   "*If non-nil, always center the group buffer.")
+ 
  (defcustom gnus-show-all-headers nil
    "*If non-nil, don't hide any headers."
    :group 'gnus-article-hiding
***************
*** 350,362 ****
  
  (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."
    :group 'gnus-summary-mail
    :type '(repeat (choice (list :value (fun) function)
                         (cons :value ("" "") regexp (repeat string))
                         (sexp :value nil))))
  
! (defcustom gnus-unread-mark ?  ;Whitespace
    "*Mark used for unread articles."
    :group 'gnus-summary-marks
    :type 'character)
--- 413,427 ----
  
  (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.
! However, whereas `gnus-split-methods' specifies file names as targets,
! this variable specifies group names."
    :group 'gnus-summary-mail
    :type '(repeat (choice (list :value (fun) function)
                         (cons :value ("" "") regexp (repeat string))
                         (sexp :value nil))))
  
! (defcustom gnus-unread-mark ?           ;Whitespace
    "*Mark used for unread articles."
    :group 'gnus-summary-marks
    :type 'character)
***************
*** 391,398 ****
    :group 'gnus-summary-marks
    :type 'character)
  
  (defcustom gnus-souped-mark ?F
!   "*Mark used for killed articles."
    :group 'gnus-summary-marks
    :type 'character)
  
--- 456,468 ----
    :group 'gnus-summary-marks
    :type 'character)
  
+ (defcustom gnus-spam-mark ?$
+   "*Mark used for spam articles."
+   :group 'gnus-summary-marks
+   :type 'character)
+ 
  (defcustom gnus-souped-mark ?F
!   "*Mark used for souped articles."
    :group 'gnus-summary-marks
    :type 'character)
  
***************
*** 416,428 ****
    :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)
  
--- 486,518 ----
    :group 'gnus-summary-marks
    :type 'character)
  
+ (defcustom gnus-forwarded-mark ?F
+   "*Mark used for articles that have been forwarded."
+   :group 'gnus-summary-marks
+   :type 'character)
+ 
+ (defcustom gnus-recent-mark ?N
+   "*Mark used for articles that are recent."
+   :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."
!   :group 'gnus-summary-marks
!   :type 'character)
! 
! (defcustom gnus-unseen-mark ?.
!   "*Mark used for articles that haven't been seen."
!   :group 'gnus-summary-marks
!   :type 'character)
! 
! (defcustom gnus-no-mark ?               ;Whitespace
!   "*Mark used for articles that have no other secondary mark."
    :group 'gnus-summary-marks
    :type 'character)
  
***************
*** 446,456 ****
    :group 'gnus-summary-marks
    :type 'character)
  
! (defcustom gnus-undownloaded-mark ?@
    "*Mark used for articles that weren't downloaded."
    :group 'gnus-summary-marks
    :type 'character)
  
  (defcustom gnus-downloadable-mark ?%
    "*Mark used for articles that are to be downloaded."
    :group 'gnus-summary-marks
--- 536,551 ----
    :group 'gnus-summary-marks
    :type 'character)
  
! (defcustom gnus-undownloaded-mark ?-
    "*Mark used for articles that weren't downloaded."
    :group 'gnus-summary-marks
    :type 'character)
  
+ (defcustom gnus-downloaded-mark ?+
+   "*Mark used for articles that were downloaded."
+   :group 'gnus-summary-marks
+   :type 'character)
+ 
  (defcustom gnus-downloadable-mark ?%
    "*Mark used for articles that are to be downloaded."
    :group 'gnus-summary-marks
***************
*** 471,477 ****
    :group 'gnus-summary-marks
    :type 'character)
  
! (defcustom gnus-empty-thread-mark ?  ;Whitespace
    "*There is no thread under the article."
    :group 'gnus-summary-marks
    :type 'character)
--- 566,572 ----
    :group 'gnus-summary-marks
    :type 'character)
  
! (defcustom gnus-empty-thread-mark ?     ;Whitespace
    "*There is no thread under the article."
    :group 'gnus-summary-marks
    :type 'character)
***************
*** 523,534 ****
    :type 'boolean)
  
  (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"
    :group 'gnus-threading
    :type 'string)
  
--- 618,633 ----
    :type 'boolean)
  
  (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
! 
! General format specifiers can also be used.
! See `(gnus)Formatting Variables'."
!   :link '(custom-manual "(gnus)Formatting Variables")
    :group 'gnus-threading
    :type 'string)
  
***************
*** 574,602 ****
  
  (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."
    :group 'gnus-summary-sort
    :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.
  
! Each function takes two threads and return non-nil if the first thread
! should be sorted before the other.  If you use more than one function,
! the primary sort function should be the last.  You should probably
! always include `gnus-thread-sort-by-number' in the list of sorting
! 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')."
    :group 'gnus-summary-sort
    :type '(repeat (choice (function-item gnus-thread-sort-by-number)
                         (function-item gnus-thread-sort-by-author)
--- 673,727 ----
  
  (defcustom gnus-article-sort-functions '(gnus-article-sort-by-number)
    "*List of functions used for sorting articles in the summary buffer.
! 
! Each function takes two articles and returns non-nil if the first
! article should be sorted before the other.  If you use more than one
! function, the primary sort function should be the last.  You should
! probably always include `gnus-article-sort-by-number' in the list of
! sorting functions -- preferably first.  Also note that sorting by date
! is often much slower than sorting by number, and the sorting order is
! very similar.  (Sorting by date means sorting by the time the message
! was sent, sorting by number means sorting by arrival time.)
! 
! Ready-made functions include `gnus-article-sort-by-number',
! `gnus-article-sort-by-author', `gnus-article-sort-by-subject',
! `gnus-article-sort-by-date', `gnus-article-sort-by-random'
! and `gnus-article-sort-by-score'.
! 
! When threading is turned on, the variable `gnus-thread-sort-functions'
! controls how articles are sorted."
    :group 'gnus-summary-sort
    :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-item gnus-article-sort-by-random)
                         (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.
  
! Each function takes two threads and returns non-nil if the first
! thread should be sorted before the other.  If you use more than one
! function, the primary sort function should be the last.  You should
! probably always include `gnus-thread-sort-by-number' in the list of
! sorting functions -- preferably first.  Also note that sorting by date
! is often much slower than sorting by number, and the sorting order is
! very similar.  (Sorting by date means sorting by the time the message
! was sent, sorting by number means sorting by arrival time.)
  
  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',
! `gnus-thread-sort-by-most-recent-number',
! `gnus-thread-sort-by-most-recent-date',
! `gnus-thread-sort-by-random', and
! `gnus-thread-sort-by-total-score' (see `gnus-thread-score-function').
! 
! When threading is turned off, the variable
! `gnus-article-sort-functions' controls how articles are sorted."
    :group 'gnus-summary-sort
    :type '(repeat (choice (function-item gnus-thread-sort-by-number)
                         (function-item gnus-thread-sort-by-author)
***************
*** 604,609 ****
--- 729,735 ----
                         (function-item gnus-thread-sort-by-date)
                         (function-item gnus-thread-sort-by-score)
                         (function-item gnus-thread-sort-by-total-score)
+                        (function-item gnus-thread-sort-by-random)
                         (function :tag "other"))))
  
  (defcustom gnus-thread-score-function '+
***************
*** 637,646 ****
  (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."
!   :options '(turn-on-gnus-mailing-list-mode)
    :group 'gnus-summary-various
    :type 'hook)
  
  (defcustom gnus-summary-menu-hook nil
    "*Hook run after the creation of the summary mode menu."
    :group 'gnus-summary-visual
--- 763,779 ----
  (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."
!   :options '(turn-on-gnus-mailing-list-mode gnus-pick-mode)
    :group 'gnus-summary-various
    :type 'hook)
  
+ ;; Extracted from gnus-xmas-redefine in order to preserve user settings
+ (when (featurep 'xemacs)
+   (add-hook 'gnus-summary-mode-hook 'gnus-xmas-summary-menu-add)
+   (add-hook 'gnus-summary-mode-hook 'gnus-xmas-setup-summary-toolbar)
+   (add-hook 'gnus-summary-mode-hook
+           'gnus-xmas-switch-horizontal-scrollbar-off))
+ 
  (defcustom gnus-summary-menu-hook nil
    "*Hook run after the creation of the summary mode menu."
    :group 'gnus-summary-visual
***************
*** 677,697 ****
  `gnus-summary-next-same-subject' command does, you can use the
  following hook:
  
!  (setq gnus-select-group-hook
!       (list
!       (lambda ()
!         (mapcar (lambda (header)
!                    (mail-header-set-subject
!                     header
!                     (gnus-simplify-subject
!                      (mail-header-subject header) 're-only)))
!                 gnus-newsgroup-headers))))"
    :group 'gnus-group-select
    :type 'hook)
  
  (defcustom gnus-select-article-hook nil
    "*A hook called when an article is selected."
    :group 'gnus-summary-choose
    :type 'hook)
  
  (defcustom gnus-visual-mark-article-hook
--- 810,830 ----
  `gnus-summary-next-same-subject' command does, you can use the
  following hook:
  
!  (add-hook gnus-select-group-hook
!          (lambda ()
!            (mapcar (lambda (header)
!                      (mail-header-set-subject
!                       header
!                       (gnus-simplify-subject
!                        (mail-header-subject header) 're-only)))
!                    gnus-newsgroup-headers)))"
    :group 'gnus-group-select
    :type 'hook)
  
  (defcustom gnus-select-article-hook nil
    "*A hook called when an article is selected."
    :group 'gnus-summary-choose
+   :options '(gnus-agent-fetch-selected-article)
    :type 'hook)
  
  (defcustom gnus-visual-mark-article-hook
***************
*** 741,804 ****
    :group 'gnus-summary
    :type 'hook)
  
  (defcustom gnus-summary-selected-face 'gnus-summary-selected-face
    "Face used for highlighting the current article in the summary buffer."
    :group 'gnus-summary-visual
    :type 'face)
  
  (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)
!     ((= mark gnus-unread-mark)
!      . gnus-summary-normal-unread-face)
!     ((and (> score default) (memq mark (list gnus-downloadable-mark
!                                            gnus-undownloaded-mark)))
       . gnus-summary-high-unread-face)
!     ((and (< score default) (memq mark (list gnus-downloadable-mark
!                                            gnus-undownloaded-mark)))
       . gnus-summary-low-unread-face)
!     ((memq mark (list gnus-downloadable-mark gnus-undownloaded-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.
  
! A list of (FORM . FACE) pairs.  When deciding how 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.
  
  You can use the following variables in the FORM field.
  
! score:   The articles score
! default: The default article score.
! below:   The score below which articles are automatically marked as read.
! mark:    The articles mark."
    :group 'gnus-summary-visual
    :type '(repeat (cons (sexp :tag "Form" nil)
                       face)))
--- 874,963 ----
    :group 'gnus-summary
    :type 'hook)
  
+ (defcustom gnus-summary-article-move-hook nil
+   "*A hook called after an article is moved, copied, respooled, or 
crossposted."
+   :group 'gnus-summary
+   :type 'hook)
+ 
+ (defcustom gnus-summary-article-delete-hook nil
+   "*A hook called after an article is deleted."
+   :group 'gnus-summary
+   :type 'hook)
+ 
+ (defcustom gnus-summary-article-expire-hook nil
+   "*A hook called after an article is expired."
+   :group 'gnus-summary
+   :type 'hook)
+ 
+ (defcustom gnus-summary-display-arrow
+   (and (fboundp 'display-graphic-p)
+        (display-graphic-p))
+   "*If non-nil, display an arrow highlighting the current article."
+   :version "21.1"
+   :group 'gnus-summary
+   :type 'boolean)
+ 
  (defcustom gnus-summary-selected-face 'gnus-summary-selected-face
    "Face used for highlighting the current article in the summary buffer."
    :group 'gnus-summary-visual
    :type 'face)
  
+ (defvar gnus-tmp-downloaded nil)
+ 
  (defcustom gnus-summary-highlight
!   '(((eq mark gnus-canceled-mark)
       . gnus-summary-cancelled-face)
!     ((and uncached (> score default-high))
!      . gnus-summary-high-undownloaded-face)
!     ((and uncached (< score default-low))
!      . gnus-summary-low-undownloaded-face)
!     (uncached
!      . gnus-summary-normal-undownloaded-face)
!     ((and (> score default-high)
!         (or (eq mark gnus-dormant-mark)
!             (eq mark gnus-ticked-mark)))
       . gnus-summary-high-ticked-face)
!     ((and (< score default-low)
!         (or (eq mark gnus-dormant-mark)
!             (eq mark gnus-ticked-mark)))
       . gnus-summary-low-ticked-face)
!     ((or (eq mark gnus-dormant-mark)
!        (eq mark gnus-ticked-mark))
       . gnus-summary-normal-ticked-face)
!     ((and (> score default-high) (eq mark gnus-ancient-mark))
       . gnus-summary-high-ancient-face)
!     ((and (< score default-low) (eq mark gnus-ancient-mark))
       . gnus-summary-low-ancient-face)
!     ((eq mark gnus-ancient-mark)
       . gnus-summary-normal-ancient-face)
!     ((and (> score default-high) (eq mark gnus-unread-mark))
       . gnus-summary-high-unread-face)
!     ((and (< score default-low) (eq mark gnus-unread-mark))
       . gnus-summary-low-unread-face)
!     ((eq mark gnus-unread-mark)
       . gnus-summary-normal-unread-face)
!     ((> score default-high)
       . gnus-summary-high-read-face)
!     ((< score default-low)
       . gnus-summary-low-read-face)
      (t
       . gnus-summary-normal-read-face))
    "*Controls the highlighting of summary buffer lines.
  
! 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.
  
  You can use the following variables in the FORM field.
  
! score:        The article's score
! default:      The default article score.
! default-high: The default score for high scored articles.
! default-low:  The default score for low scored articles.
! below:        The score below which articles are automatically marked as read.
! mark:         The article's mark.
! uncached:     Non-nil if the article is uncached."
    :group 'gnus-summary-visual
    :type '(repeat (cons (sexp :tag "Form" nil)
                       face)))
***************
*** 814,820 ****
  (defvar gnus-decode-encoded-word-function 'mail-decode-encoded-word-string
    "Variable that says which function should be used to decode a string with 
encoded words.")
  
! (defcustom gnus-extra-headers nil
    "*Extra headers to parse."
    :version "21.1"
    :group 'gnus-summary
--- 973,979 ----
  (defvar gnus-decode-encoded-word-function 'mail-decode-encoded-word-string
    "Variable that says which function should be used to decode a string with 
encoded words.")
  
! (defcustom gnus-extra-headers '(To Newsgroups)
    "*Extra headers to parse."
    :version "21.1"
    :group 'gnus-summary
***************
*** 827,851 ****
    :group 'gnus-summary
    :type 'regexp)
  
- (defcustom gnus-group-charset-alist
-   '(("^hk\\>\\|^tw\\>\\|\\<big5\\>" cn-big5)
-     ("^cn\\>\\|\\<chinese\\>" cn-gb-2312)
-     ("^fj\\>\\|^japan\\>" iso-2022-jp-2)
-     ("^tnn\\>\\|^pin\\>\\|^sci.lang.japan" iso-2022-7bit)
-     ("^relcom\\>" koi8-r)
-     ("^fido7\\>" koi8-r)
-     ("^\\(cz\\|hun\\|pl\\|sk\\|hr\\)\\>" iso-8859-2)
-     ("^israel\\>" iso-8859-1)
-     ("^han\\>" euc-kr)
-     ("^alt.chinese.text.big5\\>" chinese-big5)
-     ("^soc.culture.vietnamese\\>" vietnamese-viqr)
-     ("^\\(comp\\|rec\\|alt\\|sci\\|soc\\|news\\|gnu\\|bofh\\)\\>" iso-8859-1)
-     (".*" iso-8859-1))
-   "Alist of regexps (to match group names) and default charsets to be used 
when reading."
-   :type '(repeat (list (regexp :tag "Group")
-                      (symbol :tag "Charset")))
-   :group 'gnus-charset)
- 
  (defcustom gnus-newsgroup-ignored-charsets '(unknown-8bit x-unknown)
    "List of charsets that should be ignored.
  When these charsets are used in the \"charset\" parameter, the
--- 986,991 ----
***************
*** 854,867 ****
    :type '(repeat symbol)
    :group 'gnus-charset)
  
! (defcustom gnus-group-ignored-charsets-alist
!   '(("alt\\.chinese\\.text" iso-8859-1))
!   "Alist of regexps (to match group names) and charsets that should be 
ignored.
  When these charsets are used in the \"charset\" parameter, the
  default charset will be used instead."
!   :type '(repeat (cons (regexp :tag "Group")
!                      (repeat symbol)))
!   :group 'gnus-charset)
  
  (defcustom gnus-group-highlight-words-alist nil
    "Alist of group regexps and highlight regexps.
--- 994,1022 ----
    :type '(repeat symbol)
    :group 'gnus-charset)
  
! (gnus-define-group-parameter
!  ignored-charsets
!  :type list
!  :function-document
!  "Return the ignored charsets of GROUP."
!  :variable gnus-group-ignored-charsets-alist
!  :variable-default
!  '(("alt\\.chinese\\.text" iso-8859-1))
!  :variable-document
!  "Alist of regexps (to match group names) and charsets that should be ignored.
  When these charsets are used in the \"charset\" parameter, the
  default charset will be used instead."
!  :variable-group gnus-charset
!  :variable-type '(repeat (cons (regexp :tag "Group")
!                              (repeat symbol)))
!  :parameter-type '(choice :tag "Ignored charsets"
!                         :value nil
!                         (repeat (symbol)))
!  :parameter-document       "\
! List of charsets that should be ignored.
! 
! When these charsets are used in the \"charset\" parameter, the
! default charset will be used instead.")
  
  (defcustom gnus-group-highlight-words-alist nil
    "Alist of group regexps and highlight regexps.
***************
*** 904,923 ****
                 integer))
  
  (defcustom gnus-summary-save-parts-default-mime "image/.*"
!   "*A regexp to match MIME parts when saving multiple parts of a message
! with gnus-summary-save-parts (X m). This regexp will be used by default
! when prompting the user for which type of files to save."
    :group 'gnus-summary
    :type 'regexp)
  
  
  ;;; Internal variables
  
  (defvar gnus-article-mime-handles nil)
  (defvar gnus-article-decoded-p nil)
  (defvar gnus-scores-exclude-files nil)
  (defvar gnus-page-broken nil)
- (defvar gnus-inhibit-mime-unbuttonizing nil)
  
  (defvar gnus-original-article nil)
  (defvar gnus-article-internal-prepare-hook nil)
--- 1059,1112 ----
                 integer))
  
  (defcustom gnus-summary-save-parts-default-mime "image/.*"
!   "*A regexp to match MIME parts when saving multiple parts of a
! message with `gnus-summary-save-parts' 
(\\<gnus-summary-mode-map>\\[gnus-summary-save-parts]).
! This regexp will be used by default when prompting the user for which
! type of files to save."
    :group 'gnus-summary
    :type 'regexp)
  
+ (defcustom gnus-read-all-available-headers nil
+   "Whether Gnus should parse all headers made available to it.
+ This is mostly relevant for slow back ends where the user may
+ wish to widen the summary buffer to include all headers
+ that were fetched.  Say, for nnultimate groups."
+   :group 'gnus-summary
+   :type '(choice boolean regexp))
+ 
+ (defcustom gnus-summary-muttprint-program "muttprint"
+   "Command (and optional arguments) used to run Muttprint."
+   :version "21.3"
+   :group 'gnus-summary
+   :type 'string)
+ 
+ (defcustom gnus-article-loose-mime nil
+   "If non-nil, don't require MIME-Version header.
+ Some brain-damaged MUA/MTA, e.g. Lotus Domino 5.0.6 clients, does not
+ supply the MIME-Version header or deliberately strip it From the mail.
+ Set it to non-nil, Gnus will treat some articles as MIME even if
+ the MIME-Version header is missed."
+   :version "21.3"
+   :type 'boolean
+   :group 'gnus-article-mime)
+ 
+ (defcustom gnus-article-emulate-mime t
+   "If non-nil, use MIME emulation for uuencode and the like.
+ This means that Gnus will search message bodies for text that look
+ like uuencoded bits, yEncoded bits, and so on, and present that using
+ the normal Gnus MIME machinery."
+   :type 'boolean
+   :group 'gnus-article-mime)
  
  ;;; Internal variables
  
+ (defvar gnus-summary-display-cache nil)
  (defvar gnus-article-mime-handles nil)
  (defvar gnus-article-decoded-p nil)
+ (defvar gnus-article-charset nil)
+ (defvar gnus-article-ignored-charsets nil)
  (defvar gnus-scores-exclude-files nil)
  (defvar gnus-page-broken nil)
  
  (defvar gnus-original-article nil)
  (defvar gnus-article-internal-prepare-hook nil)
***************
*** 929,935 ****
    "Function called to sort the articles within a thread after it has been 
gathered together.")
  
  (defvar gnus-summary-save-parts-type-history nil)
! (defvar gnus-summary-save-parts-last-directory nil)
  
  ;; Avoid highlighting in kill files.
  (defvar gnus-summary-inhibit-highlight nil)
--- 1118,1124 ----
    "Function called to sort the articles within a thread after it has been 
gathered together.")
  
  (defvar gnus-summary-save-parts-type-history nil)
! (defvar gnus-summary-save-parts-last-directory mm-default-directory)
  
  ;; Avoid highlighting in kill files.
  (defvar gnus-summary-inhibit-highlight nil)
***************
*** 940,945 ****
--- 1129,1135 ----
  (defvar gnus-current-move-group nil)
  (defvar gnus-current-copy-group nil)
  (defvar gnus-current-crosspost-group nil)
+ (defvar gnus-newsgroup-display nil)
  
  (defvar gnus-newsgroup-dependencies nil)
  (defvar gnus-newsgroup-adaptive nil)
***************
*** 964,970 ****
      (?M ,(macroexpand '(mail-header-id gnus-tmp-header)) ?s)
      (?r ,(macroexpand '(mail-header-references gnus-tmp-header)) ?s)
      (?c (or (mail-header-chars gnus-tmp-header) 0) ?d)
!     (?L gnus-tmp-lines ?d)
      (?I gnus-tmp-indentation ?s)
      (?T (if (= gnus-tmp-level 0) "" (make-string (frame-width) ? )) ?s)
      (?R gnus-tmp-replied ?c)
--- 1154,1162 ----
      (?M ,(macroexpand '(mail-header-id gnus-tmp-header)) ?s)
      (?r ,(macroexpand '(mail-header-references gnus-tmp-header)) ?s)
      (?c (or (mail-header-chars gnus-tmp-header) 0) ?d)
!     (?k (gnus-summary-line-message-size gnus-tmp-header) ?s)
!     (?L gnus-tmp-lines ?s)
!     (?O gnus-tmp-downloaded ?c)
      (?I gnus-tmp-indentation ?s)
      (?T (if (= gnus-tmp-level 0) "" (make-string (frame-width) ? )) ?s)
      (?R gnus-tmp-replied ?c)
***************
*** 977,983 ****
      (?l (bbb-grouplens-score gnus-tmp-header) ?s)
      (?V (gnus-thread-total-score (and (boundp 'thread) (car thread))) ?d)
      (?U gnus-tmp-unread ?c)
!     (?f (gnus-summary-from-or-to-or-newsgroups gnus-tmp-header) ?s)
      (?t (gnus-summary-number-of-articles-in-thread
         (and (boundp 'thread) (car thread)) gnus-tmp-level)
        ?d)
--- 1169,1176 ----
      (?l (bbb-grouplens-score gnus-tmp-header) ?s)
      (?V (gnus-thread-total-score (and (boundp 'thread) (car thread))) ?d)
      (?U gnus-tmp-unread ?c)
!     (?f (gnus-summary-from-or-to-or-newsgroups gnus-tmp-header gnus-tmp-from)
!       ?s)
      (?t (gnus-summary-number-of-articles-in-thread
         (and (boundp 'thread) (car thread)) gnus-tmp-level)
        ?d)
***************
*** 985,991 ****
         (and (boundp 'thread) (car thread)) gnus-tmp-level t)
        ?c)
      (?u gnus-tmp-user-defined ?s)
!     (?P (gnus-pick-line-number) ?d))
    "An alist of format specifications that can appear in summary lines.
  These are paired with what variables they correspond with, along with
  the type of the variable (string, integer, character, etc).")
--- 1178,1187 ----
         (and (boundp 'thread) (car thread)) gnus-tmp-level t)
        ?c)
      (?u gnus-tmp-user-defined ?s)
!     (?P (gnus-pick-line-number) ?d)
!     (?B gnus-tmp-thread-tree-header-string ?s)
!     (user-date (gnus-user-date
!               ,(macroexpand '(mail-header-date gnus-tmp-header))) ?s))
    "An alist of format specifications that can appear in summary lines.
  These are paired with what variables they correspond with, along with
  the type of the variable (string, integer, character, etc).")
***************
*** 1008,1013 ****
--- 1204,1210 ----
      (?u gnus-tmp-user-defined ?s)
      (?d (length gnus-newsgroup-dormant) ?d)
      (?t (length gnus-newsgroup-marked) ?d)
+     (?h (length gnus-newsgroup-spam-marked) ?d)
      (?r (length gnus-newsgroup-reads) ?d)
      (?z (gnus-summary-article-score gnus-tmp-article-number) ?d)
      (?E gnus-newsgroup-expunged-tally ?d)
***************
*** 1019,1024 ****
--- 1216,1223 ----
  (defvar gnus-last-shell-command nil
    "Default shell command on article.")
  
+ (defvar gnus-newsgroup-agentized nil
+   "Locally bound in each summary buffer to indicate whether the server has 
been agentized.")
  (defvar gnus-newsgroup-begin nil)
  (defvar gnus-newsgroup-end nil)
  (defvar gnus-newsgroup-last-rmail nil)
***************
*** 1032,1043 ****
  (defvar gnus-newsgroup-data-reverse nil)
  (defvar gnus-newsgroup-limit nil)
  (defvar gnus-newsgroup-limits nil)
  
  (defvar gnus-newsgroup-unreads nil
!   "List of unread articles in the current newsgroup.")
  
  (defvar gnus-newsgroup-unselected nil
!   "List of unselected unread articles in the current newsgroup.")
  
  (defvar gnus-newsgroup-reads nil
    "Alist of read articles and article marks in the current newsgroup.")
--- 1231,1243 ----
  (defvar gnus-newsgroup-data-reverse nil)
  (defvar gnus-newsgroup-limit nil)
  (defvar gnus-newsgroup-limits nil)
+ (defvar gnus-summary-use-undownloaded-faces nil)
  
  (defvar gnus-newsgroup-unreads nil
!   "Sorted list of unread articles in the current newsgroup.")
  
  (defvar gnus-newsgroup-unselected nil
!   "Sorted list of unselected unread articles in the current newsgroup.")
  
  (defvar gnus-newsgroup-reads nil
    "Alist of read articles and article marks in the current newsgroup.")
***************
*** 1045,1057 ****
  (defvar gnus-newsgroup-expunged-tally nil)
  
  (defvar gnus-newsgroup-marked nil
!   "List of ticked articles in the current newsgroup (a subset of unread 
art).")
  
  (defvar gnus-newsgroup-killed nil
    "List of ranges of articles that have been through the scoring process.")
  
  (defvar gnus-newsgroup-cached nil
!   "List of articles that come from the article cache.")
  
  (defvar gnus-newsgroup-saved nil
    "List of articles that have been saved.")
--- 1245,1260 ----
  (defvar gnus-newsgroup-expunged-tally nil)
  
  (defvar gnus-newsgroup-marked nil
!   "Sorted list of ticked articles in the current newsgroup (a subset of 
unread art).")
! 
! (defvar gnus-newsgroup-spam-marked nil
!   "List of ranges of articles that have been marked as spam.")
  
  (defvar gnus-newsgroup-killed nil
    "List of ranges of articles that have been through the scoring process.")
  
  (defvar gnus-newsgroup-cached nil
!   "Sorted list of articles that come from the article cache.")
  
  (defvar gnus-newsgroup-saved nil
    "List of articles that have been saved.")
***************
*** 1061,1077 ****
  (defvar gnus-newsgroup-replied nil
    "List of articles that have been replied to in the current newsgroup.")
  
  (defvar gnus-newsgroup-expirable nil
!   "List of articles in the current newsgroup that can be expired.")
  
  (defvar gnus-newsgroup-processable nil
    "List of articles in the current newsgroup that can be processed.")
  
  (defvar gnus-newsgroup-downloadable nil
!   "List of articles in the current newsgroup that can be processed.")
  
  (defvar gnus-newsgroup-undownloaded nil
!   "List of articles in the current newsgroup that haven't been downloaded..")
  
  (defvar gnus-newsgroup-unsendable nil
    "List of articles in the current newsgroup that won't be sent.")
--- 1264,1292 ----
  (defvar gnus-newsgroup-replied nil
    "List of articles that have been replied to in the current newsgroup.")
  
+ (defvar gnus-newsgroup-forwarded nil
+   "List of articles that have been forwarded in the current newsgroup.")
+ 
+ (defvar gnus-newsgroup-recent nil
+   "List of articles that have are recent in the current newsgroup.")
+ 
  (defvar gnus-newsgroup-expirable nil
!   "Sorted list of articles in the current newsgroup that can be expired.")
  
  (defvar gnus-newsgroup-processable nil
    "List of articles in the current newsgroup that can be processed.")
  
  (defvar gnus-newsgroup-downloadable nil
!   "Sorted list of articles in the current newsgroup that can be processed.")
! 
! (defvar gnus-newsgroup-unfetched nil
!   "Sorted list of articles in the current newsgroup whose headers have
! not been fetched into the agent.
! 
! This list will always be a subset of gnus-newsgroup-undownloaded.")
  
  (defvar gnus-newsgroup-undownloaded nil
!   "List of articles in the current newsgroup that haven't been downloaded.")
  
  (defvar gnus-newsgroup-unsendable nil
    "List of articles in the current newsgroup that won't be sent.")
***************
*** 1080,1086 ****
    "List of articles in the current newsgroup that have bookmarks.")
  
  (defvar gnus-newsgroup-dormant nil
!   "List of dormant articles in the current newsgroup.")
  
  (defvar gnus-newsgroup-scored nil
    "List of scored articles in the current newsgroup.")
--- 1295,1310 ----
    "List of articles in the current newsgroup that have bookmarks.")
  
  (defvar gnus-newsgroup-dormant nil
!   "Sorted list of dormant articles in the current newsgroup.")
! 
! (defvar gnus-newsgroup-unseen nil
!   "List of unseen articles in the current newsgroup.")
! 
! (defvar gnus-newsgroup-seen nil
!   "Range of seen articles in the current newsgroup.")
! 
! (defvar gnus-newsgroup-articles nil
!   "List of articles in the current newsgroup.")
  
  (defvar gnus-newsgroup-scored nil
    "List of scored articles in the current newsgroup.")
***************
*** 1108,1125 ****
  (defvar gnus-newsgroup-ephemeral-charset nil)
  (defvar gnus-newsgroup-ephemeral-ignored-charsets nil)
  
! (defconst gnus-summary-local-variables
    '(gnus-newsgroup-name
      gnus-newsgroup-begin gnus-newsgroup-end
      gnus-newsgroup-last-rmail gnus-newsgroup-last-mail
      gnus-newsgroup-last-folder gnus-newsgroup-last-file
      gnus-newsgroup-auto-expire gnus-newsgroup-unreads
      gnus-newsgroup-unselected gnus-newsgroup-marked
      gnus-newsgroup-reads gnus-newsgroup-saved
!     gnus-newsgroup-replied gnus-newsgroup-expirable
      gnus-newsgroup-processable gnus-newsgroup-killed
      gnus-newsgroup-downloadable gnus-newsgroup-undownloaded
!     gnus-newsgroup-unsendable
      gnus-newsgroup-bookmarks gnus-newsgroup-dormant
      gnus-newsgroup-headers gnus-newsgroup-threads
      gnus-newsgroup-prepared gnus-summary-highlight-line-function
--- 1332,1356 ----
  (defvar gnus-newsgroup-ephemeral-charset nil)
  (defvar gnus-newsgroup-ephemeral-ignored-charsets nil)
  
! (defvar gnus-article-before-search nil)
! 
! (defvar gnus-summary-local-variables
    '(gnus-newsgroup-name
      gnus-newsgroup-begin gnus-newsgroup-end
      gnus-newsgroup-last-rmail gnus-newsgroup-last-mail
      gnus-newsgroup-last-folder gnus-newsgroup-last-file
      gnus-newsgroup-auto-expire gnus-newsgroup-unreads
      gnus-newsgroup-unselected gnus-newsgroup-marked
+     gnus-newsgroup-spam-marked
      gnus-newsgroup-reads gnus-newsgroup-saved
!     gnus-newsgroup-replied gnus-newsgroup-forwarded
!     gnus-newsgroup-recent
!     gnus-newsgroup-expirable
      gnus-newsgroup-processable gnus-newsgroup-killed
      gnus-newsgroup-downloadable gnus-newsgroup-undownloaded
!     gnus-newsgroup-unfetched
!     gnus-newsgroup-unsendable gnus-newsgroup-unseen
!     gnus-newsgroup-seen gnus-newsgroup-articles
      gnus-newsgroup-bookmarks gnus-newsgroup-dormant
      gnus-newsgroup-headers gnus-newsgroup-threads
      gnus-newsgroup-prepared gnus-summary-highlight-line-function
***************
*** 1141,1151 ****
      gnus-cache-removable-articles gnus-newsgroup-cached
      gnus-newsgroup-data gnus-newsgroup-data-reverse
      gnus-newsgroup-limit gnus-newsgroup-limits
!     gnus-newsgroup-charset)
    "Variables that are buffer-local to the summary buffers.")
  
  ;; Byte-compiler warning.
! (eval-when-compile (defvar gnus-article-mode-map))
  
  ;; MIME stuff.
  
--- 1372,1420 ----
      gnus-cache-removable-articles gnus-newsgroup-cached
      gnus-newsgroup-data gnus-newsgroup-data-reverse
      gnus-newsgroup-limit gnus-newsgroup-limits
!     gnus-newsgroup-charset gnus-newsgroup-display
!     gnus-summary-use-undownloaded-faces)
    "Variables that are buffer-local to the summary buffers.")
  
+ (defvar gnus-newsgroup-variables nil
+   "A list of variables that have separate values in different newsgroups.
+ A list of newsgroup (summary buffer) local variables, or cons of
+ variables and their default expressions to be evalled (when the default
+ values are not nil), that should be made global while the summary buffer
+ is active.
+ 
+ Note: The default expressions will be evaluated (using function `eval')
+ before assignment to the local variable rather than just assigned to it.
+ If the default expression is the symbol `global', that symbol will not
+ be evaluated but the global value of the local variable will be used
+ instead.
+ 
+ These variables can be used to set variables in the group parameters
+ while still allowing them to affect operations done in other buffers.
+ For example:
+ 
+ \(setq gnus-newsgroup-variables
+      '(message-use-followup-to
+        (gnus-visible-headers .
+        \"^From:\\\\|^Newsgroups:\\\\|^Subject:\\\\|^Date:\\\\|^To:\")))
+ ")
+ 
  ;; Byte-compiler warning.
! (eval-when-compile
!   ;; Bind features so that require will believe that gnus-sum has
!   ;; already been loaded (avoids infinite recursion)
!   (let ((features (cons 'gnus-sum features)))
!     ;; Several of the declarations in gnus-sum are needed to load the
!     ;; following files. Right now, these definitions have been
!     ;; compiled but not defined (evaluated).  We could either do a
!     ;; eval-and-compile about all of the declarations or evaluate the
!     ;; source file.
!     (if (boundp 'gnus-newsgroup-variables)
!         nil
!       (load "gnus-sum.el" t t t))
!     (require 'gnus)
!     (require 'gnus-agent)
!     (require 'gnus-art)))
  
  ;; MIME stuff.
  
***************
*** 1153,1165 ****
    '(mail-decode-encoded-word-string)
    "List of methods used to decode encoded words.
  
! This variable is a list of FUNCTION or (REGEXP . FUNCTION).  If item is
! FUNCTION, FUNCTION will be apply to all newsgroups.  If item is a
! (REGEXP . FUNCTION), FUNCTION will be only apply to thes newsgroups
  whose names match REGEXP.
  
  For example:
! ((\"chinese\" . gnus-decode-encoded-word-string-by-guess)
   mail-decode-encoded-word-string
   (\"chinese\" . rfc1843-decode-string))")
  
--- 1422,1434 ----
    '(mail-decode-encoded-word-string)
    "List of methods used to decode encoded words.
  
! This variable is a list of FUNCTION or (REGEXP . FUNCTION).  If item
! is FUNCTION, FUNCTION will be apply to all newsgroups.  If item is a
! \(REGEXP . FUNCTION), FUNCTION will be only apply to thes newsgroups
  whose names match REGEXP.
  
  For example:
! \((\"chinese\" . gnus-decode-encoded-word-string-by-guess)
   mail-decode-encoded-word-string
   (\"chinese\" . rfc1843-decode-string))")
  
***************
*** 1178,1184 ****
                         (string-match (car x) gnus-newsgroup-name))
                    (nconc gnus-decode-encoded-word-methods-cache
                           (list (cdr x))))))
!         gnus-decode-encoded-word-methods))
    (let ((xlist gnus-decode-encoded-word-methods-cache))
      (pop xlist)
      (while xlist
--- 1447,1453 ----
                         (string-match (car x) gnus-newsgroup-name))
                    (nconc gnus-decode-encoded-word-methods-cache
                           (list (cdr x))))))
!           gnus-decode-encoded-word-methods))
    (let ((xlist gnus-decode-encoded-word-methods-cache))
      (pop xlist)
      (while xlist
***************
*** 1189,1211 ****
  
  (defun gnus-simplify-whitespace (str)
    "Remove excessive whitespace from STR."
!   (let ((mystr str))
!     ;; Multiple spaces.
!     (while (string-match "[ \t][ \t]+" mystr)
!       (setq mystr (concat (substring mystr 0 (match-beginning 0))
!                           " "
!                           (substring mystr (match-end 0)))))
!     ;; Leading spaces.
!     (when (string-match "^[ \t]+" mystr)
!       (setq mystr (substring mystr (match-end 0))))
!     ;; Trailing spaces.
!     (when (string-match "[ \t]+$" mystr)
!       (setq mystr (substring mystr 0 (match-beginning 0))))
!     mystr))
  
  (defsubst gnus-simplify-subject-re (subject)
    "Remove \"Re:\" from subject lines."
!   (if (string-match "^[Rr][Ee]: *" subject)
        (substring subject (match-end 0))
      subject))
  
--- 1458,1485 ----
  
  (defun gnus-simplify-whitespace (str)
    "Remove excessive whitespace from STR."
!   ;; Multiple spaces.
!   (while (string-match "[ \t][ \t]+" str)
!     (setq str (concat (substring str 0 (match-beginning 0))
!                       " "
!                       (substring str (match-end 0)))))
!   ;; Leading spaces.
!   (when (string-match "^[ \t]+" str)
!     (setq str (substring str (match-end 0))))
!   ;; Trailing spaces.
!   (when (string-match "[ \t]+$" str)
!     (setq str (substring str 0 (match-beginning 0))))
!   str)
! 
! (defun gnus-simplify-all-whitespace (str)
!   "Remove all whitespace from STR."
!   (while (string-match "[ \t\n]+" str)
!     (setq str (replace-match "" nil nil str)))
!   str)
  
  (defsubst gnus-simplify-subject-re (subject)
    "Remove \"Re:\" from subject lines."
!   (if (string-match message-subject-re-regexp subject)
        (substring subject (match-end 0))
      subject))
  
***************
*** 1279,1285 ****
        (buffer-string))))
  
  (defsubst gnus-simplify-subject-fully (subject)
!   "Simplify a subject string according to gnus-summary-gather-subject-limit."
    (cond
     (gnus-simplify-subject-functions
      (gnus-map-function gnus-simplify-subject-functions subject))
--- 1553,1559 ----
        (buffer-string))))
  
  (defsubst gnus-simplify-subject-fully (subject)
!   "Simplify a subject string according to 
`gnus-summary-gather-subject-limit'."
    (cond
     (gnus-simplify-subject-functions
      (gnus-map-function gnus-simplify-subject-functions subject))
***************
*** 1295,1301 ****
  
  (defsubst gnus-subject-equal (s1 s2 &optional simple-first)
    "Check whether two subjects are equal.
! If optional argument simple-first is t, first argument is already
  simplified."
    (cond
     ((null simple-first)
--- 1569,1575 ----
  
  (defsubst gnus-subject-equal (s1 s2 &optional simple-first)
    "Check whether two subjects are equal.
! If optional argument SIMPLE-FIRST is t, first argument is already
  simplified."
    (cond
     ((null simple-first)
***************
*** 1320,1671 ****
  
  (defvar gnus-article-commands-menu)
  
! (when t
!   ;; Non-orthogonal keys
  
!   (gnus-define-keys gnus-summary-mode-map
!     " " gnus-summary-next-page
!     "\177" gnus-summary-prev-page
!     [delete] gnus-summary-prev-page
!     [backspace] gnus-summary-prev-page
!     "\r" gnus-summary-scroll-up
!     "\M-\r" gnus-summary-scroll-down
!     "n" gnus-summary-next-unread-article
!     "p" gnus-summary-prev-unread-article
!     "N" gnus-summary-next-article
!     "P" gnus-summary-prev-article
!     "\M-\C-n" gnus-summary-next-same-subject
!     "\M-\C-p" gnus-summary-prev-same-subject
!     "\M-n" gnus-summary-next-unread-subject
!     "\M-p" gnus-summary-prev-unread-subject
!     "." gnus-summary-first-unread-article
!     "," gnus-summary-best-unread-article
!     "\M-s" gnus-summary-search-article-forward
!     "\M-r" gnus-summary-search-article-backward
!     "<" gnus-summary-beginning-of-article
!     ">" gnus-summary-end-of-article
!     "j" gnus-summary-goto-article
!     "^" gnus-summary-refer-parent-article
!     "\M-^" gnus-summary-refer-article
!     "u" gnus-summary-tick-article-forward
!     "!" gnus-summary-tick-article-forward
!     "U" gnus-summary-tick-article-backward
!     "d" gnus-summary-mark-as-read-forward
!     "D" gnus-summary-mark-as-read-backward
!     "E" gnus-summary-mark-as-expirable
!     "\M-u" gnus-summary-clear-mark-forward
!     "\M-U" gnus-summary-clear-mark-backward
!     "k" gnus-summary-kill-same-subject-and-select
!     "\C-k" gnus-summary-kill-same-subject
!     "\M-\C-k" gnus-summary-kill-thread
!     "\M-\C-l" gnus-summary-lower-thread
!     "e" gnus-summary-edit-article
!     "#" gnus-summary-mark-as-processable
!     "\M-#" gnus-summary-unmark-as-processable
!     "\M-\C-t" gnus-summary-toggle-threads
!     "\M-\C-s" gnus-summary-show-thread
!     "\M-\C-h" gnus-summary-hide-thread
!     "\M-\C-f" gnus-summary-next-thread
!     "\M-\C-b" gnus-summary-prev-thread
!     [(meta down)] gnus-summary-next-thread
!     [(meta up)] gnus-summary-prev-thread
!     "\M-\C-u" gnus-summary-up-thread
!     "\M-\C-d" gnus-summary-down-thread
!     "&" gnus-summary-execute-command
!     "c" gnus-summary-catchup-and-exit
!     "\C-w" gnus-summary-mark-region-as-read
!     "\C-t" gnus-summary-toggle-truncation
!     "?" gnus-summary-mark-as-dormant
!     "\C-c\M-\C-s" gnus-summary-limit-include-expunged
!     "\C-c\C-s\C-n" gnus-summary-sort-by-number
!     "\C-c\C-s\C-l" gnus-summary-sort-by-lines
!     "\C-c\C-s\C-c" gnus-summary-sort-by-chars
!     "\C-c\C-s\C-a" gnus-summary-sort-by-author
!     "\C-c\C-s\C-s" gnus-summary-sort-by-subject
!     "\C-c\C-s\C-d" gnus-summary-sort-by-date
!     "\C-c\C-s\C-i" gnus-summary-sort-by-score
!     "=" gnus-summary-expand-window
!     "\C-x\C-s" gnus-summary-reselect-current-group
!     "\M-g" gnus-summary-rescan-group
!     "w" gnus-summary-stop-page-breaking
!     "\C-c\C-r" gnus-summary-caesar-message
!     "f" gnus-summary-followup
!     "F" gnus-summary-followup-with-original
!     "C" gnus-summary-cancel-article
!     "r" gnus-summary-reply
!     "R" gnus-summary-reply-with-original
!     "\C-c\C-f" gnus-summary-mail-forward
!     "o" gnus-summary-save-article
!     "\C-o" gnus-summary-save-article-mail
!     "|" gnus-summary-pipe-output
!     "\M-k" gnus-summary-edit-local-kill
!     "\M-K" gnus-summary-edit-global-kill
!     ;; "V" gnus-version
!     "\C-c\C-d" gnus-summary-describe-group
!     "q" gnus-summary-exit
!     "Q" gnus-summary-exit-no-update
!     "\C-c\C-i" gnus-info-find-node
!     gnus-mouse-2 gnus-mouse-pick-article
!     "m" gnus-summary-mail-other-window
!     "a" gnus-summary-post-news
!     "x" gnus-summary-limit-to-unread
!     "s" gnus-summary-isearch-article
!     "t" gnus-summary-toggle-header
!     "g" gnus-summary-show-article
!     "l" gnus-summary-goto-last-article
!     "\C-c\C-v\C-v" gnus-uu-decode-uu-view
!     "\C-d" gnus-summary-enter-digest-group
!     "\M-\C-d" gnus-summary-read-document
!     "\M-\C-e" gnus-summary-edit-parameters
!     "\M-\C-a" gnus-summary-customize-parameters
!     "\C-c\C-b" gnus-bug
!     "*" gnus-cache-enter-article
!     "\M-*" gnus-cache-remove-article
!     "\M-&" gnus-summary-universal-argument
!     "\C-l" gnus-recenter
!     "I" gnus-summary-increase-score
!     "L" gnus-summary-lower-score
!     "\M-i" gnus-symbolic-argument
!     "h" gnus-summary-select-article-buffer
! 
!     "b" gnus-article-view-part
!     "\M-t" gnus-summary-toggle-display-buttonized
! 
!     "V" gnus-summary-score-map
!     "X" gnus-uu-extract-map
!     "S" gnus-summary-send-map)
! 
!   ;; Sort of orthogonal keymap
!   (gnus-define-keys (gnus-summary-mark-map "M" gnus-summary-mode-map)
!     "t" gnus-summary-tick-article-forward
!     "!" gnus-summary-tick-article-forward
!     "d" gnus-summary-mark-as-read-forward
!     "r" gnus-summary-mark-as-read-forward
!     "c" gnus-summary-clear-mark-forward
!     " " gnus-summary-clear-mark-forward
!     "e" gnus-summary-mark-as-expirable
!     "x" gnus-summary-mark-as-expirable
!     "?" gnus-summary-mark-as-dormant
!     "b" gnus-summary-set-bookmark
!     "B" gnus-summary-remove-bookmark
!     "#" gnus-summary-mark-as-processable
!     "\M-#" gnus-summary-unmark-as-processable
!     "S" gnus-summary-limit-include-expunged
!     "C" gnus-summary-catchup
!     "H" gnus-summary-catchup-to-here
!     "\C-c" gnus-summary-catchup-all
!     "k" gnus-summary-kill-same-subject-and-select
!     "K" gnus-summary-kill-same-subject
!     "P" gnus-uu-mark-map)
! 
!   (gnus-define-keys (gnus-summary-mscore-map "V" gnus-summary-mark-map)
!     "c" gnus-summary-clear-above
!     "u" gnus-summary-tick-above
!     "m" gnus-summary-mark-above
!     "k" gnus-summary-kill-below)
! 
!   (gnus-define-keys (gnus-summary-limit-map "/" gnus-summary-mode-map)
!     "/" gnus-summary-limit-to-subject
!     "n" gnus-summary-limit-to-articles
!     "w" gnus-summary-pop-limit
!     "s" gnus-summary-limit-to-subject
!     "a" gnus-summary-limit-to-author
!     "u" gnus-summary-limit-to-unread
!     "m" gnus-summary-limit-to-marks
!     "M" gnus-summary-limit-exclude-marks
!     "v" gnus-summary-limit-to-score
!     "*" gnus-summary-limit-include-cached
!     "D" gnus-summary-limit-include-dormant
!     "T" gnus-summary-limit-include-thread
!     "d" gnus-summary-limit-exclude-dormant
!     "t" gnus-summary-limit-to-age
!     "x" gnus-summary-limit-to-extra
!     "E" gnus-summary-limit-include-expunged
!     "c" gnus-summary-limit-exclude-childless-dormant
!     "C" gnus-summary-limit-mark-excluded-as-read)
! 
!   (gnus-define-keys (gnus-summary-goto-map "G" gnus-summary-mode-map)
!     "n" gnus-summary-next-unread-article
!     "p" gnus-summary-prev-unread-article
!     "N" gnus-summary-next-article
!     "P" gnus-summary-prev-article
!     "\C-n" gnus-summary-next-same-subject
!     "\C-p" gnus-summary-prev-same-subject
!     "\M-n" gnus-summary-next-unread-subject
!     "\M-p" gnus-summary-prev-unread-subject
!     "f" gnus-summary-first-unread-article
!     "b" gnus-summary-best-unread-article
!     "j" gnus-summary-goto-article
!     "g" gnus-summary-goto-subject
!     "l" gnus-summary-goto-last-article
!     "o" gnus-summary-pop-article)
! 
!   (gnus-define-keys (gnus-summary-thread-map "T" gnus-summary-mode-map)
!     "k" gnus-summary-kill-thread
!     "l" gnus-summary-lower-thread
!     "i" gnus-summary-raise-thread
!     "T" gnus-summary-toggle-threads
!     "t" gnus-summary-rethread-current
!     "^" gnus-summary-reparent-thread
!     "s" gnus-summary-show-thread
!     "S" gnus-summary-show-all-threads
!     "h" gnus-summary-hide-thread
!     "H" gnus-summary-hide-all-threads
!     "n" gnus-summary-next-thread
!     "p" gnus-summary-prev-thread
!     "u" gnus-summary-up-thread
!     "o" gnus-summary-top-thread
!     "d" gnus-summary-down-thread
!     "#" gnus-uu-mark-thread
!     "\M-#" gnus-uu-unmark-thread)
! 
!   (gnus-define-keys (gnus-summary-buffer-map "Y" gnus-summary-mode-map)
!     "g" gnus-summary-prepare
!     "c" gnus-summary-insert-cached-articles)
! 
!   (gnus-define-keys (gnus-summary-exit-map "Z" gnus-summary-mode-map)
!     "c" gnus-summary-catchup-and-exit
!     "C" gnus-summary-catchup-all-and-exit
!     "E" gnus-summary-exit-no-update
!     "Q" gnus-summary-exit
!     "Z" gnus-summary-exit
!     "n" gnus-summary-catchup-and-goto-next-group
!     "R" gnus-summary-reselect-current-group
!     "G" gnus-summary-rescan-group
!     "N" gnus-summary-next-group
!     "s" gnus-summary-save-newsrc
!     "P" gnus-summary-prev-group)
! 
!   (gnus-define-keys (gnus-summary-article-map "A" gnus-summary-mode-map)
!     " " gnus-summary-next-page
!     "n" gnus-summary-next-page
!     "\177" gnus-summary-prev-page
!     [delete] gnus-summary-prev-page
!     "p" gnus-summary-prev-page
!     "\r" gnus-summary-scroll-up
!     "\M-\r" gnus-summary-scroll-down
!     "<" gnus-summary-beginning-of-article
!     ">" gnus-summary-end-of-article
!     "b" gnus-summary-beginning-of-article
!     "e" gnus-summary-end-of-article
!     "^" gnus-summary-refer-parent-article
!     "r" gnus-summary-refer-parent-article
!     "D" gnus-summary-enter-digest-group
!     "R" gnus-summary-refer-references
!     "T" gnus-summary-refer-thread
!     "g" gnus-summary-show-article
!     "s" gnus-summary-isearch-article
!     "P" gnus-summary-print-article
!     "t" gnus-article-babel)
! 
!   (gnus-define-keys (gnus-summary-wash-map "W" gnus-summary-mode-map)
!     "b" gnus-article-add-buttons
!     "B" gnus-article-add-buttons-to-head
!     "o" gnus-article-treat-overstrike
!     "e" gnus-article-emphasize
!     "w" gnus-article-fill-cited-article
!     "Q" gnus-article-fill-long-lines
!     "C" gnus-article-capitalize-sentences
!     "c" gnus-article-remove-cr
!     "q" gnus-article-de-quoted-unreadable
!     "6" gnus-article-de-base64-unreadable
!     "Z" gnus-article-decode-HZ
!     "h" gnus-article-wash-html
!     "f" gnus-article-display-x-face
!     "l" gnus-summary-stop-page-breaking
!     "r" gnus-summary-caesar-message
!     "t" gnus-summary-toggle-header
!     "v" gnus-summary-verbose-headers
!     "H" gnus-article-strip-headers-in-body
!     "d" gnus-article-treat-dumbquotes)
! 
!   (gnus-define-keys (gnus-summary-wash-hide-map "W" gnus-summary-wash-map)
!     "a" gnus-article-hide
!     "h" gnus-article-hide-headers
!     "b" gnus-article-hide-boring-headers
!     "s" gnus-article-hide-signature
!     "c" gnus-article-hide-citation
!     "C" gnus-article-hide-citation-in-followups
!     "l" gnus-article-hide-list-identifiers
!     "p" gnus-article-hide-pgp
!     "B" gnus-article-strip-banner
!     "P" gnus-article-hide-pem
!     "\C-c" gnus-article-hide-citation-maybe)
! 
!   (gnus-define-keys (gnus-summary-wash-highlight-map "H" 
gnus-summary-wash-map)
!     "a" gnus-article-highlight
!     "h" gnus-article-highlight-headers
!     "c" gnus-article-highlight-citation
!     "s" gnus-article-highlight-signature)
! 
!   (gnus-define-keys (gnus-summary-wash-mime-map "M" gnus-summary-wash-map)
!     "w" gnus-article-decode-mime-words
!     "c" gnus-article-decode-charset
!     "v" gnus-mime-view-all-parts
!     "b" gnus-article-view-part)
! 
!   (gnus-define-keys (gnus-summary-wash-time-map "T" gnus-summary-wash-map)
!     "z" gnus-article-date-ut
!     "u" gnus-article-date-ut
!     "l" gnus-article-date-local
!     "e" gnus-article-date-lapsed
!     "o" gnus-article-date-original
!     "i" gnus-article-date-iso8601
!     "s" gnus-article-date-user)
! 
!   (gnus-define-keys (gnus-summary-wash-empty-map "E" gnus-summary-wash-map)
!     "t" gnus-article-remove-trailing-blank-lines
!     "l" gnus-article-strip-leading-blank-lines
!     "m" gnus-article-strip-multiple-blank-lines
!     "a" gnus-article-strip-blank-lines
!     "A" gnus-article-strip-all-blank-lines
!     "s" gnus-article-strip-leading-space
!     "e" gnus-article-strip-trailing-space)
! 
!   (gnus-define-keys (gnus-summary-help-map "H" gnus-summary-mode-map)
!     "v" gnus-version
!     "f" gnus-summary-fetch-faq
!     "d" gnus-summary-describe-group
!     "h" gnus-summary-describe-briefly
!     "i" gnus-info-find-node)
! 
!   (gnus-define-keys (gnus-summary-backend-map "B" gnus-summary-mode-map)
!     "e" gnus-summary-expire-articles
!     "\M-\C-e" gnus-summary-expire-articles-now
!     "\177" gnus-summary-delete-article
!     [delete] gnus-summary-delete-article
!     [backspace] gnus-summary-delete-article
!     "m" gnus-summary-move-article
!     "r" gnus-summary-respool-article
!     "w" gnus-summary-edit-article
!     "c" gnus-summary-copy-article
!     "B" gnus-summary-crosspost-article
!     "q" gnus-summary-respool-query
!     "t" gnus-summary-respool-trace
!     "i" gnus-summary-import-article
!     "p" gnus-summary-article-posted-p)
! 
!   (gnus-define-keys (gnus-summary-save-map "O" gnus-summary-mode-map)
!     "o" gnus-summary-save-article
!     "m" gnus-summary-save-article-mail
!     "F" gnus-summary-write-article-file
!     "r" gnus-summary-save-article-rmail
!     "f" gnus-summary-save-article-file
!     "b" gnus-summary-save-article-body-file
!     "h" gnus-summary-save-article-folder
!     "v" gnus-summary-save-article-vm
!     "p" gnus-summary-pipe-output
!     "s" gnus-soup-add-article)
! 
!   (gnus-define-keys (gnus-summary-mime-map "K" gnus-summary-mode-map)
!     "b" gnus-summary-display-buttonized
!     "m" gnus-summary-repair-multipart
!     "v" gnus-article-view-part
!     "o" gnus-article-save-part
!     "c" gnus-article-copy-part
!     "e" gnus-article-externalize-part
!     "i" gnus-article-inline-part
!     "|" gnus-article-pipe-part))
  
  (defun gnus-summary-make-menu-bar ()
    (gnus-turn-off-edit-menu 'summary)
--- 1594,2060 ----
  
  (defvar gnus-article-commands-menu)
  
! ;; Non-orthogonal keys
  
! (gnus-define-keys gnus-summary-mode-map
!   " " gnus-summary-next-page
!   "\177" gnus-summary-prev-page
!   [delete] gnus-summary-prev-page
!   [backspace] gnus-summary-prev-page
!   "\r" gnus-summary-scroll-up
!   "\M-\r" gnus-summary-scroll-down
!   "n" gnus-summary-next-unread-article
!   "p" gnus-summary-prev-unread-article
!   "N" gnus-summary-next-article
!   "P" gnus-summary-prev-article
!   "\M-\C-n" gnus-summary-next-same-subject
!   "\M-\C-p" gnus-summary-prev-same-subject
!   "\M-n" gnus-summary-next-unread-subject
!   "\M-p" gnus-summary-prev-unread-subject
!   "." gnus-summary-first-unread-article
!   "," gnus-summary-best-unread-article
!   "\M-s" gnus-summary-search-article-forward
!   "\M-r" gnus-summary-search-article-backward
!   "<" gnus-summary-beginning-of-article
!   ">" gnus-summary-end-of-article
!   "j" gnus-summary-goto-article
!   "^" gnus-summary-refer-parent-article
!   "\M-^" gnus-summary-refer-article
!   "u" gnus-summary-tick-article-forward
!   "!" gnus-summary-tick-article-forward
!   "U" gnus-summary-tick-article-backward
!   "d" gnus-summary-mark-as-read-forward
!   "D" gnus-summary-mark-as-read-backward
!   "E" gnus-summary-mark-as-expirable
!   "\M-u" gnus-summary-clear-mark-forward
!   "\M-U" gnus-summary-clear-mark-backward
!   "k" gnus-summary-kill-same-subject-and-select
!   "\C-k" gnus-summary-kill-same-subject
!   "\M-\C-k" gnus-summary-kill-thread
!   "\M-\C-l" gnus-summary-lower-thread
!   "e" gnus-summary-edit-article
!   "#" gnus-summary-mark-as-processable
!   "\M-#" gnus-summary-unmark-as-processable
!   "\M-\C-t" gnus-summary-toggle-threads
!   "\M-\C-s" gnus-summary-show-thread
!   "\M-\C-h" gnus-summary-hide-thread
!   "\M-\C-f" gnus-summary-next-thread
!   "\M-\C-b" gnus-summary-prev-thread
!   [(meta down)] gnus-summary-next-thread
!   [(meta up)] gnus-summary-prev-thread
!   "\M-\C-u" gnus-summary-up-thread
!   "\M-\C-d" gnus-summary-down-thread
!   "&" gnus-summary-execute-command
!   "c" gnus-summary-catchup-and-exit
!   "\C-w" gnus-summary-mark-region-as-read
!   "\C-t" gnus-summary-toggle-truncation
!   "?" gnus-summary-mark-as-dormant
!   "\C-c\M-\C-s" gnus-summary-limit-include-expunged
!   "\C-c\C-s\C-n" gnus-summary-sort-by-number
!   "\C-c\C-s\C-l" gnus-summary-sort-by-lines
!   "\C-c\C-s\C-c" gnus-summary-sort-by-chars
!   "\C-c\C-s\C-a" gnus-summary-sort-by-author
!   "\C-c\C-s\C-s" gnus-summary-sort-by-subject
!   "\C-c\C-s\C-d" gnus-summary-sort-by-date
!   "\C-c\C-s\C-i" gnus-summary-sort-by-score
!   "\C-c\C-s\C-o" gnus-summary-sort-by-original
!   "\C-c\C-s\C-r" gnus-summary-sort-by-random
!   "=" gnus-summary-expand-window
!   "\C-x\C-s" gnus-summary-reselect-current-group
!   "\M-g" gnus-summary-rescan-group
!   "w" gnus-summary-stop-page-breaking
!   "\C-c\C-r" gnus-summary-caesar-message
!   "f" gnus-summary-followup
!   "F" gnus-summary-followup-with-original
!   "C" gnus-summary-cancel-article
!   "r" gnus-summary-reply
!   "R" gnus-summary-reply-with-original
!   "\C-c\C-f" gnus-summary-mail-forward
!   "o" gnus-summary-save-article
!   "\C-o" gnus-summary-save-article-mail
!   "|" gnus-summary-pipe-output
!   "\M-k" gnus-summary-edit-local-kill
!   "\M-K" gnus-summary-edit-global-kill
!   ;; "V" gnus-version
!   "\C-c\C-d" gnus-summary-describe-group
!   "q" gnus-summary-exit
!   "Q" gnus-summary-exit-no-update
!   "\C-c\C-i" gnus-info-find-node
!   gnus-mouse-2 gnus-mouse-pick-article
!   "m" gnus-summary-mail-other-window
!   "a" gnus-summary-post-news
!   "i" gnus-summary-news-other-window
!   "x" gnus-summary-limit-to-unread
!   "s" gnus-summary-isearch-article
!   "t" gnus-summary-toggle-header
!   "g" gnus-summary-show-article
!   "l" gnus-summary-goto-last-article
!   "\C-c\C-v\C-v" gnus-uu-decode-uu-view
!   "\C-d" gnus-summary-enter-digest-group
!   "\M-\C-d" gnus-summary-read-document
!   "\M-\C-e" gnus-summary-edit-parameters
!   "\M-\C-a" gnus-summary-customize-parameters
!   "\C-c\C-b" gnus-bug
!   "*" gnus-cache-enter-article
!   "\M-*" gnus-cache-remove-article
!   "\M-&" gnus-summary-universal-argument
!   "\C-l" gnus-recenter
!   "I" gnus-summary-increase-score
!   "L" gnus-summary-lower-score
!   "\M-i" gnus-symbolic-argument
!   "h" gnus-summary-select-article-buffer
! 
!   "b" gnus-article-view-part
!   "\M-t" gnus-summary-toggle-display-buttonized
! 
!   "V" gnus-summary-score-map
!   "X" gnus-uu-extract-map
!   "S" gnus-summary-send-map)
! 
! ;; Sort of orthogonal keymap
! (gnus-define-keys (gnus-summary-mark-map "M" gnus-summary-mode-map)
!   "t" gnus-summary-tick-article-forward
!   "!" gnus-summary-tick-article-forward
!   "d" gnus-summary-mark-as-read-forward
!   "r" gnus-summary-mark-as-read-forward
!   "c" gnus-summary-clear-mark-forward
!   " " gnus-summary-clear-mark-forward
!   "e" gnus-summary-mark-as-expirable
!   "x" gnus-summary-mark-as-expirable
!   "?" gnus-summary-mark-as-dormant
!   "b" gnus-summary-set-bookmark
!   "B" gnus-summary-remove-bookmark
!   "#" gnus-summary-mark-as-processable
!   "\M-#" gnus-summary-unmark-as-processable
!   "S" gnus-summary-limit-include-expunged
!   "C" gnus-summary-catchup
!   "H" gnus-summary-catchup-to-here
!   "h" gnus-summary-catchup-from-here
!   "\C-c" gnus-summary-catchup-all
!   "k" gnus-summary-kill-same-subject-and-select
!   "K" gnus-summary-kill-same-subject
!   "P" gnus-uu-mark-map)
! 
! (gnus-define-keys (gnus-summary-mscore-map "V" gnus-summary-mark-map)
!   "c" gnus-summary-clear-above
!   "u" gnus-summary-tick-above
!   "m" gnus-summary-mark-above
!   "k" gnus-summary-kill-below)
! 
! (gnus-define-keys (gnus-summary-limit-map "/" gnus-summary-mode-map)
!   "/" gnus-summary-limit-to-subject
!   "n" gnus-summary-limit-to-articles
!   "w" gnus-summary-pop-limit
!   "s" gnus-summary-limit-to-subject
!   "a" gnus-summary-limit-to-author
!   "u" gnus-summary-limit-to-unread
!   "m" gnus-summary-limit-to-marks
!   "M" gnus-summary-limit-exclude-marks
!   "v" gnus-summary-limit-to-score
!   "*" gnus-summary-limit-include-cached
!   "D" gnus-summary-limit-include-dormant
!   "T" gnus-summary-limit-include-thread
!   "d" gnus-summary-limit-exclude-dormant
!   "t" gnus-summary-limit-to-age
!   "." gnus-summary-limit-to-unseen
!   "x" gnus-summary-limit-to-extra
!   "p" gnus-summary-limit-to-display-predicate
!   "E" gnus-summary-limit-include-expunged
!   "c" gnus-summary-limit-exclude-childless-dormant
!   "C" gnus-summary-limit-mark-excluded-as-read
!   "o" gnus-summary-insert-old-articles
!   "N" gnus-summary-insert-new-articles)
! 
! (gnus-define-keys (gnus-summary-goto-map "G" gnus-summary-mode-map)
!   "n" gnus-summary-next-unread-article
!   "p" gnus-summary-prev-unread-article
!   "N" gnus-summary-next-article
!   "P" gnus-summary-prev-article
!   "\C-n" gnus-summary-next-same-subject
!   "\C-p" gnus-summary-prev-same-subject
!   "\M-n" gnus-summary-next-unread-subject
!   "\M-p" gnus-summary-prev-unread-subject
!   "f" gnus-summary-first-unread-article
!   "b" gnus-summary-best-unread-article
!   "j" gnus-summary-goto-article
!   "g" gnus-summary-goto-subject
!   "l" gnus-summary-goto-last-article
!   "o" gnus-summary-pop-article)
! 
! (gnus-define-keys (gnus-summary-thread-map "T" gnus-summary-mode-map)
!   "k" gnus-summary-kill-thread
!   "l" gnus-summary-lower-thread
!   "i" gnus-summary-raise-thread
!   "T" gnus-summary-toggle-threads
!   "t" gnus-summary-rethread-current
!   "^" gnus-summary-reparent-thread
!   "s" gnus-summary-show-thread
!   "S" gnus-summary-show-all-threads
!   "h" gnus-summary-hide-thread
!   "H" gnus-summary-hide-all-threads
!   "n" gnus-summary-next-thread
!   "p" gnus-summary-prev-thread
!   "u" gnus-summary-up-thread
!   "o" gnus-summary-top-thread
!   "d" gnus-summary-down-thread
!   "#" gnus-uu-mark-thread
!   "\M-#" gnus-uu-unmark-thread)
! 
! (gnus-define-keys (gnus-summary-buffer-map "Y" gnus-summary-mode-map)
!   "g" gnus-summary-prepare
!   "c" gnus-summary-insert-cached-articles
!   "d" gnus-summary-insert-dormant-articles)
! 
! (gnus-define-keys (gnus-summary-exit-map "Z" gnus-summary-mode-map)
!   "c" gnus-summary-catchup-and-exit
!   "C" gnus-summary-catchup-all-and-exit
!   "E" gnus-summary-exit-no-update
!   "Q" gnus-summary-exit
!   "Z" gnus-summary-exit
!   "n" gnus-summary-catchup-and-goto-next-group
!   "R" gnus-summary-reselect-current-group
!   "G" gnus-summary-rescan-group
!   "N" gnus-summary-next-group
!   "s" gnus-summary-save-newsrc
!   "P" gnus-summary-prev-group)
! 
! (gnus-define-keys (gnus-summary-article-map "A" gnus-summary-mode-map)
!   " " gnus-summary-next-page
!   "n" gnus-summary-next-page
!   "\177" gnus-summary-prev-page
!   [delete] gnus-summary-prev-page
!   "p" gnus-summary-prev-page
!   "\r" gnus-summary-scroll-up
!   "\M-\r" gnus-summary-scroll-down
!   "<" gnus-summary-beginning-of-article
!   ">" gnus-summary-end-of-article
!   "b" gnus-summary-beginning-of-article
!   "e" gnus-summary-end-of-article
!   "^" gnus-summary-refer-parent-article
!   "r" gnus-summary-refer-parent-article
!   "D" gnus-summary-enter-digest-group
!   "R" gnus-summary-refer-references
!   "T" gnus-summary-refer-thread
!   "g" gnus-summary-show-article
!   "s" gnus-summary-isearch-article
!   "P" gnus-summary-print-article
!   "M" gnus-mailing-list-insinuate
!   "t" gnus-article-babel)
! 
! (gnus-define-keys (gnus-summary-wash-map "W" gnus-summary-mode-map)
!   "b" gnus-article-add-buttons
!   "B" gnus-article-add-buttons-to-head
!   "o" gnus-article-treat-overstrike
!   "e" gnus-article-emphasize
!   "w" gnus-article-fill-cited-article
!   "Q" gnus-article-fill-long-lines
!   "C" gnus-article-capitalize-sentences
!   "c" gnus-article-remove-cr
!   "q" gnus-article-de-quoted-unreadable
!   "6" gnus-article-de-base64-unreadable
!   "Z" gnus-article-decode-HZ
!   "h" gnus-article-wash-html
!   "u" gnus-article-unsplit-urls
!   "s" gnus-summary-force-verify-and-decrypt
!   "f" gnus-article-display-x-face
!   "l" gnus-summary-stop-page-breaking
!   "r" gnus-summary-caesar-message
!   "m" gnus-summary-morse-message
!   "t" gnus-summary-toggle-header
!   "g" gnus-treat-smiley
!   "v" gnus-summary-verbose-headers
!   "a" gnus-article-strip-headers-in-body ;; mnemonic: wash archive
!   "p" gnus-article-verify-x-pgp-sig
!   "d" gnus-article-treat-dumbquotes)
! 
! (gnus-define-keys (gnus-summary-wash-deuglify-map "Y" gnus-summary-wash-map)
!   ;; mnemonic: deuglif*Y*
!   "u" gnus-article-outlook-unwrap-lines
!   "a" gnus-article-outlook-repair-attribution
!   "c" gnus-article-outlook-rearrange-citation
!   "f" gnus-article-outlook-deuglify-article) ;; mnemonic: full deuglify
! 
! (gnus-define-keys (gnus-summary-wash-hide-map "W" gnus-summary-wash-map)
!   "a" gnus-article-hide
!   "h" gnus-article-hide-headers
!   "b" gnus-article-hide-boring-headers
!   "s" gnus-article-hide-signature
!   "c" gnus-article-hide-citation
!   "C" gnus-article-hide-citation-in-followups
!   "l" gnus-article-hide-list-identifiers
!   "B" gnus-article-strip-banner
!   "P" gnus-article-hide-pem
!   "\C-c" gnus-article-hide-citation-maybe)
! 
! (gnus-define-keys (gnus-summary-wash-highlight-map "H" gnus-summary-wash-map)
!   "a" gnus-article-highlight
!   "h" gnus-article-highlight-headers
!   "c" gnus-article-highlight-citation
!   "s" gnus-article-highlight-signature)
! 
! (gnus-define-keys (gnus-summary-wash-header-map "G" gnus-summary-wash-map)
!   "f" gnus-article-treat-fold-headers
!   "u" gnus-article-treat-unfold-headers
!   "n" gnus-article-treat-fold-newsgroups)
! 
! (gnus-define-keys (gnus-summary-wash-display-map "D" gnus-summary-wash-map)
!   "x" gnus-article-display-x-face
!   "d" gnus-article-display-face
!   "s" gnus-treat-smiley
!   "D" gnus-article-remove-images
!   "f" gnus-treat-from-picon
!   "m" gnus-treat-mail-picon
!   "n" gnus-treat-newsgroups-picon)
! 
! (gnus-define-keys (gnus-summary-wash-mime-map "M" gnus-summary-wash-map)
!   "w" gnus-article-decode-mime-words
!   "c" gnus-article-decode-charset
!   "v" gnus-mime-view-all-parts
!   "b" gnus-article-view-part)
! 
! (gnus-define-keys (gnus-summary-wash-time-map "T" gnus-summary-wash-map)
!   "z" gnus-article-date-ut
!   "u" gnus-article-date-ut
!   "l" gnus-article-date-local
!   "p" gnus-article-date-english
!   "e" gnus-article-date-lapsed
!   "o" gnus-article-date-original
!   "i" gnus-article-date-iso8601
!   "s" gnus-article-date-user)
! 
! (gnus-define-keys (gnus-summary-wash-empty-map "E" gnus-summary-wash-map)
!   "t" gnus-article-remove-trailing-blank-lines
!   "l" gnus-article-strip-leading-blank-lines
!   "m" gnus-article-strip-multiple-blank-lines
!   "a" gnus-article-strip-blank-lines
!   "A" gnus-article-strip-all-blank-lines
!   "s" gnus-article-strip-leading-space
!   "e" gnus-article-strip-trailing-space
!   "w" gnus-article-remove-leading-whitespace)
! 
! (gnus-define-keys (gnus-summary-help-map "H" gnus-summary-mode-map)
!   "v" gnus-version
!   "f" gnus-summary-fetch-faq
!   "d" gnus-summary-describe-group
!   "h" gnus-summary-describe-briefly
!   "i" gnus-info-find-node
!   "c" gnus-group-fetch-charter
!   "C" gnus-group-fetch-control)
! 
! (gnus-define-keys (gnus-summary-backend-map "B" gnus-summary-mode-map)
!   "e" gnus-summary-expire-articles
!   "\M-\C-e" gnus-summary-expire-articles-now
!   "\177" gnus-summary-delete-article
!   [delete] gnus-summary-delete-article
!   [backspace] gnus-summary-delete-article
!   "m" gnus-summary-move-article
!   "r" gnus-summary-respool-article
!   "w" gnus-summary-edit-article
!   "c" gnus-summary-copy-article
!   "B" gnus-summary-crosspost-article
!   "q" gnus-summary-respool-query
!   "t" gnus-summary-respool-trace
!   "i" gnus-summary-import-article
!   "I" gnus-summary-create-article
!   "p" gnus-summary-article-posted-p)
! 
! (gnus-define-keys (gnus-summary-save-map "O" gnus-summary-mode-map)
!   "o" gnus-summary-save-article
!   "m" gnus-summary-save-article-mail
!   "F" gnus-summary-write-article-file
!   "r" gnus-summary-save-article-rmail
!   "f" gnus-summary-save-article-file
!   "b" gnus-summary-save-article-body-file
!   "h" gnus-summary-save-article-folder
!   "v" gnus-summary-save-article-vm
!   "p" gnus-summary-pipe-output
!   "P" gnus-summary-muttprint
!   "s" gnus-soup-add-article)
! 
! (gnus-define-keys (gnus-summary-mime-map "K" gnus-summary-mode-map)
!   "b" gnus-summary-display-buttonized
!   "m" gnus-summary-repair-multipart
!   "v" gnus-article-view-part
!   "o" gnus-article-save-part
!   "c" gnus-article-copy-part
!   "C" gnus-article-view-part-as-charset
!   "e" gnus-article-view-part-externally
!   "E" gnus-article-encrypt-body
!   "i" gnus-article-inline-part
!   "|" gnus-article-pipe-part)
! 
! (gnus-define-keys (gnus-uu-mark-map "P" gnus-summary-mark-map)
!   "p" gnus-summary-mark-as-processable
!   "u" gnus-summary-unmark-as-processable
!   "U" gnus-summary-unmark-all-processable
!   "v" gnus-uu-mark-over
!   "s" gnus-uu-mark-series
!   "r" gnus-uu-mark-region
!   "g" gnus-uu-unmark-region
!   "R" gnus-uu-mark-by-regexp
!   "G" gnus-uu-unmark-by-regexp
!   "t" gnus-uu-mark-thread
!   "T" gnus-uu-unmark-thread
!   "a" gnus-uu-mark-all
!   "b" gnus-uu-mark-buffer
!   "S" gnus-uu-mark-sparse
!   "k" gnus-summary-kill-process-mark
!   "y" gnus-summary-yank-process-mark
!   "w" gnus-summary-save-process-mark
!   "i" gnus-uu-invert-processable)
! 
! (gnus-define-keys (gnus-uu-extract-map "X" gnus-summary-mode-map)
!   ;;"x" gnus-uu-extract-any
!   "m" gnus-summary-save-parts
!   "u" gnus-uu-decode-uu
!   "U" gnus-uu-decode-uu-and-save
!   "s" gnus-uu-decode-unshar
!   "S" gnus-uu-decode-unshar-and-save
!   "o" gnus-uu-decode-save
!   "O" gnus-uu-decode-save
!   "b" gnus-uu-decode-binhex
!   "B" gnus-uu-decode-binhex
!   "p" gnus-uu-decode-postscript
!   "P" gnus-uu-decode-postscript-and-save)
! 
! (gnus-define-keys
!     (gnus-uu-extract-view-map "v" gnus-uu-extract-map)
!   "u" gnus-uu-decode-uu-view
!   "U" gnus-uu-decode-uu-and-save-view
!   "s" gnus-uu-decode-unshar-view
!   "S" gnus-uu-decode-unshar-and-save-view
!   "o" gnus-uu-decode-save-view
!   "O" gnus-uu-decode-save-view
!   "b" gnus-uu-decode-binhex-view
!   "B" gnus-uu-decode-binhex-view
!   "p" gnus-uu-decode-postscript-view
!   "P" gnus-uu-decode-postscript-and-save-view)
! 
! (defvar gnus-article-post-menu nil)
! 
! (defconst gnus-summary-menu-maxlen 20)
! 
! (defun gnus-summary-menu-split (menu)
!   ;; If we have lots of elements, divide them into groups of 20
!   ;; and make a pane (or submenu) for each one.
!   (if (> (length menu) (/ (* gnus-summary-menu-maxlen 3) 2))
!       (let ((menu menu) sublists next
!           (i 1))
!       (while menu
!         ;; Pull off the next gnus-summary-menu-maxlen elements
!         ;; and make them the next element of sublist.
!         (setq next (nthcdr gnus-summary-menu-maxlen menu))
!         (if next
!             (setcdr (nthcdr (1- gnus-summary-menu-maxlen) menu)
!                     nil))
!         (setq sublists (cons (cons (format "%s ... %s" (aref (car menu) 0)
!                                            (aref (car (last menu)) 0)) menu)
!                              sublists))
!         (setq i (1+ i))
!         (setq menu next))
!       (nreverse sublists))
!     ;; Few elements--put them all in one pane.
!     menu))
  
  (defun gnus-summary-make-menu-bar ()
    (gnus-turn-off-edit-menu 'summary)
***************
*** 1673,1824 ****
    (unless (boundp 'gnus-summary-misc-menu)
  
      (easy-menu-define
!      gnus-summary-kill-menu gnus-summary-mode-map ""
!      (cons
!       "Score"
!       (nconc
!        (list
!       ["Enter score..." gnus-summary-score-entry t]
!       ["Customize" gnus-score-customize t])
!        (gnus-make-score-map 'increase)
!        (gnus-make-score-map 'lower)
!        '(("Mark"
!         ["Kill below" gnus-summary-kill-below t]
!         ["Mark above" gnus-summary-mark-above t]
!         ["Tick above" gnus-summary-tick-above t]
!         ["Clear above" gnus-summary-clear-above t])
!        ["Current score" gnus-summary-current-score t]
!        ["Set score" gnus-summary-set-score t]
!        ["Switch current score file..." gnus-score-change-score-file t]
!        ["Set mark below..." gnus-score-set-mark-below t]
!        ["Set expunge below..." gnus-score-set-expunge-below t]
!        ["Edit current score file" gnus-score-edit-current-scores t]
!        ["Edit score file" gnus-score-edit-file t]
!        ["Trace score" gnus-score-find-trace t]
!        ["Find words" gnus-score-find-favourite-words t]
!        ["Rescore buffer" gnus-summary-rescore t]
!        ["Increase score..." gnus-summary-increase-score t]
!        ["Lower score..." gnus-summary-lower-score t]))))
! 
!     ;; Define both the Article menu in the summary buffer and the equivalent
!     ;; Commands menu in the article buffer here for consistency.
      (let ((innards
!            '(("Hide"
!               ["All" gnus-article-hide t]
!               ["Headers" gnus-article-hide-headers t]
!               ["Signature" gnus-article-hide-signature t]
!               ["Citation" gnus-article-hide-citation t]
              ["List identifiers" gnus-article-hide-list-identifiers t]
-               ["PGP" gnus-article-hide-pgp t]
              ["Banner" gnus-article-strip-banner t]
!               ["Boring headers" gnus-article-hide-boring-headers t])
!              ("Highlight"
!               ["All" gnus-article-highlight t]
!               ["Headers" gnus-article-highlight-headers t]
!               ["Signature" gnus-article-highlight-signature t]
!               ["Citation" gnus-article-highlight-citation t])
             ("MIME"
              ["Words" gnus-article-decode-mime-words t]
              ["Charset" gnus-article-decode-charset t]
              ["QP" gnus-article-de-quoted-unreadable t]
              ["Base64" gnus-article-de-base64-unreadable t]
!             ["View all" gnus-mime-view-all-parts t])
!              ("Date"
!               ["Local" gnus-article-date-local t]
!               ["ISO8601" gnus-article-date-iso8601 t]
!               ["UT" gnus-article-date-ut t]
!               ["Original" gnus-article-date-original t]
!               ["Lapsed" gnus-article-date-lapsed t]
!               ["User-defined" gnus-article-date-user t])
!              ("Washing"
!               ("Remove Blanks"
!                ["Leading" gnus-article-strip-leading-blank-lines t]
!                ["Multiple" gnus-article-strip-multiple-blank-lines t]
!                ["Trailing" gnus-article-remove-trailing-blank-lines t]
!                ["All of the above" gnus-article-strip-blank-lines t]
!                ["All" gnus-article-strip-all-blank-lines t]
!                ["Leading space" gnus-article-strip-leading-space t]
!              ["Trailing space" gnus-article-strip-trailing-space t])
!               ["Overstrike" gnus-article-treat-overstrike t]
!               ["Dumb quotes" gnus-article-treat-dumbquotes t]
!               ["Emphasis" gnus-article-emphasize t]
!               ["Word wrap" gnus-article-fill-cited-article t]
              ["Fill long lines" gnus-article-fill-long-lines t]
              ["Capitalize sentences" gnus-article-capitalize-sentences t]
!               ["CR" gnus-article-remove-cr t]
!               ["Show X-Face" gnus-article-display-x-face t]
!               ["Quoted-Printable" gnus-article-de-quoted-unreadable t]
!               ["Base64" gnus-article-de-base64-unreadable t]
!               ["Rot 13" gnus-summary-caesar-message
!              :help "\"Caesar rotate\" article by 13"]
!               ["Unix pipe" gnus-summary-pipe-message t]
!               ["Add buttons" gnus-article-add-buttons t]
!               ["Add buttons to head" gnus-article-add-buttons-to-head t]
!               ["Stop page breaking" gnus-summary-stop-page-breaking t]
!               ["Verbose header" gnus-summary-verbose-headers t]
!               ["Toggle header" gnus-summary-toggle-header t]
              ["Html" gnus-article-wash-html t]
!             ["HZ" gnus-article-decode-HZ t])
!              ("Output"
!               ["Save in default format" gnus-summary-save-article
!              :help "Save article using default method"]
!               ["Save in file" gnus-summary-save-article-file
!              :help "Save article in file"]
!               ["Save in Unix mail format" gnus-summary-save-article-mail t]
!               ["Save in MH folder" gnus-summary-save-article-folder t]
!               ["Save in VM folder" gnus-summary-save-article-vm t]
!               ["Save in RMAIL mbox" gnus-summary-save-article-rmail t]
!               ["Save body in file" gnus-summary-save-article-body-file t]
!               ["Pipe through a filter" gnus-summary-pipe-output t]
!               ["Add to SOUP packet" gnus-soup-add-article t]
!               ["Print" gnus-summary-print-article t])
!              ("Backend"
!               ["Respool article..." gnus-summary-respool-article t]
!               ["Move article..." gnus-summary-move-article
!                (gnus-check-backend-function
!                 'request-move-article gnus-newsgroup-name)]
!               ["Copy article..." gnus-summary-copy-article t]
!               ["Crosspost article..." gnus-summary-crosspost-article
!                (gnus-check-backend-function
!                 'request-replace-article gnus-newsgroup-name)]
!               ["Import file..." gnus-summary-import-article t]
!               ["Check if posted" gnus-summary-article-posted-p t]
!               ["Edit article" gnus-summary-edit-article
!                (not (gnus-group-read-only-p))]
!               ["Delete article" gnus-summary-delete-article
!                (gnus-check-backend-function
!                 'request-expire-articles gnus-newsgroup-name)]
!               ["Query respool" gnus-summary-respool-query t]
              ["Trace respool" gnus-summary-respool-trace t]
!               ["Delete expirable articles" gnus-summary-expire-articles-now
!                (gnus-check-backend-function
!                 'request-expire-articles gnus-newsgroup-name)])
!              ("Extract"
!               ["Uudecode" gnus-uu-decode-uu
!              :help "Decode uuencoded article(s)"]
!               ["Uudecode and save" gnus-uu-decode-uu-and-save t]
!               ["Unshar" gnus-uu-decode-unshar t]
!               ["Unshar and save" gnus-uu-decode-unshar-and-save t]
!               ["Save" gnus-uu-decode-save t]
!               ["Binhex" gnus-uu-decode-binhex t]
!               ["Postscript" gnus-uu-decode-postscript t])
!              ("Cache"
!               ["Enter article" gnus-cache-enter-article t]
!               ["Remove article" gnus-cache-remove-article t])
             ["Translate" gnus-article-babel t]
!              ["Select article buffer" gnus-summary-select-article-buffer t]
!              ["Enter digest buffer" gnus-summary-enter-digest-group t]
!              ["Isearch article..." gnus-summary-isearch-article t]
!              ["Beginning of the article" gnus-summary-beginning-of-article t]
!              ["End of the article" gnus-summary-end-of-article t]
!              ["Fetch parent of article" gnus-summary-refer-parent-article t]
!              ["Fetch referenced articles" gnus-summary-refer-references t]
!              ["Fetch current thread" gnus-summary-refer-thread t]
!              ["Fetch article with id..." gnus-summary-refer-article t]
!              ["Redisplay" gnus-summary-show-article t])))
        (easy-menu-define
!        gnus-summary-article-menu gnus-summary-mode-map ""
!        (cons "Article" innards))
  
        (if (not (keymapp gnus-summary-article-menu))
          (easy-menu-define
--- 2062,2285 ----
    (unless (boundp 'gnus-summary-misc-menu)
  
      (easy-menu-define
!       gnus-summary-kill-menu gnus-summary-mode-map ""
!       (cons
!        "Score"
!        (nconc
!       (list
!        ["Customize" gnus-score-customize t])
!       (gnus-make-score-map 'increase)
!       (gnus-make-score-map 'lower)
!       '(("Mark"
!          ["Kill below" gnus-summary-kill-below t]
!          ["Mark above" gnus-summary-mark-above t]
!          ["Tick above" gnus-summary-tick-above t]
!          ["Clear above" gnus-summary-clear-above t])
!         ["Current score" gnus-summary-current-score t]
!         ["Set score" gnus-summary-set-score t]
!         ["Switch current score file..." gnus-score-change-score-file t]
!         ["Set mark below..." gnus-score-set-mark-below t]
!         ["Set expunge below..." gnus-score-set-expunge-below t]
!         ["Edit current score file" gnus-score-edit-current-scores t]
!         ["Edit score file" gnus-score-edit-file t]
!         ["Trace score" gnus-score-find-trace t]
!         ["Find words" gnus-score-find-favourite-words t]
!         ["Rescore buffer" gnus-summary-rescore t]
!         ["Increase score..." gnus-summary-increase-score t]
!         ["Lower score..." gnus-summary-lower-score t]))))
! 
!     ;; Define both the Article menu in the summary buffer and the
!     ;; equivalent Commands menu in the article buffer here for
!     ;; consistency.
      (let ((innards
!          `(("Hide"
!             ["All" gnus-article-hide t]
!             ["Headers" gnus-article-hide-headers t]
!             ["Signature" gnus-article-hide-signature t]
!             ["Citation" gnus-article-hide-citation t]
              ["List identifiers" gnus-article-hide-list-identifiers t]
              ["Banner" gnus-article-strip-banner t]
!             ["Boring headers" gnus-article-hide-boring-headers t])
!            ("Highlight"
!             ["All" gnus-article-highlight t]
!             ["Headers" gnus-article-highlight-headers t]
!             ["Signature" gnus-article-highlight-signature t]
!             ["Citation" gnus-article-highlight-citation t])
             ("MIME"
              ["Words" gnus-article-decode-mime-words t]
              ["Charset" gnus-article-decode-charset t]
              ["QP" gnus-article-de-quoted-unreadable t]
              ["Base64" gnus-article-de-base64-unreadable t]
!             ["View MIME buttons" gnus-summary-display-buttonized t]
!             ["View all" gnus-mime-view-all-parts t]
!             ["Verify and Decrypt" gnus-summary-force-verify-and-decrypt t]
!             ["Encrypt body" gnus-article-encrypt-body
!              :active (not (gnus-group-read-only-p))
!              ,@(if (featurep 'xemacs) nil
!                  '(:help "Encrypt the message body on disk"))]
!             ["Extract all parts..." gnus-summary-save-parts t]
!             ("Multipart"
!              ["Repair multipart" gnus-summary-repair-multipart t]
!              ["Pipe part..." gnus-article-pipe-part t]
!              ["Inline part" gnus-article-inline-part t]
!              ["Encrypt body" gnus-article-encrypt-body
!               :active (not (gnus-group-read-only-p))
!              ,@(if (featurep 'xemacs) nil
!                  '(:help "Encrypt the message body on disk"))]
!              ["View part externally" gnus-article-view-part-externally t]
!              ["View part with charset..." gnus-article-view-part-as-charset t]
!              ["Copy part" gnus-article-copy-part t]
!              ["Save part..." gnus-article-save-part t]
!              ["View part" gnus-article-view-part t]))
!            ("Date"
!             ["Local" gnus-article-date-local t]
!             ["ISO8601" gnus-article-date-iso8601 t]
!             ["UT" gnus-article-date-ut t]
!             ["Original" gnus-article-date-original t]
!             ["Lapsed" gnus-article-date-lapsed t]
!             ["User-defined" gnus-article-date-user t])
!            ("Display"
!             ["Remove images" gnus-article-remove-images t]
!             ["Toggle smiley" gnus-treat-smiley t]
!             ["Show X-Face" gnus-article-display-x-face t]
!             ["Show picons in From" gnus-treat-from-picon t]
!             ["Show picons in mail headers" gnus-treat-mail-picon t]
!             ["Show picons in news headers" gnus-treat-newsgroups-picon t]
!             ("View as different encoding"
!              ,@(gnus-summary-menu-split
!                 (mapcar
!                  (lambda (cs)
!                    ;; Since easymenu under Emacs doesn't allow
!                    ;; lambda forms for menu commands, we should
!                    ;; provide intern'ed function symbols.
!                    (let ((command (intern (format "\
! gnus-summary-show-article-from-menu-as-charset-%s" cs))))
!                      (fset command
!                            `(lambda ()
!                               (interactive)
!                               (let ((gnus-summary-show-article-charset-alist
!                                      '((1 . ,cs))))
!                                 (gnus-summary-show-article 1))))
!                      `[,(symbol-name cs) ,command t]))
!                  (sort (if (fboundp 'coding-system-list)
!                            (coding-system-list)
!                          (mapcar 'car mm-mime-mule-charset-alist))
!                        'string<)))))
!            ("Washing"
!             ("Remove Blanks"
!              ["Leading" gnus-article-strip-leading-blank-lines t]
!              ["Multiple" gnus-article-strip-multiple-blank-lines t]
!              ["Trailing" gnus-article-remove-trailing-blank-lines t]
!              ["All of the above" gnus-article-strip-blank-lines t]
!              ["All" gnus-article-strip-all-blank-lines t]
!              ["Leading space" gnus-article-strip-leading-space t]
!              ["Trailing space" gnus-article-strip-trailing-space t]
!              ["Leading space in headers"
!               gnus-article-remove-leading-whitespace t])
!             ["Overstrike" gnus-article-treat-overstrike t]
!             ["Dumb quotes" gnus-article-treat-dumbquotes t]
!             ["Emphasis" gnus-article-emphasize t]
!             ["Word wrap" gnus-article-fill-cited-article t]
              ["Fill long lines" gnus-article-fill-long-lines t]
              ["Capitalize sentences" gnus-article-capitalize-sentences t]
!             ["Remove CR" gnus-article-remove-cr t]
!             ["Quoted-Printable" gnus-article-de-quoted-unreadable t]
!             ["Base64" gnus-article-de-base64-unreadable t]
!             ["Rot 13" gnus-summary-caesar-message
!              ,@(if (featurep 'xemacs) '(t)
!                  '(:help "\"Caesar rotate\" article by 13"))]
!             ["Morse decode" gnus-summary-morse-message t]
!             ["Unix pipe..." gnus-summary-pipe-message t]
!             ["Add buttons" gnus-article-add-buttons t]
!             ["Add buttons to head" gnus-article-add-buttons-to-head t]
!             ["Stop page breaking" gnus-summary-stop-page-breaking t]
!             ["Verbose header" gnus-summary-verbose-headers t]
!             ["Toggle header" gnus-summary-toggle-header t]
!             ["Unfold headers" gnus-article-treat-unfold-headers t]
!             ["Fold newsgroups" gnus-article-treat-fold-newsgroups t]
              ["Html" gnus-article-wash-html t]
!             ["Unsplit URLs" gnus-article-unsplit-urls t]
!             ["Verify X-PGP-Sig" gnus-article-verify-x-pgp-sig t]
!             ["Decode HZ" gnus-article-decode-HZ t]
!             ("(Outlook) Deuglify"
!              ["Unwrap lines" gnus-article-outlook-unwrap-lines t]
!              ["Repair attribution" gnus-article-outlook-repair-attribution t]
!              ["Rearrange citation" gnus-article-outlook-rearrange-citation t]
!              ["Full (Outlook) deuglify"
!               gnus-article-outlook-deuglify-article t])
!             )
!            ("Output"
!             ["Save in default format..." gnus-summary-save-article
!              ,@(if (featurep 'xemacs) '(t)
!                  '(:help "Save article using default method"))]
!             ["Save in file..." gnus-summary-save-article-file
!              ,@(if (featurep 'xemacs) '(t)
!                  '(:help "Save article in file"))]
!             ["Save in Unix mail format..." gnus-summary-save-article-mail t]
!             ["Save in MH folder..." gnus-summary-save-article-folder t]
!             ["Save in VM folder..." gnus-summary-save-article-vm t]
!             ["Save in RMAIL mbox..." gnus-summary-save-article-rmail t]
!             ["Save body in file..." gnus-summary-save-article-body-file t]
!             ["Pipe through a filter..." gnus-summary-pipe-output t]
!             ["Add to SOUP packet" gnus-soup-add-article t]
!             ["Print with Muttprint..." gnus-summary-muttprint t]
!             ["Print" gnus-summary-print-article t])
!            ("Backend"
!             ["Respool article..." gnus-summary-respool-article t]
!             ["Move article..." gnus-summary-move-article
!              (gnus-check-backend-function
!               'request-move-article gnus-newsgroup-name)]
!             ["Copy article..." gnus-summary-copy-article t]
!             ["Crosspost article..." gnus-summary-crosspost-article
!              (gnus-check-backend-function
!               'request-replace-article gnus-newsgroup-name)]
!             ["Import file..." gnus-summary-import-article
!              (gnus-check-backend-function
!               'request-accept-article gnus-newsgroup-name)]
!             ["Create article..." gnus-summary-create-article
!              (gnus-check-backend-function
!               'request-accept-article gnus-newsgroup-name)]
!             ["Check if posted" gnus-summary-article-posted-p t]
!             ["Edit article" gnus-summary-edit-article
!              (not (gnus-group-read-only-p))]
!             ["Delete article" gnus-summary-delete-article
!              (gnus-check-backend-function
!               'request-expire-articles gnus-newsgroup-name)]
!             ["Query respool" gnus-summary-respool-query t]
              ["Trace respool" gnus-summary-respool-trace t]
!             ["Delete expirable articles" gnus-summary-expire-articles-now
!              (gnus-check-backend-function
!               'request-expire-articles gnus-newsgroup-name)])
!            ("Extract"
!             ["Uudecode" gnus-uu-decode-uu
!              ,@(if (featurep 'xemacs) '(t)
!                  '(:help "Decode uuencoded article(s)"))]
!             ["Uudecode and save" gnus-uu-decode-uu-and-save t]
!             ["Unshar" gnus-uu-decode-unshar t]
!             ["Unshar and save" gnus-uu-decode-unshar-and-save t]
!             ["Save" gnus-uu-decode-save t]
!             ["Binhex" gnus-uu-decode-binhex t]
!             ["Postscript" gnus-uu-decode-postscript t]
!             ["All MIME parts" gnus-summary-save-parts t])
!            ("Cache"
!             ["Enter article" gnus-cache-enter-article t]
!             ["Remove article" gnus-cache-remove-article t])
             ["Translate" gnus-article-babel t]
!            ["Select article buffer" gnus-summary-select-article-buffer t]
!            ["Enter digest buffer" gnus-summary-enter-digest-group t]
!            ["Isearch article..." gnus-summary-isearch-article t]
!            ["Beginning of the article" gnus-summary-beginning-of-article t]
!            ["End of the article" gnus-summary-end-of-article t]
!            ["Fetch parent of article" gnus-summary-refer-parent-article t]
!            ["Fetch referenced articles" gnus-summary-refer-references t]
!            ["Fetch current thread" gnus-summary-refer-thread t]
!            ["Fetch article with id..." gnus-summary-refer-article t]
!            ["Setup Mailing List Params" gnus-mailing-list-insinuate t]
!            ["Redisplay" gnus-summary-show-article t]
!            ["Raw article" gnus-summary-show-raw-article :keys "C-u g"])))
        (easy-menu-define
!       gnus-summary-article-menu gnus-summary-mode-map ""
!       (cons "Article" innards))
  
        (if (not (keymapp gnus-summary-article-menu))
          (easy-menu-define
***************
*** 1831,2029 ****
          (cons "Commands" gnus-article-commands-menu))))
  
      (easy-menu-define
!      gnus-summary-thread-menu gnus-summary-mode-map ""
!      '("Threads"
!        ["Toggle threading" gnus-summary-toggle-threads t]
!        ["Hide threads" gnus-summary-hide-all-threads t]
!        ["Show threads" gnus-summary-show-all-threads t]
!        ["Hide thread" gnus-summary-hide-thread t]
!        ["Show thread" gnus-summary-show-thread t]
!        ["Go to next thread" gnus-summary-next-thread t]
!        ["Go to previous thread" gnus-summary-prev-thread t]
!        ["Go down thread" gnus-summary-down-thread t]
!        ["Go up thread" gnus-summary-up-thread t]
!        ["Top of thread" gnus-summary-top-thread t]
!        ["Mark thread as read" gnus-summary-kill-thread t]
!        ["Lower thread score" gnus-summary-lower-thread t]
!        ["Raise thread score" gnus-summary-raise-thread t]
!        ["Rethread current" gnus-summary-rethread-current t]))
  
      (easy-menu-define
!      gnus-summary-post-menu gnus-summary-mode-map ""
!      '("Post"
!        ["Post an article" gnus-summary-post-news
!       :help "Post an article"]
!        ["Followup" gnus-summary-followup
!       :help "Post followup to this article"]
!        ["Followup and yank" gnus-summary-followup-with-original
!       :help "Post followup to this article, quoting its contents"]
!        ["Supersede article" gnus-summary-supersede-article t]
!        ["Cancel article" gnus-summary-cancel-article
!       :help "Cancel an article you posted"]
!        ["Reply" gnus-summary-reply t]
!        ["Reply and yank" gnus-summary-reply-with-original t]
!        ["Wide reply" gnus-summary-wide-reply t]
!        ["Wide reply and yank" gnus-summary-wide-reply-with-original
!       :help "Mail a reply, quoting this article"]
!        ["Mail forward" gnus-summary-mail-forward t]
!        ["Post forward" gnus-summary-post-forward t]
!        ["Digest and mail" gnus-uu-digest-mail-forward t]
!        ["Digest and post" gnus-uu-digest-post-forward t]
!        ["Resend message" gnus-summary-resend-message t]
!        ["Send bounced mail" gnus-summary-resend-bounced-mail t]
!        ["Send a mail" gnus-summary-mail-other-window t]
!        ["Uuencode and post" gnus-uu-post-news
!       :help "Post a uuencoded article"]
!        ["Followup via news" gnus-summary-followup-to-mail t]
!        ["Followup via news and yank"
!       gnus-summary-followup-to-mail-with-original t]
!        ;;("Draft"
!        ;;["Send" gnus-summary-send-draft t]
!        ;;["Send bounced" gnus-resend-bounced-mail t])
!        ))
  
      (easy-menu-define
!      gnus-summary-misc-menu gnus-summary-mode-map ""
!      '("Misc"
!        ("Mark Read"
!       ["Mark as read" gnus-summary-mark-as-read-forward t]
!       ["Mark same subject and select"
!        gnus-summary-kill-same-subject-and-select t]
!       ["Mark same subject" gnus-summary-kill-same-subject t]
!       ["Catchup" gnus-summary-catchup
!        :help "Mark unread articles in this group as read"]
!       ["Catchup all" gnus-summary-catchup-all t]
!       ["Catchup to here" gnus-summary-catchup-to-here t]
!       ["Catchup region" gnus-summary-mark-region-as-read t]
!       ["Mark excluded" gnus-summary-limit-mark-excluded-as-read t])
!        ("Mark Various"
!       ["Tick" gnus-summary-tick-article-forward t]
!       ["Mark as dormant" gnus-summary-mark-as-dormant t]
!       ["Remove marks" gnus-summary-clear-mark-forward t]
!       ["Set expirable mark" gnus-summary-mark-as-expirable t]
!       ["Set bookmark" gnus-summary-set-bookmark t]
!       ["Remove bookmark" gnus-summary-remove-bookmark t])
!        ("Mark Limit"
!       ["Marks..." gnus-summary-limit-to-marks t]
!       ["Subject..." gnus-summary-limit-to-subject t]
!       ["Author..." gnus-summary-limit-to-author t]
!       ["Age..." gnus-summary-limit-to-age t]
!       ["Extra..." gnus-summary-limit-to-extra t]
!       ["Score" gnus-summary-limit-to-score t]
!       ["Unread" gnus-summary-limit-to-unread t]
!       ["Non-dormant" gnus-summary-limit-exclude-dormant t]
!       ["Articles" gnus-summary-limit-to-articles t]
!       ["Pop limit" gnus-summary-pop-limit t]
!       ["Show dormant" gnus-summary-limit-include-dormant t]
!       ["Hide childless dormant"
!        gnus-summary-limit-exclude-childless-dormant t]
!       ;;["Hide thread" gnus-summary-limit-exclude-thread t]
!       ["Hide marked" gnus-summary-limit-exclude-marks t]
!       ["Show expunged" gnus-summary-show-all-expunged t])
!        ("Process Mark"
!       ["Set mark" gnus-summary-mark-as-processable t]
!       ["Remove mark" gnus-summary-unmark-as-processable t]
!       ["Remove all marks" gnus-summary-unmark-all-processable t]
!       ["Mark above" gnus-uu-mark-over t]
!       ["Mark series" gnus-uu-mark-series t]
!       ["Mark region" gnus-uu-mark-region t]
!       ["Unmark region" gnus-uu-unmark-region t]
!       ["Mark by regexp..." gnus-uu-mark-by-regexp t]
!         ["Unmark by regexp..." gnus-uu-unmark-by-regexp t]
!       ["Mark all" gnus-uu-mark-all t]
!       ["Mark buffer" gnus-uu-mark-buffer t]
!       ["Mark sparse" gnus-uu-mark-sparse t]
!       ["Mark thread" gnus-uu-mark-thread t]
!       ["Unmark thread" gnus-uu-unmark-thread t]
!       ("Process Mark Sets"
!        ["Kill" gnus-summary-kill-process-mark t]
!        ["Yank" gnus-summary-yank-process-mark
!         gnus-newsgroup-process-stack]
!        ["Save" gnus-summary-save-process-mark t]))
!        ("Scroll article"
!       ["Page forward" gnus-summary-next-page
!        :help "Show next page of article"]
!       ["Page backward" gnus-summary-prev-page
!        :help "Show previous page of article"]
!       ["Line forward" gnus-summary-scroll-up t])
!        ("Move"
!       ["Next unread article" gnus-summary-next-unread-article t]
!       ["Previous unread article" gnus-summary-prev-unread-article t]
!       ["Next article" gnus-summary-next-article t]
!       ["Previous article" gnus-summary-prev-article t]
!       ["Next unread subject" gnus-summary-next-unread-subject t]
!       ["Previous unread subject" gnus-summary-prev-unread-subject t]
!       ["Next article same subject" gnus-summary-next-same-subject t]
!       ["Previous article same subject" gnus-summary-prev-same-subject t]
!       ["First unread article" gnus-summary-first-unread-article t]
!       ["Best unread article" gnus-summary-best-unread-article t]
!       ["Go to subject number..." gnus-summary-goto-subject t]
!       ["Go to article number..." gnus-summary-goto-article t]
!       ["Go to the last article" gnus-summary-goto-last-article t]
!       ["Pop article off history" gnus-summary-pop-article t])
!        ("Sort"
!       ["Sort by number" gnus-summary-sort-by-number t]
!       ["Sort by author" gnus-summary-sort-by-author t]
!       ["Sort by subject" gnus-summary-sort-by-subject t]
!       ["Sort by date" gnus-summary-sort-by-date t]
!       ["Sort by score" gnus-summary-sort-by-score t]
!       ["Sort by lines" gnus-summary-sort-by-lines t]
!       ["Sort by characters" gnus-summary-sort-by-chars t])
!        ("Help"
!       ["Fetch group FAQ" gnus-summary-fetch-faq t]
!       ["Describe group" gnus-summary-describe-group t]
!       ["Read manual" gnus-info-find-node t])
!        ("Modes"
!       ["Pick and read" gnus-pick-mode t]
!       ["Binary" gnus-binary-mode t])
!        ("Regeneration"
!       ["Regenerate" gnus-summary-prepare t]
!       ["Insert cached articles" gnus-summary-insert-cached-articles t]
!       ["Toggle threading" gnus-summary-toggle-threads t])
!        ["Filter articles..." gnus-summary-execute-command t]
!        ["Run command on subjects..." gnus-summary-universal-argument t]
!        ["Search articles forward..." gnus-summary-search-article-forward t]
!        ["Search articles backward..." gnus-summary-search-article-backward t]
!        ["Toggle line truncation" gnus-summary-toggle-truncation t]
!        ["Expand window" gnus-summary-expand-window t]
!        ["Expire expirable articles" gnus-summary-expire-articles
!       (gnus-check-backend-function
!        'request-expire-articles gnus-newsgroup-name)]
!        ["Edit local kill file" gnus-summary-edit-local-kill t]
!        ["Edit main kill file" gnus-summary-edit-global-kill t]
!        ["Edit group parameters" gnus-summary-edit-parameters t]
!        ["Customize group parameters" gnus-summary-customize-parameters t]
!        ["Send a bug report" gnus-bug t]
!        ("Exit"
!       ["Catchup and exit" gnus-summary-catchup-and-exit
!        :help "Mark unread articles in this group as read, then exit"]
!       ["Catchup all and exit" gnus-summary-catchup-all-and-exit t]
!       ["Catchup and goto next" gnus-summary-catchup-and-goto-next-group t]
!       ["Exit group" gnus-summary-exit
!        :help "Exit current group, return to group selection mode"]
!       ["Exit group without updating" gnus-summary-exit-no-update t]
!       ["Exit and goto next group" gnus-summary-next-group t]
!       ["Exit and goto prev group" gnus-summary-prev-group t]
!       ["Reselect group" gnus-summary-reselect-current-group t]
!       ["Rescan group" gnus-summary-rescan-group t]
!       ["Update dribble" gnus-summary-save-newsrc t])))
  
      (gnus-run-hooks 'gnus-summary-menu-hook)))
  
  (defvar gnus-summary-tool-bar-map nil)
  
  ;; Emacs 21 tool bar.  Should be no-op otherwise.
- ;; NB: A new function tool-bar-local-item-from-menu is added in Emacs
- ;; 21.2.50+.  Considering many users use Emacs 21, use
- ;; tool-bar-add-item-from-menu here.
  (defun gnus-summary-make-tool-bar ()
!   (if (and
!        (condition-case nil (require 'tool-bar) (error nil))
!        (fboundp 'tool-bar-add-item-from-menu)
!        (default-value 'tool-bar-mode)
!        (not gnus-summary-tool-bar-map))
        (setq gnus-summary-tool-bar-map
!           (let ((tool-bar-map (make-sparse-keymap)))
              (tool-bar-add-item-from-menu
               'gnus-summary-prev-unread "prev-ur" gnus-summary-mode-map)
              (tool-bar-add-item-from-menu
--- 2292,2530 ----
          (cons "Commands" gnus-article-commands-menu))))
  
      (easy-menu-define
!       gnus-summary-thread-menu gnus-summary-mode-map ""
!       '("Threads"
!       ["Find all messages in thread" gnus-summary-refer-thread t]
!       ["Toggle threading" gnus-summary-toggle-threads t]
!       ["Hide threads" gnus-summary-hide-all-threads t]
!       ["Show threads" gnus-summary-show-all-threads t]
!       ["Hide thread" gnus-summary-hide-thread t]
!       ["Show thread" gnus-summary-show-thread t]
!       ["Go to next thread" gnus-summary-next-thread t]
!       ["Go to previous thread" gnus-summary-prev-thread t]
!       ["Go down thread" gnus-summary-down-thread t]
!       ["Go up thread" gnus-summary-up-thread t]
!       ["Top of thread" gnus-summary-top-thread t]
!       ["Mark thread as read" gnus-summary-kill-thread t]
!       ["Lower thread score" gnus-summary-lower-thread t]
!       ["Raise thread score" gnus-summary-raise-thread t]
!       ["Rethread current" gnus-summary-rethread-current t]))
  
      (easy-menu-define
!       gnus-summary-post-menu gnus-summary-mode-map ""
!       `("Post"
!       ["Send a message (mail or news)" gnus-summary-post-news
!        ,@(if (featurep 'xemacs) '(t)
!            '(:help "Post an article"))]
!       ["Followup" gnus-summary-followup
!        ,@(if (featurep 'xemacs) '(t)
!            '(:help "Post followup to this article"))]
!       ["Followup and yank" gnus-summary-followup-with-original
!        ,@(if (featurep 'xemacs) '(t)
!            '(:help "Post followup to this article, quoting its contents"))]
!       ["Supersede article" gnus-summary-supersede-article t]
!       ["Cancel article" gnus-summary-cancel-article
!        ,@(if (featurep 'xemacs) '(t)
!            '(:help "Cancel an article you posted"))]
!       ["Reply" gnus-summary-reply t]
!       ["Reply and yank" gnus-summary-reply-with-original t]
!       ["Wide reply" gnus-summary-wide-reply t]
!       ["Wide reply and yank" gnus-summary-wide-reply-with-original
!        ,@(if (featurep 'xemacs) '(t)
!            '(:help "Mail a reply, quoting this article"))]
!       ["Very wide reply" gnus-summary-very-wide-reply t]
!       ["Very wide reply and yank" gnus-summary-very-wide-reply-with-original
!        ,@(if (featurep 'xemacs) '(t)
!            '(:help "Mail a very wide reply, quoting this article"))]
!       ["Mail forward" gnus-summary-mail-forward t]
!       ["Post forward" gnus-summary-post-forward t]
!       ["Digest and mail" gnus-uu-digest-mail-forward t]
!       ["Digest and post" gnus-uu-digest-post-forward t]
!       ["Resend message" gnus-summary-resend-message t]
!       ["Resend message edit" gnus-summary-resend-message-edit t]
!       ["Send bounced mail" gnus-summary-resend-bounced-mail t]
!       ["Send a mail" gnus-summary-mail-other-window t]
!       ["Create a local message" gnus-summary-news-other-window t]
!       ["Uuencode and post" gnus-uu-post-news
!        ,@(if (featurep 'xemacs) '(t)
!            '(:help "Post a uuencoded article"))]
!       ["Followup via news" gnus-summary-followup-to-mail t]
!       ["Followup via news and yank"
!        gnus-summary-followup-to-mail-with-original t]
!       ;;("Draft"
!       ;;["Send" gnus-summary-send-draft t]
!       ;;["Send bounced" gnus-resend-bounced-mail t])
!       ))
! 
!     (cond
!      ((not (keymapp gnus-summary-post-menu))
!       (setq gnus-article-post-menu gnus-summary-post-menu))
!      ((not gnus-article-post-menu)
!       ;; Don't share post menu.
!       (setq gnus-article-post-menu
!           (copy-keymap gnus-summary-post-menu))))
!     (define-key gnus-article-mode-map [menu-bar post]
!       (cons "Post" gnus-article-post-menu))
  
      (easy-menu-define
!       gnus-summary-misc-menu gnus-summary-mode-map ""
!       `("Gnus"
!       ("Mark Read"
!        ["Mark as read" gnus-summary-mark-as-read-forward t]
!        ["Mark same subject and select"
!         gnus-summary-kill-same-subject-and-select t]
!        ["Mark same subject" gnus-summary-kill-same-subject t]
!        ["Catchup" gnus-summary-catchup
!         ,@(if (featurep 'xemacs) '(t)
!             '(:help "Mark unread articles in this group as read"))]
!        ["Catchup all" gnus-summary-catchup-all t]
!        ["Catchup to here" gnus-summary-catchup-to-here t]
!        ["Catchup from here" gnus-summary-catchup-from-here t]
!        ["Catchup region" gnus-summary-mark-region-as-read
!         (gnus-mark-active-p)]
!        ["Mark excluded" gnus-summary-limit-mark-excluded-as-read t])
!       ("Mark Various"
!        ["Tick" gnus-summary-tick-article-forward t]
!        ["Mark as dormant" gnus-summary-mark-as-dormant t]
!        ["Remove marks" gnus-summary-clear-mark-forward t]
!        ["Set expirable mark" gnus-summary-mark-as-expirable t]
!        ["Set bookmark" gnus-summary-set-bookmark t]
!        ["Remove bookmark" gnus-summary-remove-bookmark t])
!       ("Limit to"
!        ["Marks..." gnus-summary-limit-to-marks t]
!        ["Subject..." gnus-summary-limit-to-subject t]
!        ["Author..." gnus-summary-limit-to-author t]
!        ["Age..." gnus-summary-limit-to-age t]
!        ["Extra..." gnus-summary-limit-to-extra t]
!        ["Score..." gnus-summary-limit-to-score t]
!        ["Display Predicate" gnus-summary-limit-to-display-predicate t]
!        ["Unread" gnus-summary-limit-to-unread t]
!        ["Unseen" gnus-summary-limit-to-unseen t]
!        ["Non-dormant" gnus-summary-limit-exclude-dormant t]
!        ["Next articles" gnus-summary-limit-to-articles t]
!        ["Pop limit" gnus-summary-pop-limit t]
!        ["Show dormant" gnus-summary-limit-include-dormant t]
!        ["Hide childless dormant"
!         gnus-summary-limit-exclude-childless-dormant t]
!        ;;["Hide thread" gnus-summary-limit-exclude-thread t]
!        ["Hide marked" gnus-summary-limit-exclude-marks t]
!        ["Show expunged" gnus-summary-limit-include-expunged t])
!       ("Process Mark"
!        ["Set mark" gnus-summary-mark-as-processable t]
!        ["Remove mark" gnus-summary-unmark-as-processable t]
!        ["Remove all marks" gnus-summary-unmark-all-processable t]
!        ["Mark above" gnus-uu-mark-over t]
!        ["Mark series" gnus-uu-mark-series t]
!        ["Mark region" gnus-uu-mark-region (gnus-mark-active-p)]
!        ["Unmark region" gnus-uu-unmark-region (gnus-mark-active-p)]
!        ["Mark by regexp..." gnus-uu-mark-by-regexp t]
!        ["Unmark by regexp..." gnus-uu-unmark-by-regexp t]
!        ["Mark all" gnus-uu-mark-all t]
!        ["Mark buffer" gnus-uu-mark-buffer t]
!        ["Mark sparse" gnus-uu-mark-sparse t]
!        ["Mark thread" gnus-uu-mark-thread t]
!        ["Unmark thread" gnus-uu-unmark-thread t]
!        ("Process Mark Sets"
!         ["Kill" gnus-summary-kill-process-mark t]
!         ["Yank" gnus-summary-yank-process-mark
!          gnus-newsgroup-process-stack]
!         ["Save" gnus-summary-save-process-mark t]
!         ["Run command on marked..." gnus-summary-universal-argument t]))
!       ("Scroll article"
!        ["Page forward" gnus-summary-next-page
!         ,@(if (featurep 'xemacs) '(t)
!             '(:help "Show next page of article"))]
!        ["Page backward" gnus-summary-prev-page
!         ,@(if (featurep 'xemacs) '(t)
!             '(:help "Show previous page of article"))]
!        ["Line forward" gnus-summary-scroll-up t])
!       ("Move"
!        ["Next unread article" gnus-summary-next-unread-article t]
!        ["Previous unread article" gnus-summary-prev-unread-article t]
!        ["Next article" gnus-summary-next-article t]
!        ["Previous article" gnus-summary-prev-article t]
!        ["Next unread subject" gnus-summary-next-unread-subject t]
!        ["Previous unread subject" gnus-summary-prev-unread-subject t]
!        ["Next article same subject" gnus-summary-next-same-subject t]
!        ["Previous article same subject" gnus-summary-prev-same-subject t]
!        ["First unread article" gnus-summary-first-unread-article t]
!        ["Best unread article" gnus-summary-best-unread-article t]
!        ["Go to subject number..." gnus-summary-goto-subject t]
!        ["Go to article number..." gnus-summary-goto-article t]
!        ["Go to the last article" gnus-summary-goto-last-article t]
!        ["Pop article off history" gnus-summary-pop-article t])
!       ("Sort"
!        ["Sort by number" gnus-summary-sort-by-number t]
!        ["Sort by author" gnus-summary-sort-by-author t]
!        ["Sort by subject" gnus-summary-sort-by-subject t]
!        ["Sort by date" gnus-summary-sort-by-date t]
!        ["Sort by score" gnus-summary-sort-by-score t]
!        ["Sort by lines" gnus-summary-sort-by-lines t]
!        ["Sort by characters" gnus-summary-sort-by-chars t]
!        ["Randomize" gnus-summary-sort-by-random t]
!        ["Original sort" gnus-summary-sort-by-original t])
!       ("Help"
!        ["Fetch group FAQ" gnus-summary-fetch-faq t]
!        ["Describe group" gnus-summary-describe-group t]
!        ["Fetch charter" gnus-group-fetch-charter
!         ,@(if (featurep 'xemacs) nil
!             '(:help "Display the charter of the current group"))]
!        ["Fetch control message" gnus-group-fetch-control
!         ,@(if (featurep 'xemacs) nil
!             '(:help "Display the archived control message for the current 
group"))]
!        ["Read manual" gnus-info-find-node t])
!       ("Modes"
!        ["Pick and read" gnus-pick-mode t]
!        ["Binary" gnus-binary-mode t])
!       ("Regeneration"
!        ["Regenerate" gnus-summary-prepare t]
!        ["Insert cached articles" gnus-summary-insert-cached-articles t]
!        ["Insert dormant articles" gnus-summary-insert-dormant-articles t]
!        ["Toggle threading" gnus-summary-toggle-threads t])
!       ["See old articles" gnus-summary-insert-old-articles t]
!       ["See new articles" gnus-summary-insert-new-articles t]
!       ["Filter articles..." gnus-summary-execute-command t]
!       ["Run command on articles..." gnus-summary-universal-argument t]
!       ["Search articles forward..." gnus-summary-search-article-forward t]
!       ["Search articles backward..." gnus-summary-search-article-backward t]
!       ["Toggle line truncation" gnus-summary-toggle-truncation t]
!       ["Expand window" gnus-summary-expand-window t]
!       ["Expire expirable articles" gnus-summary-expire-articles
!        (gnus-check-backend-function
!         'request-expire-articles gnus-newsgroup-name)]
!       ["Edit local kill file" gnus-summary-edit-local-kill t]
!       ["Edit main kill file" gnus-summary-edit-global-kill t]
!       ["Edit group parameters" gnus-summary-edit-parameters t]
!       ["Customize group parameters" gnus-summary-customize-parameters t]
!       ["Send a bug report" gnus-bug t]
!       ("Exit"
!        ["Catchup and exit" gnus-summary-catchup-and-exit
!         ,@(if (featurep 'xemacs) '(t)
!             '(:help "Mark unread articles in this group as read, then exit"))]
!        ["Catchup all and exit" gnus-summary-catchup-all-and-exit t]
!        ["Catchup and goto next" gnus-summary-catchup-and-goto-next-group t]
!        ["Exit group" gnus-summary-exit
!         ,@(if (featurep 'xemacs) '(t)
!             '(:help "Exit current group, return to group selection mode"))]
!        ["Exit group without updating" gnus-summary-exit-no-update t]
!        ["Exit and goto next group" gnus-summary-next-group t]
!        ["Exit and goto prev group" gnus-summary-prev-group t]
!        ["Reselect group" gnus-summary-reselect-current-group t]
!        ["Rescan group" gnus-summary-rescan-group t]
!        ["Update dribble" gnus-summary-save-newsrc t])))
  
      (gnus-run-hooks 'gnus-summary-menu-hook)))
  
  (defvar gnus-summary-tool-bar-map nil)
  
  ;; Emacs 21 tool bar.  Should be no-op otherwise.
  (defun gnus-summary-make-tool-bar ()
!   (if (and (fboundp 'tool-bar-add-item-from-menu)
!          (default-value 'tool-bar-mode)
!          (not gnus-summary-tool-bar-map))
        (setq gnus-summary-tool-bar-map
!           (let ((tool-bar-map (make-sparse-keymap))
!                 (load-path (mm-image-load-path)))
              (tool-bar-add-item-from-menu
               'gnus-summary-prev-unread "prev-ur" gnus-summary-mode-map)
              (tool-bar-add-item-from-menu
***************
*** 2156,2162 ****
  respectively.
  
  You can also post articles and send mail from this buffer.  To
! follow up an article, type `\\[gnus-summary-followup]'.        To mail a 
reply to the author
  of an article, type `\\[gnus-summary-reply]'.
  
  There are approx. one gazillion commands you can execute in this
--- 2657,2663 ----
  respectively.
  
  You can also post articles and send mail from this buffer.  To
! follow up an article, type `\\[gnus-summary-followup]'.  To mail a reply to 
the author
  of an article, type `\\[gnus-summary-reply]'.
  
  There are approx. one gazillion commands you can execute in this
***************
*** 2171,2176 ****
--- 2672,2679 ----
      (gnus-summary-make-menu-bar)
      (gnus-summary-make-tool-bar))
    (gnus-summary-make-local-variables)
+   (let ((gnus-summary-local-variables gnus-newsgroup-variables))
+     (gnus-summary-make-local-variables))
    (gnus-make-thread-indent-array)
    (gnus-simplify-mode-line)
    (setq major-mode 'gnus-summary-mode)
***************
*** 2190,2198 ****
    (make-local-variable 'gnus-summary-dummy-line-format)
    (make-local-variable 'gnus-summary-dummy-line-format-spec)
    (make-local-variable 'gnus-summary-mark-positions)
!   (make-local-hook 'pre-command-hook)
    (add-hook 'pre-command-hook 'gnus-set-global-variables nil t)
    (gnus-run-hooks 'gnus-summary-mode-hook)
    (mm-enable-multibyte)
    (gnus-update-format-specifications nil 'summary 'summary-mode 
'summary-dummy)
    (gnus-update-summary-mark-positions))
--- 2693,2702 ----
    (make-local-variable 'gnus-summary-dummy-line-format)
    (make-local-variable 'gnus-summary-dummy-line-format-spec)
    (make-local-variable 'gnus-summary-mark-positions)
!   (gnus-make-local-hook 'pre-command-hook)
    (add-hook 'pre-command-hook 'gnus-set-global-variables nil t)
    (gnus-run-hooks 'gnus-summary-mode-hook)
+   (turn-on-gnus-mailing-list-mode)
    (mm-enable-multibyte)
    (gnus-update-format-specifications nil 'summary 'summary-mode 
'summary-dummy)
    (gnus-update-summary-mark-positions))
***************
*** 2290,2296 ****
            (setq gnus-newsgroup-data (nconc list gnus-newsgroup-data))
            (when offset
              (gnus-data-update-list odata offset)))
!       ;; Find the last element in the list to be spliced into the main
        ;; list.
        (while (cdr list)
          (setq list (cdr list)))
--- 2794,2800 ----
            (setq gnus-newsgroup-data (nconc list gnus-newsgroup-data))
            (when offset
              (gnus-data-update-list odata offset)))
!       ;; Find the last element in the list to be spliced into the main
        ;; list.
        (while (cdr list)
          (setq list (cdr list)))
***************
*** 2352,2358 ****
  (defun gnus-article-parent-p (number)
    "Say whether this article is a parent or not."
    (let ((data (gnus-data-find-list number)))
!     (and (cdr data)                   ; There has to be an article after...
         (< (gnus-data-level (car data)) ; And it has to have a higher level.
            (gnus-data-level (nth 1 data))))))
  
--- 2856,2862 ----
  (defun gnus-article-parent-p (number)
    "Say whether this article is a parent or not."
    (let ((data (gnus-data-find-list number)))
!     (and (cdr data)              ; There has to be an article after...
         (< (gnus-data-level (car data)) ; And it has to have a higher level.
            (gnus-data-level (nth 1 data))))))
  
***************
*** 2380,2385 ****
--- 2884,2890 ----
  (defun gnus-article-read-p (article)
    "Say whether ARTICLE is read or not."
    (not (or (memq article gnus-newsgroup-marked)
+          (memq article gnus-newsgroup-spam-marked)
           (memq article gnus-newsgroup-unreads)
           (memq article gnus-newsgroup-unselected)
           (memq article gnus-newsgroup-dormant))))
***************
*** 2470,2475 ****
--- 2975,2981 ----
  This is all marks except unread, ticked, dormant, and expirable."
    (not (or (= mark gnus-unread-mark)
           (= mark gnus-ticked-mark)
+          (= mark gnus-spam-mark)
           (= mark gnus-dormant-mark)
           (= mark gnus-expirable-mark))))
  
***************
*** 2481,2490 ****
  marks of articles."
    `(cond
      ((memq ,number gnus-newsgroup-unsendable) gnus-unsendable-mark)
-     ((memq ,number gnus-newsgroup-undownloaded) gnus-undownloaded-mark)
      ((memq ,number gnus-newsgroup-downloadable) gnus-downloadable-mark)
      ((memq ,number gnus-newsgroup-unreads) gnus-unread-mark)
      ((memq ,number gnus-newsgroup-marked) gnus-ticked-mark)
      ((memq ,number gnus-newsgroup-dormant) gnus-dormant-mark)
      ((memq ,number gnus-newsgroup-expirable) gnus-expirable-mark)
      (t (or (cdr (assq ,number gnus-newsgroup-reads))
--- 2987,2996 ----
  marks of articles."
    `(cond
      ((memq ,number gnus-newsgroup-unsendable) gnus-unsendable-mark)
      ((memq ,number gnus-newsgroup-downloadable) gnus-downloadable-mark)
      ((memq ,number gnus-newsgroup-unreads) gnus-unread-mark)
      ((memq ,number gnus-newsgroup-marked) gnus-ticked-mark)
+     ((memq ,number gnus-newsgroup-spam-marked) gnus-spam-mark)
      ((memq ,number gnus-newsgroup-dormant) gnus-dormant-mark)
      ((memq ,number gnus-newsgroup-expirable) gnus-expirable-mark)
      (t (or (cdr (assq ,number gnus-newsgroup-reads))
***************
*** 2492,2500 ****
  
  ;; Saving hidden threads.
  
- (put 'gnus-save-hidden-threads 'lisp-indent-function 0)
- (put 'gnus-save-hidden-threads 'edebug-form-spec '(body))
- 
  (defmacro gnus-save-hidden-threads (&rest forms)
    "Save hidden threads, eval FORMS, and restore the hidden threads."
    (let ((config (make-symbol "config")))
--- 2998,3003 ----
***************
*** 2503,2508 ****
--- 3006,3013 ----
           (save-excursion
             ,@forms)
         (gnus-restore-hidden-threads-configuration ,config)))))
+ (put 'gnus-save-hidden-threads 'lisp-indent-function 0)
+ (put 'gnus-save-hidden-threads 'edebug-form-spec '(body))
  
  (defun gnus-data-compute-positions ()
    "Compute the positions of all articles."
***************
*** 2558,2564 ****
      ;; Nix out all the control chars...
      (while (>= (setq i (1- i)) 0)
        (aset table i [??]))
!     ;; ... but not newline and cr, of course.  (cr is necessary for the
      ;; selective display).
      (aset table ?\n nil)
      (aset table ?\r nil)
--- 3063,3069 ----
      ;; Nix out all the control chars...
      (while (>= (setq i (1- i)) 0)
        (aset table i [??]))
!    ;; ... but not newline and cr, of course.  (cr is necessary for the
      ;; selective display).
      (aset table ?\n nil)
      (aset table ?\r nil)
***************
*** 2572,2580 ****
          (aset table i [??]))))
      (setq buffer-display-table table)))
  
  (defun gnus-summary-setup-buffer (group)
    "Initialize summary buffer."
!   (let ((buffer (concat "*Summary " group "*")))
      (if (get-buffer buffer)
        (progn
          (set-buffer buffer)
--- 3077,3105 ----
          (aset table i [??]))))
      (setq buffer-display-table table)))
  
+ (defun gnus-summary-set-article-display-arrow (pos)
+   "Update the overlay arrow to point to line at position POS."
+   (when (and gnus-summary-display-arrow
+            (boundp 'overlay-arrow-position)
+            (boundp 'overlay-arrow-string))
+     (save-excursion
+       (goto-char pos)
+       (beginning-of-line)
+       (unless overlay-arrow-position
+       (setq overlay-arrow-position (make-marker)))
+       (setq overlay-arrow-string "=>"
+           overlay-arrow-position (set-marker overlay-arrow-position
+                                              (point)
+                                              (current-buffer))))))
+ 
  (defun gnus-summary-setup-buffer (group)
    "Initialize summary buffer."
!   (let ((buffer (gnus-summary-buffer-name group))
!       (dead-name (concat "*Dead Summary "
!                          (gnus-group-decoded-name group) "*")))
!     ;; If a dead summary buffer exists, we kill it.
!     (when (gnus-buffer-live-p dead-name)
!       (gnus-kill-buffer dead-name))
      (if (get-buffer buffer)
        (progn
          (set-buffer buffer)
***************
*** 2590,2595 ****
--- 3115,3122 ----
        (make-local-variable 'gnus-article-current)
        (make-local-variable 'gnus-original-article-buffer))
        (setq gnus-newsgroup-name group)
+       ;; Set any local variables in the group parameters.
+       (gnus-summary-set-local-parameters gnus-newsgroup-name)
        t)))
  
  (defun gnus-set-global-variables ()
***************
*** 2600,2605 ****
--- 3127,3133 ----
      (setq gnus-summary-buffer (current-buffer))
      (let ((name gnus-newsgroup-name)
          (marked gnus-newsgroup-marked)
+         (spam gnus-newsgroup-spam-marked)
          (unread gnus-newsgroup-unreads)
          (headers gnus-current-headers)
          (data gnus-newsgroup-data)
***************
*** 2609,2619 ****
          (gac gnus-article-current)
          (reffed gnus-reffed-article-number)
          (score-file gnus-current-score-file)
!         (default-charset gnus-newsgroup-charset))
        (save-excursion
        (set-buffer gnus-group-buffer)
        (setq gnus-newsgroup-name name
              gnus-newsgroup-marked marked
              gnus-newsgroup-unreads unread
              gnus-current-headers headers
              gnus-newsgroup-data data
--- 3137,3156 ----
          (gac gnus-article-current)
          (reffed gnus-reffed-article-number)
          (score-file gnus-current-score-file)
!         (default-charset gnus-newsgroup-charset)
!         vlist)
!       (let ((locals gnus-newsgroup-variables))
!       (while locals
!         (if (consp (car locals))
!             (push (eval (caar locals)) vlist)
!           (push (eval (car locals)) vlist))
!         (setq locals (cdr locals)))
!       (setq vlist (nreverse vlist)))
        (save-excursion
        (set-buffer gnus-group-buffer)
        (setq gnus-newsgroup-name name
              gnus-newsgroup-marked marked
+             gnus-newsgroup-spam-marked spam
              gnus-newsgroup-unreads unread
              gnus-current-headers headers
              gnus-newsgroup-data data
***************
*** 2624,2629 ****
--- 3161,3172 ----
              gnus-reffed-article-number reffed
              gnus-current-score-file score-file
              gnus-newsgroup-charset default-charset)
+       (let ((locals gnus-newsgroup-variables))
+         (while locals
+           (if (consp (car locals))
+               (set (caar locals) (pop vlist))
+             (set (car locals) (pop vlist)))
+           (setq locals (cdr locals))))
        ;; The article buffer also has local variables.
        (when (gnus-buffer-live-p gnus-article-buffer)
          (set-buffer gnus-article-buffer)
***************
*** 2665,2679 ****
      (let ((gnus-replied-mark 129)
          (gnus-score-below-mark 130)
          (gnus-score-over-mark 130)
!         (gnus-download-mark 131)
          (spec gnus-summary-line-format-spec)
          gnus-visual pos)
        (save-excursion
        (gnus-set-work-buffer)
        (let ((gnus-summary-line-format-spec spec)
!             (gnus-newsgroup-downloadable '((0 . t))))
          (gnus-summary-insert-line
!          [0 "" "" "" "" "" 0 0 "" nil]  0 nil 128 t nil "" nil 1)
          (goto-char (point-min))
          (setq pos (list (cons 'unread (and (search-forward "\200" nil t)
                                             (- (point) (point-min) 1)))))
--- 3208,3223 ----
      (let ((gnus-replied-mark 129)
          (gnus-score-below-mark 130)
          (gnus-score-over-mark 130)
!         (gnus-undownloaded-mark 131)
          (spec gnus-summary-line-format-spec)
          gnus-visual pos)
        (save-excursion
        (gnus-set-work-buffer)
        (let ((gnus-summary-line-format-spec spec)
!             (gnus-newsgroup-downloadable '(0)))
          (gnus-summary-insert-line
!          [0 "" "" "05 Apr 2001 23:33:09 +0400" "" "" 0 0 "" nil]
!          0 nil t 128 t nil "" nil 1)
          (goto-char (point-min))
          (setq pos (list (cons 'unread (and (search-forward "\200" nil t)
                                             (- (point) (point-min) 1)))))
***************
*** 2699,2734 ****
     (point) (progn (eval gnus-summary-dummy-line-format-spec) (point))
     (list 'gnus-number gnus-tmp-number 'gnus-intangible gnus-tmp-number)))
  
! (defun gnus-summary-from-or-to-or-newsgroups (header)
!   (let ((to (cdr (assq 'To (mail-header-extra header))))
!       (newsgroups (cdr (assq 'Newsgroups (mail-header-extra header))))
!       (mail-parse-charset gnus-newsgroup-charset)
        (mail-parse-ignored-charsets
         (save-excursion (set-buffer gnus-summary-buffer)
                         gnus-newsgroup-ignored-charsets)))
!     (cond
!      ((and to
!          gnus-ignored-from-addresses
!          (string-match gnus-ignored-from-addresses
!                        (mail-header-from header)))
!       (concat "-> "
!             (or (car (funcall gnus-extract-address-components
!                               (funcall
!                                gnus-decode-encoded-word-function to)))
!                 (funcall gnus-decode-encoded-word-function to))))
!      ((and newsgroups
!          gnus-ignored-from-addresses
!          (string-match gnus-ignored-from-addresses
!                        (mail-header-from header)))
!       (concat "=> " newsgroups))
!      (t
!       (or (car (funcall gnus-extract-address-components
!                       (mail-header-from header)))
!         (mail-header-from header))))))
  
  (defun gnus-summary-insert-line (gnus-tmp-header
                                 gnus-tmp-level gnus-tmp-current
!                                gnus-tmp-unread gnus-tmp-replied
                                 gnus-tmp-expirable gnus-tmp-subject-or-nil
                                 &optional gnus-tmp-dummy gnus-tmp-score
                                 gnus-tmp-process)
--- 3243,3278 ----
     (point) (progn (eval gnus-summary-dummy-line-format-spec) (point))
     (list 'gnus-number gnus-tmp-number 'gnus-intangible gnus-tmp-number)))
  
! (defun gnus-summary-extract-address-component (from)
!   (or (car (funcall gnus-extract-address-components from))
!       from))
! 
! (defun gnus-summary-from-or-to-or-newsgroups (header gnus-tmp-from)
!   (let ((mail-parse-charset gnus-newsgroup-charset)
!       ; Is it really necessary to do this next part for each summary line?
!       ; Luckily, doesn't seem to slow things down much.
        (mail-parse-ignored-charsets
         (save-excursion (set-buffer gnus-summary-buffer)
                         gnus-newsgroup-ignored-charsets)))
!     (or
!      (and gnus-ignored-from-addresses
!         (string-match gnus-ignored-from-addresses gnus-tmp-from)
!         (let ((extra-headers (mail-header-extra header))
!               to
!               newsgroups)
!           (cond
!            ((setq to (cdr (assq 'To extra-headers)))
!             (concat "-> "
!                     (inline
!                       (gnus-summary-extract-address-component
!                        (funcall gnus-decode-encoded-word-function to)))))
!            ((setq newsgroups (cdr (assq 'Newsgroups extra-headers)))
!             (concat "=> " newsgroups)))))
!      (inline (gnus-summary-extract-address-component gnus-tmp-from)))))
  
  (defun gnus-summary-insert-line (gnus-tmp-header
                                 gnus-tmp-level gnus-tmp-current
!                                undownloaded gnus-tmp-unread gnus-tmp-replied
                                 gnus-tmp-expirable gnus-tmp-subject-or-nil
                                 &optional gnus-tmp-dummy gnus-tmp-score
                                 gnus-tmp-process)
***************
*** 2739,2781 ****
          (if (or (null gnus-summary-default-score)
                  (<= (abs (- gnus-tmp-score gnus-summary-default-score))
                      gnus-summary-zcore-fuzz))
!             ?  ;Whitespace
            (if (< gnus-tmp-score gnus-summary-default-score)
                gnus-score-below-mark gnus-score-over-mark)))
         (gnus-tmp-replied
          (cond (gnus-tmp-process gnus-process-mark)
                ((memq gnus-tmp-current gnus-newsgroup-cached)
                 gnus-cached-mark)
                (gnus-tmp-replied gnus-replied-mark)
                ((memq gnus-tmp-current gnus-newsgroup-saved)
                 gnus-saved-mark)
!               (t gnus-unread-mark)))
         (gnus-tmp-from (mail-header-from gnus-tmp-header))
         (gnus-tmp-name
          (cond
           ((string-match "<[^>]+> *$" gnus-tmp-from)
            (let ((beg (match-beginning 0)))
!             (or (and (string-match "^\"[^\"]*\"" gnus-tmp-from)
!                      (substring gnus-tmp-from (1+ (match-beginning 0))
!                                 (1- (match-end 0))))
                  (substring gnus-tmp-from 0 beg))))
           ((string-match "(.+)" gnus-tmp-from)
            (substring gnus-tmp-from
                       (1+ (match-beginning 0)) (1- (match-end 0))))
           (t gnus-tmp-from)))
         (gnus-tmp-subject (mail-header-subject gnus-tmp-header))
-        (gnus-tmp-number (mail-header-number gnus-tmp-header))
         (gnus-tmp-opening-bracket (if gnus-tmp-dummy ?\< ?\[))
         (gnus-tmp-closing-bracket (if gnus-tmp-dummy ?\> ?\]))
         (buffer-read-only nil))
      (when (string= gnus-tmp-name "")
        (setq gnus-tmp-name gnus-tmp-from))
      (unless (numberp gnus-tmp-lines)
!       (setq gnus-tmp-lines 0))
!     (gnus-put-text-property
       (point)
       (progn (eval gnus-summary-line-format-spec) (point))
!      'gnus-number gnus-tmp-number)
      (when (gnus-visual-p 'summary-highlight 'highlight)
        (forward-line -1)
        (gnus-run-hooks 'gnus-summary-update-hook)
--- 3283,3340 ----
          (if (or (null gnus-summary-default-score)
                  (<= (abs (- gnus-tmp-score gnus-summary-default-score))
                      gnus-summary-zcore-fuzz))
!             ?                         ;Whitespace
            (if (< gnus-tmp-score gnus-summary-default-score)
                gnus-score-below-mark gnus-score-over-mark)))
+        (gnus-tmp-number (mail-header-number gnus-tmp-header))
         (gnus-tmp-replied
          (cond (gnus-tmp-process gnus-process-mark)
                ((memq gnus-tmp-current gnus-newsgroup-cached)
                 gnus-cached-mark)
                (gnus-tmp-replied gnus-replied-mark)
+               ((memq gnus-tmp-current gnus-newsgroup-forwarded)
+                gnus-forwarded-mark)
                ((memq gnus-tmp-current gnus-newsgroup-saved)
                 gnus-saved-mark)
!               ((memq gnus-tmp-number gnus-newsgroup-recent)
!                gnus-recent-mark)
!               ((memq gnus-tmp-number gnus-newsgroup-unseen)
!                gnus-unseen-mark)
!               (t gnus-no-mark)))
!        (gnus-tmp-downloaded
!         (cond (undownloaded
!                  gnus-undownloaded-mark)
!                 (gnus-newsgroup-agentized
!                  gnus-downloaded-mark)
!                 (t
!                  gnus-no-mark)))
         (gnus-tmp-from (mail-header-from gnus-tmp-header))
         (gnus-tmp-name
          (cond
           ((string-match "<[^>]+> *$" gnus-tmp-from)
            (let ((beg (match-beginning 0)))
!             (or (and (string-match "^\".+\"" gnus-tmp-from)
!                      (substring gnus-tmp-from 1 (1- (match-end 0))))
                  (substring gnus-tmp-from 0 beg))))
           ((string-match "(.+)" gnus-tmp-from)
            (substring gnus-tmp-from
                       (1+ (match-beginning 0)) (1- (match-end 0))))
           (t gnus-tmp-from)))
         (gnus-tmp-subject (mail-header-subject gnus-tmp-header))
         (gnus-tmp-opening-bracket (if gnus-tmp-dummy ?\< ?\[))
         (gnus-tmp-closing-bracket (if gnus-tmp-dummy ?\> ?\]))
         (buffer-read-only nil))
      (when (string= gnus-tmp-name "")
        (setq gnus-tmp-name gnus-tmp-from))
      (unless (numberp gnus-tmp-lines)
!       (setq gnus-tmp-lines -1))
!     (if (= gnus-tmp-lines -1)
!       (setq gnus-tmp-lines "?")
!       (setq gnus-tmp-lines (number-to-string gnus-tmp-lines)))
!       (gnus-put-text-property
       (point)
       (progn (eval gnus-summary-line-format-spec) (point))
!        'gnus-number gnus-tmp-number)
      (when (gnus-visual-p 'summary-highlight 'highlight)
        (forward-line -1)
        (gnus-run-hooks 'gnus-summary-update-hook)
***************
*** 2804,2810 ****
         (if (or (null gnus-summary-default-score)
                 (<= (abs (- score gnus-summary-default-score))
                     gnus-summary-zcore-fuzz))
!            ?  ;Whitespace
           (if (< score gnus-summary-default-score)
               gnus-score-below-mark gnus-score-over-mark))
         'score))
--- 3363,3369 ----
         (if (or (null gnus-summary-default-score)
                 (<= (abs (- score gnus-summary-default-score))
                     gnus-summary-zcore-fuzz))
!            ?                          ;Whitespace
           (if (< score gnus-summary-default-score)
               gnus-score-below-mark gnus-score-over-mark))
         'score))
***************
*** 2819,2825 ****
  This may be 0 in some cases -- if none of the articles in
  the thread are to be displayed."
    (let* ((number
!         ;; Fix by Luc Van Eycken <address@hidden>.
          (cond
           ((not (listp thread))
            1)
--- 3378,3384 ----
  This may be 0 in some cases -- if none of the articles in
  the thread are to be displayed."
    (let* ((number
!        ;; Fix by Luc Van Eycken <address@hidden>.
          (cond
           ((not (listp thread))
            1)
***************
*** 2842,2850 ****
--- 3401,3422 ----
          gnus-empty-thread-mark)
        number)))
  
+ (defsubst gnus-summary-line-message-size (head)
+   "Return pretty-printed version of message size.
+ This function is intended to be used in
+ `gnus-summary-line-format-alist'."
+   (let ((c (or (mail-header-chars head) -1)))
+     (cond ((< c 0) "n/a")             ; chars not available
+         ((< c (* 1000 10)) (format "%1.1fk" (/ c 1024.0)))
+         ((< c (* 1000 100)) (format "%dk" (/ c 1024.0)))
+         ((< c (* 1000 10000)) (format "%1.1fM" (/ c (* 1024.0 1024))))
+         (t (format "%dM" (/ c (* 1024.0 1024)))))))
+ 
+ 
  (defun gnus-summary-set-local-parameters (group)
    "Go through the local params of GROUP and set all variable specs in that 
list."
    (let ((params (gnus-group-find-parameter group))
+       (vars '(quit-config))           ; Ignore quit-config.
        elem)
      (while params
        (setq elem (car params)
***************
*** 2852,2859 ****
        (and (consp elem)                       ; Has to be a cons.
           (consp (cdr elem))           ; The cdr has to be a list.
           (symbolp (car elem))         ; Has to be a symbol in there.
!          (not (memq (car elem) '(quit-config))) ; Ignore quit-config.
           (ignore-errors               ; So we set it.
             (make-local-variable (car elem))
             (set (car elem) (eval (nth 1 elem))))))))
  
--- 3424,3432 ----
        (and (consp elem)                       ; Has to be a cons.
           (consp (cdr elem))           ; The cdr has to be a list.
           (symbolp (car elem))         ; Has to be a symbol in there.
!          (not (memq (car elem) vars))
           (ignore-errors               ; So we set it.
+            (push (car elem) vars)
             (make-local-variable (car elem))
             (set (car elem) (eval (nth 1 elem))))))))
  
***************
*** 2890,2899 ****
                                        kill-buffer no-display
                                        &optional select-articles)
    ;; Killed foreign groups can't be entered.
!   (when (and (not (gnus-group-native-p group))
!            (not (gnus-gethash group gnus-newsrc-hashtb)))
!     (error "Dead non-native groups can't be entered"))
!   (gnus-message 5 "Retrieving newsgroup: %s..." group)
    (let* ((new-group (gnus-summary-setup-buffer group))
         (quit-config (gnus-group-quit-config group))
         (did-select (and new-group (gnus-select-newsgroup
--- 3463,3473 ----
                                        kill-buffer no-display
                                        &optional select-articles)
    ;; Killed foreign groups can't be entered.
!   ;;  (when (and (not (gnus-group-native-p group))
!   ;;       (not (gnus-gethash group gnus-newsrc-hashtb)))
!   ;;    (error "Dead non-native groups can't be entered"))
!   (gnus-message 5 "Retrieving newsgroup: %s..."
!               (gnus-group-decoded-name group))
    (let* ((new-group (gnus-summary-setup-buffer group))
         (quit-config (gnus-group-quit-config group))
         (did-select (and new-group (gnus-select-newsgroup
***************
*** 2923,2929 ****
              (gnus-group-jump-to-group group)
              (gnus-group-next-unread-group 1))
          (gnus-handle-ephemeral-exit quit-config)))
!       (gnus-message 3 "Can't select group")
        nil)
       ;; The user did a `C-g' while prompting for number of articles,
       ;; so we exit this group.
--- 3497,3507 ----
              (gnus-group-jump-to-group group)
              (gnus-group-next-unread-group 1))
          (gnus-handle-ephemeral-exit quit-config)))
!       (let ((grpinfo (gnus-get-info group)))
!       (if (null (gnus-info-read grpinfo))
!           (gnus-message 3 "Group %s contains no messages"
!                         (gnus-group-decoded-name group))
!         (gnus-message 3 "Can't select group")))
        nil)
       ;; The user did a `C-g' while prompting for number of articles,
       ;; so we exit this group.
***************
*** 2951,2958 ****
             (gnus-active gnus-newsgroup-name)))
        ;; You can change the summary buffer in some way with this hook.
        (gnus-run-hooks 'gnus-select-group-hook)
-       ;; Set any local variables in the group parameters.
-       (gnus-summary-set-local-parameters gnus-newsgroup-name)
        (gnus-update-format-specifications
         nil 'summary 'summary-mode 'summary-dummy)
        (gnus-update-summary-mark-positions)
--- 3529,3534 ----
***************
*** 3004,3014 ****
        ;; Hide conversation thread subtrees.  We cannot do this in
        ;; gnus-summary-prepare-hook since kill processing may not
        ;; work with hidden articles.
!       (and gnus-show-threads
!            gnus-thread-hide-subtree
!            (gnus-summary-hide-all-threads))
        (when kill-buffer
          (gnus-kill-or-deaden-summary kill-buffer))
        ;; Show first unread article if requested.
        (if (and (not no-article)
                 (not no-display)
--- 3580,3589 ----
        ;; Hide conversation thread subtrees.  We cannot do this in
        ;; gnus-summary-prepare-hook since kill processing may not
        ;; work with hidden articles.
!       (gnus-summary-maybe-hide-threads)
        (when kill-buffer
          (gnus-kill-or-deaden-summary kill-buffer))
+       (gnus-summary-auto-select-subject)
        ;; Show first unread article if requested.
        (if (and (not no-article)
                 (not no-display)
***************
*** 3016,3035 ****
                 gnus-auto-select-first)
            (progn
              (gnus-configure-windows 'summary)
!             (cond
!              ((eq gnus-auto-select-first 'best)
!               (gnus-summary-best-unread-article))
!              ((eq gnus-auto-select-first t)
!               (gnus-summary-first-unread-article))
!              ((gnus-functionp gnus-auto-select-first)
!               (funcall gnus-auto-select-first))))
!         ;; Don't select any articles, just move point to the first
!         ;; article in the group.
!         (goto-char (point-min))
          (gnus-summary-position-point)
          (gnus-configure-windows 'summary 'force)
          (gnus-set-mode-line 'summary))
!       (when (get-buffer-window gnus-group-buffer t)
          ;; Gotta use windows, because recenter does weird stuff if
          ;; the current buffer ain't the displayed window.
          (let ((owin (selected-window)))
--- 3591,3607 ----
                 gnus-auto-select-first)
            (progn
              (gnus-configure-windows 'summary)
!             (let ((art (gnus-summary-article-number)))
!               (unless (and (not gnus-plugged)
!                            (or (memq art gnus-newsgroup-undownloaded)
!                                (memq art gnus-newsgroup-downloadable)))
!                 (gnus-summary-goto-article art))))
!         ;; Don't select any articles.
          (gnus-summary-position-point)
          (gnus-configure-windows 'summary 'force)
          (gnus-set-mode-line 'summary))
!       (when (and gnus-auto-center-group
!                  (get-buffer-window gnus-group-buffer t))
          ;; Gotta use windows, because recenter does weird stuff if
          ;; the current buffer ain't the displayed window.
          (let ((owin (selected-window)))
***************
*** 3040,3047 ****
--- 3612,3639 ----
        ;; Mark this buffer as "prepared".
        (setq gnus-newsgroup-prepared t)
        (gnus-run-hooks 'gnus-summary-prepared-hook)
+       (unless (gnus-ephemeral-group-p group)
+         (gnus-group-update-group group))
        t)))))
  
+ (defun gnus-summary-auto-select-subject ()
+   "Select the subject line on initial group entry."
+   (goto-char (point-min))
+   (cond
+    ((eq gnus-auto-select-subject 'best)
+     (gnus-summary-best-unread-subject))
+    ((eq gnus-auto-select-subject 'unread)
+     (gnus-summary-first-unread-subject))
+    ((eq gnus-auto-select-subject 'unseen)
+     (gnus-summary-first-unseen-subject))
+    ((eq gnus-auto-select-subject 'unseen-or-unread)
+     (gnus-summary-first-unseen-or-unread-subject))
+    ((eq gnus-auto-select-subject 'first)
+     ;; Do nothing.
+     )
+    ((functionp gnus-auto-select-subject)
+     (funcall gnus-auto-select-subject))))
+ 
  (defun gnus-summary-prepare ()
    "Generate the summary buffer."
    (interactive)
***************
*** 3066,3072 ****
      (gnus-run-hooks 'gnus-summary-prepare-hook)))
  
  (defsubst gnus-general-simplify-subject (subject)
!   "Simply subject by the same rules as gnus-gather-threads-by-subject."
    (setq subject
        (cond
         ;; Truncate the subject.
--- 3658,3664 ----
      (gnus-run-hooks 'gnus-summary-prepare-hook)))
  
  (defsubst gnus-general-simplify-subject (subject)
!   "Simplify subject by the same rules as `gnus-gather-threads-by-subject'."
    (setq subject
        (cond
         ;; Truncate the subject.
***************
*** 3086,3092 ****
  
    (if (and gnus-summary-gather-exclude-subject
           (string-match gnus-summary-gather-exclude-subject subject))
!       nil                             ; This article shouldn't be gathered
      subject))
  
  (defun gnus-summary-simplify-subject-query ()
--- 3678,3684 ----
  
    (if (and gnus-summary-gather-exclude-subject
           (string-match gnus-summary-gather-exclude-subject subject))
!       nil                         ; This article shouldn't be gathered
      subject))
  
  (defun gnus-summary-simplify-subject-query ()
***************
*** 3122,3128 ****
                (setcdr prev (cdr threads))
                (setq threads prev))
            ;; Enter this thread into the hash table.
!           (gnus-sethash subject threads hashtb)))
        (setq prev threads)
        (setq threads (cdr threads)))
        result)))
--- 3714,3729 ----
                (setcdr prev (cdr threads))
                (setq threads prev))
            ;; Enter this thread into the hash table.
!           (gnus-sethash subject
!                         (if gnus-summary-make-false-root-always
!                             (progn
!                               ;; If you want a dummy root above all
!                               ;; threads...
!                               (setcar threads (list whole-subject
!                                                     (car threads)))
!                               threads)
!                           threads)
!                         hashtb)))
        (setq prev threads)
        (setq threads (cdr threads)))
        result)))
***************
*** 3137,3143 ****
      (while threads
        (when (setq references (mail-header-references (caar threads)))
        (setq id (mail-header-id (caar threads))
!             ids (gnus-split-references references)
              entered nil)
        (while (setq ref (pop ids))
          (setq ids (delete ref ids))
--- 3738,3744 ----
      (while threads
        (when (setq references (mail-header-references (caar threads)))
        (setq id (mail-header-id (caar threads))
!             ids (inline (gnus-split-references references))
              entered nil)
        (while (setq ref (pop ids))
          (setq ids (delete ref ids))
***************
*** 3221,3228 ****
                  (setq threads nil)
                  (throw 'infloop t))
                (unless (car (symbol-value refs))
!                 ;; These threads do not refer back to any other articles,
!                 ;; so they're roots.
                  (setq threads (append (cdr (symbol-value refs)) threads))))
              gnus-newsgroup-dependencies)))
      threads))
--- 3822,3829 ----
                  (setq threads nil)
                  (throw 'infloop t))
                (unless (car (symbol-value refs))
!                 ;; These threads do not refer back to any other
!                 ;; articles, so they're roots.
                  (setq threads (append (cdr (symbol-value refs)) threads))))
              gnus-newsgroup-dependencies)))
      threads))
***************
*** 3236,3248 ****
  
  If `gnus-summary-ignore-duplicates' is nil then duplicate Message-IDs
  will not be entered in the DEPENDENCIES table.  Otherwise duplicate
! Message-IDs will be renamed be renamed to a unique Message-ID before
! being entered.
  
  Returns HEADER if it was entered in the DEPENDENCIES.  Returns nil otherwise."
    (let* ((id (mail-header-id header))
         (id-dep (and id (intern id dependencies)))
!        ref ref-dep ref-header)
      ;; Enter this `header' in the `dependencies' table.
      (cond
       ((not id-dep)
--- 3837,3849 ----
  
  If `gnus-summary-ignore-duplicates' is nil then duplicate Message-IDs
  will not be entered in the DEPENDENCIES table.  Otherwise duplicate
! Message-IDs will be renamed to a unique Message-ID before being
! entered.
  
  Returns HEADER if it was entered in the DEPENDENCIES.  Returns nil otherwise."
    (let* ((id (mail-header-id header))
         (id-dep (and id (intern id dependencies)))
!        parent-id ref ref-dep ref-header replaced)
      ;; Enter this `header' in the `dependencies' table.
      (cond
       ((not id-dep)
***************
*** 3259,3265 ****
       (force-new
        ;; Overrides an existing entry;
        ;; just set the header part of the entry.
!       (setcar (symbol-value id-dep) header))
  
       ;; Renames the existing `header' to a unique Message-ID.
       ((not gnus-summary-ignore-duplicates)
--- 3860,3867 ----
       (force-new
        ;; Overrides an existing entry;
        ;; just set the header part of the entry.
!       (setcar (symbol-value id-dep) header)
!       (setq replaced t))
  
       ;; Renames the existing `header' to a unique Message-ID.
       ((not gnus-summary-ignore-duplicates)
***************
*** 3282,3290 ****
               (or (mail-header-xref header) "")))
        (setq header nil)))
  
!     (when header
!       ;; First check if that we are not creating a References loop.
!       (setq ref (gnus-parent-id (mail-header-references header)))
        (while (and ref
                  (setq ref-dep (intern-soft ref dependencies))
                  (boundp ref-dep)
--- 3884,3893 ----
               (or (mail-header-xref header) "")))
        (setq header nil)))
  
!     (when (and header (not replaced))
!       ;; First check that we are not creating a References loop.
!       (setq parent-id (gnus-parent-id (mail-header-references header)))
!       (setq ref parent-id)
        (while (and ref
                  (setq ref-dep (intern-soft ref dependencies))
                  (boundp ref-dep)
***************
*** 3294,3303 ****
            ;; root article.
            (progn
              (mail-header-set-references (car (symbol-value id-dep)) "none")
!             (setq ref nil))
          (setq ref (gnus-parent-id (mail-header-references ref-header)))))
!       (setq ref (gnus-parent-id (mail-header-references header)))
!       (setq ref-dep (intern (or ref "none") dependencies))
        (if (boundp ref-dep)
          (setcdr (symbol-value ref-dep)
                  (nconc (cdr (symbol-value ref-dep))
--- 3897,3906 ----
            ;; root article.
            (progn
              (mail-header-set-references (car (symbol-value id-dep)) "none")
!             (setq ref nil)
!             (setq parent-id nil))
          (setq ref (gnus-parent-id (mail-header-references ref-header)))))
!       (setq ref-dep (intern (or parent-id "none") dependencies))
        (if (boundp ref-dep)
          (setcdr (symbol-value ref-dep)
                  (nconc (cdr (symbol-value ref-dep))
***************
*** 3305,3310 ****
--- 3908,3918 ----
        (set ref-dep (list nil (symbol-value id-dep)))))
      header))
  
+ (defun gnus-extract-message-id-from-in-reply-to (string)
+   (if (string-match "<[^>]+>" string)
+       (substring string (match-beginning 0) (match-end 0))
+     nil))
+ 
  (defun gnus-build-sparse-threads ()
    (let ((headers gnus-newsgroup-headers)
        (mail-parse-charset gnus-newsgroup-charset)
***************
*** 3376,3391 ****
             (setq heads nil)))))
       gnus-newsgroup-dependencies)))
  
  ;; This function has to be called with point after the article number
  ;; on the beginning of the line.
  (defsubst gnus-nov-parse-line (number dependencies &optional force-new)
    (let ((eol (gnus-point-at-eol))
        (buffer (current-buffer))
!       header)
  
      ;; overview: [num subject from date id refs chars lines misc]
      (unwind-protect
!       (progn
          (narrow-to-region (point) eol)
          (unless (eobp)
            (forward-char))
--- 3984,4006 ----
             (setq heads nil)))))
       gnus-newsgroup-dependencies)))
  
+ (defsubst gnus-remove-odd-characters (string)
+   "Translate STRING into something that doesn't contain weird characters."
+   (mm-subst-char-in-string
+    ?\r ?\-
+    (mm-subst-char-in-string
+     ?\n ?\- string)))
+ 
  ;; This function has to be called with point after the article number
  ;; on the beginning of the line.
  (defsubst gnus-nov-parse-line (number dependencies &optional force-new)
    (let ((eol (gnus-point-at-eol))
        (buffer (current-buffer))
!       header references in-reply-to)
  
      ;; overview: [num subject from date id refs chars lines misc]
      (unwind-protect
!       (let (x)
          (narrow-to-region (point) eol)
          (unless (eobp)
            (forward-char))
***************
*** 3393,3405 ****
          (setq header
                (make-full-mail-header
                 number                 ; number
!                (funcall gnus-decode-encoded-word-function
!                         (nnheader-nov-field)) ; subject
!                (funcall gnus-decode-encoded-word-function
!                         (nnheader-nov-field)) ; from
                 (nnheader-nov-field)   ; date
                 (nnheader-nov-read-message-id) ; id
!                (nnheader-nov-field)   ; refs
                 (nnheader-nov-read-integer) ; chars
                 (nnheader-nov-read-integer) ; lines
                 (unless (eobp)
--- 4008,4026 ----
          (setq header
                (make-full-mail-header
                 number                 ; number
!                (condition-case ()     ; subject
!                    (gnus-remove-odd-characters
!                     (funcall gnus-decode-encoded-word-function
!                              (setq x (nnheader-nov-field))))
!                  (error x))
!                (condition-case ()     ; from
!                    (gnus-remove-odd-characters
!                     (funcall gnus-decode-encoded-word-function
!                              (setq x (nnheader-nov-field))))
!                  (error x))
                 (nnheader-nov-field)   ; date
                 (nnheader-nov-read-message-id) ; id
!                (setq references (nnheader-nov-field)) ; refs
                 (nnheader-nov-read-integer) ; chars
                 (nnheader-nov-read-integer) ; lines
                 (unless (eobp)
***************
*** 3410,3415 ****
--- 4031,4042 ----
  
        (widen))
  
+     (when (and (string= references "")
+              (setq in-reply-to (mail-header-extra header))
+              (setq in-reply-to (cdr (assq 'In-Reply-To in-reply-to))))
+       (mail-header-set-references
+        header (gnus-extract-message-id-from-in-reply-to in-reply-to)))
+ 
      (when gnus-alter-header-function
        (funcall gnus-alter-header-function header))
      (gnus-dependencies-add-header header dependencies force-new)))
***************
*** 3444,3450 ****
          (push header gnus-newsgroup-headers)
          (if (memq number gnus-newsgroup-unselected)
              (progn
!               (push number gnus-newsgroup-unreads)
                (setq gnus-newsgroup-unselected
                      (delq number gnus-newsgroup-unselected)))
            (push number gnus-newsgroup-ancient)))))))
--- 4071,4079 ----
          (push header gnus-newsgroup-headers)
          (if (memq number gnus-newsgroup-unselected)
              (progn
!               (setq gnus-newsgroup-unreads
!                     (gnus-add-to-sorted-list gnus-newsgroup-unreads
!                                              number))
                (setq gnus-newsgroup-unselected
                      (delq number gnus-newsgroup-unselected)))
            (push number gnus-newsgroup-ancient)))))))
***************
*** 3470,3483 ****
              (if (memq (setq article (mail-header-number header))
                        gnus-newsgroup-unselected)
                  (progn
!                   (push article gnus-newsgroup-unreads)
                    (setq gnus-newsgroup-unselected
                          (delq article gnus-newsgroup-unselected)))
                (push article gnus-newsgroup-ancient)))
            (forward-line 1)))))))
  
  (defun gnus-summary-update-article-line (article header)
!   "Update the line for ARTICLE using HEADERS."
    (let* ((id (mail-header-id header))
         (thread (gnus-id-to-thread id)))
      (unless thread
--- 4099,4114 ----
              (if (memq (setq article (mail-header-number header))
                        gnus-newsgroup-unselected)
                  (progn
!                   (setq gnus-newsgroup-unreads
!                         (gnus-add-to-sorted-list
!                          gnus-newsgroup-unreads article))
                    (setq gnus-newsgroup-unselected
                          (delq article gnus-newsgroup-unselected)))
                (push article gnus-newsgroup-ancient)))
            (forward-line 1)))))))
  
  (defun gnus-summary-update-article-line (article header)
!   "Update the line for ARTICLE using HEADER."
    (let* ((id (mail-header-id header))
         (thread (gnus-id-to-thread id)))
      (unless thread
***************
*** 3487,3524 ****
      (gnus-summary-goto-subject article)
      (let* ((datal (gnus-data-find-list article))
           (data (car datal))
-          (length (when (cdr datal)
-                    (- (gnus-data-pos data)
-                       (gnus-data-pos (cadr datal)))))
           (buffer-read-only nil)
           (level (gnus-summary-thread-level)))
        (gnus-delete-line)
!       (gnus-summary-insert-line
!        header level nil (gnus-article-mark article)
!        (memq article gnus-newsgroup-replied)
!        (memq article gnus-newsgroup-expirable)
!        ;; Only insert the Subject string when it's different
!        ;; from the previous Subject string.
!        (if (and
!           gnus-show-threads
!           (gnus-subject-equal
!            (condition-case ()
!                (mail-header-subject
!                 (gnus-data-header
!                  (cadr
!                   (gnus-data-find-list
!                    article
!                    (gnus-data-list t)))))
!              ;; Error on the side of excessive subjects.
!              (error ""))
!            (mail-header-subject header)))
!          ""
!        (mail-header-subject header))
!        nil (cdr (assq article gnus-newsgroup-scored))
!        (memq article gnus-newsgroup-processable))
!       (when length
!       (gnus-data-update-list
!        (cdr datal) (- length (- (gnus-data-pos data) (point))))))))
  
  (defun gnus-summary-update-article (article &optional iheader)
    "Update ARTICLE in the summary buffer."
--- 4118,4158 ----
      (gnus-summary-goto-subject article)
      (let* ((datal (gnus-data-find-list article))
           (data (car datal))
           (buffer-read-only nil)
           (level (gnus-summary-thread-level)))
        (gnus-delete-line)
!       (let ((inserted (- (point)
!                          (progn
!                            (gnus-summary-insert-line
!                             header level nil
!                             (memq article gnus-newsgroup-undownloaded)
!                             (gnus-article-mark article)
!                             (memq article gnus-newsgroup-replied)
!                             (memq article gnus-newsgroup-expirable)
!                             ;; Only insert the Subject string when it's 
different
!                             ;; from the previous Subject string.
!                             (if (and
!                                  gnus-show-threads
!                                  (gnus-subject-equal
!                                   (condition-case ()
!                                       (mail-header-subject
!                                        (gnus-data-header
!                                         (cadr
!                                          (gnus-data-find-list
!                                           article
!                                           (gnus-data-list t)))))
!                                     ;; Error on the side of excessive 
subjects.
!                                     (error ""))
!                                   (mail-header-subject header)))
!                                 ""
!                               (mail-header-subject header))
!                             nil (cdr (assq article gnus-newsgroup-scored))
!                             (memq article gnus-newsgroup-processable))
!                            (point)))))
!         (when (cdr datal)
!           (gnus-data-update-list
!            (cdr datal)
!            (- (gnus-data-pos data) (gnus-data-pos (cadr datal)) 
inserted)))))))
  
  (defun gnus-summary-update-article (article &optional iheader)
    "Update ARTICLE in the summary buffer."
***************
*** 3756,3766 ****
    (if (not gnus-thread-sort-functions)
        threads
      (gnus-message 8 "Sorting threads...")
!     (prog1
!       (gnus-sort-threads-1
         threads
         (gnus-make-sort-function gnus-thread-sort-functions))
!       (gnus-message 8 "Sorting threads...done"))))
  
  (defun gnus-sort-articles (articles)
    "Sort ARTICLES."
--- 4390,4400 ----
    (if (not gnus-thread-sort-functions)
        threads
      (gnus-message 8 "Sorting threads...")
!     (let ((max-lisp-eval-depth 5000))
!       (prog1 (gnus-sort-threads-1
         threads
         (gnus-make-sort-function gnus-thread-sort-functions))
!         (gnus-message 8 "Sorting threads...done")))))
  
  (defun gnus-sort-articles (articles)
    "Sort ARTICLES."
***************
*** 3792,3797 ****
--- 4426,4440 ----
    (gnus-article-sort-by-number
     (gnus-thread-header h1) (gnus-thread-header h2)))
  
+ (defsubst gnus-article-sort-by-random (h1 h2)
+   "Sort articles by article number."
+   (zerop (random 2)))
+ 
+ (defun gnus-thread-sort-by-random (h1 h2)
+   "Sort threads by root article number."
+   (gnus-article-sort-by-random
+    (gnus-thread-header h1) (gnus-thread-header h2)))
+ 
  (defsubst gnus-article-sort-by-lines (h1 h2)
    "Sort articles by article Lines header."
    (< (mail-header-lines h1)
***************
*** 3873,3887 ****
  
  (defun gnus-thread-total-score (thread)
    ;; This function find the total score of THREAD.
!   (cond ((null thread)
!        0)
!       ((consp thread)
!        (if (stringp (car thread))
!            (apply gnus-thread-score-function 0
!                   (mapcar 'gnus-thread-total-score-1 (cdr thread)))
!          (gnus-thread-total-score-1 thread)))
!       (t
!        (gnus-thread-total-score-1 (list thread)))))
  
  (defun gnus-thread-total-score-1 (root)
    ;; This function find the total score of the thread below ROOT.
--- 4516,4562 ----
  
  (defun gnus-thread-total-score (thread)
    ;; This function find the total score of THREAD.
!   (cond
!    ((null thread)
!     0)
!    ((consp thread)
!     (if (stringp (car thread))
!       (apply gnus-thread-score-function 0
!              (mapcar 'gnus-thread-total-score-1 (cdr thread)))
!       (gnus-thread-total-score-1 thread)))
!    (t
!     (gnus-thread-total-score-1 (list thread)))))
! 
! (defun gnus-thread-sort-by-most-recent-number (h1 h2)
!   "Sort threads such that the thread with the most recently arrived article 
comes first."
!   (> (gnus-thread-highest-number h1) (gnus-thread-highest-number h2)))
! 
! (defun gnus-thread-highest-number (thread)
!   "Return the highest article number in THREAD."
!   (apply 'max (mapcar (lambda (header)
!                       (mail-header-number header))
!                     (message-flatten-list thread))))
! 
! (defun gnus-thread-sort-by-most-recent-date (h1 h2)
!   "Sort threads such that the thread with the most recently dated article 
comes first."
!   (> (gnus-thread-latest-date h1) (gnus-thread-latest-date h2)))
! 
! (defun gnus-thread-latest-date (thread)
!   "Return the highest article date in THREAD."
!   (let ((previous-time 0))
!     (apply 'max
!          (mapcar
!           (lambda (header)
!             (setq previous-time
!                   (condition-case ()
!                       (time-to-seconds (mail-header-parse-date
!                                         (mail-header-date header)))
!                     (error previous-time))))
!           (sort
!            (message-flatten-list thread)
!            (lambda (h1 h2)
!              (< (mail-header-number h1)
!                 (mail-header-number h2))))))))
  
  (defun gnus-thread-total-score-1 (root)
    ;; This function find the total score of the thread below ROOT.
***************
*** 3909,3914 ****
--- 4584,4623 ----
    (or (cdr (assq type (mail-header-extra (or header gnus-tmp-header))))
        ""))
  
+ (defvar gnus-tmp-thread-tree-header-string "")
+ 
+ (defcustom gnus-sum-thread-tree-root "> "
+   "With %B spec, used for the root of a thread.
+ If nil, use subject instead."
+   :type '(radio (const :format "%v  " nil) (string :size 0))
+   :group 'gnus-thread)
+ (defcustom gnus-sum-thread-tree-false-root "> "
+   "With %B spec, used for a false root of a thread.
+ If nil, use subject instead."
+   :type '(radio (const :format "%v  " nil) (string :size 0))
+   :group 'gnus-thread)
+ (defcustom gnus-sum-thread-tree-single-indent ""
+   "With %B spec, used for a thread with just one message.
+ If nil, use subject instead."
+   :type '(radio (const :format "%v  " nil) (string :size 0))
+   :group 'gnus-thread)
+ (defcustom gnus-sum-thread-tree-vertical "| "
+   "With %B spec, used for drawing a vertical line."
+   :type 'string
+   :group 'gnus-thread)
+ (defcustom gnus-sum-thread-tree-indent "  "
+   "With %B spec, used for indenting."
+   :type 'string
+   :group 'gnus-thread)
+ (defcustom gnus-sum-thread-tree-leaf-with-other "+-> "
+   "With %B spec, used for a leaf with brothers."
+   :type 'string
+   :group 'gnus-thread)
+ (defcustom gnus-sum-thread-tree-single-leaf "\\-> "
+   "With %B spec, used for a leaf without brothers."
+   :type 'string
+   :group 'gnus-thread)
+ 
  (defun gnus-summary-prepare-threads (threads)
    "Prepare summary buffer from THREADS and indentation LEVEL.
  THREADS is either a list of `(PARENT [(CHILD1 [(GRANDCHILD ...]...) ...])'
***************
*** 3921,3935 ****
    (let ((gnus-tmp-level 0)
        (default-score (or gnus-summary-default-score 0))
        (gnus-visual-p (gnus-visual-p 'summary-highlight 'highlight))
        thread number subject stack state gnus-tmp-gathered beg-match
!       new-roots gnus-tmp-new-adopts thread-end
!       gnus-tmp-header gnus-tmp-unread
        gnus-tmp-replied gnus-tmp-subject-or-nil
        gnus-tmp-dummy gnus-tmp-indentation gnus-tmp-lines gnus-tmp-score
        gnus-tmp-score-char gnus-tmp-from gnus-tmp-name
!       gnus-tmp-number gnus-tmp-opening-bracket gnus-tmp-closing-bracket)
  
!     (setq gnus-tmp-prev-subject nil)
  
      (if (vectorp (car threads))
        ;; If this is a straight (sic) list of headers, then a
--- 4630,4648 ----
    (let ((gnus-tmp-level 0)
        (default-score (or gnus-summary-default-score 0))
        (gnus-visual-p (gnus-visual-p 'summary-highlight 'highlight))
+       (building-line-count gnus-summary-display-while-building)
+       (building-count (integerp gnus-summary-display-while-building))
        thread number subject stack state gnus-tmp-gathered beg-match
!       new-roots gnus-tmp-new-adopts thread-end simp-subject
!       gnus-tmp-header gnus-tmp-unread gnus-tmp-downloaded
        gnus-tmp-replied gnus-tmp-subject-or-nil
        gnus-tmp-dummy gnus-tmp-indentation gnus-tmp-lines gnus-tmp-score
        gnus-tmp-score-char gnus-tmp-from gnus-tmp-name
!       gnus-tmp-number gnus-tmp-opening-bracket gnus-tmp-closing-bracket
!       tree-stack)
  
!     (setq gnus-tmp-prev-subject nil
!           gnus-tmp-thread-tree-header-string "")
  
      (if (vectorp (car threads))
        ;; If this is a straight (sic) list of headers, then a
***************
*** 3939,3944 ****
--- 4652,4659 ----
  
        ;; Do the threaded display.
  
+       (if gnus-summary-display-while-building
+         (switch-to-buffer (buffer-name)))
        (while (or threads stack gnus-tmp-new-adopts new-roots)
  
        (if (and (= gnus-tmp-level 0)
***************
*** 3965,3971 ****
            ;; the stack.
            (setq state (car stack)
                  gnus-tmp-level (car state)
!                 thread (cdr state)
                  stack (cdr stack)
                  gnus-tmp-header (caar thread))))
  
--- 4680,4687 ----
            ;; the stack.
            (setq state (car stack)
                  gnus-tmp-level (car state)
!                 tree-stack (cadr state)
!                 thread (caddr state)
                  stack (cdr stack)
                  gnus-tmp-header (caar thread))))
  
***************
*** 4009,4015 ****
              (setq gnus-tmp-level -1)))
  
          (setq number (mail-header-number gnus-tmp-header)
!               subject (mail-header-subject gnus-tmp-header))
  
          (cond
           ;; If the thread has changed subject, we might want to make
--- 4725,4732 ----
              (setq gnus-tmp-level -1)))
  
          (setq number (mail-header-number gnus-tmp-header)
!               subject (mail-header-subject gnus-tmp-header)
!               simp-subject (gnus-simplify-subject-fully subject))
  
          (cond
           ;; If the thread has changed subject, we might want to make
***************
*** 4017,4024 ****
           ((and (null gnus-thread-ignore-subject)
                 (not (zerop gnus-tmp-level))
                 gnus-tmp-prev-subject
!                (not (inline
!                       (gnus-subject-equal gnus-tmp-prev-subject subject))))
            (setq new-roots (nconc new-roots (list (car thread)))
                  thread-end t
                  gnus-tmp-header nil))
--- 4734,4740 ----
           ((and (null gnus-thread-ignore-subject)
                 (not (zerop gnus-tmp-level))
                 gnus-tmp-prev-subject
!                (not (string= gnus-tmp-prev-subject simp-subject)))
            (setq new-roots (nconc new-roots (list (car thread)))
                  thread-end t
                  gnus-tmp-header nil))
***************
*** 4049,4055 ****
            (setq gnus-newsgroup-unreads
                  (delq number gnus-newsgroup-unreads))
            (if gnus-newsgroup-auto-expire
!               (push number gnus-newsgroup-expirable)
              (push (cons number gnus-low-score-mark)
                    gnus-newsgroup-reads))))
  
--- 4765,4773 ----
            (setq gnus-newsgroup-unreads
                  (delq number gnus-newsgroup-unreads))
            (if gnus-newsgroup-auto-expire
!               (setq gnus-newsgroup-expirable
!                     (gnus-add-to-sorted-list
!                      gnus-newsgroup-expirable number))
              (push (cons number gnus-low-score-mark)
                    gnus-newsgroup-reads))))
  
***************
*** 4077,4091 ****
             (cond
              ((and gnus-thread-ignore-subject
                    gnus-tmp-prev-subject
!                   (not (inline (gnus-subject-equal
!                                 gnus-tmp-prev-subject subject))))
               subject)
              ((zerop gnus-tmp-level)
               (if (and (eq gnus-summary-make-false-root 'empty)
                        (memq number gnus-tmp-gathered)
                        gnus-tmp-prev-subject
!                       (inline (gnus-subject-equal
!                                gnus-tmp-prev-subject subject)))
                   gnus-summary-same-subject
                 subject))
              (t gnus-summary-same-subject)))
--- 4795,4807 ----
             (cond
              ((and gnus-thread-ignore-subject
                    gnus-tmp-prev-subject
!                   (not (string= gnus-tmp-prev-subject simp-subject)))
               subject)
              ((zerop gnus-tmp-level)
               (if (and (eq gnus-summary-make-false-root 'empty)
                        (memq number gnus-tmp-gathered)
                        gnus-tmp-prev-subject
!                       (string= gnus-tmp-prev-subject simp-subject))
                   gnus-summary-same-subject
                 subject))
              (t gnus-summary-same-subject)))
***************
*** 4106,4112 ****
             (if (or (null gnus-summary-default-score)
                     (<= (abs (- gnus-tmp-score gnus-summary-default-score))
                         gnus-summary-zcore-fuzz))
!                ?  ;Whitespace
               (if (< gnus-tmp-score gnus-summary-default-score)
                   gnus-score-below-mark gnus-score-over-mark))
             gnus-tmp-replied
--- 4822,4828 ----
             (if (or (null gnus-summary-default-score)
                     (<= (abs (- gnus-tmp-score gnus-summary-default-score))
                         gnus-summary-zcore-fuzz))
!                ?                      ;Whitespace
               (if (< gnus-tmp-score gnus-summary-default-score)
                   gnus-score-below-mark gnus-score-over-mark))
             gnus-tmp-replied
***************
*** 4116,4156 ****
                    gnus-cached-mark)
                   ((memq number gnus-newsgroup-replied)
                    gnus-replied-mark)
                   ((memq number gnus-newsgroup-saved)
                    gnus-saved-mark)
!                  (t gnus-unread-mark))
             gnus-tmp-from (mail-header-from gnus-tmp-header)
             gnus-tmp-name
             (cond
              ((string-match "<[^>]+> *$" gnus-tmp-from)
               (setq beg-match (match-beginning 0))
!              (or (and (string-match "^\"[^\"]*\"" gnus-tmp-from)
!                       (substring gnus-tmp-from (1+ (match-beginning 0))
!                                  (1- (match-end 0))))
                   (substring gnus-tmp-from 0 beg-match)))
              ((string-match "(.+)" gnus-tmp-from)
               (substring gnus-tmp-from
                          (1+ (match-beginning 0)) (1- (match-end 0))))
!             (t gnus-tmp-from)))
            (when (string= gnus-tmp-name "")
              (setq gnus-tmp-name gnus-tmp-from))
            (unless (numberp gnus-tmp-lines)
!             (setq gnus-tmp-lines 0))
!           (gnus-put-text-property
             (point)
             (progn (eval gnus-summary-line-format-spec) (point))
!            'gnus-number number)
            (when gnus-visual-p
              (forward-line -1)
              (gnus-run-hooks 'gnus-summary-update-hook)
              (forward-line 1))
  
!           (setq gnus-tmp-prev-subject subject)))
  
        (when (nth 1 thread)
!         (push (cons (max 0 gnus-tmp-level) (nthcdr 1 thread)) stack))
        (incf gnus-tmp-level)
        (setq threads (if thread-end nil (cdar thread)))
        (unless threads
          (setq gnus-tmp-level 0)))))
    (gnus-message 7 "Generating summary...done"))
--- 4832,4924 ----
                    gnus-cached-mark)
                   ((memq number gnus-newsgroup-replied)
                    gnus-replied-mark)
+                  ((memq number gnus-newsgroup-forwarded)
+                   gnus-forwarded-mark)
                   ((memq number gnus-newsgroup-saved)
                    gnus-saved-mark)
!                  ((memq number gnus-newsgroup-recent)
!                   gnus-recent-mark)
!                  ((memq number gnus-newsgroup-unseen)
!                   gnus-unseen-mark)
!                  (t gnus-no-mark))
!            gnus-tmp-downloaded
!              (cond ((memq number gnus-newsgroup-undownloaded)
!                     gnus-undownloaded-mark)
!                    (gnus-newsgroup-agentized
!                     gnus-downloaded-mark)
!                    (t
!                     gnus-no-mark))
             gnus-tmp-from (mail-header-from gnus-tmp-header)
             gnus-tmp-name
             (cond
              ((string-match "<[^>]+> *$" gnus-tmp-from)
               (setq beg-match (match-beginning 0))
!              (or (and (string-match "^\".+\"" gnus-tmp-from)
!                       (substring gnus-tmp-from 1 (1- (match-end 0))))
                   (substring gnus-tmp-from 0 beg-match)))
              ((string-match "(.+)" gnus-tmp-from)
               (substring gnus-tmp-from
                          (1+ (match-beginning 0)) (1- (match-end 0))))
!             (t gnus-tmp-from))
! 
!            ;; Do the %B string
!            gnus-tmp-thread-tree-header-string
!            (cond
!             ((not gnus-show-threads) "")
!             ((zerop gnus-tmp-level)
!              (cond ((cdar thread)
!                     (or gnus-sum-thread-tree-root subject))
!                    (gnus-tmp-new-adopts
!                     (or gnus-sum-thread-tree-false-root subject))
!                    (t
!                     (or gnus-sum-thread-tree-single-indent subject))))
!             (t
!              (concat (apply 'concat
!                             (mapcar (lambda (item)
!                                       (if (= item 1)
!                                           gnus-sum-thread-tree-vertical
!                                         gnus-sum-thread-tree-indent))
!                                     (cdr (reverse tree-stack))))
!                      (if (nth 1 thread)
!                          gnus-sum-thread-tree-leaf-with-other
!                        gnus-sum-thread-tree-single-leaf)))))
            (when (string= gnus-tmp-name "")
              (setq gnus-tmp-name gnus-tmp-from))
            (unless (numberp gnus-tmp-lines)
!             (setq gnus-tmp-lines -1))
!           (if (= gnus-tmp-lines -1)
!               (setq gnus-tmp-lines "?")
!             (setq gnus-tmp-lines (number-to-string gnus-tmp-lines)))
!               (gnus-put-text-property
             (point)
             (progn (eval gnus-summary-line-format-spec) (point))
!                'gnus-number number)
            (when gnus-visual-p
              (forward-line -1)
              (gnus-run-hooks 'gnus-summary-update-hook)
              (forward-line 1))
  
!           (setq gnus-tmp-prev-subject simp-subject)))
  
        (when (nth 1 thread)
!         (push (list (max 0 gnus-tmp-level)
!                     (copy-sequence tree-stack)
!                     (nthcdr 1 thread))
!               stack))
!       (push (if (nth 1 thread) 1 0) tree-stack)
        (incf gnus-tmp-level)
        (setq threads (if thread-end nil (cdar thread)))
+       (if gnus-summary-display-while-building
+           (if building-count
+               (progn
+                 ;; use a set frequency
+                 (setq building-line-count (1- building-line-count))
+                 (when (= building-line-count 0)
+                   (sit-for 0)
+                   (setq building-line-count
+                         gnus-summary-display-while-building)))
+             ;; always
+             (sit-for 0)))
        (unless threads
          (setq gnus-tmp-level 0)))))
    (gnus-message 7 "Generating summary...done"))
***************
*** 4184,4189 ****
--- 4952,4958 ----
              gnus-newsgroup-data)
        (gnus-summary-insert-line
         header 0 number
+        (memq number gnus-newsgroup-undownloaded)
         mark (memq number gnus-newsgroup-replied)
         (memq number gnus-newsgroup-expirable)
         (mail-header-subject header) nil
***************
*** 4192,4212 ****
  
  (defun gnus-summary-remove-list-identifiers ()
    "Remove list identifiers in `gnus-list-identifiers' from articles in the 
current group."
!   (let ((regexp (if (stringp gnus-list-identifiers)
!                   gnus-list-identifiers
!                 (mapconcat 'identity gnus-list-identifiers " *\\|"))))
!     (dolist (header gnus-newsgroup-headers)
!       (when (string-match (concat "\\(\\(\\(Re: +\\)?\\(" regexp
!                                 " *\\)\\)+\\(Re: +\\)?\\)")
!                         (mail-header-subject header))
!       (mail-header-set-subject
!        header (concat (substring (mail-header-subject header)
!                                  0 (match-beginning 1))
!                       (or
!                        (match-string 3 (mail-header-subject header))
!                        (match-string 5 (mail-header-subject header)))
!                       (substring (mail-header-subject header)
!                                  (match-end 1))))))))
  
  (defun gnus-select-newsgroup (group &optional read-all select-articles)
    "Select newsgroup GROUP.
--- 4961,5010 ----
  
  (defun gnus-summary-remove-list-identifiers ()
    "Remove list identifiers in `gnus-list-identifiers' from articles in the 
current group."
!   (let ((regexp (if (consp gnus-list-identifiers)
!                   (mapconcat 'identity gnus-list-identifiers " *\\|")
!                 gnus-list-identifiers))
!       changed subject)
!     (when regexp
!       (dolist (header gnus-newsgroup-headers)
!       (setq subject (mail-header-subject header)
!             changed nil)
!       (while (string-match
!               (concat "^\\(R[Ee]: +\\)*\\(" regexp " *\\)")
!               subject)
!         (setq subject
!               (concat (substring subject 0 (match-beginning 2))
!                       (substring subject (match-end 0)))
!               changed t))
!       (when (and changed
!                  (string-match
!                   "^\\(\\(R[Ee]: +\\)+\\)R[Ee]: +" subject))
!         (setq subject
!               (concat (substring subject 0 (match-beginning 1))
!                       (substring subject (match-end 1)))))
!       (when changed
!         (mail-header-set-subject header subject))))))
! 
! (defun gnus-fetch-headers (articles)
!   "Fetch headers of ARTICLES."
!   (let ((name (gnus-group-decoded-name gnus-newsgroup-name)))
!     (gnus-message 5 "Fetching headers for %s..." name)
!     (prog1
!       (if (eq 'nov
!               (setq gnus-headers-retrieved-by
!                     (gnus-retrieve-headers
!                      articles gnus-newsgroup-name
!                      ;; We might want to fetch old headers, but
!                      ;; not if there is only 1 article.
!                      (and (or (and
!                                (not (eq gnus-fetch-old-headers 'some))
!                                (not (numberp gnus-fetch-old-headers)))
!                               (> (length articles) 1))
!                           gnus-fetch-old-headers))))
!           (gnus-get-newsgroup-headers-xover
!            articles nil nil gnus-newsgroup-name t)
!         (gnus-get-newsgroup-headers))
!       (gnus-message 5 "Fetching headers for %s...done" name))))
  
  (defun gnus-select-newsgroup (group &optional read-all select-articles)
    "Select newsgroup GROUP.
***************
*** 4215,4221 ****
    (let* ((entry (gnus-gethash group gnus-newsrc-hashtb))
         ;;!!! Dirty hack; should be removed.
         (gnus-summary-ignore-duplicates
!         (if (eq (car (gnus-find-method-for-group group)) 'nnvirtual)
              t
            gnus-summary-ignore-duplicates))
         (info (nth 2 entry))
--- 5013,5019 ----
    (let* ((entry (gnus-gethash group gnus-newsrc-hashtb))
         ;;!!! Dirty hack; should be removed.
         (gnus-summary-ignore-duplicates
!         (if (eq (car (gnus-find-method-for-group group)) 'nnvirtual)
              t
            gnus-summary-ignore-duplicates))
         (info (nth 2 entry))
***************
*** 4230,4272 ****
        (gnus-activate-group group)     ; Or we can activate it...
        (progn                          ; Or we bug out.
          (when (equal major-mode 'gnus-summary-mode)
!           (kill-buffer (current-buffer)))
!         (error "Couldn't request group %s: %s"
                 group (gnus-status-message group))))
  
      (unless (gnus-request-group group t)
        (when (equal major-mode 'gnus-summary-mode)
!       (kill-buffer (current-buffer)))
        (error "Couldn't request group %s: %s"
             group (gnus-status-message group)))
  
!     (setq gnus-newsgroup-name group)
!     (setq gnus-newsgroup-unselected nil)
!     (setq gnus-newsgroup-unreads (gnus-list-of-unread-articles group))
!     (gnus-summary-setup-default-charset)
  
!     ;; Adjust and set lists of article marks.
!     (when info
!       (gnus-adjust-marked-articles info))
  
      ;; Kludge to avoid having cached articles nixed out in virtual groups.
      (when (gnus-virtual-group-p group)
        (setq cached gnus-newsgroup-cached))
  
      (setq gnus-newsgroup-unreads
!         (gnus-set-difference
!          (gnus-set-difference gnus-newsgroup-unreads gnus-newsgroup-marked)
           gnus-newsgroup-dormant))
  
      (setq gnus-newsgroup-processable nil)
  
      (gnus-update-read-articles group gnus-newsgroup-unreads)
  
      (if (setq articles select-articles)
        (setq gnus-newsgroup-unselected
!             (gnus-sorted-intersection
!              gnus-newsgroup-unreads
!              (gnus-sorted-complement gnus-newsgroup-unreads articles)))
        (setq articles (gnus-articles-to-read group read-all)))
  
      (cond
--- 5028,5118 ----
        (gnus-activate-group group)     ; Or we can activate it...
        (progn                          ; Or we bug out.
          (when (equal major-mode 'gnus-summary-mode)
!           (gnus-kill-buffer (current-buffer)))
!         (error "Couldn't activate group %s: %s"
                 group (gnus-status-message group))))
  
      (unless (gnus-request-group group t)
        (when (equal major-mode 'gnus-summary-mode)
!       (gnus-kill-buffer (current-buffer)))
        (error "Couldn't request group %s: %s"
             group (gnus-status-message group)))
  
!     (when gnus-agent
!       ;; The agent may be storing articles that are no longer in the
!       ;; server's active range.  If that is the case, the active range
!       ;; needs to be expanded such that the agent's articles can be
!       ;; included in the summary.
!       (let* ((gnus-command-method (gnus-find-method-for-group group))
!              (alist (gnus-agent-load-alist group))
!              (active (gnus-active group)))
!         (if (and (car alist)
!                  (< (caar alist) (car active)))
!             (gnus-set-active group (cons (caar alist) (cdr active)))))
! 
!       (setq gnus-summary-use-undownloaded-faces
!           (gnus-agent-find-parameter
!            group
!            'agent-enable-undownloaded-faces)))
! 
!     (setq gnus-newsgroup-name group
!         gnus-newsgroup-unselected nil
!         gnus-newsgroup-unreads (gnus-list-of-unread-articles group))
  
!     (let ((display (gnus-group-find-parameter group 'display)))
!       (setq gnus-newsgroup-display
!           (cond
!            ((not (zerop (or (car-safe read-all) 0)))
!             ;; The user entered the group with C-u SPC/RET, let's show
!             ;; all articles.
!             'gnus-not-ignore)
!            ((eq display 'all)
!             'gnus-not-ignore)
!            ((arrayp display)
!             (gnus-summary-display-make-predicate (mapcar 'identity display)))
!            ((numberp display)
!             ;; The following is probably the "correct" solution, but
!             ;; it makes Gnus fetch all headers and then limit the
!             ;; articles (which is slow), so instead we hack the
!             ;; select-articles parameter instead. -- Simon Josefsson
!             ;; <address@hidden>
!             ;;
!             ;; (gnus-byte-compile
!             ;;  `(lambda () (> number ,(- (cdr (gnus-active group))
!             ;;                         display)))))
!             (setq select-articles
!                   (gnus-uncompress-range
!                    (cons (let ((tmp (- (cdr (gnus-active group)) display)))
!                            (if (> tmp 0)
!                                tmp
!                              1))
!                          (cdr (gnus-active group)))))
!             nil)
!            (t
!             nil))))
! 
!     (gnus-summary-setup-default-charset)
  
      ;; Kludge to avoid having cached articles nixed out in virtual groups.
      (when (gnus-virtual-group-p group)
        (setq cached gnus-newsgroup-cached))
  
      (setq gnus-newsgroup-unreads
!         (gnus-sorted-ndifference
!          (gnus-sorted-ndifference gnus-newsgroup-unreads
!                                   gnus-newsgroup-marked)
           gnus-newsgroup-dormant))
  
      (setq gnus-newsgroup-processable nil)
  
      (gnus-update-read-articles group gnus-newsgroup-unreads)
  
+     ;; Adjust and set lists of article marks.
+     (when info
+       (gnus-adjust-marked-articles info))
      (if (setq articles select-articles)
        (setq gnus-newsgroup-unselected
!             (gnus-sorted-difference gnus-newsgroup-unreads articles))
        (setq articles (gnus-articles-to-read group read-all)))
  
      (cond
***************
*** 4280,4302 ****
            (gnus-make-hashtable (length articles)))
        (gnus-set-global-variables)
        ;; Retrieve the headers and read them in.
!       (gnus-message 5 "Fetching headers for %s..." gnus-newsgroup-name)
!       (setq gnus-newsgroup-headers
!           (if (eq 'nov
!                   (setq gnus-headers-retrieved-by
!                         (gnus-retrieve-headers
!                          articles gnus-newsgroup-name
!                          ;; We might want to fetch old headers, but
!                          ;; not if there is only 1 article.
!                          (and (or (and
!                                    (not (eq gnus-fetch-old-headers 'some))
!                                    (not (numberp gnus-fetch-old-headers)))
!                                   (> (length articles) 1))
!                               gnus-fetch-old-headers))))
!               (gnus-get-newsgroup-headers-xover
!                articles nil nil gnus-newsgroup-name t)
!             (gnus-get-newsgroup-headers)))
!       (gnus-message 5 "Fetching headers for %s...done" gnus-newsgroup-name)
  
        ;; Kludge to avoid having cached articles nixed out in virtual groups.
        (when cached
--- 5126,5133 ----
            (gnus-make-hashtable (length articles)))
        (gnus-set-global-variables)
        ;; Retrieve the headers and read them in.
! 
!       (setq gnus-newsgroup-headers (gnus-fetch-headers articles))
  
        ;; Kludge to avoid having cached articles nixed out in virtual groups.
        (when cached
***************
*** 4309,4323 ****
        ;; Set the initial limit.
        (setq gnus-newsgroup-limit (copy-sequence articles))
        ;; Remove canceled articles from the list of unread articles.
        (setq gnus-newsgroup-unreads
!           (gnus-set-sorted-intersection
!            gnus-newsgroup-unreads
!            (setq fetched-articles
!                  (mapcar (lambda (headers) (mail-header-number headers))
!                          gnus-newsgroup-headers))))
        ;; Removed marked articles that do not exist.
        (gnus-update-missing-marks
!        (gnus-sorted-complement fetched-articles articles))
        ;; We might want to build some more threads first.
        (when (and gnus-fetch-old-headers
                 (eq gnus-headers-retrieved-by 'nov))
--- 5140,5157 ----
        ;; Set the initial limit.
        (setq gnus-newsgroup-limit (copy-sequence articles))
        ;; Remove canceled articles from the list of unread articles.
+       (setq fetched-articles
+           (mapcar (lambda (headers) (mail-header-number headers))
+                   gnus-newsgroup-headers))
+       (setq gnus-newsgroup-articles fetched-articles)
        (setq gnus-newsgroup-unreads
!           (gnus-sorted-nintersection
!            gnus-newsgroup-unreads fetched-articles))
!       (gnus-compute-unseen-list)
! 
        ;; Removed marked articles that do not exist.
        (gnus-update-missing-marks
!        (gnus-sorted-difference articles fetched-articles))
        ;; We might want to build some more threads first.
        (when (and gnus-fetch-old-headers
                 (eq gnus-headers-retrieved-by 'nov))
***************
*** 4346,4367 ****
        ;; GROUP is successfully selected.
        (or gnus-newsgroup-headers t)))))
  
  (defun gnus-articles-to-read (group &optional read-all)
    "Find out what articles the user wants to read."
!   (let* ((articles
          ;; Select all articles if `read-all' is non-nil, or if there
          ;; are no unread articles.
          (if (or read-all
                  (and (zerop (length gnus-newsgroup-marked))
                       (zerop (length gnus-newsgroup-unreads)))
!                 (eq (gnus-group-find-parameter group 'display)
!                     'all))
              (or
               (gnus-uncompress-range (gnus-active group))
               (gnus-cache-articles-in-group group))
!           (sort (append gnus-newsgroup-dormant gnus-newsgroup-marked
!                         (copy-sequence gnus-newsgroup-unreads))
!                 '<)))
         (scored-list (gnus-killed-articles gnus-newsgroup-killed articles))
         (scored (length scored-list))
         (number (length articles))
--- 5180,5276 ----
        ;; GROUP is successfully selected.
        (or gnus-newsgroup-headers t)))))
  
+ (defun gnus-compute-unseen-list ()
+   ;; The `seen' marks are treated specially.
+   (if (not gnus-newsgroup-seen)
+       (setq gnus-newsgroup-unseen gnus-newsgroup-articles)
+     (setq gnus-newsgroup-unseen
+         (gnus-inverse-list-range-intersection
+          gnus-newsgroup-articles gnus-newsgroup-seen))))
+ 
+ (defun gnus-summary-display-make-predicate (display)
+   (require 'gnus-agent)
+   (when (= (length display) 1)
+     (setq display (car display)))
+   (unless gnus-summary-display-cache
+     (dolist (elem (append '((unread . unread)
+                           (read . read)
+                           (unseen . unseen))
+                         gnus-article-mark-lists))
+       (push (cons (cdr elem)
+                 (gnus-byte-compile
+                  `(lambda () (gnus-article-marked-p ',(cdr elem)))))
+           gnus-summary-display-cache)))
+   (let ((gnus-category-predicate-alist gnus-summary-display-cache)
+       (gnus-category-predicate-cache gnus-summary-display-cache))
+     (gnus-get-predicate display)))
+ 
+ ;; Uses the dynamically bound `number' variable.
+ (eval-when-compile
+   (defvar number))
+ (defun gnus-article-marked-p (type &optional article)
+   (let ((article (or article number)))
+     (cond
+      ((eq type 'tick)
+       (memq article gnus-newsgroup-marked))
+      ((eq type 'spam)
+       (memq article gnus-newsgroup-spam-marked))
+      ((eq type 'unsend)
+       (memq article gnus-newsgroup-unsendable))
+      ((eq type 'undownload)
+       (memq article gnus-newsgroup-undownloaded))
+      ((eq type 'download)
+       (memq article gnus-newsgroup-downloadable))
+      ((eq type 'unread)
+       (memq article gnus-newsgroup-unreads))
+      ((eq type 'read)
+       (memq article gnus-newsgroup-reads))
+      ((eq type 'dormant)
+       (memq article gnus-newsgroup-dormant) )
+      ((eq type 'expire)
+       (memq article gnus-newsgroup-expirable))
+      ((eq type 'reply)
+       (memq article gnus-newsgroup-replied))
+      ((eq type 'killed)
+       (memq article gnus-newsgroup-killed))
+      ((eq type 'bookmark)
+       (assq article gnus-newsgroup-bookmarks))
+      ((eq type 'score)
+       (assq article gnus-newsgroup-scored))
+      ((eq type 'save)
+       (memq article gnus-newsgroup-saved))
+      ((eq type 'cache)
+       (memq article gnus-newsgroup-cached))
+      ((eq type 'forward)
+       (memq article gnus-newsgroup-forwarded))
+      ((eq type 'seen)
+       (not (memq article gnus-newsgroup-unseen)))
+      ((eq type 'recent)
+       (memq article gnus-newsgroup-recent))
+      (t t))))
+ 
  (defun gnus-articles-to-read (group &optional read-all)
    "Find out what articles the user wants to read."
!   (let* ((display (gnus-group-find-parameter group 'display))
!        (articles
          ;; Select all articles if `read-all' is non-nil, or if there
          ;; are no unread articles.
          (if (or read-all
                  (and (zerop (length gnus-newsgroup-marked))
                       (zerop (length gnus-newsgroup-unreads)))
!                 ;; Fetch all if the predicate is non-nil.
!                 gnus-newsgroup-display)
!             ;; We want to select the headers for all the articles in
!             ;; the group, so we select either all the active
!             ;; articles in the group, or (if that's nil), the
!             ;; articles in the cache.
              (or
               (gnus-uncompress-range (gnus-active group))
               (gnus-cache-articles-in-group group))
!           ;; Select only the "normal" subset of articles.
!           (gnus-sorted-nunion
!            (gnus-sorted-union gnus-newsgroup-dormant gnus-newsgroup-marked)
!            gnus-newsgroup-unreads)))
         (scored-list (gnus-killed-articles gnus-newsgroup-killed articles))
         (scored (length scored-list))
         (number (length articles))
***************
*** 4371,4388 ****
          (cond
           ((numberp read-all)
            read-all)
           (t
            (condition-case ()
                (cond
                 ((and (or (<= scored marked) (= scored number))
                       (numberp gnus-large-newsgroup)
                       (> number gnus-large-newsgroup))
!                 (let ((input
!                        (read-string
!                         (format
!                          "How many articles from %s (default %d): "
!                          (gnus-limit-string gnus-newsgroup-name 35)
!                          number))))
                    (if (string-match "^[ \t]*$" input) number input)))
                 ((and (> scored marked) (< scored number)
                       (> (- scored number) 20))
--- 5280,5308 ----
          (cond
           ((numberp read-all)
            read-all)
+          ((numberp gnus-newsgroup-display)
+           gnus-newsgroup-display)
           (t
            (condition-case ()
                (cond
                 ((and (or (<= scored marked) (= scored number))
                       (numberp gnus-large-newsgroup)
                       (> number gnus-large-newsgroup))
!                 (let* ((cursor-in-echo-area nil)
!                        (initial (gnus-parameter-large-newsgroup-initial
!                                  gnus-newsgroup-name))
!                        (input
!                         (read-string
!                          (format
!                           "How many articles from %s (%s %d): "
!                           (gnus-limit-string
!                            (gnus-group-decoded-name gnus-newsgroup-name)
!                            35)
!                           (if initial "max" "default")
!                           number)
!                          (if initial
!                              (cons (number-to-string initial)
!                                    0)))))
                    (if (string-match "^[ \t]*$" input) number input)))
                 ((and (> scored marked) (< scored number)
                       (> (- scored number) 20))
***************
*** 4390,4396 ****
                         (read-string
                          (format "%s %s (%d scored, %d total): "
                                  "How many articles from"
!                                 group scored number))))
                    (if (string-match "^[ \t]*$" input)
                        number input)))
                 (t number))
--- 5310,5317 ----
                         (read-string
                          (format "%s %s (%d scored, %d total): "
                                  "How many articles from"
!                                 (gnus-group-decoded-name group)
!                                 scored number))))
                    (if (string-match "^[ \t]*$" input)
                        number input)))
                 (t number))
***************
*** 4413,4426 ****
          ;; Select the N most recent articles.
          (setq articles (nthcdr (- number select) articles))))
        (setq gnus-newsgroup-unselected
!           (gnus-sorted-intersection
!            gnus-newsgroup-unreads
!            (gnus-sorted-complement gnus-newsgroup-unreads articles)))
        (when gnus-alter-articles-to-read-function
!       (setq gnus-newsgroup-unreads
              (sort
               (funcall gnus-alter-articles-to-read-function
!                       gnus-newsgroup-name gnus-newsgroup-unreads)
               '<)))
        articles)))
  
--- 5334,5345 ----
          ;; Select the N most recent articles.
          (setq articles (nthcdr (- number select) articles))))
        (setq gnus-newsgroup-unselected
!           (gnus-sorted-difference gnus-newsgroup-unreads articles))
        (when gnus-alter-articles-to-read-function
!       (setq articles
              (sort
               (funcall gnus-alter-articles-to-read-function
!                       gnus-newsgroup-name articles)
               '<)))
        articles)))
  
***************
*** 4443,4448 ****
--- 5362,5376 ----
        (setq marks (cdr marks)))
      out))
  
+ (defun gnus-article-mark-to-type (mark)
+   "Return the type of MARK."
+   (or (cadr (assq mark gnus-article-special-mark-lists))
+       'list))
+ 
+ (defun gnus-article-unpropagatable-p (mark)
+   "Return whether MARK should be propagated to back end."
+   (memq mark gnus-article-unpropagated-mark-lists))
+ 
  (defun gnus-adjust-marked-articles (info)
    "Set all article lists and remove all marks that are no longer valid."
    (let* ((marked-lists (gnus-info-marks info))
***************
*** 4450,4477 ****
         (min (car active))
         (max (cdr active))
         (types gnus-article-mark-lists)
!        (uncompressed '(score bookmark killed))
!        marks var articles article mark)
  
!     (while marked-lists
!       (setq marks (pop marked-lists))
!       (set (setq var (intern (format "gnus-newsgroup-%s"
!                                    (car (rassq (setq mark (car marks))
!                                                types)))))
!          (if (memq (car marks) uncompressed) (cdr marks)
!            (gnus-uncompress-range (cdr marks))))
  
!       (setq articles (symbol-value var))
! 
!       ;; All articles have to be subsets of the active articles.
        (cond
         ;; Adjust "simple" lists.
!        ((memq mark '(tick dormant expire reply save))
!       (while articles
!         (when (or (< (setq article (pop articles)) min) (> article max))
!           (set var (delq article (symbol-value var))))))
         ;; Adjust assocs.
!        ((memq mark uncompressed)
        (when (not (listp (cdr (symbol-value var))))
          (set var (list (symbol-value var))))
        (when (not (listp (cdr articles)))
--- 5378,5403 ----
         (min (car active))
         (max (cdr active))
         (types gnus-article-mark-lists)
!        marks var articles article mark mark-type)
  
!     (dolist (marks marked-lists)
!       (setq mark (car marks)
!           mark-type (gnus-article-mark-to-type mark)
!           var (intern (format "gnus-newsgroup-%s" (car (rassq mark types)))))
  
!       ;; We set the variable according to the type of the marks list,
!       ;; and then adjust the marks to a subset of the active articles.
        (cond
         ;; Adjust "simple" lists.
!        ((eq mark-type 'list)
!       (set var (setq articles (gnus-uncompress-range (cdr marks))))
!       (when (memq mark '(tick dormant expire reply save))
!         (while articles
!           (when (or (< (setq article (pop articles)) min) (> article max))
!             (set var (delq article (symbol-value var)))))))
         ;; Adjust assocs.
!        ((eq mark-type 'tuple)
!       (set var (setq articles (cdr marks)))
        (when (not (listp (cdr (symbol-value var))))
          (set var (list (symbol-value var))))
        (when (not (listp (cdr articles)))
***************
*** 4480,4515 ****
          (when (or (not (consp (setq article (pop articles))))
                    (< (car article) min)
                    (> (car article) max))
!           (set var (delq article (symbol-value var))))))))))
  
  (defun gnus-update-missing-marks (missing)
    "Go through the list of MISSING articles and remove them from the mark 
lists."
    (when missing
!     (let ((types gnus-article-mark-lists)
!         var m)
        ;; Go through all types.
!       (while types
!       (setq var (intern (format "gnus-newsgroup-%s" (car (pop types)))))
!       (when (symbol-value var)
!         ;; This list has articles.  So we delete all missing articles
!         ;; from it.
!         (setq m missing)
!         (while m
!           (set var (delq (pop m) (symbol-value var)))))))))
  
  (defun gnus-update-marks ()
    "Enter the various lists of marked articles into the newsgroup info list."
    (let ((types gnus-article-mark-lists)
        (info (gnus-get-info gnus-newsgroup-name))
-       (uncompressed '(score bookmark killed))
        type list newmarked symbol delta-marks)
      (when info
        ;; Add all marks lists to the list of marks lists.
        (while (setq type (pop types))
        (setq list (symbol-value
                    (setq symbol
!                         (intern (format "gnus-newsgroup-%s"
!                                         (car type))))))
  
        (when list
          ;; Get rid of the entries of the articles that have the
--- 5406,5455 ----
          (when (or (not (consp (setq article (pop articles))))
                    (< (car article) min)
                    (> (car article) max))
!           (set var (delq article (symbol-value var))))))
!        ;; Adjust ranges (sloppily).
!        ((eq mark-type 'range)
!       (cond
!        ((eq mark 'seen)
!         ;; Fix the record for `seen' if it looks like (seen NUM1 . NUM2).
!         ;; It should be (seen (NUM1 . NUM2)).
!         (when (numberp (cddr marks))
!           (setcdr marks (list (cdr marks))))
!         (setq articles (cdr marks))
!         (while (and articles
!                     (or (and (consp (car articles))
!                              (> min (cdar articles)))
!                         (and (numberp (car articles))
!                              (> min (car articles)))))
!           (pop articles))
!         (set var articles))))))))
  
  (defun gnus-update-missing-marks (missing)
    "Go through the list of MISSING articles and remove them from the mark 
lists."
    (when missing
!     (let (var m)
        ;; Go through all types.
!       (dolist (elem gnus-article-mark-lists)
!       (when (eq (gnus-article-mark-to-type (cdr elem)) 'list)
!         (setq var (intern (format "gnus-newsgroup-%s" (car elem))))
!         (when (symbol-value var)
!           ;; This list has articles.  So we delete all missing
!           ;; articles from it.
!           (setq m missing)
!           (while m
!             (set var (delq (pop m) (symbol-value var))))))))))
  
  (defun gnus-update-marks ()
    "Enter the various lists of marked articles into the newsgroup info list."
    (let ((types gnus-article-mark-lists)
        (info (gnus-get-info gnus-newsgroup-name))
        type list newmarked symbol delta-marks)
      (when info
        ;; Add all marks lists to the list of marks lists.
        (while (setq type (pop types))
        (setq list (symbol-value
                    (setq symbol
!                         (intern (format "gnus-newsgroup-%s" (car type))))))
  
        (when list
          ;; Get rid of the entries of the articles that have the
***************
*** 4528,4554 ****
                (setq arts (cdr arts)))
              (setq list (cdr all)))))
  
!       (unless (memq (cdr type) uncompressed)
          (setq list (gnus-compress-sequence (set symbol (sort list '<)) t)))
  
!       (when (gnus-check-backend-function
!              'request-set-mark gnus-newsgroup-name)
!         ;; propagate flags to server, with the following exceptions:
!         ;; uncompressed:s are not proper flags (they are cons cells)
!         ;; cache is a internal gnus flag
!         ;; download are local to one gnus installation (well)
!         ;; unsend are for nndraft groups only
!         ;; xxx: generality of this?  this suits nnimap anyway
!         (unless (memq (cdr type) (append '(cache download unsend)
!                                          uncompressed))
!           (let* ((old (cdr (assq (cdr type) (gnus-info-marks info))))
!                  (del (gnus-remove-from-range (gnus-copy-sequence old) list))
!                  (add (gnus-remove-from-range
!                        (gnus-copy-sequence list) old)))
!             (when add
!               (push (list add 'add (list (cdr type))) delta-marks))
!             (when del
!               (push (list del 'del (list (cdr type))) delta-marks)))))
  
        (when list
          (push (cons (cdr type) list) newmarked)))
--- 5468,5490 ----
                (setq arts (cdr arts)))
              (setq list (cdr all)))))
  
!       (when (eq (cdr type) 'seen)
!         (setq list (gnus-range-add list gnus-newsgroup-unseen)))
! 
!       (when (eq (gnus-article-mark-to-type (cdr type)) 'list)
          (setq list (gnus-compress-sequence (set symbol (sort list '<)) t)))
  
!       (when (and (gnus-check-backend-function
!                   'request-set-mark gnus-newsgroup-name)
!                  (not (gnus-article-unpropagatable-p (cdr type))))
!         (let* ((old (cdr (assq (cdr type) (gnus-info-marks info))))
!                (del (gnus-remove-from-range (gnus-copy-sequence old) list))
!                (add (gnus-remove-from-range
!                      (gnus-copy-sequence list) old)))
!           (when add
!             (push (list add 'add (list (cdr type))) delta-marks))
!           (when del
!             (push (list del 'del (list (cdr type))) delta-marks))))
  
        (when list
          (push (cons (cdr type) list) newmarked)))
***************
*** 4584,4599 ****
        ;; We evaluate this in the summary buffer since these
        ;; variables are buffer-local to that buffer.
        (set-buffer gnus-summary-buffer)
!       ;; We bind all these variables that are used in the `eval' form
        ;; below.
        (let* ((mformat (symbol-value
                         (intern
                          (format "gnus-%s-mode-line-format-spec" where))))
!              (gnus-tmp-group-name (gnus-group-name-decode
!                                    gnus-newsgroup-name
!                                    (gnus-group-name-charset
!                                     nil
!                                     gnus-newsgroup-name)))
               (gnus-tmp-article-number (or gnus-current-article 0))
               (gnus-tmp-unread gnus-newsgroup-unreads)
               (gnus-tmp-unread-and-unticked (length gnus-newsgroup-unreads))
--- 5520,5532 ----
        ;; We evaluate this in the summary buffer since these
        ;; variables are buffer-local to that buffer.
        (set-buffer gnus-summary-buffer)
!        ;; We bind all these variables that are used in the `eval' form
        ;; below.
        (let* ((mformat (symbol-value
                         (intern
                          (format "gnus-%s-mode-line-format-spec" where))))
!              (gnus-tmp-group-name (gnus-group-decoded-name
!                                    gnus-newsgroup-name))
               (gnus-tmp-article-number (or gnus-current-article 0))
               (gnus-tmp-unread gnus-newsgroup-unreads)
               (gnus-tmp-unread-and-unticked (length gnus-newsgroup-unreads))
***************
*** 4614,4620 ****
                     (mail-header-subject gnus-current-headers))
                  ""))
               bufname-length max-len
!              gnus-tmp-header);; passed as argument to any user-format-funcs
          (setq mode-string (eval mformat))
          (setq bufname-length (if (string-match "%b" mode-string)
                                   (- (length
--- 5547,5553 ----
                     (mail-header-subject gnus-current-headers))
                  ""))
               bufname-length max-len
!              gnus-tmp-header) ;; passed as argument to any user-format-funcs
          (setq mode-string (eval mformat))
          (setq bufname-length (if (string-match "%b" mode-string)
                                   (- (length
***************
*** 4755,4763 ****
--- 5688,5698 ----
             (gnus-info-set-marks ',info ',(gnus-info-marks info) t)
             (gnus-info-set-read ',info ',(gnus-info-read info))
             (gnus-get-unread-articles-in-group ',info (gnus-active ,group))
+            (gnus-request-set-mark ,group (list (list ',range 'del '(read))))
             (gnus-group-update-group ,group t))))
        ;; Add the read articles to the range.
        (gnus-info-set-read info range)
+       (gnus-request-set-mark group (list (list range 'add '(read))))
        ;; Then we have to re-compute how many unread
        ;; articles there are in this group.
        (when active
***************
*** 4777,4783 ****
        ;; Update the number of unread articles.
        (setcar entry num)
        ;; Update the group buffer.
!       (gnus-group-update-group group t)))))
  
  (defvar gnus-newsgroup-none-id 0)
  
--- 5712,5719 ----
        ;; Update the number of unread articles.
        (setcar entry num)
        ;; Update the group buffer.
!       (unless (gnus-ephemeral-group-p group)
!         (gnus-group-update-group group t))))))
  
  (defvar gnus-newsgroup-none-id 0)
  
***************
*** 4799,4804 ****
--- 5735,5741 ----
        ;; Translate all TAB characters into SPACE characters.
        (subst-char-in-region (point-min) (point-max) ?\t ?  t)
        (subst-char-in-region (point-min) (point-max) ?\r ?  t)
+       (ietf-drums-unfold-fws)
        (gnus-run-hooks 'gnus-parse-headers-hook)
        (let ((case-fold-search t)
            in-reply-to header p lines chars)
***************
*** 4829,4850 ****
            ;; Subject.
            (progn
              (goto-char p)
!             (if (search-forward "\nsubject: " nil t)
                  (funcall gnus-decode-encoded-word-function
                           (nnheader-header-value))
                "(none)"))
            ;; From.
            (progn
              (goto-char p)
!             (if (or (search-forward "\nfrom: " nil t)
!                     (search-forward "\nfrom:" nil t))
                  (funcall gnus-decode-encoded-word-function
                           (nnheader-header-value))
                "(nobody)"))
            ;; Date.
            (progn
              (goto-char p)
!             (if (search-forward "\ndate: " nil t)
                  (nnheader-header-value) ""))
            ;; Message-ID.
            (progn
--- 5766,5786 ----
            ;; Subject.
            (progn
              (goto-char p)
!             (if (search-forward "\nsubject:" nil t)
                  (funcall gnus-decode-encoded-word-function
                           (nnheader-header-value))
                "(none)"))
            ;; From.
            (progn
              (goto-char p)
!             (if (search-forward "\nfrom:" nil t)
                  (funcall gnus-decode-encoded-word-function
                           (nnheader-header-value))
                "(nobody)"))
            ;; Date.
            (progn
              (goto-char p)
!             (if (search-forward "\ndate:" nil t)
                  (nnheader-header-value) ""))
            ;; Message-ID.
            (progn
***************
*** 4861,4867 ****
            ;; References.
            (progn
              (goto-char p)
!             (if (search-forward "\nreferences: " nil t)
                  (progn
                    (setq end (point))
                    (prog1
--- 5797,5803 ----
            ;; References.
            (progn
              (goto-char p)
!             (if (search-forward "\nreferences:" nil t)
                  (progn
                    (setq end (point))
                    (prog1
***************
*** 4878,4884 ****
                ;; Get the references from the in-reply-to header if there
                ;; were no references and the in-reply-to header looks
                ;; promising.
!               (if (and (search-forward "\nin-reply-to: " nil t)
                         (setq in-reply-to (nnheader-header-value))
                         (string-match "<[^>]+>" in-reply-to))
                    (let (ref2)
--- 5814,5820 ----
                ;; Get the references from the in-reply-to header if there
                ;; were no references and the in-reply-to header looks
                ;; promising.
!               (if (and (search-forward "\nin-reply-to:" nil t)
                         (setq in-reply-to (nnheader-header-value))
                         (string-match "<[^>]+>" in-reply-to))
                    (let (ref2)
***************
*** 4896,4914 ****
              (goto-char p)
              (if (search-forward "\nchars: " nil t)
                  (if (numberp (setq chars (ignore-errors (read cur))))
!                     chars 0)
!               0))
            ;; Lines.
            (progn
              (goto-char p)
              (if (search-forward "\nlines: " nil t)
                  (if (numberp (setq lines (ignore-errors (read cur))))
!                     lines 0)
!               0))
            ;; Xref.
            (progn
              (goto-char p)
!             (and (search-forward "\nxref: " nil t)
                   (nnheader-header-value)))
            ;; Extra.
            (when gnus-extra-headers
--- 5832,5850 ----
              (goto-char p)
              (if (search-forward "\nchars: " nil t)
                  (if (numberp (setq chars (ignore-errors (read cur))))
!                     chars -1)
!               -1))
            ;; Lines.
            (progn
              (goto-char p)
              (if (search-forward "\nlines: " nil t)
                  (if (numberp (setq lines (ignore-errors (read cur))))
!                     lines -1)
!               -1))
            ;; Xref.
            (progn
              (goto-char p)
!             (and (search-forward "\nxref:" nil t)
                   (nnheader-header-value)))
            ;; Extra.
            (when gnus-extra-headers
***************
*** 4917,4923 ****
                (while extra
                  (goto-char p)
                  (when (search-forward
!                        (concat "\n" (symbol-name (car extra)) ": ") nil t)
                    (push (cons (car extra) (nnheader-header-value))
                          out))
                  (pop extra))
--- 5853,5859 ----
                (while extra
                  (goto-char p)
                  (when (search-forward
!                        (concat "\n" (symbol-name (car extra)) ":") nil t)
                    (push (cons (car extra) (nnheader-header-value))
                          out))
                  (pop extra))
***************
*** 4952,4957 ****
--- 5888,5900 ----
        (mail-parse-ignored-charsets gnus-newsgroup-ignored-charsets)
        (cur nntp-server-buffer)
        (dependencies (or dependencies gnus-newsgroup-dependencies))
+       (allp (cond
+              ((eq gnus-read-all-available-headers t)
+               t)
+              ((stringp gnus-read-all-available-headers)
+               (string-match gnus-read-all-available-headers group))
+              (t
+               nil)))
        number headers header)
      (save-excursion
        (set-buffer nntp-server-buffer)
***************
*** 4959,4984 ****
        ;; Allow the user to mangle the headers before parsing them.
        (gnus-run-hooks 'gnus-parse-headers-hook)
        (goto-char (point-min))
!       (while (not (eobp))
!       (condition-case ()
!           (while (and sequence (not (eobp)))
!             (setq number (read cur))
!             (while (and sequence
!                         (< (car sequence) number))
!               (setq sequence (cdr sequence)))
!             (and sequence
!                  (eq number (car sequence))
!                  (progn
!                    (setq sequence (cdr sequence))
!                    (setq header (inline
!                                   (gnus-nov-parse-line
!                                    number dependencies force-new))))
!                  (push header headers))
!             (forward-line 1))
!         (error
!          (gnus-error 4 "Strange nov line (%d)"
!                      (count-lines (point-min) (point)))))
!       (forward-line 1))
        ;; A common bug in inn is that if you have posted an article and
        ;; then retrieves the active file, it will answer correctly --
        ;; the new article is included.  However, a NOV entry for the
--- 5902,5925 ----
        ;; Allow the user to mangle the headers before parsing them.
        (gnus-run-hooks 'gnus-parse-headers-hook)
        (goto-char (point-min))
!       (gnus-parse-without-error
!       (while (and (or sequence allp)
!                   (not (eobp)))
!         (setq number (read cur))
!         (when (not allp)
!           (while (and sequence
!                       (< (car sequence) number))
!             (setq sequence (cdr sequence))))
!         (when (and (or allp
!                        (and sequence
!                             (eq number (car sequence))))
!                    (progn
!                      (setq sequence (cdr sequence))
!                      (setq header (inline
!                                     (gnus-nov-parse-line
!                                      number dependencies force-new)))))
!           (push header headers))
!         (forward-line 1)))
        ;; A common bug in inn is that if you have posted an article and
        ;; then retrieves the active file, it will answer correctly --
        ;; the new article is included.  However, a NOV entry for the
***************
*** 4992,4998 ****
        (let ((gnus-nov-is-evil t))
          (nconc
           (nreverse headers)
!          (when (gnus-retrieve-headers sequence group)
             (gnus-get-newsgroup-headers))))))))
  
  (defun gnus-article-get-xrefs ()
--- 5933,5939 ----
        (let ((gnus-nov-is-evil t))
          (nconc
           (nreverse headers)
!          (when (eq (gnus-retrieve-headers sequence group) 'headers)
             (gnus-get-newsgroup-headers))))))))
  
  (defun gnus-article-get-xrefs ()
***************
*** 5014,5021 ****
                           (looking-at "Xref:"))
                      (search-forward "\nXref:" nil t))
              (goto-char (1+ (match-end 0)))
!             (setq xref (buffer-substring (point)
!                                          (progn (end-of-line) (point))))
              (mail-header-set-xref headers xref)))))))
  
  (defun gnus-summary-insert-subject (id &optional old-header use-old-header)
--- 5955,5961 ----
                           (looking-at "Xref:"))
                      (search-forward "\nXref:" nil t))
              (goto-char (1+ (match-end 0)))
!             (setq xref (buffer-substring (point) (gnus-point-at-eol)))
              (mail-header-set-xref headers xref)))))))
  
  (defun gnus-summary-insert-subject (id &optional old-header use-old-header)
***************
*** 5047,5052 ****
--- 5987,5997 ----
              (prog1
                  (1+ (gnus-point-at-eol))
                (gnus-delete-line))))))
+       ;; Remove list identifiers from subject.
+       (when gnus-list-identifiers
+       (let ((gnus-newsgroup-headers (list header)))
+         (gnus-summary-remove-list-identifiers)
+         (setq header (car gnus-newsgroup-headers))))
        (when old-header
        (mail-header-set-number header (mail-header-number old-header)))
        (setq gnus-newsgroup-sparse
***************
*** 5177,5229 ****
      (save-excursion
        (gnus-group-best-unread-group exclude-group))))
  
! (defun gnus-summary-find-next (&optional unread article backward undownloaded)
!   (if backward (gnus-summary-find-prev)
      (let* ((dummy (gnus-summary-article-intangible-p))
           (article (or article (gnus-summary-article-number)))
!          (arts (gnus-data-find-list article))
           result)
        (when (and (not dummy)
                 (or (not gnus-summary-check-current)
                     (not unread)
!                    (not (gnus-data-unread-p (car arts)))))
!       (setq arts (cdr arts)))
        (when (setq result
                  (if unread
                      (progn
!                       (while arts
!                         (when (or (and undownloaded
!                                        (eq gnus-undownloaded-mark
!                                            (gnus-data-mark (car arts))))
!                                   (gnus-data-unread-p (car arts)))
!                           (setq result (car arts)
!                                 arts nil))
!                         (setq arts (cdr arts)))
                        result)
!                   (car arts)))
        (goto-char (gnus-data-pos result))
        (gnus-data-number result)))))
  
  (defun gnus-summary-find-prev (&optional unread article)
    (let* ((eobp (eobp))
         (article (or article (gnus-summary-article-number)))
!        (arts (gnus-data-find-list article (gnus-data-list 'rev)))
         result)
      (when (and (not eobp)
               (or (not gnus-summary-check-current)
                   (not unread)
!                  (not (gnus-data-unread-p (car arts)))))
!       (setq arts (cdr arts)))
      (when (setq result
                (if unread
                    (progn
!                     (while arts
!                       (when (gnus-data-unread-p (car arts))
!                         (setq result (car arts)
!                               arts nil))
!                       (setq arts (cdr arts)))
                      result)
!                 (car arts)))
        (goto-char (gnus-data-pos result))
        (gnus-data-number result))))
  
--- 6122,6198 ----
      (save-excursion
        (gnus-group-best-unread-group exclude-group))))
  
! (defun gnus-summary-find-next (&optional unread article backward)
!   (if backward
!       (gnus-summary-find-prev unread article)
      (let* ((dummy (gnus-summary-article-intangible-p))
           (article (or article (gnus-summary-article-number)))
!          (data (gnus-data-find-list article))
           result)
        (when (and (not dummy)
                 (or (not gnus-summary-check-current)
                     (not unread)
!                    (not (gnus-data-unread-p (car data)))))
!       (setq data (cdr data)))
        (when (setq result
                  (if unread
                      (progn
!                       (while data
!                           (unless (memq (gnus-data-number (car data))
!                                         (cond
!                                        ((eq gnus-auto-goto-ignores
!                                             'always-undownloaded)
!                                         gnus-newsgroup-undownloaded)
!                                        (gnus-plugged
!                                         nil)
!                                        ((eq gnus-auto-goto-ignores
!                                             'unfetched)
!                                         gnus-newsgroup-unfetched)
!                                        ((eq gnus-auto-goto-ignores
!                                             'undownloaded)
!                                         gnus-newsgroup-undownloaded)))
!                             (when (gnus-data-unread-p (car data))
!                               (setq result (car data)
!                                     data nil)))
!                         (setq data (cdr data)))
                        result)
!                   (car data)))
        (goto-char (gnus-data-pos result))
        (gnus-data-number result)))))
  
  (defun gnus-summary-find-prev (&optional unread article)
    (let* ((eobp (eobp))
         (article (or article (gnus-summary-article-number)))
!        (data (gnus-data-find-list article (gnus-data-list 'rev)))
         result)
      (when (and (not eobp)
               (or (not gnus-summary-check-current)
                   (not unread)
!                  (not (gnus-data-unread-p (car data)))))
!       (setq data (cdr data)))
      (when (setq result
                (if unread
                    (progn
!                     (while data
!                         (unless (memq (gnus-data-number (car data))
!                                       (cond
!                                      ((eq gnus-auto-goto-ignores
!                                           'always-undownloaded)
!                                       gnus-newsgroup-undownloaded)
!                                      (gnus-plugged
!                                       nil)
!                                      ((eq gnus-auto-goto-ignores
!                                           'unfetched)
!                                       gnus-newsgroup-unfetched)
!                                      ((eq gnus-auto-goto-ignores
!                                           'undownloaded)
!                                       gnus-newsgroup-undownloaded)))
!                           (when (gnus-data-unread-p (car data))
!                             (setq result (car data)
!                                   data nil)))
!                       (setq data (cdr data)))
                      result)
!                 (car data)))
        (goto-char (gnus-data-pos result))
        (gnus-data-number result))))
  
***************
*** 5274,5291 ****
    ;; Suggested by address@hidden (Greg Earle).
    ;; Recenter only when requested.  Suggested by address@hidden
    (interactive)
!   (let* ((top (cond ((< (window-height) 4) 0)
!                   ((< (window-height) 7) 1)
!                   (t (if (numberp gnus-auto-center-summary)
!                          gnus-auto-center-summary
!                        2))))
!        (height (1- (window-height)))
!        (bottom (save-excursion (goto-char (point-max))
!                                (forward-line (- height))
!                                (point)))
!        (window (get-buffer-window (current-buffer))))
!     ;; The user has to want it.
!     (when gnus-auto-center-summary
        (when (get-buffer-window gnus-article-buffer)
        ;; Only do recentering when the article buffer is displayed,
        ;; Set the window start to either `bottom', which is the biggest
--- 6243,6260 ----
    ;; Suggested by address@hidden (Greg Earle).
    ;; Recenter only when requested.  Suggested by address@hidden
    (interactive)
!   ;; The user has to want it.
!   (when gnus-auto-center-summary
!     (let* ((top (cond ((< (window-height) 4) 0)
!                     ((< (window-height) 7) 1)
!                     (t (if (numberp gnus-auto-center-summary)
!                            gnus-auto-center-summary
!                          2))))
!          (height (1- (window-height)))
!          (bottom (save-excursion (goto-char (point-max))
!                                  (forward-line (- height))
!                                  (point)))
!          (window (get-buffer-window (current-buffer))))
        (when (get-buffer-window gnus-article-buffer)
        ;; Only do recentering when the article buffer is displayed,
        ;; Set the window start to either `bottom', which is the biggest
***************
*** 5377,5389 ****
         (marked (gnus-info-marks info))
         (active (gnus-active group)))
      (and info active
!        (gnus-set-difference
!         (gnus-sorted-complement
!          (gnus-uncompress-range active)
!          (gnus-list-of-unread-articles group))
!         (append
!          (gnus-uncompress-range (cdr (assq 'dormant marked)))
!          (gnus-uncompress-range (cdr (assq 'tick marked))))))))
  
  ;; Various summary commands
  
--- 6346,6358 ----
         (marked (gnus-info-marks info))
         (active (gnus-active group)))
      (and info active
!        (gnus-list-range-difference
!         (gnus-list-range-difference
!          (gnus-sorted-complement
!           (gnus-uncompress-range active)
!           (gnus-list-of-unread-articles group))
!          (cdr (assq 'dormant marked)))
!         (cdr (assq 'tick marked))))))
  
  ;; Various summary commands
  
***************
*** 5419,5441 ****
  
  (defun gnus-summary-toggle-truncation (&optional arg)
    "Toggle truncation of summary lines.
! With arg, turn line truncation on if arg is positive."
    (interactive "P")
    (setq truncate-lines
        (if (null arg) (not truncate-lines)
          (> (prefix-numeric-value arg) 0)))
    (redraw-display))
  
  (defun gnus-summary-reselect-current-group (&optional all rescan)
    "Exit and then reselect the current newsgroup.
  The prefix argument ALL means to select all articles."
    (interactive "P")
    (when (gnus-ephemeral-group-p gnus-newsgroup-name)
      (error "Ephemeral groups can't be reselected"))
!   (let ((current-subject (gnus-summary-article-number))
        (group gnus-newsgroup-name))
      (setq gnus-newsgroup-begin nil)
!     (gnus-summary-exit)
      ;; We have to adjust the point of group mode buffer because
      ;; point was moved to the next unread newsgroup by exiting.
      (gnus-summary-jump-to-group group)
--- 6388,6427 ----
  
  (defun gnus-summary-toggle-truncation (&optional arg)
    "Toggle truncation of summary lines.
! With ARG, turn line truncation on if ARG is positive."
    (interactive "P")
    (setq truncate-lines
        (if (null arg) (not truncate-lines)
          (> (prefix-numeric-value arg) 0)))
    (redraw-display))
  
+ (defun gnus-summary-find-for-reselect ()
+   "Return the number of an article to stay on across a reselect.
+ The current article is considered, then following articles, then previous
+ articles.  An article is sought which is not cancelled and isn't a temporary
+ insertion from another group.  If there's no such then return a dummy 0."
+   (let (found)
+     (dolist (rev '(nil t))
+       (unless found      ; don't demand the reverse list if we don't need it
+         (let ((data (gnus-data-find-list
+                      (gnus-summary-article-number) (gnus-data-list rev))))
+           (while (and data (not found))
+             (if (and (< 0 (gnus-data-number (car data)))
+                      (not (eq gnus-canceled-mark (gnus-data-mark (car 
data)))))
+                 (setq found (gnus-data-number (car data))))
+             (setq data (cdr data))))))
+     (or found 0)))
+ 
  (defun gnus-summary-reselect-current-group (&optional all rescan)
    "Exit and then reselect the current newsgroup.
  The prefix argument ALL means to select all articles."
    (interactive "P")
    (when (gnus-ephemeral-group-p gnus-newsgroup-name)
      (error "Ephemeral groups can't be reselected"))
!   (let ((current-subject (gnus-summary-find-for-reselect))
        (group gnus-newsgroup-name))
      (setq gnus-newsgroup-begin nil)
!     (gnus-summary-exit nil 'leave-hidden)
      ;; We have to adjust the point of group mode buffer because
      ;; point was moved to the next unread newsgroup by exiting.
      (gnus-summary-jump-to-group group)
***************
*** 5457,5469 ****
        (when gnus-newsgroup-kill-headers
          (setq gnus-newsgroup-killed
                (gnus-compress-sequence
!                (nconc
!                 (gnus-set-sorted-intersection
!                  (gnus-uncompress-range gnus-newsgroup-killed)
!                  (setq gnus-newsgroup-unselected
!                        (sort gnus-newsgroup-unselected '<)))
!                 (setq gnus-newsgroup-unreads
!                       (sort gnus-newsgroup-unreads '<)))
                 t)))
        (unless (listp (cdr gnus-newsgroup-killed))
          (setq gnus-newsgroup-killed (list gnus-newsgroup-killed)))
--- 6443,6452 ----
        (when gnus-newsgroup-kill-headers
          (setq gnus-newsgroup-killed
                (gnus-compress-sequence
!                (gnus-sorted-union
!                 (gnus-list-range-intersection
!                  gnus-newsgroup-unselected gnus-newsgroup-killed)
!                 gnus-newsgroup-unreads)
                 t)))
        (unless (listp (cdr gnus-newsgroup-killed))
          (setq gnus-newsgroup-killed (list gnus-newsgroup-killed)))
***************
*** 5473,5479 ****
            (set-buffer gnus-group-buffer)
            (gnus-undo-force-boundary))
          (gnus-update-read-articles
!          group (append gnus-newsgroup-unreads gnus-newsgroup-unselected))
          ;; Set the current article marks.
          (let ((gnus-newsgroup-scored
                 (if (and (not gnus-save-score)
--- 6456,6463 ----
            (set-buffer gnus-group-buffer)
            (gnus-undo-force-boundary))
          (gnus-update-read-articles
!          group (gnus-sorted-union
!                 gnus-newsgroup-unreads gnus-newsgroup-unselected))
          ;; Set the current article marks.
          (let ((gnus-newsgroup-scored
                 (if (and (not gnus-save-score)
***************
*** 5500,5506 ****
        (gnus-save-newsrc-file)
      (gnus-dribble-save)))
  
! (defun gnus-summary-exit (&optional temporary)
    "Exit reading current newsgroup, and then return to group selection mode.
  `gnus-exit-group-hook' is called with no arguments if that value is non-nil."
    (interactive)
--- 6484,6490 ----
        (gnus-save-newsrc-file)
      (gnus-dribble-save)))
  
! (defun gnus-summary-exit (&optional temporary leave-hidden)
    "Exit reading current newsgroup, and then return to group selection mode.
  `gnus-exit-group-hook' is called with no arguments if that value is non-nil."
    (interactive)
***************
*** 5516,5523 ****
    (gnus-async-halt-prefetch)
    (let* ((group gnus-newsgroup-name)
         (quit-config (gnus-group-quit-config gnus-newsgroup-name))
         (mode major-mode)
!          (group-point nil)
         (buf (current-buffer)))
      (unless quit-config
        ;; Do adaptive scoring, and possibly save score files.
--- 6500,6508 ----
    (gnus-async-halt-prefetch)
    (let* ((group gnus-newsgroup-name)
         (quit-config (gnus-group-quit-config gnus-newsgroup-name))
+        (gnus-group-is-exiting-p t)
         (mode major-mode)
!        (group-point nil)
         (buf (current-buffer)))
      (unless quit-config
        ;; Do adaptive scoring, and possibly save score files.
***************
*** 5567,5593 ****
        (setq gnus-article-current nil))
        (set-buffer buf)
        (if (not gnus-kill-summary-on-exit)
!         (gnus-deaden-summary)
        ;; We set all buffer-local variables to nil.  It is unclear why
        ;; this is needed, but if we don't, buffer-local variables are
        ;; not garbage-collected, it seems.  This would the lead to en
        ;; ever-growing Emacs.
        (gnus-summary-clear-local-variables)
        (when (get-buffer gnus-article-buffer)
          (bury-buffer gnus-article-buffer))
        ;; We clear the global counterparts of the buffer-local
        ;; variables as well, just to be on the safe side.
        (set-buffer gnus-group-buffer)
        (gnus-summary-clear-local-variables)
        ;; Return to group mode buffer.
        (when (eq mode 'gnus-summary-mode)
          (gnus-kill-buffer buf)))
        (setq gnus-current-select-method gnus-select-method)
!       (pop-to-buffer gnus-group-buffer)
        (if (not quit-config)
          (progn
            (goto-char group-point)
!           (gnus-configure-windows 'group 'force))
        (gnus-handle-ephemeral-exit quit-config))
        ;; Clear the current group name.
        (unless quit-config
--- 6552,6587 ----
        (setq gnus-article-current nil))
        (set-buffer buf)
        (if (not gnus-kill-summary-on-exit)
!         (progn
!           (gnus-deaden-summary)
!           (setq mode nil))
        ;; We set all buffer-local variables to nil.  It is unclear why
        ;; this is needed, but if we don't, buffer-local variables are
        ;; not garbage-collected, it seems.  This would the lead to en
        ;; ever-growing Emacs.
        (gnus-summary-clear-local-variables)
+       (let ((gnus-summary-local-variables gnus-newsgroup-variables))
+         (gnus-summary-clear-local-variables))
        (when (get-buffer gnus-article-buffer)
          (bury-buffer gnus-article-buffer))
        ;; We clear the global counterparts of the buffer-local
        ;; variables as well, just to be on the safe side.
        (set-buffer gnus-group-buffer)
        (gnus-summary-clear-local-variables)
+       (let ((gnus-summary-local-variables gnus-newsgroup-variables))
+         (gnus-summary-clear-local-variables))
        ;; Return to group mode buffer.
        (when (eq mode 'gnus-summary-mode)
          (gnus-kill-buffer buf)))
        (setq gnus-current-select-method gnus-select-method)
!       (if leave-hidden
!         (set-buffer gnus-group-buffer)
!       (pop-to-buffer gnus-group-buffer))
        (if (not quit-config)
          (progn
            (goto-char group-point)
!           (unless leave-hidden
!             (gnus-configure-windows 'group 'force)))
        (gnus-handle-ephemeral-exit quit-config))
        ;; Clear the current group name.
        (unless quit-config
***************
*** 5598,5611 ****
    "Quit reading current newsgroup without updating read article info."
    (interactive)
    (let* ((group gnus-newsgroup-name)
         (quit-config (gnus-group-quit-config group)))
      (when (or no-questions
              gnus-expert-user
              (gnus-y-or-n-p "Discard changes to this group and exit? "))
        (gnus-async-halt-prefetch)
!       (mapcar 'funcall
!             (delq 'gnus-summary-expire-articles
!                   (copy-sequence gnus-summary-prepare-exit-hook)))
        (when (gnus-buffer-live-p gnus-article-buffer)
        (save-excursion
          (set-buffer gnus-article-buffer)
--- 6592,6605 ----
    "Quit reading current newsgroup without updating read article info."
    (interactive)
    (let* ((group gnus-newsgroup-name)
+        (gnus-group-is-exiting-p t)
+        (gnus-group-is-exiting-without-update-p t)
         (quit-config (gnus-group-quit-config group)))
      (when (or no-questions
              gnus-expert-user
              (gnus-y-or-n-p "Discard changes to this group and exit? "))
        (gnus-async-halt-prefetch)
!       (run-hooks 'gnus-summary-prepare-exit-hook)
        (when (gnus-buffer-live-p gnus-article-buffer)
        (save-excursion
          (set-buffer gnus-article-buffer)
***************
*** 5622,5631 ****
          (gnus-deaden-summary)
        (gnus-close-group group)
        (gnus-summary-clear-local-variables)
        (set-buffer gnus-group-buffer)
        (gnus-summary-clear-local-variables)
!       (when (get-buffer gnus-summary-buffer)
!         (kill-buffer gnus-summary-buffer)))
        (unless gnus-single-article-buffer
        (setq gnus-article-current nil))
        (when gnus-use-trees
--- 6616,6628 ----
          (gnus-deaden-summary)
        (gnus-close-group group)
        (gnus-summary-clear-local-variables)
+       (let ((gnus-summary-local-variables gnus-newsgroup-variables))
+         (gnus-summary-clear-local-variables))
        (set-buffer gnus-group-buffer)
        (gnus-summary-clear-local-variables)
!       (let ((gnus-summary-local-variables gnus-newsgroup-variables))
!         (gnus-summary-clear-local-variables))
!       (gnus-kill-buffer gnus-summary-buffer))
        (unless gnus-single-article-buffer
        (setq gnus-article-current nil))
        (when gnus-use-trees
***************
*** 5637,5646 ****
        (gnus-configure-windows 'group 'force)
        ;; Clear the current group name.
        (setq gnus-newsgroup-name nil)
        (when (equal (gnus-group-group-name) group)
        (gnus-group-next-unread-group 1))
        (when quit-config
!         (gnus-handle-ephemeral-exit quit-config)))))
  
  (defun gnus-handle-ephemeral-exit (quit-config)
    "Handle movement when leaving an ephemeral group.
--- 6634,6645 ----
        (gnus-configure-windows 'group 'force)
        ;; Clear the current group name.
        (setq gnus-newsgroup-name nil)
+       (unless (gnus-ephemeral-group-p group)
+       (gnus-group-update-group group))
        (when (equal (gnus-group-group-name) group)
        (gnus-group-next-unread-group 1))
        (when quit-config
!       (gnus-handle-ephemeral-exit quit-config)))))
  
  (defun gnus-handle-ephemeral-exit (quit-config)
    "Handle movement when leaving an ephemeral group.
***************
*** 5649,5673 ****
        (gnus-configure-windows 'group 'force)
      (set-buffer (car quit-config))
      (cond ((eq major-mode 'gnus-summary-mode)
!            (gnus-set-global-variables))
!           ((eq major-mode 'gnus-article-mode)
!            (save-excursion
!              ;; The `gnus-summary-buffer' variable may point
!              ;; to the old summary buffer when using a single
!              ;; article buffer.
!              (unless (gnus-buffer-live-p gnus-summary-buffer)
!                (set-buffer gnus-group-buffer))
!              (set-buffer gnus-summary-buffer)
!              (gnus-set-global-variables))))
      (if (or (eq (cdr quit-config) 'article)
!             (eq (cdr quit-config) 'pick))
!         (progn
!           ;; The current article may be from the ephemeral group
!           ;; thus it is best that we reload this article
!           (gnus-summary-show-article)
!           (if (and (boundp 'gnus-pick-mode) (symbol-value 'gnus-pick-mode))
!               (gnus-configure-windows 'pick 'force)
!             (gnus-configure-windows (cdr quit-config) 'force)))
        (gnus-configure-windows (cdr quit-config) 'force))
      (when (eq major-mode 'gnus-summary-mode)
        (gnus-summary-next-subject 1 nil t)
--- 6648,6675 ----
        (gnus-configure-windows 'group 'force)
      (set-buffer (car quit-config))
      (cond ((eq major-mode 'gnus-summary-mode)
!          (gnus-set-global-variables))
!         ((eq major-mode 'gnus-article-mode)
!          (save-excursion
!            ;; The `gnus-summary-buffer' variable may point
!            ;; to the old summary buffer when using a single
!            ;; article buffer.
!            (unless (gnus-buffer-live-p gnus-summary-buffer)
!              (set-buffer gnus-group-buffer))
!            (set-buffer gnus-summary-buffer)
!            (gnus-set-global-variables))))
      (if (or (eq (cdr quit-config) 'article)
!           (eq (cdr quit-config) 'pick))
!       (progn
!         ;; The current article may be from the ephemeral group
!         ;; thus it is best that we reload this article
!         ;;
!         ;; If we're exiting from a large digest, this can be
!         ;; extremely slow.  So, it's better not to reload it. -- jh.
!         ;;(gnus-summary-show-article)
!         (if (and (boundp 'gnus-pick-mode) (symbol-value 'gnus-pick-mode))
!             (gnus-configure-windows 'pick 'force)
!           (gnus-configure-windows (cdr quit-config) 'force)))
        (gnus-configure-windows (cdr quit-config) 'force))
      (when (eq major-mode 'gnus-summary-mode)
        (gnus-summary-next-subject 1 nil t)
***************
*** 5683,5692 ****
    (suppress-keymap gnus-dead-summary-mode-map)
    (substitute-key-definition
     'undefined 'gnus-summary-wake-up-the-dead gnus-dead-summary-mode-map)
!   (let ((keys '("\C-d" "\r" "\177" [delete])))
!     (while keys
!       (define-key gnus-dead-summary-mode-map
!       (pop keys) 'gnus-summary-wake-up-the-dead))))
  
  (defvar gnus-dead-summary-mode nil
    "Minor mode for Gnus summary buffers.")
--- 6685,6695 ----
    (suppress-keymap gnus-dead-summary-mode-map)
    (substitute-key-definition
     'undefined 'gnus-summary-wake-up-the-dead gnus-dead-summary-mode-map)
!   (dolist (key '("\C-d" "\r" "\177" [delete]))
!     (define-key gnus-dead-summary-mode-map
!       key 'gnus-summary-wake-up-the-dead))
!   (dolist (key '("q" "Q"))
!     (define-key gnus-dead-summary-mode-map key 'bury-buffer)))
  
  (defvar gnus-dead-summary-mode nil
    "Minor mode for Gnus summary buffers.")
***************
*** 5732,5748 ****
        (set-buffer buffer)
        (gnus-kill-buffer gnus-article-buffer)
        (gnus-kill-buffer gnus-original-article-buffer)))
!     (cond (gnus-kill-summary-on-exit
!          (when (and gnus-use-trees
!                     (gnus-buffer-exists-p buffer))
!            (save-excursion
!              (set-buffer buffer)
!              (gnus-tree-close gnus-newsgroup-name)))
!          (gnus-kill-buffer buffer))
!         ((gnus-buffer-exists-p buffer)
!          (save-excursion
!            (set-buffer buffer)
!            (gnus-deaden-summary))))))
  
  (defun gnus-summary-wake-up-the-dead (&rest args)
    "Wake up the dead summary buffer."
--- 6735,6754 ----
        (set-buffer buffer)
        (gnus-kill-buffer gnus-article-buffer)
        (gnus-kill-buffer gnus-original-article-buffer)))
!     (cond
!      ;; Kill the buffer.
!      (gnus-kill-summary-on-exit
!       (when (and gnus-use-trees
!                (gnus-buffer-exists-p buffer))
!       (save-excursion
!         (set-buffer buffer)
!         (gnus-tree-close gnus-newsgroup-name)))
!       (gnus-kill-buffer buffer))
!      ;; Deaden the buffer.
!      ((gnus-buffer-exists-p buffer)
!       (save-excursion
!       (set-buffer buffer)
!       (gnus-deaden-summary))))))
  
  (defun gnus-summary-wake-up-the-dead (&rest args)
    "Wake up the dead summary buffer."
***************
*** 5789,5795 ****
  (defun gnus-summary-next-group (&optional no-article target-group backward)
    "Exit current newsgroup and then select next unread newsgroup.
  If prefix argument NO-ARTICLE is non-nil, no article is selected
! initially.  If NEXT-GROUP, go to this group.  If BACKWARD, go to
  previous group instead."
    (interactive "P")
    ;; Stop pre-fetching.
--- 6795,6801 ----
  (defun gnus-summary-next-group (&optional no-article target-group backward)
    "Exit current newsgroup and then select next unread newsgroup.
  If prefix argument NO-ARTICLE is non-nil, no article is selected
! initially.  If TARGET-GROUP, go to this group.  If BACKWARD, go to
  previous group instead."
    (interactive "P")
    ;; Stop pre-fetching.
***************
*** 5826,5835 ****
        (let ((unreads (gnus-group-group-unread)))
          (if (and (or (eq t unreads)
                       (and unreads (not (zerop unreads))))
!                  (gnus-summary-read-group
!                   target-group nil no-article
!                   (and (buffer-name current-buffer) current-buffer)
!                   nil backward))
              (setq entered t)
            (setq current-group target-group
                  target-group nil)))))))
--- 6832,6841 ----
        (let ((unreads (gnus-group-group-unread)))
          (if (and (or (eq t unreads)
                       (and unreads (not (zerop unreads))))
!                  (gnus-summary-read-group
!                   target-group nil no-article
!                   (and (buffer-name current-buffer) current-buffer)
!                   nil backward))
              (setq entered t)
            (setq current-group target-group
                  target-group nil)))))))
***************
*** 5842,5879 ****
  
  ;; Walking around summary lines.
  
! (defun gnus-summary-first-subject (&optional unread undownloaded)
!   "Go to the first unread subject.
! If UNREAD is non-nil, go to the first unread article.
! Returns the article selected or nil if there are no unread articles."
    (interactive "P")
!   (prog1
!       (cond
!        ;; Empty summary.
!        ((null gnus-newsgroup-data)
!       (gnus-message 3 "No articles in the group")
!       nil)
!        ;; Pick the first article.
!        ((not unread)
!       (goto-char (gnus-data-pos (car gnus-newsgroup-data)))
!       (gnus-data-number (car gnus-newsgroup-data)))
!        ;; No unread articles.
!        ((null gnus-newsgroup-unreads)
!       (gnus-message 3 "No more unread articles")
!       nil)
!        ;; Find the first unread article.
!        (t
!       (let ((data gnus-newsgroup-data))
!         (while (and data
!                     (and (not (and undownloaded
!                                    (eq gnus-undownloaded-mark
!                                        (gnus-data-mark (car data)))))
!                          (not (gnus-data-unread-p (car data)))))
!           (setq data (cdr data)))
!         (when data
!           (goto-char (gnus-data-pos (car data)))
!           (gnus-data-number (car data))))))
!     (gnus-summary-position-point)))
  
  (defun gnus-summary-next-subject (n &optional unread dont-display)
    "Go to next N'th summary line.
--- 6848,6903 ----
  
  ;; Walking around summary lines.
  
! (defun gnus-summary-first-subject (&optional unread undownloaded unseen)
!   "Go to the first subject satisfying any non-nil constraint.
! If UNREAD is non-nil, the article should be unread.
! If UNDOWNLOADED is non-nil, the article should be undownloaded.
! If UNSEEN is non-nil, the article should be unseen.
! Returns the article selected or nil if there are no matching articles."
    (interactive "P")
!   (cond
!    ;; Empty summary.
!    ((null gnus-newsgroup-data)
!     (gnus-message 3 "No articles in the group")
!     nil)
!    ;; Pick the first article.
!    ((not (or unread undownloaded unseen))
!     (goto-char (gnus-data-pos (car gnus-newsgroup-data)))
!     (gnus-data-number (car gnus-newsgroup-data)))
!    ;; Find the first unread article.
!    (t
!     (let ((data gnus-newsgroup-data))
!       (while (and data
!                   (let ((num (gnus-data-number (car data))))
!                     (or (memq num gnus-newsgroup-unfetched)
!                         (not (or (and unread
!                                       (memq num gnus-newsgroup-unreads))
!                                  (and undownloaded
!                                       (memq num gnus-newsgroup-undownloaded))
!                                  (and unseen
!                                       (memq num gnus-newsgroup-unseen)))))))
!         (setq data (cdr data)))
!       (prog1
!           (if data
!               (progn
!                 (goto-char (gnus-data-pos (car data)))
!                 (gnus-data-number (car data)))
!             (gnus-message 3 "No more%s articles"
!                           (let* ((r (when unread " unread"))
!                                  (d (when undownloaded " undownloaded"))
!                                  (s (when unseen " unseen"))
!                                  (l (delq nil (list r d s))))
!                             (cond ((= 3 (length l))
!                                    (concat r "," d ", or" s))
!                                   ((= 2 (length l))
!                                    (concat (car l) ", or" (cadr l)))
!                                   ((= 1 (length l))
!                                    (car l))
!                                   (t
!                                    ""))))
!             nil
!             )
!         (gnus-summary-position-point))))))
  
  (defun gnus-summary-next-subject (n &optional unread dont-display)
    "Go to next N'th summary line.
***************
*** 5914,5923 ****
--- 6938,6957 ----
    (interactive "p")
    (gnus-summary-next-subject (- n) t))
  
+ (defun gnus-summary-goto-subjects (articles)
+   "Insert the subject header for ARTICLES in the current buffer."
+   (save-excursion
+     (dolist (article articles)
+       (gnus-summary-goto-subject article t)))
+   (gnus-summary-limit (append articles gnus-newsgroup-limit))
+   (gnus-summary-position-point))
+  
  (defun gnus-summary-goto-subject (article &optional force silent)
    "Go the subject line of ARTICLE.
  If FORCE, also allow jumping to articles not currently shown."
    (interactive "nArticle number: ")
+   (unless (numberp article)
+     (error "Article %s is not a number" article))
    (let ((b (point))
        (data (gnus-data-find article)))
      ;; We read in the article if we have to.
***************
*** 5934,5940 ****
          (unless silent
            (gnus-message 3 "Can't find article %d" article))
          nil)
!       (goto-char (gnus-data-pos data))
        (gnus-summary-position-point)
        article)))
  
--- 6968,6976 ----
          (unless silent
            (gnus-message 3 "Can't find article %d" article))
          nil)
!       (let ((pt (gnus-data-pos data)))
!       (goto-char pt)
!       (gnus-summary-set-article-display-arrow pt))
        (gnus-summary-position-point)
        article)))
  
***************
*** 5954,5959 ****
--- 6990,7000 ----
      (with-current-buffer gnus-article-buffer
        (mm-enable-multibyte)))
    (gnus-set-global-variables)
+   (when (gnus-buffer-live-p gnus-article-buffer)
+     (with-current-buffer gnus-article-buffer
+       (setq gnus-article-charset gnus-newsgroup-charset)
+       (setq gnus-article-ignored-charsets gnus-newsgroup-ignored-charsets)
+       (mm-enable-multibyte)))
    (if (null article)
        nil
      (prog1
***************
*** 6004,6021 ****
          (progn
            (gnus-summary-display-article article all-headers)
            (when (gnus-buffer-live-p gnus-article-buffer)
!              (with-current-buffer gnus-article-buffer
                (if (not gnus-article-decoded-p) ;; a local variable
                    (mm-disable-multibyte))))
-           (when (or all-headers gnus-show-all-headers)
-             (gnus-article-show-all-headers))
            (gnus-article-set-window-start
             (cdr (assq article gnus-newsgroup-bookmarks)))
            article)
-       (when (or all-headers gnus-show-all-headers)
-         (gnus-article-show-all-headers))
        'old))))
  
  (defun gnus-summary-set-current-mark (&optional current-mark)
    "Obsolete function."
    nil)
--- 7045,7069 ----
          (progn
            (gnus-summary-display-article article all-headers)
            (when (gnus-buffer-live-p gnus-article-buffer)
!             (with-current-buffer gnus-article-buffer
                (if (not gnus-article-decoded-p) ;; a local variable
                    (mm-disable-multibyte))))
            (gnus-article-set-window-start
             (cdr (assq article gnus-newsgroup-bookmarks)))
            article)
        'old))))
  
+ (defun gnus-summary-force-verify-and-decrypt ()
+   "Display buttons for signed/encrypted parts and verify/decrypt them."
+   (interactive)
+   (let ((mm-verify-option 'known)
+       (mm-decrypt-option 'known)
+       (gnus-article-emulate-mime t)
+       (gnus-buttonized-mime-types (append (list "multipart/signed"
+                                                 "multipart/encrypted")
+                                           gnus-buttonized-mime-types)))
+     (gnus-summary-select-article nil 'force)))
+ 
  (defun gnus-summary-set-current-mark (&optional current-mark)
    "Obsolete function."
    nil)
***************
*** 6087,6093 ****
    (let ((keystrokes '((?\C-n (gnus-group-next-unread-group 1))
                      (?\C-p (gnus-group-prev-unread-group 1))))
        (cursor-in-echo-area t)
!       keve key group ended)
      (save-excursion
        (set-buffer gnus-group-buffer)
        (goto-char start)
--- 7135,7141 ----
    (let ((keystrokes '((?\C-n (gnus-group-next-unread-group 1))
                      (?\C-p (gnus-group-prev-unread-group 1))))
        (cursor-in-echo-area t)
!       keve key group ended prompt)
      (save-excursion
        (set-buffer gnus-group-buffer)
        (goto-char start)
***************
*** 6096,6114 ****
                (gnus-summary-best-group gnus-newsgroup-name)
              (gnus-summary-search-group backward gnus-keep-same-level))))
      (while (not ended)
!       (gnus-message
!        5 "No more%s articles%s" (if unread " unread" "")
!        (if (and group
!               (not (gnus-ephemeral-group-p gnus-newsgroup-name)))
!          (format " (Type %s for %s [%s])"
!                  (single-key-description cmd) group
!                  (car (gnus-gethash group gnus-newsrc-hashtb)))
!        (format " (Type %s to exit %s)"
!                (single-key-description cmd)
!                gnus-newsgroup-name)))
        ;; Confirm auto selection.
!       (setq key (car (setq keve (gnus-read-event-char))))
!       (setq ended t)
        (cond
         ((assq key keystrokes)
        (let ((obuf (current-buffer)))
--- 7144,7163 ----
                (gnus-summary-best-group gnus-newsgroup-name)
              (gnus-summary-search-group backward gnus-keep-same-level))))
      (while (not ended)
!       (setq prompt
!           (format
!            "No more%s articles%s " (if unread " unread" "")
!            (if (and group
!                     (not (gnus-ephemeral-group-p gnus-newsgroup-name)))
!                (format " (Type %s for %s [%s])"
!                        (single-key-description cmd) group
!                        (car (gnus-gethash group gnus-newsrc-hashtb)))
!              (format " (Type %s to exit %s)"
!                      (single-key-description cmd)
!                      gnus-newsgroup-name))))
        ;; Confirm auto selection.
!       (setq key (car (setq keve (gnus-read-event-char prompt)))
!           ended t)
        (cond
         ((assq key keystrokes)
        (let ((obuf (current-buffer)))
***************
*** 6151,6164 ****
     (and gnus-auto-select-same
        (gnus-summary-article-subject))))
  
! (defun gnus-summary-next-page (&optional lines circular)
    "Show next page of the selected article.
  If at the end of the current article, select the next article.
  LINES says how many lines should be scrolled up.
  
  If CIRCULAR is non-nil, go to the start of the article instead of
  selecting the next article when reaching the end of the current
! article."
    (interactive "P")
    (setq gnus-summary-buffer (current-buffer))
    (gnus-set-global-variables)
--- 7200,7217 ----
     (and gnus-auto-select-same
        (gnus-summary-article-subject))))
  
! (defun gnus-summary-next-page (&optional lines circular stop)
    "Show next page of the selected article.
  If at the end of the current article, select the next article.
  LINES says how many lines should be scrolled up.
  
  If CIRCULAR is non-nil, go to the start of the article instead of
  selecting the next article when reaching the end of the current
! article.
! 
! If STOP is non-nil, just stop when reaching the end of the message.
! 
! Also see the variable `gnus-article-skip-boring'."
    (interactive "P")
    (setq gnus-summary-buffer (current-buffer))
    (gnus-set-global-variables)
***************
*** 6182,6190 ****
          (gnus-summary-display-article article)
        (when article-window
          (gnus-eval-in-buffer-window gnus-article-buffer
!           (setq endp (gnus-article-next-page lines)))
          (when endp
!           (cond (circular
                   (gnus-summary-beginning-of-article))
                  (lines
                   (gnus-message 3 "End of message"))
--- 7235,7246 ----
          (gnus-summary-display-article article)
        (when article-window
          (gnus-eval-in-buffer-window gnus-article-buffer
!           (setq endp (or (gnus-article-next-page lines)
!                          (gnus-article-only-boring-p))))
          (when endp
!           (cond (stop
!                  (gnus-message 3 "End of message"))
!                 (circular
                   (gnus-summary-beginning-of-article))
                  (lines
                   (gnus-message 3 "End of message"))
***************
*** 6296,6301 ****
--- 7352,7381 ----
        (gnus-summary-first-subject t))
      (gnus-summary-position-point)))
  
+ (defun gnus-summary-first-unseen-subject ()
+   "Place the point on the subject line of the first unseen article.
+ Return nil if there are no unseen articles."
+   (interactive)
+   (prog1
+       (when (gnus-summary-first-subject nil nil t)
+       (gnus-summary-show-thread)
+       (gnus-summary-first-subject nil nil t))
+     (gnus-summary-position-point)))
+ 
+ (defun gnus-summary-first-unseen-or-unread-subject ()
+   "Place the point on the subject line of the first unseen article or,
+ if all article have been seen, on the subject line of the first unread
+ article."
+   (interactive)
+   (prog1
+       (unless (when (gnus-summary-first-subject nil nil t)
+               (gnus-summary-show-thread)
+               (gnus-summary-first-subject nil nil t))
+       (when (gnus-summary-first-subject t)
+         (gnus-summary-show-thread)
+         (gnus-summary-first-subject t)))
+     (gnus-summary-position-point)))
+ 
  (defun gnus-summary-first-article ()
    "Select the first article.
  Return nil if there are no articles."
***************
*** 6307,6314 ****
        (gnus-summary-display-article (gnus-summary-article-number)))
      (gnus-summary-position-point)))
  
! (defun gnus-summary-best-unread-article ()
!   "Select the unread article with the highest score."
    (interactive)
    (let ((best -1000000)
        (data gnus-newsgroup-data)
--- 7387,7406 ----
        (gnus-summary-display-article (gnus-summary-article-number)))
      (gnus-summary-position-point)))
  
! (defun gnus-summary-best-unread-article (&optional arg)
!   "Select the unread article with the highest score.
! If given a prefix argument, select the next unread article that has a
! score higher than the default score."
!   (interactive "P")
!   (let ((article (if arg
!                    (gnus-summary-better-unread-subject)
!                  (gnus-summary-best-unread-subject))))
!     (if article
!       (gnus-summary-goto-article article)
!       (error "No unread articles"))))
! 
! (defun gnus-summary-best-unread-subject ()
!   "Select the unread subject with the highest score."
    (interactive)
    (let ((best -1000000)
        (data gnus-newsgroup-data)
***************
*** 6321,6331 ****
           (setq best score
                 article (gnus-data-number (car data))))
        (setq data (cdr data)))
!     (prog1
!       (if article
!           (gnus-summary-goto-article article)
!         (error "No unread articles"))
!       (gnus-summary-position-point))))
  
  (defun gnus-summary-last-subject ()
    "Go to the last displayed subject line in the group."
--- 7413,7437 ----
           (setq best score
                 article (gnus-data-number (car data))))
        (setq data (cdr data)))
!     (when article
!       (gnus-summary-goto-subject article))
!     (gnus-summary-position-point)
!     article))
! 
! (defun gnus-summary-better-unread-subject ()
!   "Select the first unread subject that has a score over the default score."
!   (interactive)
!   (let ((data gnus-newsgroup-data)
!       article score)
!     (while (and (setq article (gnus-data-number (car data)))
!               (or (gnus-data-read-p (car data))
!                   (not (> (gnus-summary-article-score article)
!                           gnus-summary-default-score))))
!       (setq data (cdr data)))
!     (when article
!       (gnus-summary-goto-subject article))
!     (gnus-summary-position-point)
!     article))
  
  (defun gnus-summary-last-subject ()
    "Go to the last displayed subject line in the group."
***************
*** 6348,6354 ****
      t))
    (prog1
        (if (and (stringp article)
!              (string-match "@" article))
          (gnus-summary-refer-article article)
        (when (stringp article)
          (setq article (string-to-number article)))
--- 7454,7460 ----
      t))
    (prog1
        (if (and (stringp article)
!              (string-match "@\\|%40" article))
          (gnus-summary-refer-article article)
        (when (stringp article)
          (setq article (string-to-number article)))
***************
*** 6443,6454 ****
         days)
       (while (not days-got)
         (setq days (if younger
!                     (read-string "Limit to articles within (in days): ")
!                   (read-string "Limit to articles old than (in days): ")))
         (when (> (length days) 0)
         (setq days (read days)))
         (if (numberp days)
!          (setq days-got t)
         (message "Please enter a number.")
         (sleep-for 1)))
       (list days younger)))
--- 7549,7566 ----
         days)
       (while (not days-got)
         (setq days (if younger
!                     (read-string "Limit to articles younger than (in days, 
older when negative): ")
!                   (read-string
!                    "Limit to articles older than (in days, younger when 
negative): ")))
         (when (> (length days) 0)
         (setq days (read days)))
         (if (numberp days)
!          (progn
!            (setq days-got t)
!            (if (< days 0)
!                (progn
!                  (setq younger (not younger))
!                  (setq days (* days -1)))))
         (message "Please enter a number.")
         (sleep-for 1)))
       (list days younger)))
***************
*** 6476,6482 ****
    (interactive
     (let ((header
          (intern
!          (gnus-completing-read
            (symbol-name (car gnus-extra-headers))
            (if current-prefix-arg
                "Exclude extra header:"
--- 7588,7594 ----
    (interactive
     (let ((header
          (intern
!          (gnus-completing-read-with-default
            (symbol-name (car gnus-extra-headers))
            (if current-prefix-arg
                "Exclude extra header:"
***************
*** 6501,6506 ****
--- 7613,7630 ----
          (gnus-summary-limit articles))
        (gnus-summary-position-point))))
  
+ (defun gnus-summary-limit-to-display-predicate ()
+   "Limit the summary buffer to the predicated in the `display' group 
parameter."
+   (interactive)
+   (unless gnus-newsgroup-display
+     (error "There is no `display' group parameter"))
+   (let (articles)
+     (dolist (number gnus-newsgroup-articles)
+       (when (funcall gnus-newsgroup-display)
+       (push number articles)))
+     (gnus-summary-limit articles))
+   (gnus-summary-position-point))
+ 
  (defalias 'gnus-summary-delete-marked-as-read 'gnus-summary-limit-to-unread)
  (make-obsolete
   'gnus-summary-delete-marked-as-read 'gnus-summary-limit-to-unread)
***************
*** 6515,6521 ****
       ;; Concat all the marks that say that an article is read and have
       ;; those removed.
       (list gnus-del-mark gnus-read-mark gnus-ancient-mark
!          gnus-killed-mark gnus-kill-file-mark
           gnus-low-score-mark gnus-expirable-mark
           gnus-canceled-mark gnus-catchup-mark gnus-sparse-mark
           gnus-duplicate-mark gnus-souped-mark)
--- 7639,7645 ----
       ;; Concat all the marks that say that an article is read and have
       ;; those removed.
       (list gnus-del-mark gnus-read-mark gnus-ancient-mark
!          gnus-killed-mark gnus-spam-mark gnus-kill-file-mark
           gnus-low-score-mark gnus-expirable-mark
           gnus-canceled-mark gnus-catchup-mark gnus-sparse-mark
           gnus-duplicate-mark gnus-souped-mark)
***************
*** 6553,6564 ****
        (gnus-summary-limit articles))
      (gnus-summary-position-point)))
  
! (defun gnus-summary-limit-to-score (&optional score)
    "Limit to articles with score at or above SCORE."
!   (interactive "P")
!   (setq score (if score
!                 (prefix-numeric-value score)
!               (or gnus-summary-default-score 0)))
    (let ((data gnus-newsgroup-data)
        articles)
      (while data
--- 7677,7685 ----
        (gnus-summary-limit articles))
      (gnus-summary-position-point)))
  
! (defun gnus-summary-limit-to-score (score)
    "Limit to articles with score at or above SCORE."
!   (interactive "NLimit to articles with score of at least: ")
    (let ((data gnus-newsgroup-data)
        articles)
      (while data
***************
*** 6570,6584 ****
        (gnus-summary-limit articles)
        (gnus-summary-position-point))))
  
  (defun gnus-summary-limit-include-thread (id)
!   "Display all the hidden articles that in the current thread."
    (interactive (list (mail-header-id (gnus-summary-article-header))))
    (let ((articles (gnus-articles-in-thread
                   (gnus-id-to-thread (gnus-root-id id)))))
      (prog1
        (gnus-summary-limit (nconc articles gnus-newsgroup-limit))
        (gnus-summary-position-point))))
  
  (defun gnus-summary-limit-include-dormant ()
    "Display all the hidden articles that are marked as dormant.
  Note that this command only works on a subset of the articles currently
--- 7691,7735 ----
        (gnus-summary-limit articles)
        (gnus-summary-position-point))))
  
+ (defun gnus-summary-limit-to-unseen ()
+   "Limit to unseen articles."
+   (interactive)
+   (prog1
+       (gnus-summary-limit gnus-newsgroup-unseen)
+     (gnus-summary-position-point)))
+ 
  (defun gnus-summary-limit-include-thread (id)
!   "Display all the hidden articles that is in the thread with ID in it.
! When called interactively, ID is the Message-ID of the current
! article."
    (interactive (list (mail-header-id (gnus-summary-article-header))))
    (let ((articles (gnus-articles-in-thread
                   (gnus-id-to-thread (gnus-root-id id)))))
      (prog1
        (gnus-summary-limit (nconc articles gnus-newsgroup-limit))
+       (gnus-summary-limit-include-matching-articles
+        "subject"
+        (regexp-quote (gnus-simplify-subject-re
+                     (mail-header-subject (gnus-id-to-header id)))))
+       (gnus-summary-position-point))))
+ 
+ (defun gnus-summary-limit-include-matching-articles (header regexp)
+   "Display all the hidden articles that have HEADERs that match REGEXP."
+   (interactive (list (read-string "Match on header: ")
+                    (read-string "Regexp: ")))
+   (let ((articles (gnus-find-matching-articles header regexp)))
+     (prog1
+       (gnus-summary-limit (nconc articles gnus-newsgroup-limit))
        (gnus-summary-position-point))))
  
+ (defun gnus-summary-insert-dormant-articles ()
+   "Insert all the dormant articles for this group into the current buffer."
+   (interactive)
+   (let ((gnus-verbose (max 6 gnus-verbose)))
+     (if (not gnus-newsgroup-dormant)
+       (gnus-message 3 "No cached articles for this group")
+       (gnus-summary-goto-subjects gnus-newsgroup-dormant))))
+ 
  (defun gnus-summary-limit-include-dormant ()
    "Display all the hidden articles that are marked as dormant.
  Note that this command only works on a subset of the articles currently
***************
*** 6625,6639 ****
    "Mark all unread excluded articles as read.
  If ALL, mark even excluded ticked and dormants as read."
    (interactive "P")
!   (let ((articles (gnus-sorted-complement
                   (sort
                    (mapcar (lambda (h) (mail-header-number h))
                            gnus-newsgroup-headers)
                    '<)
!                  (sort gnus-newsgroup-limit '<)))
        article)
      (setq gnus-newsgroup-unreads
!         (gnus-intersection gnus-newsgroup-unreads gnus-newsgroup-limit))
      (if all
        (setq gnus-newsgroup-dormant nil
              gnus-newsgroup-marked nil
--- 7776,7792 ----
    "Mark all unread excluded articles as read.
  If ALL, mark even excluded ticked and dormants as read."
    (interactive "P")
!   (setq gnus-newsgroup-limit (sort gnus-newsgroup-limit '<))
!   (let ((articles (gnus-sorted-ndifference
                   (sort
                    (mapcar (lambda (h) (mail-header-number h))
                            gnus-newsgroup-headers)
                    '<)
!                  gnus-newsgroup-limit))
        article)
      (setq gnus-newsgroup-unreads
!         (gnus-sorted-intersection gnus-newsgroup-unreads
!                                   gnus-newsgroup-limit))
      (if all
        (setq gnus-newsgroup-dormant nil
              gnus-newsgroup-marked nil
***************
*** 6663,6671 ****
      ;; according to the new limit.
      (gnus-summary-prepare)
      ;; Hide any threads, possibly.
!     (and gnus-show-threads
!        gnus-thread-hide-subtree
!        (gnus-summary-hide-all-threads))
      ;; Try to return to the article you were at, or one in the
      ;; neighborhood.
      (when data
--- 7816,7822 ----
      ;; according to the new limit.
      (gnus-summary-prepare)
      ;; Hide any threads, possibly.
!     (gnus-summary-maybe-hide-threads)
      ;; Try to return to the article you were at, or one in the
      ;; neighborhood.
      (when data
***************
*** 6725,6731 ****
    thread)
  
  (defun gnus-cut-threads (threads)
!   "Cut off all uninteresting articles from the beginning of threads."
    (when (or (eq gnus-fetch-old-headers 'some)
            (eq gnus-fetch-old-headers 'invisible)
            (numberp gnus-fetch-old-headers)
--- 7876,7882 ----
    thread)
  
  (defun gnus-cut-threads (threads)
!   "Cut off all uninteresting articles from the beginning of THREADS."
    (when (or (eq gnus-fetch-old-headers 'some)
            (eq gnus-fetch-old-headers 'invisible)
            (numberp gnus-fetch-old-headers)
***************
*** 6745,6750 ****
--- 7896,7902 ----
    ;; Most groups have nothing to remove.
    (if (or gnus-inhibit-limiting
          (and (null gnus-newsgroup-dormant)
+              (eq gnus-newsgroup-display 'gnus-not-ignore)
               (not (eq gnus-fetch-old-headers 'some))
               (not (numberp gnus-fetch-old-headers))
               (not (eq gnus-fetch-old-headers 'invisible))
***************
*** 6784,6790 ****
    ;; will really go down to a leaf article first, before slowly
    ;; working its way up towards the root.
    (when thread
!     (let ((children
           (if (cdr thread)
               (apply '+ (mapcar 'gnus-summary-limit-children
                                 (cdr thread)))
--- 7936,7943 ----
    ;; will really go down to a leaf article first, before slowly
    ;; working its way up towards the root.
    (when thread
!     (let* ((max-lisp-eval-depth 5000)
!          (children
           (if (cdr thread)
               (apply '+ (mapcar 'gnus-summary-limit-children
                                 (cdr thread)))
***************
*** 6833,6838 ****
--- 7986,7994 ----
                  (push (cons number gnus-low-score-mark)
                        gnus-newsgroup-reads)))
              t)
+           ;; Do the `display' group parameter.
+           (and gnus-newsgroup-display
+                (not (funcall gnus-newsgroup-display)))
            ;; Check NoCeM things.
            (if (and gnus-use-nocem
                     (gnus-nocem-unwanted-article-p
***************
*** 6890,6896 ****
            (set-buffer gnus-original-article-buffer)
            (nnheader-narrow-to-headers)
            (unless (setq ref (message-fetch-field "references"))
!             (setq ref (message-fetch-field "in-reply-to")))
            (widen))
        (setq ref
              ;; It's not the current article, so we take a bet on
--- 8046,8053 ----
            (set-buffer gnus-original-article-buffer)
            (nnheader-narrow-to-headers)
            (unless (setq ref (message-fetch-field "references"))
!             (when (setq ref (message-fetch-field "in-reply-to"))
!               (setq ref (gnus-extract-message-id-from-in-reply-to ref))))
            (widen))
        (setq ref
              ;; It's not the current article, so we take a bet on
***************
*** 6936,6954 ****
    (let ((id (mail-header-id (gnus-summary-article-header)))
        (limit (if limit (prefix-numeric-value limit)
                 gnus-refer-thread-limit)))
-     ;; We want to fetch LIMIT *old* headers, but we also have to
-     ;; re-fetch all the headers in the current buffer, because many of
-     ;; them may be undisplayed.  So we adjust LIMIT.
-     (when (numberp limit)
-       (incf limit (- gnus-newsgroup-end gnus-newsgroup-begin)))
      (unless (eq gnus-fetch-old-headers 'invisible)
        (gnus-message 5 "Fetching headers for %s..." gnus-newsgroup-name)
        ;; Retrieve the headers and read them in.
!       (if (eq (gnus-retrieve-headers
!              (list gnus-newsgroup-end) gnus-newsgroup-name limit)
              'nov)
          (gnus-build-all-threads)
!       (error "Can't fetch thread from backends that don't support NOV"))
        (gnus-message 5 "Fetching headers for %s...done" gnus-newsgroup-name))
      (gnus-summary-limit-include-thread id)))
  
--- 8093,8116 ----
    (let ((id (mail-header-id (gnus-summary-article-header)))
        (limit (if limit (prefix-numeric-value limit)
                 gnus-refer-thread-limit)))
      (unless (eq gnus-fetch-old-headers 'invisible)
        (gnus-message 5 "Fetching headers for %s..." gnus-newsgroup-name)
        ;; Retrieve the headers and read them in.
!       (if (eq (if (numberp limit)
!                 (gnus-retrieve-headers
!                  (list (min
!                         (+ (mail-header-number
!                             (gnus-summary-article-header))
!                            limit)
!                         gnus-newsgroup-end))
!                  gnus-newsgroup-name (* limit 2))
!               ;; gnus-refer-thread-limit is t, i.e. fetch _all_
!               ;; headers.
!               (gnus-retrieve-headers (list gnus-newsgroup-end)
!                                      gnus-newsgroup-name limit))
              'nov)
          (gnus-build-all-threads)
!       (error "Can't fetch thread from back ends that don't support NOV"))
        (gnus-message 5 "Fetching headers for %s...done" gnus-newsgroup-name))
      (gnus-summary-limit-include-thread id)))
  
***************
*** 6957,6968 ****
--- 8119,8134 ----
    (interactive "sMessage-ID: ")
    (when (and (stringp message-id)
             (not (zerop (length message-id))))
+     (setq message-id (gnus-replace-in-string message-id " " ""))
      ;; Construct the correct Message-ID if necessary.
      ;; Suggested by address@hidden
      (unless (string-match "^<" message-id)
        (setq message-id (concat "<" message-id)))
      (unless (string-match ">$" message-id)
        (setq message-id (concat message-id ">")))
+     ;; People often post MIDs from URLs, so unhex it:
+     (unless (string-match "@" message-id)
+       (setq message-id (gnus-url-unhex-string message-id)))
      (let* ((header (gnus-id-to-header message-id))
           (sparse (and header
                        (gnus-summary-article-sparse-p
***************
*** 6985,6993 ****
        ;; We fetch the article.
        (catch 'found
          (dolist (gnus-override-method (gnus-refer-article-methods))
!           (gnus-check-server gnus-override-method)
!           ;; Fetch the header, and display the article.
!           (when (setq number (gnus-summary-insert-subject message-id))
              (gnus-summary-select-article nil nil nil number)
              (throw 'found t)))
          (gnus-message 3 "Couldn't fetch article %s" message-id)))))))
--- 8151,8160 ----
        ;; We fetch the article.
        (catch 'found
          (dolist (gnus-override-method (gnus-refer-article-methods))
!           (when (and (gnus-check-server gnus-override-method)
!                      ;; Fetch the header,
!                      (setq number (gnus-summary-insert-subject message-id)))
!             ;; and display the article.
              (gnus-summary-select-article nil nil nil number)
              (throw 'found t)))
          (gnus-message 3 "Couldn't fetch article %s" message-id)))))))
***************
*** 7031,7038 ****
  to guess what the document format is."
    (interactive "P")
    (let ((conf gnus-current-window-configuration))
!     (save-excursion
!       (gnus-summary-select-article))
      (setq gnus-current-window-configuration conf)
      (let* ((name (format "%s-%d"
                         (gnus-group-prefixed-name
--- 8198,8209 ----
  to guess what the document format is."
    (interactive "P")
    (let ((conf gnus-current-window-configuration))
!     (save-window-excursion
!       (save-excursion
!       (let (gnus-article-prepare-hook
!             gnus-display-mime-function
!             gnus-break-pages)
!         (gnus-summary-select-article))))
      (setq gnus-current-window-configuration conf)
      (let* ((name (format "%s-%d"
                         (gnus-group-prefixed-name
***************
*** 7043,7048 ****
--- 8214,8220 ----
           (ogroup gnus-newsgroup-name)
           (params (append (gnus-info-params (gnus-get-info ogroup))
                           (list (cons 'to-group ogroup))
+                          (list (cons 'parent-group ogroup))
                           (list (cons 'save-article-group ogroup))))
           (case-fold-search t)
           (buf (current-buffer))
***************
*** 7051,7058 ****
        (set-buffer gnus-original-article-buffer)
        ;; Have the digest group inherit the main mail address of
        ;; the parent article.
!       (when (setq to-address (or (message-fetch-field "reply-to")
!                                  (message-fetch-field "from")))
          (setq params (append
                        (list (cons 'to-address
                                    (funcall gnus-decode-encoded-word-function
--- 8223,8230 ----
        (set-buffer gnus-original-article-buffer)
        ;; Have the digest group inherit the main mail address of
        ;; the parent article.
!       (when (setq to-address (or (gnus-fetch-field "reply-to")
!                                  (gnus-fetch-field "from")))
          (setq params (append
                        (list (cons 'to-address
                                    (funcall gnus-decode-encoded-word-function
***************
*** 7068,7088 ****
        (delete-matching-lines "^Path:\\|^From ")
        (widen))
        (unwind-protect
!           (if (let ((gnus-newsgroup-ephemeral-charset gnus-newsgroup-charset)
                    (gnus-newsgroup-ephemeral-ignored-charsets
                     gnus-newsgroup-ignored-charsets))
                (gnus-group-read-ephemeral-group
                 name `(nndoc ,name (nndoc-address ,(get-buffer dig))
                              (nndoc-article-type
!                              ,(if force 'mbox 'guess))) t))
              ;; Make all postings to this group go to the parent group.
!               (nconc (gnus-info-params (gnus-get-info name))
!                      params)
!             ;; Couldn't select this doc group.
!             (switch-to-buffer buf)
!             (gnus-set-global-variables)
!             (gnus-configure-windows 'summary)
!             (gnus-message 3 "Article couldn't be entered?"))
        (kill-buffer dig)))))
  
  (defun gnus-summary-read-document (n)
--- 8240,8263 ----
        (delete-matching-lines "^Path:\\|^From ")
        (widen))
        (unwind-protect
!         (if (let ((gnus-newsgroup-ephemeral-charset gnus-newsgroup-charset)
                    (gnus-newsgroup-ephemeral-ignored-charsets
                     gnus-newsgroup-ignored-charsets))
                (gnus-group-read-ephemeral-group
                 name `(nndoc ,name (nndoc-address ,(get-buffer dig))
                              (nndoc-article-type
!                              ,(if force 'mbox 'guess)))
!                t nil nil nil
!                `((adapt-file . ,(gnus-score-file-name gnus-newsgroup-name
!                                                       "ADAPT")))))
              ;; Make all postings to this group go to the parent group.
!             (nconc (gnus-info-params (gnus-get-info name))
!                    params)
!           ;; Couldn't select this doc group.
!           (switch-to-buffer buf)
!           (gnus-set-global-variables)
!           (gnus-configure-windows 'summary)
!           (gnus-message 3 "Article couldn't be entered?"))
        (kill-buffer dig)))))
  
  (defun gnus-summary-read-document (n)
***************
*** 7115,7121 ****
                                     (nndoc-article-type guess))
                       t nil t))
                (progn
!                 ;; Make all postings to this group go to the parent group.
                  (nconc (gnus-info-params (gnus-get-info egroup))
                         params)
                  (push egroup groups))
--- 8290,8296 ----
                                     (nndoc-article-type guess))
                       t nil t))
                (progn
!           ;; Make all postings to this group go to the parent group.
                  (nconc (gnus-info-params (gnus-get-info egroup))
                         params)
                  (push egroup groups))
***************
*** 7159,7168 ****
         current-prefix-arg))
    (if (string-equal regexp "")
        (setq regexp (or gnus-last-search-regexp ""))
!     (setq gnus-last-search-regexp regexp))
!   (if (gnus-summary-search-article regexp backward)
!       (gnus-summary-show-thread)
!     (error "Search failed: \"%s\"" regexp)))
  
  (defun gnus-summary-search-article-backward (regexp)
    "Search for an article containing REGEXP backward."
--- 8334,8347 ----
         current-prefix-arg))
    (if (string-equal regexp "")
        (setq regexp (or gnus-last-search-regexp ""))
!     (setq gnus-last-search-regexp regexp)
!     (setq gnus-article-before-search gnus-current-article))
!   ;; Intentionally set gnus-last-article.
!   (setq gnus-last-article gnus-article-before-search)
!   (let ((gnus-last-article gnus-last-article))
!     (if (gnus-summary-search-article regexp backward)
!       (gnus-summary-show-thread)
!       (error "Search failed: \"%s\"" regexp))))
  
  (defun gnus-summary-search-article-backward (regexp)
    "Search for an article containing REGEXP backward."
***************
*** 7188,7193 ****
--- 8367,8378 ----
        (gnus-use-article-prefetch nil)
        (gnus-xmas-force-redisplay nil) ;Inhibit XEmacs redisplay.
        (gnus-use-trees nil)            ;Inhibit updating tree buffer.
+       (gnus-visual nil)
+       (gnus-keep-backlog nil)
+       (gnus-break-pages nil)
+       (gnus-summary-display-arrow nil)
+       (gnus-updated-mode-lines nil)
+       (gnus-auto-center-summary nil)
        (sum (current-buffer))
        (gnus-display-mime-function nil)
        (found nil)
***************
*** 7241,7246 ****
--- 8426,8443 ----
        (gnus-summary-position-point)
        t)))
  
+ (defun gnus-find-matching-articles (header regexp)
+   "Return a list of all articles that match REGEXP on HEADER.
+ This search includes all articles in the current group that Gnus has
+ fetched headers for, whether they are displayed or not."
+   (let ((articles nil)
+       (func `(lambda (h) (,(intern (concat "mail-header-" header)) h)))
+       (case-fold-search t))
+     (dolist (header gnus-newsgroup-headers)
+       (when (string-match regexp (funcall func header))
+       (push (mail-header-number header) articles)))
+     (nreverse articles)))
+ 
  (defun gnus-summary-find-matching (header regexp &optional backward unread
                                          not-case-fold not-matching)
    "Return a list of all articles that match REGEXP on HEADER.
***************
*** 7287,7295 ****
     (list (let ((completion-ignore-case t))
           (completing-read
            "Header name: "
!           (mapcar (lambda (string) (list string))
!                   '("Number" "Subject" "From" "Lines" "Date"
!                     "Message-ID" "Xref" "References" "Body"))
            nil 'require-match))
         (read-string "Regexp: ")
         (read-key-sequence "Command: ")
--- 8484,8494 ----
     (list (let ((completion-ignore-case t))
           (completing-read
            "Header name: "
!           (mapcar (lambda (header) (list (format "%s" header)))
!                   (append
!                    '("Number" "Subject" "From" "Lines" "Date"
!                      "Message-ID" "Xref" "References" "Body")
!                    gnus-extra-headers))
            nil 'require-match))
         (read-string "Regexp: ")
         (read-key-sequence "Command: ")
***************
*** 7301,7312 ****
    ;; We don't want to change current point nor window configuration.
    (save-excursion
      (save-window-excursion
!       (gnus-message 6 "Executing %s..." (key-description command))
!       ;; We'd like to execute COMMAND interactively so as to give arguments.
!       (gnus-execute header regexp
!                   `(call-interactively ',(key-binding command))
!                   backward)
!       (gnus-message 6 "Executing %s...done" (key-description command)))))
  
  (defun gnus-summary-beginning-of-article ()
    "Scroll the article back to the beginning."
--- 8500,8518 ----
    ;; We don't want to change current point nor window configuration.
    (save-excursion
      (save-window-excursion
!       (let (gnus-visual
!           gnus-treat-strip-trailing-blank-lines
!           gnus-treat-strip-leading-blank-lines
!           gnus-treat-strip-multiple-blank-lines
!           gnus-treat-hide-boring-headers
!           gnus-treat-fold-newsgroups
!           gnus-article-prepare-hook)
!       (gnus-message 6 "Executing %s..." (key-description command))
!       ;; We'd like to execute COMMAND interactively so as to give arguments.
!       (gnus-execute header regexp
!                     `(call-interactively ',(key-binding command))
!                     backward)
!       (gnus-message 6 "Executing %s...done" (key-description command))))))
  
  (defun gnus-summary-beginning-of-article ()
    "Scroll the article back to the beginning."
***************
*** 7316,7322 ****
    (gnus-eval-in-buffer-window gnus-article-buffer
      (widen)
      (goto-char (point-min))
!     (when gnus-page-broken
        (gnus-narrow-to-page))))
  
  (defun gnus-summary-end-of-article ()
--- 8522,8528 ----
    (gnus-eval-in-buffer-window gnus-article-buffer
      (widen)
      (goto-char (point-min))
!     (when gnus-break-pages
        (gnus-narrow-to-page))))
  
  (defun gnus-summary-end-of-article ()
***************
*** 7328,7341 ****
      (widen)
      (goto-char (point-max))
      (recenter -3)
!     (when gnus-page-broken
        (gnus-narrow-to-page))))
  
  (defun gnus-summary-print-article (&optional filename n)
!   "Generate and print a PostScript image of the N next (mail) articles.
  
! If N is negative, print the N previous articles.  If N is nil and articles
! have been marked with the process mark, print these instead.
  
  If the optional first argument FILENAME is nil, send the image to the
  printer.  If FILENAME is a string, save the PostScript image in a file with
--- 8534,8562 ----
      (widen)
      (goto-char (point-max))
      (recenter -3)
!     (when gnus-break-pages
!       (when (re-search-backward page-delimiter nil t)
!       (narrow-to-region (match-end 0) (point-max)))
        (gnus-narrow-to-page))))
  
+ (defun gnus-summary-print-truncate-and-quote (string &optional len)
+   "Truncate to LEN and quote all \"(\"'s in STRING."
+   (gnus-replace-in-string (if (and len (> (length string) len))
+                             (substring string 0 len)
+                           string)
+                         "[()]" "\\\\\\&"))
+ 
  (defun gnus-summary-print-article (&optional filename n)
!   "Generate and print a PostScript image of the process-marked (mail) 
articles.
  
! If used interactively, print the current article if none are
! process-marked.  With prefix arg, prompt the user for the name of the
! file to save in.
! 
! When used from Lisp, accept two optional args FILENAME and N.  N means
! to print the next N articles.  If N is negative, print the N previous
! articles.  If N is nil and articles have been marked with the process
! mark, print these instead.
  
  If the optional first argument FILENAME is nil, send the image to the
  printer.  If FILENAME is a string, save the PostScript image in a file with
***************
*** 7345,7389 ****
    (dolist (article (gnus-summary-work-articles n))
      (gnus-summary-select-article nil nil 'pseudo article)
      (gnus-eval-in-buffer-window gnus-article-buffer
!       (let ((buffer (generate-new-buffer " *print*")))
!       (unwind-protect
!           (progn
!             (copy-to-buffer buffer (point-min) (point-max))
!             (set-buffer buffer)
!             (gnus-article-delete-invisible-text)
!             (let ((ps-left-header
!                    (list
!                     (concat "("
!                             (mail-header-subject gnus-current-headers) ")")
!                     (concat "("
!                             (mail-header-from gnus-current-headers) ")")))
!                   (ps-right-header
!                    (list
!                     "/pagenumberstring load"
!                     (concat "("
!                             (mail-header-date gnus-current-headers) ")"))))
!               (gnus-run-hooks 'gnus-ps-print-hook)
!               (save-excursion
!                 (ps-spool-buffer-with-faces))))
!         (kill-buffer buffer))))
      (gnus-summary-remove-process-mark article))
    (ps-despool filename))
  
  (defun gnus-summary-show-article (&optional arg)
!   "Force re-fetching of the current article.
  If ARG (the prefix) is a number, show the article with the charset
  defined in `gnus-summary-show-article-charset-alist', or the charset
! inputed.
  If ARG (the prefix) is non-nil and not a number, show the raw article
! without any article massaging functions being run."
    (interactive "P")
    (cond
     ((numberp arg)
      (let ((gnus-newsgroup-charset
           (or (cdr (assq arg gnus-summary-show-article-charset-alist))
!              (read-coding-system "Charset: ")))
          (gnus-newsgroup-ignored-charsets 'gnus-all))
!       (gnus-summary-select-article nil 'force)))
     ((not arg)
      ;; Select the article the normal way.
      (gnus-summary-select-article nil 'force))
--- 8566,8660 ----
    (dolist (article (gnus-summary-work-articles n))
      (gnus-summary-select-article nil nil 'pseudo article)
      (gnus-eval-in-buffer-window gnus-article-buffer
!       (gnus-print-buffer))
      (gnus-summary-remove-process-mark article))
    (ps-despool filename))
  
+ (defun gnus-print-buffer ()
+   (let ((buffer (generate-new-buffer " *print*")))
+     (unwind-protect
+       (progn
+         (copy-to-buffer buffer (point-min) (point-max))
+         (set-buffer buffer)
+         (gnus-remove-text-with-property 'gnus-decoration)
+         (when (gnus-visual-p 'article-highlight 'highlight)
+           ;; Copy-to-buffer doesn't copy overlay.  So redo
+           ;; highlight.
+           (let ((gnus-article-buffer buffer))
+             (gnus-article-highlight-citation t)
+             (gnus-article-highlight-signature)
+             (gnus-article-emphasize)
+             (gnus-article-delete-invisible-text)))
+         (let ((ps-left-header
+                (list
+                 (concat "("
+                         (gnus-summary-print-truncate-and-quote
+                          (mail-header-subject gnus-current-headers)
+                          66) ")")
+                 (concat "("
+                         (gnus-summary-print-truncate-and-quote
+                          (mail-header-from gnus-current-headers)
+                          45) ")")))
+               (ps-right-header
+                (list
+                 "/pagenumberstring load"
+                 (concat "("
+                         (mail-header-date gnus-current-headers) ")"))))
+           (gnus-run-hooks 'gnus-ps-print-hook)
+           (save-excursion
+             (if window-system
+                 (ps-spool-buffer-with-faces)
+               (ps-spool-buffer)))))
+       (kill-buffer buffer))))
+ 
  (defun gnus-summary-show-article (&optional arg)
!   "Force redisplaying of the current article.
  If ARG (the prefix) is a number, show the article with the charset
  defined in `gnus-summary-show-article-charset-alist', or the charset
! input.
  If ARG (the prefix) is non-nil and not a number, show the raw article
! without any article massaging functions being run.  Normally, the key
! strokes are `C-u g'."
    (interactive "P")
    (cond
     ((numberp arg)
+     (gnus-summary-show-article t)
      (let ((gnus-newsgroup-charset
           (or (cdr (assq arg gnus-summary-show-article-charset-alist))
!              (mm-read-coding-system
!               "View as charset: " ;; actually it is coding system.
!               (save-excursion
!                 (set-buffer gnus-article-buffer)
!                 (mm-detect-coding-region (point) (point-max))))))
          (gnus-newsgroup-ignored-charsets 'gnus-all))
!       (gnus-summary-select-article nil 'force)
!       (let ((deps gnus-newsgroup-dependencies)
!           head header lines)
!       (save-excursion
!         (set-buffer gnus-original-article-buffer)
!         (save-restriction
!           (message-narrow-to-head)
!           (setq head (buffer-string))
!           (goto-char (point-min))
!           (unless (re-search-forward "^lines:[ \t]\\([0-9]+\\)" nil t)
!             (goto-char (point-max))
!             (widen)
!             (setq lines (1- (count-lines (point) (point-max))))))
!         (with-temp-buffer
!           (insert (format "211 %d Article retrieved.\n"
!                           (cdr gnus-article-current)))
!           (insert head)
!           (if lines (insert (format "Lines: %d\n" lines)))
!           (insert ".\n")
!           (let ((nntp-server-buffer (current-buffer)))
!             (setq header (car (gnus-get-newsgroup-headers deps t))))))
!       (gnus-data-set-header
!        (gnus-data-find (cdr gnus-article-current))
!        header)
!       (gnus-summary-update-article-line
!        (cdr gnus-article-current) header)
!       (when (gnus-summary-goto-subject (cdr gnus-article-current) nil t)
!         (gnus-summary-update-secondary-mark (cdr gnus-article-current))))))
     ((not arg)
      ;; Select the article the normal way.
      (gnus-summary-select-article nil 'force))
***************
*** 7410,7415 ****
--- 8681,8691 ----
    (gnus-summary-goto-subject gnus-current-article)
    (gnus-summary-position-point))
  
+ (defun gnus-summary-show-raw-article ()
+   "Show the raw article without any article massaging functions being run."
+   (interactive)
+   (gnus-summary-show-article t))
+ 
  (defun gnus-summary-verbose-headers (&optional arg)
    "Toggle permanent full header display.
  If ARG is a positive number, turn header display on.
***************
*** 7428,7469 ****
  If ARG is a positive number, show the entire header.
  If ARG is a negative number, hide the unwanted header lines."
    (interactive "P")
!   (save-excursion
!     (set-buffer gnus-article-buffer)
!     (save-restriction
        (let* ((buffer-read-only nil)
             (inhibit-point-motion-hooks t)
!            hidden s e)
!       (setq hidden
!             (if (numberp arg)
!                 (>= arg 0)
!               (save-restriction
!                 (article-narrow-to-head)
!                 (gnus-article-hidden-text-p 'headers))))
!       (goto-char (point-min))
!       (when (search-forward "\n\n" nil t)
!         (delete-region (point-min) (1- (point))))
!       (goto-char (point-min))
        (with-current-buffer gnus-original-article-buffer
          (goto-char (setq s (point-min)))
!         (setq e (1- (or (search-forward "\n\n" nil t) (point-max)))))
        (insert-buffer-substring gnus-original-article-buffer s e)
!       (save-restriction
!         (narrow-to-region (point-min) (point))
!         (article-decode-encoded-words)
!         (if  hidden
!             (let ((gnus-treat-hide-headers nil)
!                   (gnus-treat-hide-boring-headers nil))
!               (setq gnus-article-wash-types
!                     (delq 'headers gnus-article-wash-types))
!               (gnus-treat-article 'head))
!           (gnus-treat-article 'head)))
        (gnus-set-mode-line 'article)))))
  
  (defun gnus-summary-show-all-headers ()
    "Make all header lines visible."
    (interactive)
!   (gnus-article-show-all-headers))
  
  (defun gnus-summary-caesar-message (&optional arg)
    "Caesar rotate the current article by 13.
--- 8704,8749 ----
  If ARG is a positive number, show the entire header.
  If ARG is a negative number, hide the unwanted header lines."
    (interactive "P")
!   (let ((window (and (gnus-buffer-live-p gnus-article-buffer)
!                    (get-buffer-window gnus-article-buffer t))))
!     (with-current-buffer gnus-article-buffer
!       (widen)
!       (article-narrow-to-head)
        (let* ((buffer-read-only nil)
             (inhibit-point-motion-hooks t)
!            (hidden (if (numberp arg)
!                        (>= arg 0)
!                      (gnus-article-hidden-text-p 'headers)))
!            s e)
!       (delete-region (point-min) (point-max))
        (with-current-buffer gnus-original-article-buffer
          (goto-char (setq s (point-min)))
!         (setq e (if (search-forward "\n\n" nil t)
!                     (1- (point))
!                   (point-max))))
        (insert-buffer-substring gnus-original-article-buffer s e)
!       (run-hooks 'gnus-article-decode-hook)
!       (if hidden
!           (let ((gnus-treat-hide-headers nil)
!                 (gnus-treat-hide-boring-headers nil))
!             (gnus-delete-wash-type 'headers)
!             (gnus-treat-article 'head))
!         (gnus-treat-article 'head))
!       (widen)
!       (if window
!           (set-window-start window (goto-char (point-min))))
!       (if gnus-break-pages
!           (gnus-narrow-to-page)
!         (when (gnus-visual-p 'page-marker)
!           (let ((buffer-read-only nil))
!             (gnus-remove-text-with-property 'gnus-prev)
!             (gnus-remove-text-with-property 'gnus-next))))
        (gnus-set-mode-line 'article)))))
  
  (defun gnus-summary-show-all-headers ()
    "Make all header lines visible."
    (interactive)
!   (gnus-summary-toggle-header 1))
  
  (defun gnus-summary-caesar-message (&optional arg)
    "Caesar rotate the current article by 13.
***************
*** 7480,7485 ****
--- 8760,8790 ----
          (message-caesar-buffer-body arg)
          (set-window-start (get-buffer-window (current-buffer)) start))))))
  
+ (autoload 'unmorse-region "morse"
+   "Convert morse coded text in region to ordinary ASCII text."
+   t)
+ 
+ (defun gnus-summary-morse-message (&optional arg)
+   "Morse decode the current article."
+   (interactive "P")
+   (gnus-summary-select-article)
+   (let ((mail-header-separator ""))
+     (gnus-eval-in-buffer-window gnus-article-buffer
+       (save-excursion
+       (save-restriction
+         (widen)
+         (let ((pos (window-start))
+               buffer-read-only)
+           (goto-char (point-min))
+           (when (message-goto-body)
+             (gnus-narrow-to-body))
+           (goto-char (point-min))
+           (while (re-search-forward "·" (point-max) t)
+             (replace-match "."))
+           (unmorse-region (point-min) (point-max))
+           (widen)
+           (set-window-start (get-buffer-window (current-buffer)) pos)))))))
+ 
  (defun gnus-summary-stop-page-breaking ()
    "Stop page breaking in the current article."
    (interactive)
***************
*** 7503,7508 ****
--- 8808,8817 ----
  If SELECT-METHOD is non-nil, do not move to a specific newsgroup, but
  re-spool using this method.
  
+ When called interactively with TO-NEWSGROUP being nil, the value of
+ the variable `gnus-move-split-methods' is used for finding a default
+ for the target newsgroup.
+ 
  For this function to work, both the current newsgroup and the
  newsgroup that you want to move to have to support the `request-move'
  and `request-accept' functions.
***************
*** 7511,7520 ****
    (interactive "P")
    (unless action
      (setq action 'move))
-   ;; Disable marking as read.
-   (let (gnus-mark-article-hook)
-     (save-window-excursion
-       (gnus-summary-select-article)))
    ;; Check whether the source group supports the required functions.
    (cond ((and (eq action 'move)
              (not (gnus-check-backend-function
--- 8820,8825 ----
***************
*** 7526,7532 ****
         (error "The current group does not support article editing")))
    (let ((articles (gnus-summary-work-articles n))
        (prefix (if (gnus-check-backend-function
!                   'request-move-article gnus-newsgroup-name)
                    (gnus-group-real-prefix gnus-newsgroup-name)
                  ""))
        (names '((move "Move" "Moving")
--- 8831,8837 ----
         (error "The current group does not support article editing")))
    (let ((articles (gnus-summary-work-articles n))
        (prefix (if (gnus-check-backend-function
!                    'request-move-article gnus-newsgroup-name)
                    (gnus-group-real-prefix gnus-newsgroup-name)
                  ""))
        (names '((move "Move" "Moving")
***************
*** 7540,7545 ****
--- 8845,8862 ----
      ;; Read the newsgroup name.
      (when (and (not to-newsgroup)
               (not select-method))
+       (if (and gnus-move-split-methods
+              (not
+               (and (memq gnus-current-article articles)
+                    (gnus-buffer-live-p gnus-original-article-buffer))))
+         ;; When `gnus-move-split-methods' is non-nil, we have to
+         ;; select an article to give `gnus-read-move-group-name' an
+         ;; opportunity to suggest an appropriate default.  However,
+         ;; we needn't render or mark the article.
+         (let ((gnus-display-mime-function nil)
+               (gnus-article-prepare-hook nil)
+               (gnus-mark-article-hook nil))
+           (gnus-summary-select-article nil nil nil (car articles))))
        (setq to-newsgroup
            (gnus-read-move-group-name
             (cadr (assq action names))
***************
*** 7589,7595 ****
                      (mail-header-xref (gnus-summary-article-header article))
                      " ")))
           (setq new-xref (concat (gnus-group-real-name gnus-newsgroup-name)
!                                 ":" article))
           (unless xref
             (setq xref (list (system-name))))
           (setq new-xref
--- 8906,8912 ----
                      (mail-header-xref (gnus-summary-article-header article))
                      " ")))
           (setq new-xref (concat (gnus-group-real-name gnus-newsgroup-name)
!                                 ":" (number-to-string article)))
           (unless xref
             (setq xref (list (system-name))))
           (setq new-xref
***************
*** 7606,7612 ****
                                (gnus-request-accept-article
                                 to-newsgroup select-method (not articles))))
               (setq new-xref (concat new-xref " " (car art-group)
!                                     ":" (cdr art-group)))
               ;; Now we have the new Xrefs header, so we insert
               ;; it and replace the new article.
               (nnheader-replace-header "Xref" new-xref)
--- 8923,8930 ----
                                (gnus-request-accept-article
                                 to-newsgroup select-method (not articles))))
               (setq new-xref (concat new-xref " " (car art-group)
!                                     ":"
!                                     (number-to-string (cdr art-group))))
               ;; Now we have the new Xrefs header, so we insert
               ;; it and replace the new article.
               (nnheader-replace-header "Xref" new-xref)
***************
*** 7621,7634 ****
         ((eq art-group 'junk)
        (when (eq action 'move)
          (gnus-summary-mark-article article gnus-canceled-mark)
!         (gnus-message 4 "Deleted article %s" article)))
         (t
        (let* ((pto-group (gnus-group-prefixed-name
                           (car art-group) to-method))
               (entry
                (gnus-gethash pto-group gnus-newsrc-hashtb))
               (info (nth 2 entry))
!                (to-group (gnus-info-group info))
               to-marks)
          ;; Update the group that has been moved to.
          (when (and info
--- 8939,8959 ----
         ((eq art-group 'junk)
        (when (eq action 'move)
          (gnus-summary-mark-article article gnus-canceled-mark)
!         (gnus-message 4 "Deleted article %s" article)
!         ;; run the delete hook
!         (run-hook-with-args 'gnus-summary-article-delete-hook
!                             action
!                             (gnus-data-header
!                              (assoc article (gnus-data-list nil)))
!                             gnus-newsgroup-name nil
!                             select-method)))
         (t
        (let* ((pto-group (gnus-group-prefixed-name
                           (car art-group) to-method))
               (entry
                (gnus-gethash pto-group gnus-newsrc-hashtb))
               (info (nth 2 entry))
!              (to-group (gnus-info-group info))
               to-marks)
          ;; Update the group that has been moved to.
          (when (and info
***************
*** 7643,7649 ****
                                       (list (cdr art-group)))))
  
            ;; See whether the article is to be put in the cache.
!           (let ((marks gnus-article-mark-lists)
                  (to-article (cdr art-group)))
  
              ;; Enter the article into the cache in the new group,
--- 8968,8977 ----
                                       (list (cdr art-group)))))
  
            ;; See whether the article is to be put in the cache.
!           (let ((marks (if (gnus-group-auto-expirable-p to-group)
!                            gnus-article-mark-lists
!                          (delete '(expirable . expire)
!                                  (copy-sequence gnus-article-mark-lists))))
                  (to-article (cdr art-group)))
  
              ;; Enter the article into the cache in the new group,
***************
*** 7665,7690 ****
                  (setcdr gnus-newsgroup-active to-article))
  
                (while marks
!                 (when (memq article (symbol-value
!                                      (intern (format "gnus-newsgroup-%s"
!                                                      (caar marks)))))
!                   (push (cdar marks) to-marks)
!                   ;; If the other group is the same as this group,
!                   ;; then we have to add the mark to the list.
!                   (when (equal to-group gnus-newsgroup-name)
!                     (set (intern (format "gnus-newsgroup-%s" (caar marks)))
!                          (cons to-article
!                                (symbol-value
!                                 (intern (format "gnus-newsgroup-%s"
!                                                 (caar marks)))))))
!                   ;; Copy the marks to other group.
!                   (gnus-add-marked-articles
!                    to-group (cdar marks) (list to-article) info))
                  (setq marks (cdr marks)))
  
!               (gnus-request-set-mark to-group (list (list (list to-article)
!                                                           'set
!                                                           to-marks))))
  
              (gnus-dribble-enter
               (concat "(gnus-group-set-info '"
--- 8993,9018 ----
                  (setcdr gnus-newsgroup-active to-article))
  
                (while marks
!                 (when (eq (gnus-article-mark-to-type (cdar marks)) 'list)
!                   (when (memq article (symbol-value
!                                        (intern (format "gnus-newsgroup-%s"
!                                                        (caar marks)))))
!                     (push (cdar marks) to-marks)
!                     ;; If the other group is the same as this group,
!                     ;; then we have to add the mark to the list.
!                     (when (equal to-group gnus-newsgroup-name)
!                       (set (intern (format "gnus-newsgroup-%s" (caar marks)))
!                            (cons to-article
!                                  (symbol-value
!                                   (intern (format "gnus-newsgroup-%s"
!                                                   (caar marks)))))))
!                     ;; Copy the marks to other group.
!                     (gnus-add-marked-articles
!                      to-group (cdar marks) (list to-article) info)))
                  (setq marks (cdr marks)))
  
!               (gnus-request-set-mark
!                to-group (list (list (list to-article) 'add to-marks))))
  
              (gnus-dribble-enter
               (concat "(gnus-group-set-info '"
***************
*** 7699,7720 ****
              (gnus-request-article-this-buffer article gnus-newsgroup-name)
              (nnheader-replace-header "Xref" new-xref)
              (gnus-request-replace-article
!              article gnus-newsgroup-name (current-buffer)))))
  
        ;;;!!!Why is this necessary?
        (set-buffer gnus-summary-buffer)
! 
        (gnus-summary-goto-subject article)
        (when (eq action 'move)
          (gnus-summary-mark-article article gnus-canceled-mark))))
        (gnus-summary-remove-process-mark article))
      ;; Re-activate all groups that have been moved to.
!     (while to-groups
!       (save-excursion
!       (set-buffer gnus-group-buffer)
!       (when (gnus-group-goto-group (car to-groups) t)
!         (gnus-group-get-new-news-this-group 1 t))
!       (pop to-groups)))
  
      (gnus-kill-buffer copy-buf)
      (gnus-summary-position-point)
--- 9027,9055 ----
              (gnus-request-article-this-buffer article gnus-newsgroup-name)
              (nnheader-replace-header "Xref" new-xref)
              (gnus-request-replace-article
!              article gnus-newsgroup-name (current-buffer))))
! 
!         ;; run the move/copy/crosspost/respool hook
!         (run-hook-with-args 'gnus-summary-article-move-hook
!                             action
!                             (gnus-data-header
!                              (assoc article (gnus-data-list nil)))
!                             gnus-newsgroup-name
!                             to-newsgroup
!                             select-method))
  
        ;;;!!!Why is this necessary?
        (set-buffer gnus-summary-buffer)
!       
        (gnus-summary-goto-subject article)
        (when (eq action 'move)
          (gnus-summary-mark-article article gnus-canceled-mark))))
        (gnus-summary-remove-process-mark article))
      ;; Re-activate all groups that have been moved to.
!     (save-excursion
!       (set-buffer gnus-group-buffer)
!       (let ((gnus-group-marked to-groups))
!       (gnus-group-get-new-news-this-group nil t)))
  
      (gnus-kill-buffer copy-buf)
      (gnus-summary-position-point)
***************
*** 7723,7728 ****
--- 9058,9066 ----
  (defun gnus-summary-copy-article (&optional n to-newsgroup select-method)
    "Move the current article to a different newsgroup.
  If TO-NEWSGROUP is string, do not prompt for a newsgroup to move to.
+ When called interactively, if TO-NEWSGROUP is nil, use the value of
+ the variable `gnus-move-split-methods' for finding a default target
+ newsgroup.
  If SELECT-METHOD is non-nil, do not move to a specific newsgroup, but
  re-spool using this method."
    (interactive "P")
***************
*** 7734,7745 ****
    (gnus-summary-move-article n nil nil 'crosspost))
  
  (defcustom gnus-summary-respool-default-method nil
!   "Default method for respooling an article.
  If nil, use to the current newsgroup method."
!   :type '(choice (gnus-select-method :value (nnml ""))
!                (const nil))
    :group 'gnus-summary-mail)
  
  (defun gnus-summary-respool-article (&optional n method)
    "Respool the current article.
  The article will be squeezed through the mail spooling process again,
--- 9072,9091 ----
    (gnus-summary-move-article n nil nil 'crosspost))
  
  (defcustom gnus-summary-respool-default-method nil
!   "Default method type for respooling an article.
  If nil, use to the current newsgroup method."
!   :type 'symbol
    :group 'gnus-summary-mail)
  
+ (defcustom gnus-summary-display-while-building nil
+   "If non-nil, show and update the summary buffer as it's being built.
+ If the value is t, update the buffer after every line is inserted.  If
+ the value is an integer (N), update the display every N lines."
+   :group 'gnus-thread
+   :type '(choice (const :tag "off" nil)
+                number
+                (const :tag "frequently" t)))
+ 
  (defun gnus-summary-respool-article (&optional n method)
    "Respool the current article.
  The article will be squeezed through the mail spooling process again,
***************
*** 7762,7768 ****
                                  (car (gnus-find-method-for-group
                                        gnus-newsgroup-name)))))
                (method
!                (gnus-completing-read
                  methname "What backend do you want to use when respooling?"
                  methods nil t nil 'gnus-mail-method-history))
                ms)
--- 9108,9114 ----
                                  (car (gnus-find-method-for-group
                                        gnus-newsgroup-name)))))
                (method
!                (gnus-completing-read-with-default
                  methname "What backend do you want to use when respooling?"
                  methods nil t nil 'gnus-mail-method-history))
                ms)
***************
*** 7784,7795 ****
        (gnus-summary-move-article n nil method)
      (gnus-summary-copy-article n nil method)))
  
! (defun gnus-summary-import-article (file)
    "Import an arbitrary file into a mail newsgroup."
!   (interactive "fImport file: ")
    (let ((group gnus-newsgroup-name)
        (now (current-time))
!       atts lines)
      (unless (gnus-check-backend-function 'request-accept-article group)
        (error "%s does not support article importing" group))
      (or (file-readable-p file)
--- 9130,9141 ----
        (gnus-summary-move-article n nil method)
      (gnus-summary-copy-article n nil method)))
  
! (defun gnus-summary-import-article (file &optional edit)
    "Import an arbitrary file into a mail newsgroup."
!   (interactive "fImport file: \nP")
    (let ((group gnus-newsgroup-name)
        (now (current-time))
!       atts lines group-art)
      (unless (gnus-check-backend-function 'request-accept-article group)
        (error "%s does not support article importing" group))
      (or (file-readable-p file)
***************
*** 7800,7818 ****
        (erase-buffer)
        (nnheader-insert-file-contents file)
        (goto-char (point-min))
!       (unless (nnheader-article-p)
!       ;; This doesn't look like an article, so we fudge some headers.
        (setq atts (file-attributes file)
              lines (count-lines (point-min) (point-max)))
        (insert "From: " (read-string "From: ") "\n"
                "Subject: " (read-string "Subject: ") "\n"
!               "Date: " (message-make-date (nth 5 atts))
!               "\n"
                "Message-ID: " (message-make-message-id) "\n"
                "Lines: " (int-to-string lines) "\n"
                "Chars: " (int-to-string (nth 7 atts)) "\n\n"))
!       (gnus-request-accept-article group nil t)
!       (kill-buffer (current-buffer)))))
  
  (defun gnus-summary-article-posted-p ()
    "Say whether the current (mail) article is available from news as well.
--- 9146,9200 ----
        (erase-buffer)
        (nnheader-insert-file-contents file)
        (goto-char (point-min))
!       (if (nnheader-article-p)
!         (save-restriction
!           (goto-char (point-min))
!           (search-forward "\n\n" nil t)
!           (narrow-to-region (point-min) (1- (point)))
!           (goto-char (point-min))
!           (unless (re-search-forward "^date:" nil t)
!             (goto-char (point-max))
!             (insert "Date: " (message-make-date (nth 5 atts)) "\n")))
!        ;; This doesn't look like an article, so we fudge some headers.
        (setq atts (file-attributes file)
              lines (count-lines (point-min) (point-max)))
        (insert "From: " (read-string "From: ") "\n"
                "Subject: " (read-string "Subject: ") "\n"
!               "Date: " (message-make-date (nth 5 atts)) "\n"
                "Message-ID: " (message-make-message-id) "\n"
                "Lines: " (int-to-string lines) "\n"
                "Chars: " (int-to-string (nth 7 atts)) "\n\n"))
!       (setq group-art (gnus-request-accept-article group nil t))
!       (kill-buffer (current-buffer)))
!     (setq gnus-newsgroup-active (gnus-activate-group group))
!     (forward-line 1)
!     (gnus-summary-goto-article (cdr group-art) nil t)
!     (when edit
!       (gnus-summary-edit-article))))
! 
! (defun gnus-summary-create-article ()
!   "Create an article in a mail newsgroup."
!   (interactive)
!   (let ((group gnus-newsgroup-name)
!       (now (current-time))
!       group-art)
!     (unless (gnus-check-backend-function 'request-accept-article group)
!       (error "%s does not support article importing" group))
!     (save-excursion
!       (set-buffer (gnus-get-buffer-create " *import file*"))
!       (erase-buffer)
!       (goto-char (point-min))
!       ;; This doesn't look like an article, so we fudge some headers.
!       (insert "From: " (read-string "From: ") "\n"
!             "Subject: " (read-string "Subject: ") "\n"
!             "Date: " (message-make-date now) "\n"
!             "Message-ID: " (message-make-message-id) "\n")
!       (setq group-art (gnus-request-accept-article group nil t))
!       (kill-buffer (current-buffer)))
!     (setq gnus-newsgroup-active (gnus-activate-group group))
!     (forward-line 1)
!     (gnus-summary-goto-article (cdr group-art) nil t)
!     (gnus-summary-edit-article)))
  
  (defun gnus-summary-article-posted-p ()
    "Say whether the current (mail) article is available from news as well.
***************
*** 7830,7837 ****
  (defun gnus-summary-expire-articles (&optional now)
    "Expire all articles that are marked as expirable in the current group."
    (interactive)
!   (when (gnus-check-backend-function
!        'request-expire-articles gnus-newsgroup-name)
      ;; This backend supports expiry.
      (let* ((total (gnus-group-total-expirable-p gnus-newsgroup-name))
           (expirable (if total
--- 9212,9220 ----
  (defun gnus-summary-expire-articles (&optional now)
    "Expire all articles that are marked as expirable in the current group."
    (interactive)
!   (when (and (not gnus-group-is-exiting-without-update-p)
!            (gnus-check-backend-function
!             'request-expire-articles gnus-newsgroup-name))
      ;; This backend supports expiry.
      (let* ((total (gnus-group-total-expirable-p gnus-newsgroup-name))
           (expirable (if total
***************
*** 7865,7883 ****
                (setq es (gnus-request-expire-articles
                          expirable gnus-newsgroup-name)))
            (setq es (gnus-request-expire-articles
!                     expirable gnus-newsgroup-name))))
!       (unless total
!         (setq gnus-newsgroup-expirable es))
!       ;; We go through the old list of expirable, and mark all
!       ;; really expired articles as nonexistent.
!       (unless (eq es expirable)       ;If nothing was expired, we don't mark.
!         (let ((gnus-use-cache nil))
!           (while expirable
!             (unless (memq (car expirable) es)
!               (when (gnus-data-find (car expirable))
!                 (gnus-summary-mark-article
!                  (car expirable) gnus-canceled-mark)))
!             (setq expirable (cdr expirable)))))
        (gnus-message 6 "Expiring articles...done")))))
  
  (defun gnus-summary-expire-articles-now ()
--- 9248,9271 ----
                (setq es (gnus-request-expire-articles
                          expirable gnus-newsgroup-name)))
            (setq es (gnus-request-expire-articles
!                     expirable gnus-newsgroup-name)))
!         (unless total
!           (setq gnus-newsgroup-expirable es))
!         ;; We go through the old list of expirable, and mark all
!         ;; really expired articles as nonexistent.
!         (unless (eq es expirable) ;If nothing was expired, we don't mark.
!           (let ((gnus-use-cache nil))
!             (dolist (article expirable)
!               (when (and (not (memq article es))
!                          (gnus-data-find article))
!                 (gnus-summary-mark-article article gnus-canceled-mark)
!                 (run-hook-with-args 'gnus-summary-article-expire-hook
!                                     'delete
!                                     (gnus-data-header
!                                      (assoc article (gnus-data-list nil)))
!                                     gnus-newsgroup-name
!                                     nil
!                                     nil))))))
        (gnus-message 6 "Expiring articles...done")))))
  
  (defun gnus-summary-expire-articles-now ()
***************
*** 7897,7905 ****
  This command actually deletes articles.        This is not a marking
  command.  The article will disappear forever from your life, never to
  return.
  If N is negative, delete backwards.
  If N is nil and articles have been marked with the process mark,
! delete these instead."
    (interactive "P")
    (unless (gnus-check-backend-function 'request-expire-articles
                                       gnus-newsgroup-name)
--- 9285,9297 ----
  This command actually deletes articles.        This is not a marking
  command.  The article will disappear forever from your life, never to
  return.
+ 
  If N is negative, delete backwards.
  If N is nil and articles have been marked with the process mark,
! delete these instead.
! 
! If `gnus-novice-user' is non-nil you will be asked for
! confirmation before the articles are deleted."
    (interactive "P")
    (unless (gnus-check-backend-function 'request-expire-articles
                                       gnus-newsgroup-name)
***************
*** 7908,7913 ****
--- 9300,9306 ----
      (error "Couldn't open server"))
    ;; Compute the list of articles to delete.
    (let ((articles (sort (copy-sequence (gnus-summary-work-articles n)) '<))
+       (nnmail-expiry-target 'delete)
        not-deleted)
      (if (and gnus-novice-user
             (not (gnus-yes-or-no-p
***************
*** 7925,7930 ****
--- 9318,9329 ----
        ;; after all.
        (unless (memq (car articles) not-deleted)
          (gnus-summary-mark-article (car articles) gnus-canceled-mark))
+       (let* ((article (car articles))
+              (id (mail-header-id (gnus-data-header
+                                   (assoc article (gnus-data-list nil))))))
+         (run-hook-with-args 'gnus-summary-article-delete-hook
+                             'delete id gnus-newsgroup-name nil
+                             nil))
        (setq articles (cdr articles)))
        (when not-deleted
        (gnus-message 4 "Couldn't delete articles %s" not-deleted)))
***************
*** 7938,7955 ****
  If ARG is nil, edit the decoded articles.
  If ARG is 1, edit the raw articles.
  If ARG is 2, edit the raw articles even in read-only groups.
  Otherwise, allow editing of articles even in read-only
  groups."
    (interactive "P")
!   (let (force raw)
      (cond
       ((null arg))
!      ((eq arg 1) (setq raw t))
!      ((eq arg 2) (setq raw t
!                      force t))
!      (t (setq force t)))
!     (if (and raw (not force) (equal gnus-newsgroup-name "nndraft:drafts"))
!       (error "Can't edit the raw article in group nndraft:drafts"))
      (save-excursion
        (set-buffer gnus-summary-buffer)
        (let ((mail-parse-charset gnus-newsgroup-charset)
--- 9337,9369 ----
  If ARG is nil, edit the decoded articles.
  If ARG is 1, edit the raw articles.
  If ARG is 2, edit the raw articles even in read-only groups.
+ If ARG is 3, edit the articles with the current handles.
  Otherwise, allow editing of articles even in read-only
  groups."
    (interactive "P")
!   (let (force raw current-handles)
      (cond
       ((null arg))
!      ((eq arg 1)
!       (setq raw t))
!      ((eq arg 2)
!       (setq raw t
!           force t))
!      ((eq arg 3)
!       (setq current-handles
!           (and (gnus-buffer-live-p gnus-article-buffer)
!                (with-current-buffer gnus-article-buffer
!                  (prog1
!                      gnus-article-mime-handles
!                    (setq gnus-article-mime-handles nil))))))
!      (t
!       (setq force t)))
!     (when (and raw (not force)
!              (member gnus-newsgroup-name '("nndraft:delayed"
!                                            "nndraft:drafts"
!                                            "nndraft:queue")))
!       (error "Can't edit the raw article in group %s"
!            gnus-newsgroup-name))
      (save-excursion
        (set-buffer gnus-summary-buffer)
        (let ((mail-parse-charset gnus-newsgroup-charset)
***************
*** 7962,7982 ****
        (when (and (not raw) (gnus-buffer-live-p gnus-article-buffer))
          (with-current-buffer gnus-article-buffer
            (mm-enable-multibyte)))
!       (if (equal gnus-newsgroup-name "nndraft:drafts")
            (setq raw t))
        (gnus-article-edit-article
         (if raw 'ignore
!          #'(lambda ()
!              (let ((mbl mml-buffer-list))
!                (setq mml-buffer-list nil)
!                (mime-to-mml)
!                (make-local-hook 'kill-buffer-hook)
!                (let ((mml-buffer-list mml-buffer-list))
!                  (setq mml-buffer-list mbl)
!                  (make-local-variable 'mml-buffer-list))
!                (add-hook 'kill-buffer-hook 'mml-destroy-buffers t t))))
         `(lambda (no-highlight)
            (let ((mail-parse-charset ',gnus-newsgroup-charset)
                  (mail-parse-ignored-charsets
                   ',gnus-newsgroup-ignored-charsets))
              ,(if (not raw) '(progn
--- 9376,9398 ----
        (when (and (not raw) (gnus-buffer-live-p gnus-article-buffer))
          (with-current-buffer gnus-article-buffer
            (mm-enable-multibyte)))
!       (if (member gnus-newsgroup-name '("nndraft:delayed" "nndraft:drafts"))
            (setq raw t))
        (gnus-article-edit-article
         (if raw 'ignore
!          `(lambda ()
!             (let ((mbl mml-buffer-list))
!               (setq mml-buffer-list nil)
!               (mime-to-mml ,'current-handles)
!               (let ((mbl1 mml-buffer-list))
!                 (setq mml-buffer-list mbl)
!                 (set (make-local-variable 'mml-buffer-list) mbl1))
!               (gnus-make-local-hook 'kill-buffer-hook)
!               (add-hook 'kill-buffer-hook 'mml-destroy-buffers t t))))
         `(lambda (no-highlight)
            (let ((mail-parse-charset ',gnus-newsgroup-charset)
+                 (message-options message-options)
+                 (message-options-set-recipient)
                  (mail-parse-ignored-charsets
                   ',gnus-newsgroup-ignored-charsets))
              ,(if (not raw) '(progn
***************
*** 7996,8005 ****
--- 9412,9442 ----
                                                 no-highlight)
    "Make edits to the current article permanent."
    (interactive)
+   (save-excursion
+    ;; The buffer restriction contains the entire article if it exists.
+     (when (article-goto-body)
+       (let ((lines (count-lines (point) (point-max)))
+           (length (- (point-max) (point)))
+           (case-fold-search t)
+           (body (copy-marker (point))))
+       (goto-char (point-min))
+       (when (re-search-forward "^content-length:[ \t]\\([0-9]+\\)" body t)
+         (delete-region (match-beginning 1) (match-end 1))
+         (insert (number-to-string length)))
+       (goto-char (point-min))
+       (when (re-search-forward
+              "^x-content-length:[ \t]\\([0-9]+\\)" body t)
+         (delete-region (match-beginning 1) (match-end 1))
+         (insert (number-to-string length)))
+       (goto-char (point-min))
+       (when (re-search-forward "^lines:[ \t]\\([0-9]+\\)" body t)
+         (delete-region (match-beginning 1) (match-end 1))
+         (insert (number-to-string lines))))))
    ;; Replace the article.
    (let ((buf (current-buffer)))
      (with-temp-buffer
        (insert-buffer-substring buf)
+ 
        (if (and (not read-only)
               (not (gnus-request-replace-article
                     (cdr gnus-article-current) (car gnus-article-current)
***************
*** 8023,8042 ****
                    (insert ".\n")
                    (let ((nntp-server-buffer (current-buffer)))
                      (setq header (car (gnus-get-newsgroup-headers
!                                        (save-excursion
!                                          (set-buffer gnus-summary-buffer)
!                                          gnus-newsgroup-dependencies)
!                                        t))))
                    (save-excursion
                      (set-buffer gnus-summary-buffer)
                      (gnus-data-set-header
                       (gnus-data-find (cdr gnus-article-current))
                       header)
                      (gnus-summary-update-article-line
!                      (cdr gnus-article-current) header))))))
          ;; Update threads.
          (set-buffer (or buffer gnus-summary-buffer))
!         (gnus-summary-update-article (cdr gnus-article-current)))
        ;; Prettify the article buffer again.
        (unless no-highlight
          (save-excursion
--- 9460,9483 ----
                    (insert ".\n")
                    (let ((nntp-server-buffer (current-buffer)))
                      (setq header (car (gnus-get-newsgroup-headers
!                                        nil t))))
                    (save-excursion
                      (set-buffer gnus-summary-buffer)
                      (gnus-data-set-header
                       (gnus-data-find (cdr gnus-article-current))
                       header)
                      (gnus-summary-update-article-line
!                      (cdr gnus-article-current) header)
!                     (if (gnus-summary-goto-subject
!                          (cdr gnus-article-current) nil t)
!                         (gnus-summary-update-secondary-mark
!                          (cdr gnus-article-current))))))))
          ;; Update threads.
          (set-buffer (or buffer gnus-summary-buffer))
!         (gnus-summary-update-article (cdr gnus-article-current))
!         (if (gnus-summary-goto-subject (cdr gnus-article-current) nil t)
!             (gnus-summary-update-secondary-mark
!              (cdr gnus-article-current))))
        ;; Prettify the article buffer again.
        (unless no-highlight
          (save-excursion
***************
*** 8072,8086 ****
      (gnus-summary-select-article)
      (save-excursion
        (set-buffer gnus-original-article-buffer)
!       (save-restriction
!       (message-narrow-to-head)
!       (let ((groups (nnmail-article-group 'identity trace)))
!         (unless silent
!           (if groups
!               (message "This message would go to %s"
!                        (mapconcat 'car groups ", "))
!             (message "This message would go to no groups"))
!           groups))))))
  
  (defun gnus-summary-respool-trace ()
    "Trace where the respool algorithm would put this article.
--- 9513,9525 ----
      (gnus-summary-select-article)
      (save-excursion
        (set-buffer gnus-original-article-buffer)
!       (let ((groups (nnmail-article-group 'identity trace)))
!       (unless silent
!         (if groups
!             (message "This message would go to %s"
!                      (mapconcat 'car groups ", "))
!           (message "This message would go to no groups"))
!         groups)))))
  
  (defun gnus-summary-respool-trace ()
    "Trace where the respool algorithm would put this article.
***************
*** 8162,8189 ****
  If N is negative, mark backward instead.  If UNMARK is non-nil, remove
  the process mark instead.  The difference between N and the actual
  number of articles marked is returned."
!   (interactive "p")
!   (let ((backward (< n 0))
!       (n (abs n)))
!     (while (and
!           (> n 0)
!           (if unmark
!               (gnus-summary-remove-process-mark
!                (gnus-summary-article-number))
!             (gnus-summary-set-process-mark (gnus-summary-article-number)))
!           (zerop (gnus-summary-next-subject (if backward -1 1) nil t)))
!       (setq n (1- n)))
!     (when (/= 0 n)
!       (gnus-message 7 "No more articles"))
!     (gnus-summary-recenter)
!     (gnus-summary-position-point)
!     n))
  
  (defun gnus-summary-unmark-as-processable (n)
    "Remove the process mark from the next N articles.
  If N is negative, unmark backward instead.  The difference between N and
  the actual number of articles unmarked is returned."
!   (interactive "p")
    (gnus-summary-mark-as-processable n t))
  
  (defun gnus-summary-unmark-all-processable ()
--- 9601,9631 ----
  If N is negative, mark backward instead.  If UNMARK is non-nil, remove
  the process mark instead.  The difference between N and the actual
  number of articles marked is returned."
!   (interactive "P")
!   (if (and (null n) (gnus-region-active-p))
!       (gnus-uu-mark-region (region-beginning) (region-end) unmark)
!     (setq n (prefix-numeric-value n))
!     (let ((backward (< n 0))
!         (n (abs n)))
!       (while (and
!             (> n 0)
!             (if unmark
!                 (gnus-summary-remove-process-mark
!                  (gnus-summary-article-number))
!               (gnus-summary-set-process-mark (gnus-summary-article-number)))
!             (zerop (gnus-summary-next-subject (if backward -1 1) nil t)))
!       (setq n (1- n)))
!       (when (/= 0 n)
!       (gnus-message 7 "No more articles"))
!       (gnus-summary-recenter)
!       (gnus-summary-position-point)
!       n)))
  
  (defun gnus-summary-unmark-as-processable (n)
    "Remove the process mark from the next N articles.
  If N is negative, unmark backward instead.  The difference between N and
  the actual number of articles unmarked is returned."
!   (interactive "P")
    (gnus-summary-mark-as-processable n t))
  
  (defun gnus-summary-unmark-all-processable ()
***************
*** 8194,8199 ****
--- 9636,9655 ----
        (gnus-summary-remove-process-mark (car gnus-newsgroup-processable))))
    (gnus-summary-position-point))
  
+ (defun gnus-summary-add-mark (article type)
+   "Mark ARTICLE with a mark of TYPE."
+   (let ((vtype (car (assq type gnus-article-mark-lists)))
+       var)
+     (if (not vtype)
+       (error "No such mark type: %s" type)
+       (setq var (intern (format "gnus-newsgroup-%s" type)))
+       (set var (cons article (symbol-value var)))
+       (if (memq type '(processable cached replied forwarded recent saved))
+         (gnus-summary-update-secondary-mark article)
+       ;;; !!! This is bogus.  We should find out what primary
+       ;;; !!! mark we want to set.
+       (gnus-summary-update-mark gnus-del-mark 'unread)))))
+ 
  (defun gnus-summary-mark-as-expirable (n)
    "Mark N articles forward as expirable.
  If N is negative, mark backward instead.  The difference between N and
***************
*** 8201,8212 ****
    (interactive "p")
    (gnus-summary-mark-forward n gnus-expirable-mark))
  
  (defun gnus-summary-mark-article-as-replied (article)
!   "Mark ARTICLE replied and update the summary line."
!   (push article gnus-newsgroup-replied)
!   (let ((buffer-read-only nil))
!     (when (gnus-summary-goto-subject article nil t)
!       (gnus-summary-update-secondary-mark article))))
  
  (defun gnus-summary-set-bookmark (article)
    "Set a bookmark in current article."
--- 9657,9691 ----
    (interactive "p")
    (gnus-summary-mark-forward n gnus-expirable-mark))
  
+ (defun gnus-summary-mark-as-spam (n)
+   "Mark N articles forward as spam.
+ If N is negative, mark backward instead.  The difference between N and
+ the actual number of articles marked is returned."
+   (interactive "p")
+   (gnus-summary-mark-forward n gnus-spam-mark))
+ 
  (defun gnus-summary-mark-article-as-replied (article)
!   "Mark ARTICLE as replied to and update the summary line.
! ARTICLE can also be a list of articles."
!   (interactive (list (gnus-summary-article-number)))
!   (let ((articles (if (listp article) article (list article))))
!     (dolist (article articles)
!       (unless (numberp article)
!       (error "%s is not a number" article))
!       (push article gnus-newsgroup-replied)
!       (let ((buffer-read-only nil))
!       (when (gnus-summary-goto-subject article nil t)
!         (gnus-summary-update-secondary-mark article))))))
! 
! (defun gnus-summary-mark-article-as-forwarded (article)
!   "Mark ARTICLE as forwarded and update the summary line.
! ARTICLE can also be a list of articles."
!   (let ((articles (if (listp article) article (list article))))
!     (dolist (article articles)
!       (push article gnus-newsgroup-forwarded)
!       (let ((buffer-read-only nil))
!       (when (gnus-summary-goto-subject article nil t)
!         (gnus-summary-update-secondary-mark article))))))
  
  (defun gnus-summary-set-bookmark (article)
    "Set a bookmark in current article."
***************
*** 8217,8226 ****
            (not (equal gnus-newsgroup-name (car gnus-article-current))))
      (error "No current article selected"))
    ;; Remove old bookmark, if one exists.
!   (let ((old (assq article gnus-newsgroup-bookmarks)))
!     (when old
!       (setq gnus-newsgroup-bookmarks
!           (delq old gnus-newsgroup-bookmarks))))
    ;; Set the new bookmark, which is on the form
    ;; (article-number . line-number-in-body).
    (push
--- 9696,9702 ----
            (not (equal gnus-newsgroup-name (car gnus-article-current))))
      (error "No current article selected"))
    ;; Remove old bookmark, if one exists.
!   (gnus-pull article gnus-newsgroup-bookmarks)
    ;; Set the new bookmark, which is on the form
    ;; (article-number . line-number-in-body).
    (push
***************
*** 8230,8237 ****
           (count-lines
            (min (point)
                 (save-excursion
!                  (goto-char (point-min))
!                  (search-forward "\n\n" nil t)
                   (point)))
            (point))))
     gnus-newsgroup-bookmarks)
--- 9706,9712 ----
           (count-lines
            (min (point)
                 (save-excursion
!                  (article-goto-body)
                   (point)))
            (point))))
     gnus-newsgroup-bookmarks)
***************
*** 8241,8253 ****
    "Remove the bookmark from the current article."
    (interactive (list (gnus-summary-article-number)))
    ;; Remove old bookmark, if one exists.
!   (let ((old (assq article gnus-newsgroup-bookmarks)))
!     (if old
!       (progn
!         (setq gnus-newsgroup-bookmarks
!               (delq old gnus-newsgroup-bookmarks))
!         (gnus-message 6 "Removed bookmark."))
!       (gnus-message 6 "No bookmark in current article."))))
  
  ;; Suggested by Daniel Quinlan <address@hidden>.
  (defun gnus-summary-mark-as-dormant (n)
--- 9716,9725 ----
    "Remove the bookmark from the current article."
    (interactive (list (gnus-summary-article-number)))
    ;; Remove old bookmark, if one exists.
!   (if (not (assq article gnus-newsgroup-bookmarks))
!       (gnus-message 6 "No bookmark in current article.")
!     (gnus-pull article gnus-newsgroup-bookmarks)
!     (gnus-message 6 "Removed bookmark.")))
  
  ;; Suggested by Daniel Quinlan <address@hidden>.
  (defun gnus-summary-mark-as-dormant (n)
***************
*** 8293,8299 ****
        (gnus-summary-goto-unread
         (and gnus-summary-goto-unread
              (not (eq gnus-summary-goto-unread 'never))
!             (not (memq mark (list gnus-unread-mark
                                    gnus-ticked-mark gnus-dormant-mark)))))
        (n (abs n))
        (mark (or mark gnus-del-mark)))
--- 9765,9771 ----
        (gnus-summary-goto-unread
         (and gnus-summary-goto-unread
              (not (eq gnus-summary-goto-unread 'never))
!             (not (memq mark (list gnus-unread-mark gnus-spam-mark
                                    gnus-ticked-mark gnus-dormant-mark)))))
        (n (abs n))
        (mark (or mark gnus-del-mark)))
***************
*** 8317,8322 ****
--- 9789,9795 ----
    (let ((article (gnus-summary-article-number)))
      (setq gnus-newsgroup-unreads (delq article gnus-newsgroup-unreads))
      (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked))
+     (setq gnus-newsgroup-spam-marked (delq article 
gnus-newsgroup-spam-marked))
      (setq gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant))
      (push (cons article mark) gnus-newsgroup-reads)
      ;; Possibly remove from cache, if that is used.
***************
*** 8348,8362 ****
            (gnus-error 1 "Can't mark negative article numbers")
            nil)
        (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked))
        (setq gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant))
        (setq gnus-newsgroup-expirable (delq article gnus-newsgroup-expirable))
        (setq gnus-newsgroup-reads (delq article gnus-newsgroup-reads))
        (cond ((= mark gnus-ticked-mark)
!              (push article gnus-newsgroup-marked))
              ((= mark gnus-dormant-mark)
!              (push article gnus-newsgroup-dormant))
              (t
!              (push article gnus-newsgroup-unreads)))
        (gnus-pull article gnus-newsgroup-reads)
  
        ;; See whether the article is to be put in the cache.
--- 9821,9847 ----
            (gnus-error 1 "Can't mark negative article numbers")
            nil)
        (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked))
+       (setq gnus-newsgroup-spam-marked
+             (delq article gnus-newsgroup-spam-marked))
        (setq gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant))
        (setq gnus-newsgroup-expirable (delq article gnus-newsgroup-expirable))
        (setq gnus-newsgroup-reads (delq article gnus-newsgroup-reads))
        (cond ((= mark gnus-ticked-mark)
!              (setq gnus-newsgroup-marked
!                    (gnus-add-to-sorted-list gnus-newsgroup-marked
!                                             article)))
!             ((= mark gnus-spam-mark)
!              (setq gnus-newsgroup-spam-marked
!                    (gnus-add-to-sorted-list gnus-newsgroup-spam-marked
!                                             article)))
              ((= mark gnus-dormant-mark)
!              (setq gnus-newsgroup-dormant
!                    (gnus-add-to-sorted-list gnus-newsgroup-dormant
!                                             article)))
              (t
!              (setq gnus-newsgroup-unreads
!                    (gnus-add-to-sorted-list gnus-newsgroup-unreads
!                                             article))))
        (gnus-pull article gnus-newsgroup-reads)
  
        ;; See whether the article is to be put in the cache.
***************
*** 8388,8394 ****
      (setq mark gnus-del-mark))
    (when (and (not no-expire)
             gnus-newsgroup-auto-expire
!            (memq mark gnus-auto-expirable-marks))
      (setq mark gnus-expirable-mark))
    (let ((article (or article (gnus-summary-article-number)))
        (old-mark (gnus-summary-article-mark article)))
--- 9873,9879 ----
      (setq mark gnus-del-mark))
    (when (and (not no-expire)
             gnus-newsgroup-auto-expire
!            (memq mark gnus-auto-expirable-marks))
      (setq mark gnus-expirable-mark))
    (let ((article (or article (gnus-summary-article-number)))
        (old-mark (gnus-summary-article-mark article)))
***************
*** 8400,8405 ****
--- 9885,9891 ----
        (error "No article on current line"))
        (if (not (if (or (= mark gnus-unread-mark)
                       (= mark gnus-ticked-mark)
+                      (= mark gnus-spam-mark)
                       (= mark gnus-dormant-mark))
                   (gnus-mark-article-as-unread article mark)
                 (gnus-mark-article-as-read article mark)))
***************
*** 8430,8446 ****
          gnus-cached-mark)
         ((memq article gnus-newsgroup-replied)
          gnus-replied-mark)
         ((memq article gnus-newsgroup-saved)
          gnus-saved-mark)
!        (t gnus-unread-mark))
     'replied)
    (when (gnus-visual-p 'summary-highlight 'highlight)
      (gnus-run-hooks 'gnus-summary-update-hook))
    t)
  
  (defun gnus-summary-update-mark (mark type)
    (let ((forward (cdr (assq type gnus-summary-mark-positions)))
!         (buffer-read-only nil))
      (re-search-backward "[\n\r]" (gnus-point-at-bol) 'move-to-limit)
      (when forward
        (when (looking-at "\r")
--- 9916,9951 ----
          gnus-cached-mark)
         ((memq article gnus-newsgroup-replied)
          gnus-replied-mark)
+        ((memq article gnus-newsgroup-forwarded)
+         gnus-forwarded-mark)
         ((memq article gnus-newsgroup-saved)
          gnus-saved-mark)
!        ((memq article gnus-newsgroup-recent)
!         gnus-recent-mark)
!        ((memq article gnus-newsgroup-unseen)
!         gnus-unseen-mark)
!        (t gnus-no-mark))
     'replied)
    (when (gnus-visual-p 'summary-highlight 'highlight)
      (gnus-run-hooks 'gnus-summary-update-hook))
    t)
  
+ (defun gnus-summary-update-download-mark (article)
+   "Update the download mark."
+   (gnus-summary-update-mark
+    (cond ((memq article gnus-newsgroup-undownloaded)
+           gnus-undownloaded-mark)
+          (gnus-newsgroup-agentized
+           gnus-downloaded-mark)
+          (t
+           gnus-no-mark))
+    'download)
+   (gnus-summary-update-line t)
+   t)
+ 
  (defun gnus-summary-update-mark (mark type)
    (let ((forward (cdr (assq type gnus-summary-mark-positions)))
!       (buffer-read-only nil))
      (re-search-backward "[\n\r]" (gnus-point-at-bol) 'move-to-limit)
      (when forward
        (when (looking-at "\r")
***************
*** 8460,8471 ****
    "Enter ARTICLE in the pertinent lists and remove it from others."
    ;; Make the article expirable.
    (let ((mark (or mark gnus-del-mark)))
!     (if (= mark gnus-expirable-mark)
!       (push article gnus-newsgroup-expirable)
!       (setq gnus-newsgroup-expirable (delq article gnus-newsgroup-expirable)))
      ;; Remove from unread and marked lists.
      (setq gnus-newsgroup-unreads (delq article gnus-newsgroup-unreads))
      (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked))
      (setq gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant))
      (push (cons article mark) gnus-newsgroup-reads)
      ;; Possibly remove from cache, if that is used.
--- 9965,9978 ----
    "Enter ARTICLE in the pertinent lists and remove it from others."
    ;; Make the article expirable.
    (let ((mark (or mark gnus-del-mark)))
!     (setq gnus-newsgroup-expirable
!         (if (= mark gnus-expirable-mark)
!             (gnus-add-to-sorted-list gnus-newsgroup-expirable article)
!           (delq article gnus-newsgroup-expirable)))
      ;; Remove from unread and marked lists.
      (setq gnus-newsgroup-unreads (delq article gnus-newsgroup-unreads))
      (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked))
+     (setq gnus-newsgroup-spam-marked (delq article 
gnus-newsgroup-spam-marked))
      (setq gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant))
      (push (cons article mark) gnus-newsgroup-reads)
      ;; Possibly remove from cache, if that is used.
***************
*** 8481,8486 ****
--- 9988,9994 ----
          (gnus-error 1 "Can't mark negative article numbers")
          nil)
        (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked)
+           gnus-newsgroup-spam-marked (delq article gnus-newsgroup-spam-marked)
            gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant)
            gnus-newsgroup-expirable (delq article gnus-newsgroup-expirable)
            gnus-newsgroup-unreads (delq article gnus-newsgroup-unreads))
***************
*** 8490,8500 ****
        (gnus-dup-unsuppress-article article))
  
        (cond ((= mark gnus-ticked-mark)
!            (push article gnus-newsgroup-marked))
            ((= mark gnus-dormant-mark)
!            (push article gnus-newsgroup-dormant))
            (t
!            (push article gnus-newsgroup-unreads)))
        (gnus-pull article gnus-newsgroup-reads)
        t)))
  
--- 9998,10015 ----
        (gnus-dup-unsuppress-article article))
  
        (cond ((= mark gnus-ticked-mark)
!            (setq gnus-newsgroup-marked
!                  (gnus-add-to-sorted-list gnus-newsgroup-marked article)))
!           ((= mark gnus-spam-mark)
!            (setq gnus-newsgroup-spam-marked
!                  (gnus-add-to-sorted-list gnus-newsgroup-spam-marked
!                                           article)))
            ((= mark gnus-dormant-mark)
!            (setq gnus-newsgroup-dormant
!                  (gnus-add-to-sorted-list gnus-newsgroup-dormant article)))
            (t
!            (setq gnus-newsgroup-unreads
!                  (gnus-add-to-sorted-list gnus-newsgroup-unreads article))))
        (gnus-pull article gnus-newsgroup-reads)
        t)))
  
***************
*** 8569,8580 ****
    (when (memq gnus-current-article gnus-newsgroup-unreads)
      (gnus-summary-mark-article gnus-current-article gnus-read-mark)))
  
! (defun gnus-summary-mark-read-and-unread-as-read ()
    "Intended to be used by `gnus-summary-mark-article-hook'."
    (let ((mark (gnus-summary-article-mark)))
      (when (or (gnus-unread-mark-p mark)
              (gnus-read-mark-p mark))
!       (gnus-summary-mark-article gnus-current-article gnus-read-mark))))
  
  (defun gnus-summary-mark-region-as-read (point mark all)
    "Mark all unread articles between point and mark as read.
--- 10084,10109 ----
    (when (memq gnus-current-article gnus-newsgroup-unreads)
      (gnus-summary-mark-article gnus-current-article gnus-read-mark)))
  
! (defun gnus-summary-mark-read-and-unread-as-read (&optional new-mark)
!   "Intended to be used by `gnus-summary-mark-article-hook'."
!   (let ((mark (gnus-summary-article-mark)))
!     (when (or (gnus-unread-mark-p mark)
!             (gnus-read-mark-p mark))
!       (gnus-summary-mark-article gnus-current-article
!                                (or new-mark gnus-read-mark)))))
! 
! (defun gnus-summary-mark-current-read-and-unread-as-read (&optional new-mark)
    "Intended to be used by `gnus-summary-mark-article-hook'."
    (let ((mark (gnus-summary-article-mark)))
      (when (or (gnus-unread-mark-p mark)
              (gnus-read-mark-p mark))
!       (gnus-summary-mark-article (gnus-summary-article-number)
!                                (or new-mark gnus-read-mark)))))
! 
! (defun gnus-summary-mark-unread-as-ticked ()
!   "Intended to be used by `gnus-summary-mark-article-hook'."
!   (when (memq gnus-current-article gnus-newsgroup-unreads)
!     (gnus-summary-mark-article gnus-current-article gnus-ticked-mark)))
  
  (defun gnus-summary-mark-region-as-read (point mark all)
    "Mark all unread articles between point and mark as read.
***************
*** 8649,8656 ****
      (let ((scored gnus-newsgroup-scored)
          headers h)
        (while scored
!       (unless (gnus-summary-goto-subject (caar scored))
!         (and (setq h (gnus-summary-article-header (caar scored)))
               (< (cdar scored) gnus-summary-expunge-below)
               (push h headers)))
        (setq scored (cdr scored)))
--- 10178,10185 ----
      (let ((scored gnus-newsgroup-scored)
          headers h)
        (while scored
!       (unless (gnus-summary-article-header (caar scored))
!         (and (setq h (gnus-number-to-header (caar scored)))
               (< (cdar scored) gnus-summary-expunge-below)
               (push h headers)))
        (setq scored (cdr scored)))
***************
*** 8658,8677 ****
          (when (not no-error)
            (error "No expunged articles hidden"))
        (goto-char (point-min))
        (gnus-summary-prepare-unthreaded (nreverse headers))
        (goto-char (point-min))
        (gnus-summary-position-point)
        t))))
  
! (defun gnus-summary-catchup (&optional all quietly to-here not-mark)
    "Mark all unread articles in this newsgroup as read.
  If prefix argument ALL is non-nil, ticked and dormant articles will
  also be marked as read.
  If QUIETLY is non-nil, no questions will be asked.
  If TO-HERE is non-nil, it should be a point in the buffer.  All
! articles before this point will be marked as read.
  Note that this function will only catch up the unread article
  in the current summary buffer limitation.
  The number of articles marked as read is returned."
    (interactive "P")
    (prog1
--- 10187,10215 ----
          (when (not no-error)
            (error "No expunged articles hidden"))
        (goto-char (point-min))
+       (push gnus-newsgroup-limit gnus-newsgroup-limits)
+       (setq gnus-newsgroup-limit (copy-sequence gnus-newsgroup-limit))
+       (mapcar (lambda (x) (push (mail-header-number x)
+                                 gnus-newsgroup-limit))
+               headers)
        (gnus-summary-prepare-unthreaded (nreverse headers))
        (goto-char (point-min))
        (gnus-summary-position-point)
        t))))
  
! (defun gnus-summary-catchup (&optional all quietly to-here not-mark reverse)
    "Mark all unread articles in this newsgroup as read.
  If prefix argument ALL is non-nil, ticked and dormant articles will
  also be marked as read.
  If QUIETLY is non-nil, no questions will be asked.
+ 
  If TO-HERE is non-nil, it should be a point in the buffer.  All
! articles before (after, if REVERSE is set) this point will be marked
! as read.
! 
  Note that this function will only catch up the unread article
  in the current summary buffer limitation.
+ 
  The number of articles marked as read is returned."
    (interactive "P")
    (prog1
***************
*** 8692,8707 ****
              (progn
                (when all
                  (setq gnus-newsgroup-marked nil
                        gnus-newsgroup-dormant nil))
!               (setq gnus-newsgroup-unreads gnus-newsgroup-downloadable))
            ;; We actually mark all articles as canceled, which we
            ;; have to do when using auto-expiry or adaptive scoring.
            (gnus-summary-show-all-threads)
!           (when (gnus-summary-first-subject (not all) t)
!             (while (and
!                     (if to-here (< (point) to-here) t)
!                     (gnus-summary-mark-article-as-read gnus-catchup-mark)
!                     (gnus-summary-find-next (not all) nil nil t))))
            (gnus-set-mode-line 'summary))
          t))
      (gnus-summary-position-point)))
--- 10230,10257 ----
              (progn
                (when all
                  (setq gnus-newsgroup-marked nil
+                       gnus-newsgroup-spam-marked nil
                        gnus-newsgroup-dormant nil))
!               (setq gnus-newsgroup-unreads
!                     (gnus-sorted-nunion
!                        (gnus-intersection gnus-newsgroup-unreads
!                                           gnus-newsgroup-downloadable)
!                        gnus-newsgroup-unfetched)))
            ;; We actually mark all articles as canceled, which we
            ;; have to do when using auto-expiry or adaptive scoring.
            (gnus-summary-show-all-threads)
!           (if (and to-here reverse)
!               (progn
!                 (goto-char to-here)
!                 (gnus-summary-mark-current-read-and-unread-as-read
!                  gnus-catchup-mark)
!                 (while (gnus-summary-find-next (not all))
!                   (gnus-summary-mark-article-as-read gnus-catchup-mark)))
!             (when (gnus-summary-first-subject (not all))
!               (while (and
!                       (if to-here (< (point) to-here) t)
!                       (gnus-summary-mark-article-as-read gnus-catchup-mark)
!                       (gnus-summary-find-next (not all))))))
            (gnus-set-mode-line 'summary))
          t))
      (gnus-summary-position-point)))
***************
*** 8718,8731 ****
          (gnus-summary-catchup all t beg)))))
    (gnus-summary-position-point))
  
  (defun gnus-summary-catchup-all (&optional quietly)
!   "Mark all articles in this newsgroup as read."
    (interactive "P")
    (gnus-summary-catchup t quietly))
  
  (defun gnus-summary-catchup-and-exit (&optional all quietly)
    "Mark all unread articles in this group as read, then exit.
! If prefix argument ALL is non-nil, all articles are marked as read."
    (interactive "P")
    (when (gnus-summary-catchup all quietly nil 'fast)
      ;; Select next newsgroup or exit.
--- 10268,10296 ----
          (gnus-summary-catchup all t beg)))))
    (gnus-summary-position-point))
  
+ (defun gnus-summary-catchup-from-here (&optional all)
+   "Mark all unticked articles after (and including) the current one as read.
+ If ALL is non-nil, also mark ticked and dormant articles as read."
+   (interactive "P")
+   (save-excursion
+     (gnus-save-hidden-threads
+       (let ((beg (point)))
+       ;; We check that there are unread articles.
+       (when (or all (gnus-summary-find-next))
+         (gnus-summary-catchup all t beg nil t)))))
+   (gnus-summary-position-point))
+ 
  (defun gnus-summary-catchup-all (&optional quietly)
!   "Mark all articles in this newsgroup as read.
! This command is dangerous.  Normally, you want \\[gnus-summary-catchup]
! instead, which marks only unread articles as read."
    (interactive "P")
    (gnus-summary-catchup t quietly))
  
  (defun gnus-summary-catchup-and-exit (&optional all quietly)
    "Mark all unread articles in this group as read, then exit.
! If prefix argument ALL is non-nil, all articles are marked as read.
! If QUIETLY is non-nil, no questions will be asked."
    (interactive "P")
    (when (gnus-summary-catchup all quietly nil 'fast)
      ;; Select next newsgroup or exit.
***************
*** 8735,8741 ****
        (gnus-summary-exit))))
  
  (defun gnus-summary-catchup-all-and-exit (&optional quietly)
!   "Mark all articles in this newsgroup as read, and then exit."
    (interactive "P")
    (gnus-summary-catchup-and-exit t quietly))
  
--- 10300,10308 ----
        (gnus-summary-exit))))
  
  (defun gnus-summary-catchup-all-and-exit (&optional quietly)
!   "Mark all articles in this newsgroup as read, and then exit.
! This command is dangerous.  Normally, you want 
\\[gnus-summary-catchup-and-exit]
! instead, which marks only unread articles as read."
    (interactive "P")
    (gnus-summary-catchup-and-exit t quietly))
  
***************
*** 8870,8875 ****
--- 10437,10444 ----
        (set-buffer gnus-summary-buffer)
        (gnus-summary-unmark-all-processable)
        (gnus-summary-update-article current-article)
+       (if (gnus-summary-goto-subject (cdr gnus-article-current) nil t)
+           (gnus-summary-update-secondary-mark (cdr gnus-article-current)))
        (gnus-summary-rethread-current)
        (gnus-message 3 "Article %d is now the child of article %d"
                      current-article parent-article)))))
***************
*** 8901,8908 ****
    (interactive)
    (let ((buffer-read-only nil)
        (orig (point))
!       ;; first goto end then to beg, to have point at beg after let
!       (end (progn (end-of-line) (point)))
        (beg (progn (beginning-of-line) (point))))
      (prog1
        ;; Any hidden lines here?
--- 10470,10477 ----
    (interactive)
    (let ((buffer-read-only nil)
        (orig (point))
!       (end (gnus-point-at-eol))
!       ;; Leave point at bol
        (beg (progn (beginning-of-line) (point))))
      (prog1
        ;; Any hidden lines here?
***************
*** 8911,8928 ****
        (goto-char orig)
        (gnus-summary-position-point))))
  
! (defun gnus-summary-hide-all-threads ()
!   "Hide all thread subtrees."
    (interactive)
    (save-excursion
      (goto-char (point-min))
!     (gnus-summary-hide-thread)
!     (while (zerop (gnus-summary-next-thread 1 t))
!       (gnus-summary-hide-thread)))
    (gnus-summary-position-point))
  
  (defun gnus-summary-hide-thread ()
    "Hide thread subtrees.
  Returns nil if no threads were there to be hidden."
    (interactive)
    (let ((buffer-read-only nil)
--- 10480,10528 ----
        (goto-char orig)
        (gnus-summary-position-point))))
  
! (defun gnus-summary-maybe-hide-threads ()
!   "If requested, hide the threads that should be hidden."
!   (when (and gnus-show-threads
!            gnus-thread-hide-subtree)
!     (gnus-summary-hide-all-threads
!      (if (or (consp gnus-thread-hide-subtree)
!            (functionp gnus-thread-hide-subtree))
!        (gnus-make-predicate gnus-thread-hide-subtree)
!        nil))))
! 
! ;;; Hiding predicates.
! 
! (defun gnus-article-unread-p (header)
!   (memq (mail-header-number header) gnus-newsgroup-unreads))
! 
! (defun gnus-article-unseen-p (header)
!   (memq (mail-header-number header) gnus-newsgroup-unseen))
! 
! (defun gnus-map-articles (predicate articles)
!   "Map PREDICATE over ARTICLES and return non-nil if any predicate is 
non-nil."
!   (apply 'gnus-or (mapcar predicate
!                         (mapcar 'gnus-summary-article-header articles))))
! 
! (defun gnus-summary-hide-all-threads (&optional predicate)
!   "Hide all thread subtrees.
! If PREDICATE is supplied, threads that satisfy this predicate
! will not be hidden."
    (interactive)
    (save-excursion
      (goto-char (point-min))
!     (let ((end nil))
!       (while (not end)
!       (when (or (not predicate)
!                 (gnus-map-articles
!                  predicate (gnus-summary-article-children)))
!           (gnus-summary-hide-thread))
!       (setq end (not (zerop (gnus-summary-next-thread 1 t)))))))
    (gnus-summary-position-point))
  
  (defun gnus-summary-hide-thread ()
    "Hide thread subtrees.
+ If PREDICATE is supplied, threads that satisfy this predicate
+ will not be hidden.
  Returns nil if no threads were there to be hidden."
    (interactive)
    (let ((buffer-read-only nil)
***************
*** 9020,9026 ****
  
  (defun gnus-summary-up-thread (n)
    "Go up thread N steps.
! If N is negative, go up instead.
  Returns the difference between N and how many steps down that were
  taken."
    (interactive "p")
--- 10620,10626 ----
  
  (defun gnus-summary-up-thread (n)
    "Go up thread N steps.
! If N is negative, go down instead.
  Returns the difference between N and how many steps down that were
  taken."
    (interactive "p")
***************
*** 9071,9076 ****
--- 10671,10682 ----
    (interactive "P")
    (gnus-summary-sort 'number reverse))
  
+ (defun gnus-summary-sort-by-random (&optional reverse)
+   "Randomize the order in the summary buffer.
+ Argument REVERSE means to randomize in reverse order."
+   (interactive "P")
+   (gnus-summary-sort 'random reverse))
+ 
  (defun gnus-summary-sort-by-author (&optional reverse)
    "Sort the summary buffer by author name alphabetically.
  If `case-fold-search' is non-nil, case of letters is ignored.
***************
*** 9109,9114 ****
--- 10715,10731 ----
    (interactive "P")
    (gnus-summary-sort 'chars reverse))
  
+ (defun gnus-summary-sort-by-original (&optional reverse)
+   "Sort the summary buffer using the default sorting method.
+ Argument REVERSE means reverse order."
+   (interactive "P")
+   (let* ((buffer-read-only)
+        (gnus-summary-prepare-hook nil))
+     ;; We do the sorting by regenerating the threads.
+     (gnus-summary-prepare)
+     ;; Hide subthreads if needed.
+     (gnus-summary-maybe-hide-threads)))
+ 
  (defun gnus-summary-sort (predicate reverse)
    "Sort summary buffer by PREDICATE.  REVERSE means reverse order."
    (let* ((thread (intern (format "gnus-thread-sort-by-%s" predicate)))
***************
*** 9130,9137 ****
      ;; We do the sorting by regenerating the threads.
      (gnus-summary-prepare)
      ;; Hide subthreads if needed.
!     (when (and gnus-show-threads gnus-thread-hide-subtree)
!       (gnus-summary-hide-all-threads))))
  
  ;; Summary saving commands.
  
--- 10747,10753 ----
      ;; We do the sorting by regenerating the threads.
      (gnus-summary-prepare)
      ;; Hide subthreads if needed.
!     (gnus-summary-maybe-hide-threads)))
  
  ;; Summary saving commands.
  
***************
*** 9173,9189 ****
      (gnus-set-mode-line 'summary)
      n))
  
! (defun gnus-summary-pipe-output (&optional arg)
    "Pipe the current article to a subprocess.
  If N is a positive number, pipe the N next articles.
  If N is a negative number, pipe the N previous articles.
  If N is nil and any articles have been marked with the process mark,
! pipe those articles instead."
!   (interactive "P")
    (require 'gnus-art)
!   (let ((gnus-default-article-saver 'gnus-summary-save-in-pipe))
      (gnus-summary-save-article arg t))
!   (gnus-configure-windows 'pipe))
  
  (defun gnus-summary-save-article-mail (&optional arg)
    "Append the current article to an mail file.
--- 10789,10810 ----
      (gnus-set-mode-line 'summary)
      n))
  
! (defun gnus-summary-pipe-output (&optional arg headers)
    "Pipe the current article to a subprocess.
  If N is a positive number, pipe the N next articles.
  If N is a negative number, pipe the N previous articles.
  If N is nil and any articles have been marked with the process mark,
! pipe those articles instead.
! If HEADERS (the symbolic prefix), include the headers, too."
!   (interactive (gnus-interactive "P\ny"))
    (require 'gnus-art)
!   (let ((gnus-default-article-saver 'gnus-summary-save-in-pipe)
!       (gnus-save-all-headers (or headers gnus-save-all-headers)))
      (gnus-summary-save-article arg t))
!   (let ((buffer (get-buffer "*Shell Command Output*")))
!     (when (and buffer
!              (not (zerop (buffer-size buffer))))
!       (gnus-configure-windows 'pipe))))
  
  (defun gnus-summary-save-article-mail (&optional arg)
    "Append the current article to an mail file.
***************
*** 9240,9245 ****
--- 10861,10877 ----
    (let ((gnus-default-article-saver 'gnus-summary-save-body-in-file))
      (gnus-summary-save-article arg)))
  
+ (defun gnus-summary-muttprint (&optional arg)
+   "Print the current article using Muttprint.
+ If N is a positive number, save the N next articles.
+ If N is a negative number, save the N previous articles.
+ If N is nil and any articles have been marked with the process mark,
+ save those articles instead."
+   (interactive "P")
+   (require 'gnus-art)
+   (let ((gnus-default-article-saver 'gnus-summary-pipe-to-muttprint))
+     (gnus-summary-save-article arg t)))
+ 
  (defun gnus-summary-pipe-message (program)
    "Pipe the current article through PROGRAM."
    (interactive "sProgram: ")
***************
*** 9247,9257 ****
    (let ((mail-header-separator ""))
      (gnus-eval-in-buffer-window gnus-article-buffer
        (save-restriction
!         (widen)
!         (let ((start (window-start))
!               buffer-read-only)
!           (message-pipe-buffer-body program)
!           (set-window-start (get-buffer-window (current-buffer)) start))))))
  
  (defun gnus-get-split-value (methods)
    "Return a value based on the split METHODS."
--- 10879,10889 ----
    (let ((mail-header-separator ""))
      (gnus-eval-in-buffer-window gnus-article-buffer
        (save-restriction
!       (widen)
!       (let ((start (window-start))
!             buffer-read-only)
!         (message-pipe-buffer-body program)
!         (set-window-start (get-buffer-window (current-buffer)) start))))))
  
  (defun gnus-get-split-value (methods)
    "Return a value based on the split METHODS."
***************
*** 9270,9276 ****
                    ;; Regular expression.
                    (ignore-errors
                      (re-search-forward match nil t)))
!                  ((gnus-functionp match)
                    ;; Function.
                    (save-restriction
                      (widen)
--- 10902,10908 ----
                    ;; Regular expression.
                    (ignore-errors
                      (re-search-forward match nil t)))
!                  ((functionp match)
                    ;; Function.
                    (save-restriction
                      (widen)
***************
*** 9309,9332 ****
         (to-newsgroup
          (cond
           ((null split-name)
!           (gnus-completing-read default prom
!                                 gnus-active-hashtb
!                                 'gnus-valid-move-group-p
!                                 nil prefix
!                                 'gnus-group-history))
           ((= 1 (length split-name))
!           (gnus-completing-read (car split-name) prom
!                                 gnus-active-hashtb
!                                 'gnus-valid-move-group-p
!                                 nil nil
!                                 'gnus-group-history))
           (t
!           (gnus-completing-read nil prom
!                                 (mapcar (lambda (el) (list el))
!                                         (nreverse split-name))
!                                 nil nil nil
!                                 'gnus-group-history))))
!          (to-method (gnus-server-to-method (gnus-group-method to-newsgroup))))
      (when to-newsgroup
        (if (or (string= to-newsgroup "")
              (string= to-newsgroup prefix))
--- 10941,10967 ----
         (to-newsgroup
          (cond
           ((null split-name)
!           (gnus-completing-read-with-default
!            default prom
!            gnus-active-hashtb
!            'gnus-valid-move-group-p
!            nil prefix
!            'gnus-group-history))
           ((= 1 (length split-name))
!           (gnus-completing-read-with-default
!            (car split-name) prom
!            gnus-active-hashtb
!            'gnus-valid-move-group-p
!            nil nil
!            'gnus-group-history))
           (t
!           (gnus-completing-read-with-default
!            nil prom
!            (mapcar (lambda (el) (list el))
!                    (nreverse split-name))
!            nil nil nil
!            'gnus-group-history))))
!        (to-method (gnus-server-to-method (gnus-group-method to-newsgroup))))
      (when to-newsgroup
        (if (or (string= to-newsgroup "")
              (string= to-newsgroup prefix))
***************
*** 9365,9371 ****
      (save-excursion
        (set-buffer gnus-article-buffer)
        (let ((handles (or gnus-article-mime-handles
!                        (mm-dissect-buffer) (mm-uu-dissect))))
        (when handles
          (gnus-summary-save-parts-1 type dir handles reverse)
          (unless gnus-article-mime-handles ;; Don't destroy this case.
--- 11000,11008 ----
      (save-excursion
        (set-buffer gnus-article-buffer)
        (let ((handles (or gnus-article-mime-handles
!                        (mm-dissect-buffer nil gnus-article-loose-mime)
!                        (and gnus-article-emulate-mime
!                             (mm-uu-dissect)))))
        (when handles
          (gnus-summary-save-parts-1 type dir handles reverse)
          (unless gnus-article-mime-handles ;; Don't destroy this case.
***************
*** 9379,9391 ****
              (not (string-match type (mm-handle-media-type handle)))
            (string-match type (mm-handle-media-type handle)))
        (let ((file (expand-file-name
!                  (file-name-nondirectory
!                   (or
!                    (mail-content-type-get
!                     (mm-handle-disposition handle) 'filename)
!                    (concat gnus-newsgroup-name
!                            "." (number-to-string
!                                 (cdr gnus-article-current)))))
                   dir)))
        (unless (file-exists-p file)
          (mm-save-part-to-file handle file))))))
--- 11016,11032 ----
              (not (string-match type (mm-handle-media-type handle)))
            (string-match type (mm-handle-media-type handle)))
        (let ((file (expand-file-name
!                  (gnus-map-function
!                   mm-file-name-rewrite-functions
!                   (file-name-nondirectory
!                    (or
!                     (mail-content-type-get
!                      (mm-handle-disposition handle) 'filename)
!                     (mail-content-type-get
!                      (mm-handle-type handle) 'name)
!                     (concat gnus-newsgroup-name
!                             "." (number-to-string
!                                  (cdr gnus-article-current))))))
                   dir)))
        (unless (file-exists-p file)
          (mm-save-part-to-file handle file))))))
***************
*** 9452,9458 ****
          (gnus-data-enter
           after-article gnus-reffed-article-number
           gnus-unread-mark b (car pslist) 0 (- e b))
!         (push gnus-reffed-article-number gnus-newsgroup-unreads)
          (setq gnus-reffed-article-number (1- gnus-reffed-article-number))
          (setq pslist (cdr pslist)))))))
  
--- 11093,11101 ----
          (gnus-data-enter
           after-article gnus-reffed-article-number
           gnus-unread-mark b (car pslist) 0 (- e b))
!         (setq gnus-newsgroup-unreads
!               (gnus-add-to-sorted-list gnus-newsgroup-unreads
!                                        gnus-reffed-article-number))
          (setq gnus-reffed-article-number (1- gnus-reffed-article-number))
          (setq pslist (cdr pslist)))))))
  
***************
*** 9518,9531 ****
             (not (gnus-summary-article-sparse-p (mail-header-number header))))
        ;; We have found the header.
        header
-       ;; If this is a sparse article, we have to nix out its
-       ;; previous entry in the thread hashtb.
-       (when (and header
-                (gnus-summary-article-sparse-p (mail-header-number header)))
-       (let* ((parent (gnus-parent-id (mail-header-references header)))
-              (thread (and parent (gnus-id-to-thread parent))))
-         (when thread
-           (delq (assq header thread) thread))))
        ;; We have to really fetch the header to this article.
        (save-excursion
        (set-buffer nntp-server-buffer)
--- 11161,11166 ----
***************
*** 9583,9590 ****
    ;; Added by Per Abrahamsen <address@hidden>.
    (when gnus-summary-selected-face
      (save-excursion
!       (let* ((beg (progn (beginning-of-line) (point)))
!            (end (progn (end-of-line) (point)))
             ;; Fix by Mike Dugan <address@hidden>.
             (from (if (get-text-property beg gnus-mouse-face-prop)
                       beg
--- 11218,11225 ----
    ;; Added by Per Abrahamsen <address@hidden>.
    (when gnus-summary-selected-face
      (save-excursion
!       (let* ((beg (gnus-point-at-bol))
!            (end (gnus-point-at-eol))
             ;; Fix by Mike Dugan <address@hidden>.
             (from (if (get-text-property beg gnus-mouse-face-prop)
                       beg
***************
*** 9611,9651 ****
           (setq gnus-newsgroup-selected-overlay (gnus-make-overlay from to))
           'face gnus-summary-selected-face))))))
  
! ;; New implementation by Christian Limpach <address@hidden>.
  (defun gnus-summary-highlight-line ()
    "Highlight current line according to `gnus-summary-highlight'."
!   (let* ((list gnus-summary-highlight)
!        (p (point))
!        (end (progn (end-of-line) (point)))
!        ;; now find out where the line starts and leave point there.
!        (beg (progn (beginning-of-line) (point)))
!        (article (gnus-summary-article-number))
!        (score (or (cdr (assq (or article gnus-current-article)
                               gnus-newsgroup-scored))
                    gnus-summary-default-score 0))
         (mark (or (gnus-summary-article-mark) gnus-unread-mark))
!        (inhibit-read-only t))
!     ;; Eval the cars of the lists until we find a match.
!     (let ((default gnus-summary-default-score))
!       (while (and list
!                 (not (eval (caar list))))
!       (setq list (cdr list))))
!     (let ((face (cdar list)))
        (unless (eq face (get-text-property beg 'face))
        (gnus-put-text-property-excluding-characters-with-faces
!        beg end 'face
         (setq face (if (boundp face) (symbol-value face) face)))
        (when gnus-summary-highlight-line-function
!         (funcall gnus-summary-highlight-line-function article face))))
!     (goto-char p)))
  
  (defun gnus-update-read-articles (group unread &optional compute)
!   "Update the list of read articles in GROUP."
    (let* ((active (or gnus-newsgroup-active (gnus-active group)))
         (entry (gnus-gethash group gnus-newsrc-hashtb))
         (info (nth 2 entry))
         (prev 1)
-        (unread (sort (copy-sequence unread) '<))
         read)
      (if (or (not info) (not active))
        ;; There is no info on this group if it was, in fact,
--- 11246,11300 ----
           (setq gnus-newsgroup-selected-overlay (gnus-make-overlay from to))
           'face gnus-summary-selected-face))))))
  
! (defvar gnus-summary-highlight-line-cached nil)
! (defvar gnus-summary-highlight-line-trigger nil)
! 
! (defun gnus-summary-highlight-line-0 ()
!   (if (and (eq gnus-summary-highlight-line-trigger
!                gnus-summary-highlight)
!            gnus-summary-highlight-line-cached)
!       gnus-summary-highlight-line-cached
!     (setq gnus-summary-highlight-line-trigger gnus-summary-highlight
!           gnus-summary-highlight-line-cached
!           (let* ((cond (list 'cond))
!                  (c cond)
!                  (list gnus-summary-highlight))
!             (while list
!               (setcdr c (cons (list (caar list) (list 'quote (cdar list)))
!                             nil))
!               (setq c (cdr c)
!                     list (cdr list)))
!             (gnus-byte-compile (list 'lambda nil cond))))))
! 
  (defun gnus-summary-highlight-line ()
    "Highlight current line according to `gnus-summary-highlight'."
!   (let* ((beg (gnus-point-at-bol))
!        (article (or (gnus-summary-article-number) gnus-current-article))
!        (score (or (cdr (assq article
                               gnus-newsgroup-scored))
                    gnus-summary-default-score 0))
         (mark (or (gnus-summary-article-mark) gnus-unread-mark))
!        (inhibit-read-only t)
!        (default gnus-summary-default-score)
!        (default-high gnus-summary-default-high-score)
!        (default-low gnus-summary-default-low-score)
!        (uncached (and gnus-summary-use-undownloaded-faces
!                         (memq article gnus-newsgroup-undownloaded))))
!     (let ((face (funcall (gnus-summary-highlight-line-0))))
        (unless (eq face (get-text-property beg 'face))
        (gnus-put-text-property-excluding-characters-with-faces
!        beg (gnus-point-at-eol) 'face
         (setq face (if (boundp face) (symbol-value face) face)))
        (when gnus-summary-highlight-line-function
!         (funcall gnus-summary-highlight-line-function article face))))))
  
  (defun gnus-update-read-articles (group unread &optional compute)
!   "Update the list of read articles in GROUP.
! UNREAD is a sorted list."
    (let* ((active (or gnus-newsgroup-active (gnus-active group)))
         (entry (gnus-gethash group gnus-newsrc-hashtb))
         (info (nth 2 entry))
         (prev 1)
         read)
      (if (or (not info) (not active))
        ;; There is no info on this group if it was, in fact,
***************
*** 9709,9733 ****
  
  (defun gnus-offer-save-summaries ()
    "Offer to save all active summary buffers."
!   (save-excursion
!     (let ((buflist (buffer-list))
!         buffers bufname)
!       ;; Go through all buffers and find all summaries.
!       (while buflist
!       (and (setq bufname (buffer-name (car buflist)))
!            (string-match "Summary" bufname)
!            (save-excursion
!              (set-buffer bufname)
!              ;; We check that this is, indeed, a summary buffer.
!              (and (eq major-mode 'gnus-summary-mode)
!                   ;; Also make sure this isn't bogus.
!                   gnus-newsgroup-prepared
!                   ;; Also make sure that this isn't a dead summary buffer.
!                   (not gnus-dead-summary-mode)))
!            (push bufname buffers))
!       (setq buflist (cdr buflist)))
!       ;; Go through all these summary buffers and offer to save them.
!       (when buffers
        (map-y-or-n-p
         "Update summary buffer %s? "
         (lambda (buf)
--- 11358,11381 ----
  
  (defun gnus-offer-save-summaries ()
    "Offer to save all active summary buffers."
!   (let (buffers)
!     ;; Go through all buffers and find all summaries.
!     (dolist (buffer (buffer-list))
!       (when (and (setq buffer (buffer-name buffer))
!                (string-match "Summary" buffer)
!                (save-excursion
!                  (set-buffer buffer)
!                  ;; We check that this is, indeed, a summary buffer.
!                  (and (eq major-mode 'gnus-summary-mode)
!                       ;; Also make sure this isn't bogus.
!                       gnus-newsgroup-prepared
!                       ;; Also make sure that this isn't a
!                       ;; dead summary buffer.
!                       (not gnus-dead-summary-mode))))
!       (push buffer buffers)))
!     ;; Go through all these summary buffers and offer to save them.
!     (when buffers
!       (save-excursion
        (map-y-or-n-p
         "Update summary buffer %s? "
         (lambda (buf)
***************
*** 9737,9773 ****
  
  (defun gnus-summary-setup-default-charset ()
    "Setup newsgroup default charset."
!   (if (equal gnus-newsgroup-name "nndraft:drafts")
        (setq gnus-newsgroup-charset nil)
!     (let* ((name (and gnus-newsgroup-name
!                     (gnus-group-real-name gnus-newsgroup-name)))
!          (ignored-charsets
            (or gnus-newsgroup-ephemeral-ignored-charsets
                (append
                 (and gnus-newsgroup-name
!                     (or (gnus-group-find-parameter gnus-newsgroup-name
!                                                    'ignored-charsets t)
!                         (let ((alist gnus-group-ignored-charsets-alist)
!                               elem (charsets nil))
!                           (while (setq elem (pop alist))
!                             (when (and name
!                                        (string-match (car elem) name))
!                               (setq alist nil
!                                     charsets (cdr elem))))
!                           charsets)))
                 gnus-newsgroup-ignored-charsets))))
        (setq gnus-newsgroup-charset
            (or gnus-newsgroup-ephemeral-charset
                (and gnus-newsgroup-name
!                    (or (gnus-group-find-parameter gnus-newsgroup-name 
'charset)
!                        (let ((alist gnus-group-charset-alist)
!                              elem charset)
!                          (while (setq elem (pop alist))
!                            (when (and name
!                                       (string-match (car elem) name))
!                              (setq alist nil
!                                    charset (cadr elem))))
!                          charset)))
                gnus-default-charset))
        (set (make-local-variable 'gnus-newsgroup-ignored-charsets)
           ignored-charsets))))
--- 11385,11402 ----
  
  (defun gnus-summary-setup-default-charset ()
    "Setup newsgroup default charset."
!   (if (member gnus-newsgroup-name '("nndraft:delayed" "nndraft:drafts"))
        (setq gnus-newsgroup-charset nil)
!     (let* ((ignored-charsets
            (or gnus-newsgroup-ephemeral-ignored-charsets
                (append
                 (and gnus-newsgroup-name
!                     (gnus-parameter-ignored-charsets gnus-newsgroup-name))
                 gnus-newsgroup-ignored-charsets))))
        (setq gnus-newsgroup-charset
            (or gnus-newsgroup-ephemeral-charset
                (and gnus-newsgroup-name
!                    (gnus-parameter-charset gnus-newsgroup-name))
                gnus-default-charset))
        (set (make-local-variable 'gnus-newsgroup-ignored-charsets)
           ignored-charsets))))
***************
*** 9791,9807 ****
    (interactive (list (gnus-summary-article-number)))
    (gnus-with-article article
      (message-narrow-to-head)
      (goto-char (point-max))
      (widen)
      (when (search-forward "\n--" nil t)
        (let ((separator (buffer-substring (point) (gnus-point-at-eol))))
        (message-narrow-to-head)
-       (message-remove-header "Mime-Version")
        (message-remove-header "Content-Type")
        (goto-char (point-max))
        (insert (format "Content-Type: multipart/mixed; boundary=\"%s\"\n"
                        separator))
-       (insert "Mime-Version: 1.0\n")
        (widen))))
    (let (gnus-mark-article-hook)
      (gnus-summary-select-article t t nil article)))
--- 11420,11436 ----
    (interactive (list (gnus-summary-article-number)))
    (gnus-with-article article
      (message-narrow-to-head)
+     (message-remove-header "Mime-Version")
      (goto-char (point-max))
+     (insert "Mime-Version: 1.0\n")
      (widen)
      (when (search-forward "\n--" nil t)
        (let ((separator (buffer-substring (point) (gnus-point-at-eol))))
        (message-narrow-to-head)
        (message-remove-header "Content-Type")
        (goto-char (point-max))
        (insert (format "Content-Type: multipart/mixed; boundary=\"%s\"\n"
                        separator))
        (widen))))
    (let (gnus-mark-article-hook)
      (gnus-summary-select-article t t nil article)))
***************
*** 9892,9897 ****
--- 11521,11657 ----
      (gnus-set-mode-line 'summary)
      n))
  
+ (defun gnus-summary-insert-articles (articles)
+   (when (setq articles
+             (gnus-sorted-difference articles
+                                     (mapcar (lambda (h)
+                                               (mail-header-number h))
+                                             gnus-newsgroup-headers)))
+     (setq gnus-newsgroup-headers
+         (gnus-merge 'list
+                     gnus-newsgroup-headers
+                     (gnus-fetch-headers articles)
+                     'gnus-article-sort-by-number))
+     ;; Suppress duplicates?
+     (when gnus-suppress-duplicates
+       (gnus-dup-suppress-articles))
+ 
+     ;; We might want to build some more threads first.
+     (when (and gnus-fetch-old-headers
+              (eq gnus-headers-retrieved-by 'nov))
+       (if (eq gnus-fetch-old-headers 'invisible)
+         (gnus-build-all-threads)
+       (gnus-build-old-threads)))
+     ;; Let the Gnus agent mark articles as read.
+     (when gnus-agent
+       (gnus-agent-get-undownloaded-list))
+     ;; Remove list identifiers from subject
+     (when gnus-list-identifiers
+       (gnus-summary-remove-list-identifiers))
+     ;; First and last article in this newsgroup.
+     (when gnus-newsgroup-headers
+       (setq gnus-newsgroup-begin
+           (mail-header-number (car gnus-newsgroup-headers))
+           gnus-newsgroup-end
+           (mail-header-number
+            (gnus-last-element gnus-newsgroup-headers))))
+     (when gnus-use-scoring
+       (gnus-possibly-score-headers))))
+ 
+ (defun gnus-summary-insert-old-articles (&optional all)
+   "Insert all old articles in this group.
+ If ALL is non-nil, already read articles become readable.
+ If ALL is a number, fetch this number of articles."
+   (interactive "P")
+   (prog1
+       (let ((old (sort (mapcar 'car gnus-newsgroup-data) '<))
+           older len)
+       (setq older
+             ;; Some nntp servers lie about their active range.  When
+             ;; this happens, the active range can be in the millions.
+             ;; Use a compressed range to avoid creating a huge list.
+             (gnus-range-difference (list gnus-newsgroup-active) old))
+       (setq len (gnus-range-length older))
+       (cond
+        ((null older) nil)
+        ((numberp all)
+         (if (< all len)
+             (let ((older-range (nreverse older)))
+               (setq older nil)
+ 
+               (while (> all 0)
+                 (let* ((r (pop older-range))
+                        (min (if (numberp r) r (car r)))
+                        (max (if (numberp r) r (cdr r))))
+                   (while (and (<= min max)
+                               (> all 0))
+                     (push max older)
+                     (setq all (1- all)
+                           max (1- max))))))
+           (setq older (gnus-uncompress-range older))))
+        (all
+         (setq older (gnus-uncompress-range older)))
+        (t
+         (when (and (numberp gnus-large-newsgroup)
+                  (> len gnus-large-newsgroup))
+             (let* ((cursor-in-echo-area nil)
+                    (initial (gnus-parameter-large-newsgroup-initial
+                              gnus-newsgroup-name))
+                    (input
+                     (read-string
+                      (format
+                       "How many articles from %s (%s %d): "
+                       (gnus-limit-string
+                        (gnus-group-decoded-name gnus-newsgroup-name) 35)
+                       (if initial "max" "default")
+                       len)
+                      (if initial
+                          (cons (number-to-string initial)
+                                0)))))
+               (unless (string-match "^[ \t]*$" input)
+                 (setq all (string-to-number input))
+                 (if (< all len)
+                     (let ((older-range (nreverse older)))
+                       (setq older nil)
+ 
+                       (while (> all 0)
+                         (let* ((r (pop older-range))
+                                (min (if (numberp r) r (car r)))
+                                (max (if (numberp r) r (cdr r))))
+                           (while (and (<= min max)
+                                       (> all 0))
+                             (push max older)
+                             (setq all (1- all)
+                                   max (1- max))))))))))
+         (setq older (gnus-uncompress-range older))))
+       (if (not older)
+           (message "No old news.")
+         (gnus-summary-insert-articles older)
+         (gnus-summary-limit (gnus-sorted-nunion old older))))
+     (gnus-summary-position-point)))
+ 
+ (defun gnus-summary-insert-new-articles ()
+   "Insert all new articles in this group."
+   (interactive)
+   (prog1
+       (let ((old (sort (mapcar 'car gnus-newsgroup-data) '<))
+           (old-active gnus-newsgroup-active)
+           (nnmail-fetched-sources (list t))
+           i new)
+       (setq gnus-newsgroup-active
+             (gnus-activate-group gnus-newsgroup-name 'scan))
+       (setq i (cdr gnus-newsgroup-active))
+       (while (> i (cdr old-active))
+         (push i new)
+         (decf i))
+       (if (not new)
+           (message "No gnus is bad news.")
+         (gnus-summary-insert-articles new)
+         (setq gnus-newsgroup-unreads
+               (gnus-sorted-nunion gnus-newsgroup-unreads new))
+         (gnus-summary-limit (gnus-sorted-nunion old new))))
+     (gnus-summary-position-point)))
+ 
  (gnus-summary-make-all-marking-commands)
  
  (gnus-ems-redefine)
***************
*** 9900,9904 ****
--- 11660,11668 ----
  
  (run-hooks 'gnus-sum-load-hook)
  
+ ;; Local Variables:
+ ;; coding: iso-8859-1
+ ;; End:
+ 
  ;;; arch-tag: 17c6748f-6d00-4d36-bf01-835c42f31235
  ;;; gnus-sum.el ends here




reply via email to

[Prev in Thread] Current Thread [Next in Thread]