Importing Pterodactyl Gnus v0.51.
authoryamaoka <yamaoka>
Thu, 19 Nov 1998 03:56:45 +0000 (03:56 +0000)
committeryamaoka <yamaoka>
Thu, 19 Nov 1998 03:56:45 +0000 (03:56 +0000)
69 files changed:
GNUS-NEWS
Makefile.in
lisp/ChangeLog
lisp/Makefile.in
lisp/dgnushack.el
lisp/earcon.el
lisp/gnus-agent.el
lisp/gnus-art.el
lisp/gnus-bcklg.el
lisp/gnus-cache.el
lisp/gnus-cus.el
lisp/gnus-demon.el
lisp/gnus-draft.el
lisp/gnus-dup.el
lisp/gnus-eform.el
lisp/gnus-ems.el
lisp/gnus-group.el
lisp/gnus-int.el
lisp/gnus-kill.el
lisp/gnus-logic.el
lisp/gnus-msg.el
lisp/gnus-nocem.el
lisp/gnus-range.el
lisp/gnus-salt.el
lisp/gnus-score.el
lisp/gnus-setup.el
lisp/gnus-soup.el
lisp/gnus-spec.el
lisp/gnus-srvr.el
lisp/gnus-start.el
lisp/gnus-sum.el
lisp/gnus-topic.el
lisp/gnus-util.el
lisp/gnus-uu.el
lisp/gnus-xmas.el
lisp/gnus.el
lisp/lpath.el
lisp/mailheader.el
lisp/message.el
lisp/messagexmas.el
lisp/mml.el
lisp/nnagent.el
lisp/nnbabyl.el
lisp/nndb.el
lisp/nndoc.el
lisp/nndraft.el
lisp/nneething.el
lisp/nnfolder.el
lisp/nngateway.el
lisp/nnheader.el
lisp/nnkiboze.el
lisp/nnmail.el
lisp/nnmbox.el
lisp/nnmh.el
lisp/nnml.el
lisp/nnoo.el
lisp/nnsoup.el
lisp/nnspool.el
lisp/nntp.el
lisp/nnvirtual.el
lisp/nnweb.el
lisp/parse-time.el
lisp/score-mode.el
lisp/smiley.el
texi/ChangeLog
texi/Makefile.in
texi/dir
texi/gnus.texi
texi/message.texi

index 0c5b11a..a0ba334 100644 (file)
--- a/GNUS-NEWS
+++ b/GNUS-NEWS
 ** Gnus changes.
 
-*** The Gnus distribution no longer bundles Custom and Widget.
-If your Emacs doesn't come with these libraries, fetch them from
-<URL:http://www.dina.kvl.dk/~abraham/custom/>.  You also then need to
-add the following to the lisp/dgnushack.el file:
+*** Gnus is now a MIME-capable reader.  See the manual for details. 
 
-     (push "~/lisp/custom" load-path)
+*** gnus-auto-select-first can now be a function to be
+called to position point.
 
-Modify to suit your needs.
+*** The user can now decide which extra headers should be included in
+summary buffers and NOV files.
 
-*** New functionality for using Gnus as an offline newsreader has been
-added.  A plethora of new commands and modes have been added.  See the
-Gnus manual for the full story.
 
-*** The nndraft backend has returned, but works differently than
-before.  All Message buffers are now also articles in the nndraft
-group, which is created automatically.
-
-*** `gnus-alter-header-function' can now be used to alter header
-values.
-
-*** `gnus-summary-goto-article' now accept Message-ID's.
-
-*** A new Message command for deleting text in the body of a message
-outside the region: `C-c C-v'.
-
-*** You can now post to component group in nnvirtual groups with
-`C-u C-c C-c'.
-
-*** `nntp-rlogin-program' -- new variable to ease customization.
-
-*** `C-u C-c C-c' in `gnus-article-edit-mode' will now inhibit
-re-highlighting of the article buffer.
-
-*** New element in `gnus-boring-article-headers' -- `long-to'.
-
-*** `M-i' symbolic prefix command.  See the section "Symbolic
-Prefixes" in the Gnus manual for details.
-
-*** `L' and `I' in the summary buffer now take the symbolic prefix
-`a' to add the score rule to the "all.SCORE" file.
-
-*** `gnus-simplify-subject-functions' variable to allow greater
-control over simplification.
-
-*** `A T' -- new command for fetching the current thread.
-
-*** `/ T' -- new command for including the current thread in the
-limit.
-
-*** `M-RET' is a new Message command for breaking cited text.
-
-*** \\1-expressions are now valid in `nnmail-split-methods'.
-
-*** The `custom-face-lookup' function has been removed.  
-If you used this function in your initialization files, you must
-rewrite them to use `face-spec-set' instead.
-
-*** Cancelling now uses the current select method.  Symbolic prefix
-`a' forces normal posting method.
-
-*** New command to translate M******** sm*rtq**t*s into proper text
--- `W d'.
-
-*** For easier debugging of nntp, you can set `nntp-record-commands'
-to a non-nil value.
-
-*** nntp now uses ~/.authinfo, a .netrc-like file, for controlling
-where and how to send AUTHINFO to NNTP servers.
-
-*** A command for editing group parameters from the summary buffer
-has been added.
-
-*** A history of where mails have been split is available.
-
-*** A new article date command has been added -- `article-date-iso8601'.
-
-*** Subjects can be simplified when threading by setting
-`gnus-score-thread-simplify'.
-
-*** A new function for citing in Message has been added --
-`message-cite-original-without-signature'.
-
-*** `article-strip-all-blank-lines' -- new article command.
-
-*** A new Message command to kill to the end of the article has
-been added.
-
-*** A minimum adaptive score can be specified by using the
-`gnus-adaptive-word-minimum' variable.
-
-*** The "lapsed date" article header can be kept continually
-updated by the `gnus-start-date-timer' command.
-
-*** Web listserv archives can be read with the nnlistserv backend.
-
-*** Old dejanews archives can now be read by nnweb.
-
-*** Byte-compilation of user-specs now works under XEmacs.
-
-*** `gnus-posting-styles' has been re-activated.
index a30ae8d..a91fabc 100644 (file)
@@ -5,46 +5,46 @@ srcdir = @srcdir@
 
 @SET_MAKE@
 EMACS = @EMACS@
-XEMACS = xemacs
+XEMACS = xemacs21
 
 all: lick info
 
 lick:
-       cd lisp && $(MAKE) EMACS=$(EMACS) lispdir=$(lispdir) all
+       cd lisp && $(MAKE) EMACS="$(EMACS)" lispdir="$(lispdir)" all
 
 install:
-       cd lisp && $(MAKE) EMACS=$(EMACS) lispdir=$(lispdir) install
-       cd texi && $(MAKE) EMACS=$(EMACS) install
+       cd lisp && $(MAKE) EMACS="$(EMACS)" lispdir="$(lispdir)" install
+       cd texi && $(MAKE) EMACS="$(EMACS)" install
 
 # Rule for Lars and nobody else.
 some:
-       cd lisp && $(MAKE) EMACS=$(EMACS) some
+       cd lisp && $(MAKE) EMACS="$(EMACS)" some
 l:
-       cd lisp && $(MAKE) EMACS=$(EMACS) clever
+       cd lisp && $(MAKE) EMACS="$(EMACS)" clever
 
 info:
-       cd texi && $(MAKE) EMACS=$(EMACS) all
+       cd texi && $(MAKE) EMACS="$(EMACS)" all
 
 clean:
        rm -f */*.orig */*.rej *.orig *.rej
 
 xsome:
-       cd lisp && $(MAKE) EMACS=$(XEMACS) some
+       cd lisp && $(MAKE) EMACS="$(XEMACS)" some
 
 elclean:
        rm lisp/*.elc
 
 x:
-       make EMACS=xemacs
+       make EMACS=xemacs21
 
 distclean:
        make clean
        rm -rf *~
        for i in lisp texi; do (cd $$i; make distclean); done
-       rm -f config.log config.status Makefile
+       rm -f config.log config.status config.cache Makefile
 
 osome:
-       make EMACS=emacs-19.34 some
+       make EMACS=xemacs21 some
 
 config.status: $(srcdir)/configure
        $(SHELL) ./config.status --recheck
index 459c782..0c109e0 100644 (file)
-Thu Nov 19 04:37:45 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+Thu Nov 19 04:48:42 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus.el: Gnus v5.6.45 is released.
+       * gnus.el: Pterodactyl Gnus v0.51 is released.
 
-1998-11-08 00:42:58  Andrew Innes  <andrewi@harlequin.co.uk>
+1998-11-19 04:02:34  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * nntp.el (nntp-request-group): Allow for error codes.
+       * gnus.el: Applied patches from 5.6.45.
 
-1998-10-12  Andrew Innes  <andrewi@harlequin.co.uk>
+       * gnus-score.el (gnus-score-find-trace): Print complete file
+       paths. 
+       (gnus-score-find-trace): Truncate lines.
 
-       * gnus/nntp.el (nntp-possibly-change-group): Allow for unexpected
-       responses to GROUP command, since this may be called from a timer
-       with quit inhibited.
+       * gnus.el (gnus-message-archive-group): Allow function.
 
-1998-10-11 01:16:14  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+       * message.el (message-encode-message-body): Remove Mime-Version
+       before inserting.
 
-       * gnus-agent.el (gnus-agent-expire): Check (car expired).
+       * gnus-cus.el (gnus-group-customize): Optional topic.
 
-1998-10-02 04:49:27  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-cache.el (gnus-cache-generate-active): Ignore directories
-       that start with a dot.
-
-1998-10-01 07:42:40  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * nnmail.el (nnmail-article-group): Expand properly.
-
-       * gnus-group.el (gnus-group-apropos): Also do non-active groups. 
-
-1998-09-29 13:12:31  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-async.el (gnus-make-async-article-function): Don't use
-       push. 
-
-Thu Sep 24 19:29:43 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.44 is released.
-
-1998-09-23 20:34:27  Markus Rost  <markus.rost@mathematik.uni-regensburg.de>
-
-       * gnus.el: Extend autoloads.
-
-1998-09-15 18:57:48  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-draft.el (gnus-draft-send): Bind required headers to nil. 
-       (gnus-draft-send): No.
-
-1998-09-14 15:16:42  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * message.el (message-fix-before-sending): Comment out invisible
-       text things.
-
-1998-09-14 14:30:09  Tatsuya Ichikawa  <ichikawa@hv.epson.co.jp>
-
-       * gnus-agent.el (gnus-agent-file-coding-system): Renamed.
-
-1998-09-13  Mike McEwan  <mike@lotusland.demon.co.uk>
-
-       * gnus-agent.el (gnus-agent-expire): Stop expiry barfing on killed 
-       groups.
-
-1998-09-13 07:02:04  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-agent.el (gnus-agent-save-group-info): Create proper active
-       lines. 
-
-1998-09-10 02:40:28  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-draft.el (gnus-draft-edit-message): Save the buffer. 
-
-Sun Sep  6 20:09:36 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.43 is released.
-
-1998-09-06 19:41:54  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-sum.el (gnus-remove-thread): Unhide threads before
-       removing. 
-       (gnus-data-compute-positions): Ditto.
-
-1998-08-31 11:40:13  Shuhei KOBAYASHI  <shuhei-k@jaist.ac.jp>
-
-       * nnmail.el (nnmail-date-to-time): Parse time locally if no
-       timezone. 
-
-1998-08-31 11:21:53  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-srvr.el (gnus-browse-foreign-server): Protect against
-       out-of-range articles.
-
-       * gnus-msg.el (gnus-summary-reply): Don't inhibit posting styles.
-
-1998-08-30 22:33:33  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-score.el (gnus-summary-increase-score): Temporary third
-       majuscle. 
-
-1998-08-30 22:32:31  Dan Christensen  <jdc@playmate.mat.jhu.edu>
-
-       * gnus-score.el (gnus-summary-increase-score): Score thread on
-       Message-ID. 
-
-1998-08-29 02:46:00  Simon Josefsson  <jas@pdc.kth.se>
-
-       * gnus-sum.el (gnus-summary-mark-article-as-read): 
-       (gnus-summary-mark-article-as-unread): 
-       (gnus-summary-mark-article): Call gnus-request-update-mark.
-
-1998-08-29  Mike McEwan  <mike@lotusland.demon.co.uk>
-
-       * gnus-agent.el (gnus-agent-fetch-headers): Cater for when there's 
-       no .agentview, all articles have been expired, or everything bar a 
-       few downloaded arts have been expired.
-       (gnus-agent-expire): Mark *all* expired articles as read.
-
-Sat Aug 29 19:17:19 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.42 is released.
-
-1998-08-29 17:06:27  Simon Josefsson  <jas@pdc.kth.se>
-
-       * gnus-sum.el (gnus-summary-make-menu-bar): Typo.
-
-1998-08-29 12:47:42  Tatsuya Ichikawa  <ichikawa@hv.epson.co.jp>
-
-       * gnus-agent.el: Use nnheader-insert-file-contents.
-
-1998-08-29 12:18:18  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * nnvirtual.el (nnvirtual-request-group): Update the right group. 
-
-1998-08-27 16:46:38  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-sum.el (gnus-data-compute-positions): Didn't work on hidden
-       threads.
-
-       * nnvirtual.el (nnvirtual-request-group): Work when always
-       updating. 
-       (nnvirtual-always-rescan): Default to t.
-
-Thu Aug 27 11:03:59 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.41 is released.
-
-1998-08-27  Mike McEwan  <mike@lotusland.demon.co.uk>
-
-       * gnus-agent.el (gnus-agent-fetch-group-1): Leave the calculation
-       of `articles' to `gnus-agent-fetch-headers'.
-       (gnus-agent-fetch-headers): We only want headers that are after
-       the last entry in `gnus-group-alist'.
-
-1998-08-27 09:45:42  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * Makefile.in (warn): New.
-
-       * gnus.el: Removed unreferenced bound variables all over.
-
-       * gnus-group.el (gnus-update-group-mark-positions): Removed topic.
-
-       * gnus-cus.el (gnus-group-customize): No part.
-
-       * gnus-agent.el (gnus-category-line-format-alist): Renamed specs.
-       (gnus-category-insert-line): Use it.
-
-Thu Aug 27 09:29:53 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.40 is released.
-
-1998-08-27 09:19:31  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-agent.el (gnus-agent-mode): Only toggle plugged in group
-       mode. 
-
-1998-08-27 07:25:47  Lars Balker Rasmussen  <gnort@daimi.aau.dk>
-
-       * message.el (message-supersede): Check the right headers. 
-
-1998-08-26 13:51:18  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-sum.el (gnus-sort-threads): Changed level.
-
-1998-08-26  Mike McEwan  <mike@lotusland.demon.co.uk>
-
-       * gnus-sum.el (gnus-build-all-threads): `save-excursion' and
-       `set-buffer' back to `gnus-summary-buffer' in order to access
-       buffer-local variables.
-
-1998-08-26 06:00:44  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-sum.el (gnus-data-compute-positions): More and faster. 
-
-1998-08-26 05:41:15  Matt Pharr  <mmp@Graphics.Stanford.EDU>
-
-       * message.el (message-wash-subject): Remove more.
-
-1998-08-25 11:33:28  Tatsuya Ichikawa  <ichikawa@hv.epson.co.jp>
-
-       * gnus-cache.el (gnus-cache-overview-coding-system): New
-       variable. 
-
-1998-08-25 08:23:05  Albert L. Ting  <alt@artisan.com>
-
-       * gnus-group.el (gnus-fetch-group-other-frame): New command.
-
-1998-08-25 07:24:51  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-uu.el (gnus-uu-grab-articles): Check for pseudos.
-
-       * gnus-art.el (gnus-ignored-headers): More headers.
-
-       * gnus-sum.el (gnus-summary-move-article): Update the right
-       group. 
-
-1998-08-23 14:31:31  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-art.el (gnus-ignored-headers): More headers.
-
-1998-08-23  Mike McEwan  <mike@lotusland.demon.co.uk>
-
-       * gnus-agent.el (gnus-agent-copy-nov-line): Return to beginning of 
-       line before next read.
-       (gnus-agent-braid-nov): Remove redundant `let'. 
-
-1998-08-22 10:40:54  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-art.el (article-display-x-face): Allow multiple X-Faces
-       under XEmacs.
-
-Sat Aug 22 10:28:25 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.39 is released.
-
-1998-08-22 10:06:03  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-art.el (gnus-ignored-headers): Added more headers.
-
-1998-08-21 02:49:56  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * nnweb.el (nnweb-type): Doc fix.
-
-       * gnus-sum.el (gnus-summary-set-process-mark): Move to the right
-       article. 
-
-1998-08-20 23:10:01  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * nnmail.el (nnmail-spool-file): Allow lists of files.
-
-1998-08-20  Per Starback  <starback@update.uu.se>
-
-       * gnus/gnus-start.el (gnus-check-first-time-used): Change current
-       buffer before creating help group.
-
-1998-08-20 01:33:08  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-msg.el (gnus-message-style-insertions): New variable.
-       (gnus-message-insert-stylings): New function.
-       (gnus-configure-posting-styles): Use them.
-
-       * gnus-topic.el (gnus-topic-mode): Don't alter summary-exit-hook. 
-
-       * gnus-sum.el (gnus-select-newsgroup): Don't update group.
-
-       * gnus-msg.el (gnus-setup-message): Bind message-mode-hook.
-       (gnus-inhibit-posting-styles): New variable.
-       (gnus-summary-reply): Use it.
-       (gnus-configure-posting-styles): Ditto.
-
-       * gnus-group.el (gnus-group-suspend): Don't kill dribble buffer. 
-
-Thu Aug 20 00:28:35 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.38 is released.
-
-1998-08-20 00:02:50  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * message.el (message-mail): Doc fix.
-
-1998-08-19 23:22:02  Bill Pringlemeir  <bpringle@my-dejanews.com>
-
-       * messcompat.el (message-send-mail-function): Initialized from
-       send-mail-function. 
-
-1998-08-19 23:20:42  Martin Larose  <larosem@IRO.UMontreal.CA>
-
-       * message.el (message-send-coding-system): New variable.
-
-1998-08-19 19:00:37  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-msg.el (gnus-configure-posting-styles): Reinstated most of
-       old code.
-
-       * gnus-start.el (gnus-save-newsrc-file): Use coding system.
-
-1980-06-08 03:53:56  Mike McEwan  <mike@lotusland.demon.co.uk>
-
-       * gnus-agent.el (gnus-agent-braid-nov): Go to right place. 
-
-1980-06-08 03:01:48  Shuhei KOBAYASHI  <shuhei-k@jaist.ac.jp>
-
-       * gnus-group.el (gnus-group-suspend): Fix.
-
-1998-08-18 00:25:11  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-cite.el (gnus-cited-opened-text-button-line-format-alist):
-       New n spec.
-
-       * gnus-group.el (gnus-group-suspend): Use mapcar.
-
-1998-08-17 14:35:33  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-ems.el (gnus-add-minor-mode): Set mode var.
-
-       * gnus-start.el (gnus-slave-mode): New function.
-
-       * gnus-msg.el (gnus-post-method): Work with current in nndraft. 
-
-1998-08-16 23:30:14  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-art.el (gnus-request-article-this-buffer): Allow recursive
-       selection of nneething groups.
-
-       * nneething.el (nneething-address): Renamed from directory.
-
-Sun Aug 16 18:59:41 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.37 is released.
-
-1998-08-16 14:52:43  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.el: Autoload gnus-summary-wide-reply.
-
-       * gnus-sum.el (gnus-get-newsgroup-headers): Return the value of
-       In-Reply-To. 
-
-       * gnus-msg.el (gnus-setup-message): Posting styles have to be
-       configured in message-mode-hook.
-
-       * nntp.el (nntp-connection-timeout): Restored.
-       (nntp-open-connection): Use it.
-
-1998-08-15 22:46:49  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-group.el (gnus-group-make-useful-group): Doc fix.
-
-       * gnus-art.el (gnus-article-push-button): Place point where you
-       click.
-
-1998-08-15  Mike McEwan  <mike@lotusland.demon.co.uk>
-
-       * gnus-agent.el (gnus-agent-save-group-info): Update "groups" file 
-       if `nntp-server-list-active-group' is nil.
-
-1998-08-15 00:35:03  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-score.el (gnus-summary-increase-score): Swap t and r.
-
-       * gnus-sum.el (gnus-remove-thread): Didn't work with sparse
-       threads. 
-
-1998-08-14  François Pinard  <pinard@iro.umontreal.ca>
-
-       * nndoc.el (nndoc-generate-mime-parts-head): Use original Subject,
-       Message-ID, and References in fully blown articles.
-
-Fri Aug 14 23:03:51 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.36 is released.
-
-1998-08-14 21:49:22  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.el (load): Push onto list.
-
-       * gnus-group.el (gnus-group-get-new-news-this-group): Store active
-       info. 
-
-Fri Aug 14 21:41:59 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.35 is released.
-
-1998-08-14 00:00:15  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-srvr.el (gnus-server-scan-server): Error better.
-
-       * nndir.el: Make independent of nnmh.
-       Revert.
-
-       * message.el (message-remove-text-with-property): New function.
-       (message-fix-before-sending): Check for invisible text.
-
-       * gnus.el (load): Create the Gnus buffer even when no splash.
-
-       * gnus-msg.el (gnus-setup-message): Add buffer to list.
-
-       * gnus-win.el (gnus-remove-some-windows): Use new buffer system. 
-       (gnus-delete-windows-in-gnusey-frames): Ditto.
-
-       * gnus.el (gnus-add-buffer): New function.
-
-1998-08-13 23:38:21  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-xmas.el (gnus-buffer-list): Removed.
-
-       * gnus.el (gnus-buffers): New variable.
-       (gnus-get-buffer-create): New function; used throughout.
-       (gnus-buffers): New function.
-
-       * gnus-msg.el (gnus-configure-posting-styles): Go to eoh
-       reliably. 
-
-       * message.el (message-goto-eoh): New command.
-
-1998-08-13 23:13:53  Simon Josefsson  <jas@pdc.kth.se>
-
-       * gnus-msg.el (gnus-setup-message): use message-setup-hook
-       instead
-       (gnus-configure-posting-styles): new posting-style 'body
-       (gnus-configure-posting-styles): insert headers immediately
-
-1998-08-13 13:05:36  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-score.el (gnus-summary-increase-score): Change thread to
-       "r". 
-
-       * gnus-sum.el (gnus-summary-scroll-down): New command and
-       keystroke. 
-
-       * gnus-agent.el (gnus-agent-expire): Check that directories
-       exist. 
-
-1998-08-12 20:56:41  Simon Josefsson  <jas@pdc.kth.se>
-
-       * gnus-cache.el (gnus-uncacheable-groups): doc change
-       (gnus-cacheable-groups): new variable
-       (gnus-cache-possibly-enter-article): use it
-
-1998-08-12 22:30:16  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * nntp.el (nntp-encode-text): Too much text.
-
-1998-08-12 21:58:50  Matt Pharr  <mmp@Graphics.Stanford.EDU>
-
-       * message.el (message-make-forward-subject-function): New
-       variable. 
-       (message-wash-forwarded-subjects): Ditto.
-
-Wed Aug 12 21:09:58 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.34 is released.
-
-1998-08-12 13:32:38  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-msg.el (gnus-post-method): Don't use `current' in drafts.
-
-       * gnus-score.el (gnus-summary-increase-score): Changed T to h and
-       downcase. 
-
-Tue Aug 11 20:46:25 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.33 is released.
-
-1998-08-11 20:07:55  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-group.el (gnus-group-apropos): Check symbol value.
-
-       * gnus-cite.el (gnus-cited-closed-text-button-line-format):
-       Changed.
-
-Tue Aug 11 19:42:42 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.32 is released.
-
-1998-08-11 13:36:56  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * nndoc.el (nndoc-type-alist): Do MIME digests before multiparts.
-
-       * gnus.el (gnus-predefined-server-alist): Expand vars.
-
-1998-08-09  Dave Love  <d.love@dl.ac.uk>
-
-       * gnus-art.el (article-display-x-face): Don't try (and fail) to
-       display multiple faces.
-
-1998-08-11 11:41:43  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-art.el (gnus-header-newsgroups-face): Don't bold so much.
-
-       * gnus-group.el (gnus-group-rename-group): Remove old group name
-       from list of killed groups.
-
-       * gnus-int.el (gnus-get-function): Error better.
-
-       * gnus-art.el (gnus-article-narrow-to-signature): Inhibit motion
-       hooks.
-       (article-hide-pgp): Delete text instead of hiding it.
-
-       * gnus-group.el (gnus-group-find-new-groups): Ditto.
-
-       * gnus-start.el (gnus-find-new-newsgroups): Accept C-u C-u as a
-       total query.
-
-1998-08-10 09:31:36  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-art.el (gnus-article-prepare): Place point at the beginning
-       of the body.
-
-       * gnus-cite.el (gnus-cite-attribution-face): Changed to italic.
-
-       * gnus-art.el (gnus-article-edit-article): Delete "annotation"
-       text.
-       (gnus-insert-prev-page-button): Mark as annotation.
-       (gnus-insert-next-page-button): Ditto.
-
-       * gnus-cite.el (gnus-cited-closed-text-button-line-format): New
-       variable.
-       (gnus-cited-closed-text-button-line-format-alist): Ditto.
-       (gnus-article-toggle-cited-text): Toggle between different
-       symbols.
-
-1998-08-09 19:58:36  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.el (gnus-version): Remove backend info.
-
-Sun Aug  9 19:37:40 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.31 is released.
-
-1998-08-09  François Pinard  <pinard@iro.umontreal.ca>
-
-       * nndoc.el: Split MIME multipart messages, maybe recursively.
-       (nndoc-mime-parts-type-p, nndoc-transform-mime-parts,
-       nndoc-generate-mime-parts-head, nndoc-dissect-mime-parts,
-       nndoc-dissect-mime-parts-sub): New functions.
-
-       * nndoc.el: Quoting boundaries is optional, for multipart digests.
-
-1998-08-09 17:51:25  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-agent.el (gnus-agent-save-group-info): Check whether file
-       exists.
-
-       * message.el (message-goto-signature): Return nil if no sig.
-       (message-delete-not-region): Delete properly if no sig.
-
-1998-08-09 17:26:30  Simon Josefsson  <jas@pdc.kth.se>
-
-        * gnus-srvr.el (gnus-browse-make-menu-bar): select did read
-
-1998-08-09 15:51:43  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-sum.el (t): Added keystroke for W W C.
-
-       * gnus-cite.el (gnus-article-hide-citation-maybe): hiden->hidden.
-
-Sun Aug  9 15:46:16 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.30 is released.
-
-1998-08-09 10:48:31  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * message.el (message-cite-original-without-signature): Peel off
-       blank lines.
-
-       * gnus-art.el (gnus-article-maybe-highlight): Doc fix.
-
-       * gnus-sum.el (gnus-data-enter-list): Threw away all new list data
-       at the beginning of the buffer.
-
-1998-08-07 01:41:29  Gareth Jones  <gdj1@gdjones.demon.co.uk>
-
-       * gnus-score.el (gnus-summary-increase-score): Don't downcase
-       before lookin in char-to-header.
-
-1998-08-07 01:33:22  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.el (gnus-predefined-server-alist): Too many parentheses.
-
-1998-08-06 11:20:08  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.el (gnus-continuum-version): Include quassia.
-
-       * gnus-sum.el (gnus-data-enter-list): Check before entering list.
-
-1998-08-06 11:13:56  Francois Felix Ingrand  <felix@dial.oleane.com>
-
-       * gnus-salt.el (gnus-generate-vertical-tree): Don't go too far to
-       the left.
-
-Thu Aug  6 07:58:17 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.29 is released.
-
-1998-08-06 07:10:31  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-agent.el (gnus-agent-expire): Check whether (caar
-       gnus-agent-article-alist) is nil.
-
-       * gnus.el (gnus-read-method): Allow selecting predefined servers.
-
-       * gnus-topic.el (gnus-topic-update-topic-line): Compute right
-       number when inserting missing topic lines.
-
-       * gnus-start.el (gnus-get-unread-articles): Check that the group
-       is alive.
-
-       * gnus-score.el (gnus-score-load-score-alist): Better error
-       messaging.
-
-Tue Aug  4 09:42:31 1998  Kurt Swanson  <ksw@dna.lth.se>
-
-       * gnus-salt.el (gnus-pick-mouse-pick-region): Fix picking bug due
-       to use of gnus-read-event-char.
-
-1998-07-28  Dave Love  <d.love@dl.ac.uk>
-
-       * gnus-group.el (gnus-group-fetch-faq): Don't mung dots in group
-       name.
-
-1998-07-27  Dave Love  <d.love@dl.ac.uk>
-
-       * gnus-topic.el (gnus-topic-mode-map): Provide Emacs tty
-       alternatives to [tab], [(meta tab)].
-
-1998-08-06 04:41:38  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-start.el (gnus-startup-file-coding-system): New variable.
-       (gnus-read-init-file): Use it.
-       (gnus-read-newsrc-el-file): Ditto.
-
-       * gnus-sum.el (gnus-thread-ignore-subject): Changed default.
-
-1998-08-06 04:38:02  Richard Stallman  <rms@gnu.org>
-
-       * message.el (sendmail): Required.
-
-1998-08-06 02:11:37  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-sum.el (gnus-auto-select-same): Dix fix.
-
-1998-08-04  Mike McEwan  <mike@lotusland.demon.co.uk>
-
-       * gnus-sum.el (gnus-select-newsgroup): Set
-       `gnus-newsgroup-unselected' when selecting specific articles via
-       SELECT-ARTICLE - there may be more headers to fetch if
-       `gnus-fetch-old-headers' is non-nil.
-       (gnus-summary-read-group): pass SELECT-ARTICLE to
-       `gnus-summary-read-group-1' and reset to nil when going to next group.
-       (gnus-summary-read-group): Change `select-article' to
-       `select-articles' for consistency.
-
-Tue Aug  4 05:25:01 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.28 is released.
-
-1998-08-03 22:00:25  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * nndoc.el (nndoc-set-delims): Removed article-end.
-       (nndoc-dissect-buffer): Use eobp.
-
-1998-08-03 19:59:36  Trung Tran-Duc  <trung.tranduc@prague.ixoskillspam.cz>
-
-       * nntp.el (nntp-open-connection): Bind coding-system-for-write.
-
-1998-07-31 16:45:36  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-group.el (gnus-group-read-ephemeral-group): Make the server
-       unique.
-
-1998-07-28  François Pinard  <pinard@iro.umontreal.ca>
-
-       * gnus-uu.el (gnus-uu-reginize-string): Consider the number of
-       parts as part of the fixed subject, instead of a wild quantity.
-
-1998-07-30 21:47:23  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-cache.el (gnus-summary-insert-cached-articles): Sort
-       articles.
-
-       * nndir.el (nndir): Use nnml functions.
-
-Mon Jul 27 03:26:00 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.27 is released.
-
-1998-07-27 02:27:11  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-topic.el (gnus-topic-update-unreads): New function.
-
-       * gnus-sum.el (gnus-summary-limit): Update mode line.
-
-       * gnus-soup.el (gnus-soup-add-article): Update mode line.
-
-       * gnus-group.el (gnus-group-make-menu-bar): Bug.
-
-       * gnus-art.el (gnus-article-make-menu-bar): Menu.
-
-       * gnus-sum.el (gnus-summary-make-menu-bar): Bug reports.
-
-       * gnus-topic.el (gnus-topic-mode-map): h -> H.
-
-1998-07-19 16:59  Simon Josefsson  <jas@pdc.kth.se>
-
-       * gnus-util.el (gnus-netrc-syntax-table): @ is whitespace
-
-1998-07-17  Gordon Matzigkeit  <gord@fig.org>
-
-       * gnus-uu.el (gnus-uu-reginize-string): Simplify by looking
-       from back to front for part numbers, rather than skipping
-       leading ``version numbers.''
-
-       (gnus-uu-part-number): Make consistent with
-       gnus-uu-reginize-string.
-
-1998-07-26 19:01:58  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-art.el (gnus-request-article-this-buffer): Pass along
-       header.
-
-       * gnus-sum.el (gnus-summary-update-article): Don't pass along
-       iheader to regeneration routine.
-
-1998-07-27  KOSEKI Yoshinori  <kose@yk.NetLaputa.ne.jp>
-
-       * nnmail.el (nnmail-move-inbox): Clear nnmail-internal-password,
-       when supplied Password is incorrect.
-
-Sat Jul 25 19:31:36 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.26 is released.
-
-1998-07-25 14:53:24  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-salt.el (gnus-pick-mouse-pick-region): Use
-       gnus-read-event-char.
-
-Sat Jul 25 02:43:35 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.25 is released.
-
-1998-07-25 00:03:24  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-group.el (gnus-group-read-ephemeral-group): Ditto.
-
-       * gnus-sum.el (gnus-summary-read-group-1): Ditto.
-
-       * gnus-group.el (gnus-group-read-group): Accept article list.
-
-1998-07-24 14:35:02  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-msg.el (gnus-configure-posting-styles): Quote some.
-
-       * message.el (message-ignored-supersedes-headers): Added X-Trace
-       and X-Complaints-To.
-
-       * nnmail.el (gnus-util): Required.
-
-1998-07-21 23:03:13  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.el (gnus-news-group-p): Bogosity in params.
-
-1998-07-21 16:14:32  Robert Bihlmeyer  <robbe@orcus.priv.at>
-
-       * gnus-util.el (gnus-globalify-regexp): New function.
-
-1998-07-18 21:49:01  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus-sum.el (gnus-list-of-unread-articles): Peel off articles
-       outside active range.
-
-1998-07-15 10:47:39  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * nnvirtual.el (nnvirtual-request-type): Handle non-numerical
-       articles.
-
-       * gnus.el (gnus-news-group-p): Do something sensible with negative
-       articlies.
-
-Wed Jul 15 10:27:05 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-salt.el (gnus-tree-minimize-window): Allow numbers.
-
-Wed Jul 15 10:25:29 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-agent.el (gnus-agent-expire): Ignored ticks.
-
-Wed Jul 15 10:15:28 1998  Hallvard B. Furuseth  <h.b.furuseth@usit.uio.no>
-
-       * nntp.el (nntp-send-authinfo): Message better and stuff.
-
-Wed Jul 15 10:10:07 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.el (gnus-message-archive-group): Allow sexp.
-
-Wed Jul 15 09:56:47 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-sum.el (gnus-select-newsgroup): Accept select-articles
-       para,
-
-1998-07-13  Mike McEwan  <mike@lotusland.demon.co.uk>
-
-       * gnus-sum.el (gnus-select-newsgroup): Don't call the Agent to
-       mark articles as read until *all* headers have been retrieved.
-
-Wed Jul 15 09:06:18 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * nndir.el (nndir): Use nnml to request article.
-
-1998-07-11  SL Baur  <steve@altair.xemacs.org>
-
-       * gnus-topic.el (gnus-topic-mode-map): Use modern key syntax.
-
-Sun Jul 12 04:01:22 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-score.el (gnus-current-home-score-file): New function.
-
-1998-07-11  Mike McEwan  <mike@lotusland.demon.co.uk>
-
-       * gnus-agent.el (gnus-agent-fetch-headers): Note last fetched
-       headers per sesion to aid expiry in `headers only' groups.
-
-       * gnus-agent.el (gnus-agent-expire): Update group info to add
-       expired articles to list of read articles and prevent
-       re-fetching.
-
-1998-07-12  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * nnmail.el (nnmail-active-file-coding-system): Changed to
-       binary.
-
-Sun Jul 12 03:16:18 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-score.el (gnus-score-load-file): Specify which alist to
-       decay.
-
-1998-07-12  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-start.el (gnus-startup-file-coding-system): New variable.
-       (gnus-read-newsrc-el-file): Use it.
-
-Sat Jul 11 03:03:53 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.24 is released.
-
-Fri Jul 10 04:23:24 1998  Hallvard B. Furuseth  <h.b.furuseth@usit.uio.no>
-
-       * gnus-util.el (gnus-parse-netrc): Allow "default" values.
-
-Fri Jul 10 04:15:35 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * nntp.el (nntp-server-opened-hook): Doc change.
-
-Fri Jul 10 03:03:48 1998  François Pinard  <pinard@iro.umontreal.ca>
-
-       * gnus-sum.el (gnus-summary-respool-trace): New command and
-       keystroke.
-
-Fri Jul 10 02:18:01 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-util.el (gnus-prin1): Bind print-escape-multibyte to nil.
-
-Mon Jul  6 01:02:59 1998  Simon Josefsson  <jas@pdc.kth.se>
-
-       * gnus-range.el (gnus-sorted-complement): Fix comments.
-
-Thu Jul  2 11:16:14 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-sum.el (gnus-summary-iterate): New macro.
-
-       * message.el (message-pop-to-buffer): Clone locals.
-
-       * gnus-msg.el (gnus-posting-styles): Reinstated.
-       (gnus-posting-style-alist): Ditto.
-
-Wed Jul  1 18:02:31 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-int.el (gnus-get-function): Set funct to nil.
-
-1998-07-01 16:57:38  Simon Josefsson  <jas@pdc.kth.se>
-
-       * gnus-int.el (gnus-get-function): returned non-nil when
-        function wasn't bound, if noerror=t
-
-Wed Jul  1 17:30:41 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-topic.el (gnus-topic-mode-map): Bind TAB and M-TAB.
-
-       * gnus-sum.el (gnus-build-sparse-threads): Make sure no dates are
-       nil.
-       (gnus-summary-limit-mark-excluded-as-read): Use the intersection.
-
-       * gnus-msg.el (gnus-setup-message): Clone all local variables from
-       the summary buffer.
-
-Wed Jul  1 14:03:52 1998  Richard Stallman  <rms@santafe.edu>
-
-       * message.el (message-cite-original): Use mail-citation-hook.
-       (message-cite-function): Ditto.
-
-Wed Jul  1 14:00:53 1998  Rajappa Iyer  <rsi@lucent.com>
-
-       * gnus-salt.el (gnus-pick-mode-map): Changed keymap.
-
-Wed Jul  1 13:33:26 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.23 is released.
-
-Wed Jul  1 12:52:32 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * nntp.el (nntp-record-command): Give more precise time info.
-       (nntp-next-result-arrived-p): Look for the end of error lines.
-
-Wed Jul  1 12:24:06 1998  François Pinard  <pinard@iro.umontreal.ca>
-
-       * gnus-util.el (gnus-delete-if): Would do the opposite.
-
-Wed Jul  1 01:53:31 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-sum.el (gnus-build-sparse-threads): Didn't work at all.
-
-Tue Jun 30 15:56:54 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * nntp.el (nntp-send-authinfo): Store the user name.
-       (nntp-authinfo-user): New variable.
-
-       * gnus-sum.el (gnus-summary-limit-mark-excluded-as-read): Would
-       mark some articles as unread.
-
-       * gnus-agent.el (gnus-agent-expire): Don't sort lines.
-
-Tue Jun 30 15:56:31 1998  Mike McEwan  <mike@lotusland.demon.co.uk>
-
-       * gnus-agent.el (gnus-agent-expire): Use a fresh hash table.
-
-Mon Jun 29 22:49:49 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.22 is released.
-
-Mon Jun 29 21:22:46 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-salt.el (gnus-pick-mode-map): Remove gnus-mouse.
-
-       * gnus-sum.el (gnus-dependencies-add-header): `debug' left in.
-       Eh.  Eh.
-
-       * gnus-salt.el (gnus-summary-pick-line-format): Missing %.-
-
-       * gnus-topic.el (gnus-topic-rename): Fix error message.
-
-Sun Jun 28 14:32:08 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-spec.el (gnus-face-face-function): Double quoting removed.
-
-Sun Jun 28 09:54:52 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.21 is released.
-
-Sun Jun 28 08:51:39 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-sum.el (gnus-summary-edit-article-done): Copy the buffer to
-       a temp buffer before replacing.
-
-       * gnus-msg.el (gnus-post-news): Treat broken-reply-to in
-       followups.
-
-       * gnus-sum.el (gnus-summary-goto-subject): Position point.
-
-Sat Jun 27 09:19:20 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-demon.el (gnus-util): Required.
-
-       * gnus-score.el (gnus-score-body): Message fix.
-
-       * gnus-group.el (gnus-group-highlight-line): Use it.
-
-       * gnus-util.el
-       (gnus-put-text-properties-excluding-characters-with-faces): New
-       function.
-
-Sat Jun 27 08:56:08 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.20 is released.
-
-Sat Jun 27 08:49:51 1998  Arne Georg Gleditsch  <argggh@ifi.uio.no>
-
-       * gnus-sum.el (gnus-parent-headers): Check better for headers.
-
-Sat Jun 27 08:45:09 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * message.el (message-check-news-body-syntax): Buggy checksum
-       check.
-
-Sat Jun 27 07:59:22 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.19 is released.
-
-Sat Jun 27 07:50:50 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.18 is released.
-
-Sat Jun 27 03:18:57 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-soup.el (gnus-soup-save-areas): Made interactive.
-
-       * nnfolder.el (nnfolder-request-replace-article): Check all X-From
-       headers.
-
-       * gnus-sum.el (gnus-update-marks): Don't nix out cache lists.
-
-       * nngateway.el (nngateway-mail2news-header-transformation):
-       Changed semantics.
-
-       * message.el (message-check-news-body-syntax): Don't look at
-       buffer size to see whether text has been added.
-
-Fri Jun 26 15:46:05 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.16 is released.
-
-Fri Jun 26 15:36:25 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-util.el (gnus-delete-assq): Removed.
-       (gnus-delete-assoc): Ditto.
-
-       * gnus.el: Use throughout.
-
-       * gnus-util.el (gnus-pull): New macro.
-
-1998-06-26  Simon Josefsson  <jas@pdc.kth.se>
-
-       * gnus-sum.el (gnus-get-newsgroup-headers): parse Chars: headers
-
-Fri Jun 26 13:45:24 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-sum.el (gnus-update-marks): Use it.
-
-       * gnus-util.el (gnus-delete-alist): New function.
-
-       * gnus-sum.el (gnus-update-marks): Don't save list of cached
-       articles.
-
-       * message.el (message-mode-menu): Include kill-buffer.
-
-       * nnmail.el (nnmail-purge-split-history): Use it.
-
-       * gnus-util.el (gnus-delete-if): New function.
-
-       * nnmail.el (nnmail-article-group): Use gnus-remove-duplicates.
-
-Fri Jun 26 13:45:09 1998  Richard Stallman  <rms@santafe.edu>
-
-       * gnus-util.el (gnus-remove-duplicates): New function.
-
-Fri Jun 26 13:30:42 1998  Kevin Christian  <Kevin.Christian@symbios.com>
-
-       * gnus-score.el (gnus-score-string): Do updating of scores after
-       fuzzies.
-
-Fri Jun 26 07:26:03 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * message.el (message-mode): Don't do the intern dance.
-
-Fri Jun 26 07:13:49 1998  Richard Stallman  <rms@santafe.edu>
-
-       * message.el (message-mode): Adaptive fill changes.
-
-Fri Jun 26 04:29:44 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-sum.el (gnus-summary-mode-line-format-alist): Allow article
-       score.
-
-       * gnus-score.el (gnus-score-load-file): Would ignore all score
-       files without un-advanced rules.
-
-       * gnus-ems.el ((fboundp 'split-string)): Use it where it exists.
-
-Fri Jun 26 04:23:12 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.15 is released.
-
-Fri Jun 26 03:39:32 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * nnfolder.el (nnfolder-request-replace-article): Delete old
-       delimiter.
-
-       * gnus-msg.el (gnus-summary-reply): Use it.
-
-       * message.el (message-reply): Removed parameter.
-       (message-wide-reply): Ditto.
-
-       * gnus-msg.el (gnus-msg-treat-broken-reply-to): New function.
-
-       * gnus-art.el (gnus-check-group-server): New function.
-       (gnus-request-article-this-buffer): Don't try to waken the server
-       before needing to.
-
-Thu Jun 25 10:35:48 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-sum.el (gnus-summary-delete-article): Sort the articles
-       before deleting.
-
-       * nngateway.el (nngateway-request-post): Return success.
-
-       * nnheader.el (nnheader-insert-file-contents): Bind more hooks.
-
-       * gnus-sum.el (gnus-summary-limit-to-age): Reverse logic.
-
-       * gnus-score.el (gnus-summary-score-entry): Removed interactive
-       spec.
-       ((gnus-summary-score-map "V" gnus-summary-mode-map)): Removed
+       * gnus-sum.el (gnus-summary-customize-parameters): New command and 
        keystroke.
 
-       * gnus-art.el (gnus-article-show-summary): Position point.
+Wed Nov 18 13:46:08 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus-cache.el (gnus-cache-update-article): Change group first.
+       * message.el (message-encode-message-body): Rewrite.
 
-       * gnus.el (gnus-short-group-name): Collapse more.
+1998-11-18 07:37:47  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Thu Jun 25 08:48:06 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * mml.el (mml-base-boundary): New variable.
+       (mml-make-boundary): New function.
 
-       * gnus.el: Gnus v5.6.14 is released.
+       * gnus-cache.el (gnus-cache-coding-system): New variable.
+       (gnus-cache-request-article): Use it.
 
-Thu Jun 25 05:13:31 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * message.el (message-insert-mime-part): Delete duplicates.
 
-       * gnus-sum.el (gnus-rebuild-thread): Accept a line argument.
-       (gnus-rebuild-thread): Would skip around a lot when `P'-ing past
-       the beginning.
+Wed Nov 18 11:52:19 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus-msg.el (gnus-post-method): Present all known servers if
-       `C-u 0'.
+       * gnus-art.el (gnus-mime-display-alternative): Set end of
+       multipart and display even when nothing is preferred.
 
-       * gnus-salt.el (gnus-pick-mode-map): Reinstated keymap.
+Wed Nov 18 05:06:44 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-sum.el (gnus-build-sparse-threads): Put the proper date
-       in.
+       * gnus.el: Pterodactyl Gnus v0.50 is released.
 
-Wed Jun 24 07:52:30 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-11-18 04:42:01  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.el: Gnus v5.6.13 is released.
+       * mm-decode.el (mm-inline-media-tests): Check that device-type is
+       fbound. 
 
-Wed Jun 24 07:47:04 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-sum.el (gnus-summary-sort): Didn't do reverse.
 
-       * gnus-topic.el (gnus-topic-rename): Disallow "nil".
+1998-11-07 23:39:48  Simon Josefsson  <jas@pdc.kth.se>
 
-Wed Jun 24 07:33:17 1998  Vladimir Alexiev  <vladimir@cs.ualberta.ca>
+       * gnus.el (gnus-similar-server-opened): Compare backend.
 
-       * nnvirtual.el (nnvirtual-update-xref-header): Regexp-quote group
-       name.
+1998-11-08 03:37:42  Simon Josefsson  <jas@pdc.kth.se>
 
-Wed Jun 24 06:15:27 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-topic.el (gnus-topic-expire-articles): New function.
+       (gnus-topic-mode-map): Bind it.
 
-       * gnus-sum.el (gnus-build-sparse-threads): Give all the sparse
-       articles the date of the current child.
+       * gnus.texi (Topic Commands): New expiry command. Reordered.
 
-       * gnus-topic.el (gnus-group-topic-parameters): Didn't compute.
+1998-11-10  Miles Bader  <miles@ccs.mt.nec.co.jp>
 
-Wed Jun 24 03:27:44 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * gnus-sum.el
+       (gnus-auto-expirable-marks): New variable.
+       (gnus-inhibit-user-auto-expire): New variable.
+       (gnus-summary-mark-article-as-read, gnus-summary-mark-article):
+       When looking to see if we should expire instead, check
+       gnus-auto-expirable-marks instead of using a hard-wired list.
+       (gnus-summary-mark-as-read-forward,
+       gnus-summary-mark-as-read-backward):
+       Pass gnus-inhibit-user-auto-expire for the no-expire argument to
+       gnus-summary-mark-forward, instead of `t'.
 
-       * gnus.el: Gnus v5.6.12 is released.
+1998-11-18 03:30:26  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Wed Jun 10 11:06:35 1998  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+       * mml.el (mml-compute-boundary): New function.
+       (mml-compute-boundary-1): New function.
+       (mml-generate-mime-1): Use it.
 
-       * message.el (message-mail-other-window): Bind message-this-is-mail.
-       (message-mail-other-frame): Likewise.
-       (message-news-other-window): Bind message-this-is-news.
-       (message-news-other-frame): Likewise.
+1998-11-18  Hrvoje Niksic  <hniksic@srce.hr>
 
-1998-06-09  Sam Steingold  <sds@goems.com>
+       * mml.el (mml-generate-mime-1): Always precede closing boundary
+       with newline.
 
-        * gnus-uu.el (gnus-uu-default-view-rules): make sed kill ^M only
-        at the end of line.
+1998-11-18 02:36:37  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-1998-06-05  Hrvoje Niksic  <hniksic@srce.hr>
+       * mml.el (mml-generate-mime-1): Do right boundaries when several
+       multiparts. 
 
-       * nnmail.el (nnmail-get-split-group): Don't regexp-quote
-       nnmail-procmail-suffix.
+       * mm-decode.el (mm-user-automatic-display): Default to inline
+       jpeg. 
 
-Wed Jun 24 03:04:05 1998  Kim-Minh Kaplan  <kaplan@sky.fr>
+       * mml.el (mml-generate-mime-1): Encode non-text parts.
 
-       * gnus-sum.el (gnus-build-get-header): Fix obarray.
+Wed Nov 18 02:22:23 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-Wed Jun 24 02:49:57 1998  Castor  <castor@my-dejanews.com>
+       * gnus.el: Pterodactyl Gnus v0.49 is released.
 
-       * nntp.el (nntp-open-ssl-stream):
+1998-11-18 00:37:43  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Wed Jun 24 02:31:46 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-view.el (mm-inline-text): Require w3-vars.
 
-       * gnus-sum.el (gnus-nov-parse-line): Cleaned up.
-       (gnus-build-all-threads): Put things in the wrong obarray.
+       * gnus-setup.el (gnus-use-tm): Removed.
 
-Wed Jun 24 01:43:26 1998  Decklin Foster  <djarum@base.org>
+       * gnus-art.el (gnus-article-goto-part): Don't beep.
+       (gnus-article-view-part): Check return value.
+       (gnus-mime-display-alternative): Don't display when there is
+       nothing to display.
 
-       * nngateway.el (nngateway-mail2news-header-transformation): New
-       function.
+       * mml.el (mml-generate-mime-1): Don't use a unibyte buffer.
+       (mml-generate-mime-1): Use unibyte for binaries.
 
-Wed Jun 24 00:25:45 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-display-mime): Call
+       gnus-article-mime-part-function. 
+       (gnus-mime-part-function): New function.
+       (gnus-article-mime-part-function): New function.
 
-       * message.el (message-shorten-references): New function.
-       (message-header-format-alist): Use it.
+       * mml.el (mml-generate-mime-1): Don't insert so many newlines. 
 
-       * gnus-start.el (gnus-always-read-dribble-file): Customized.
+1998-11-16 06:44:19  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * message.el (message-generate-new-buffers): Dox fox.
+       * mml.el (mml-generate-mime-1): Do it in unibyte buffers.
 
-Tue Jun 23 23:58:48 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * message.el (message-font-lock-keywords): Highlight MML. 
+       (message-mml-face): New font.
 
-       * gnus-topic.el (gnus-topic-prepare-topic): Respect visible topic
-       param.
-       (gnus-topic-hierarchical-parameters): New function.
-
-1998-06-02  Didier Verna  <verna@inf.enst.fr>
-
-       * gnus-picon.el (gnus-get-buffer-name): use get-buffer-create
-       instead of get-buffer
-
-Wed Jun  3 04:41:45 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Mon Nov 16 23:34:12 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * nnkiboze.el (nnkiboze-request-delete-group): Delete .newsrc
-       file.
+       * gnus-art.el (gnus-display-mime): Clean up even when no handles.
+       (gnus-mm-display-part): Do not select-window if the article window
+       is not found.
 
-       * nnmail.el (nnmail-article-group): Nuke looong lines.
+Mon Nov 16 02:26:40 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus-art.el (gnus-button-alist): Buggy default.
+       * gnus-sum.el (gnus-summary-move-article): Use no-encode for B m.
 
-Wed Jun  3 04:03:37 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+Mon Nov 16 02:00:05 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus.el: Gnus v5.6.11 is released.
+       * gnus.el: Pterodactyl Gnus v0.48 is released.
 
-Wed Jun  3 03:33:50 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-11-15 23:18:56  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.el: Checked doc string syntax throughout.
+       * mm-bodies.el (mm-encode-body): Disbabled for nonmule.
 
-       * message.el (message-subject-re-regexp): Renamed.
+       * mm-util.el (mm-find-charset-region): Bogus change for non-Mule.
 
-Wed Jun  3 03:33:05 1998  Simon Josefsson  <jas@pdc.kth.se>
+       * message.el (message-cite-original-without-signature): Ditto. 
+       (message-cite-original): Quote parts.
 
-       * message.el (message-ignored-subject-re): New variable.
+Sun Nov 15 22:01:55 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-Wed Jun  3 03:25:13 1998  Sam Steingold  <sds@usa.net>
+       * gnus.el: Pterodactyl Gnus v0.47 is released.
 
-       * gnus-msg.el (gnus-bug-create-help-buffer): New variable.
-       (gnus-bug): Use it.
+1998-11-15 20:11:33  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-1998-05-07  Hrvoje Niksic  <hniksic@srce.hr>
+       * message.el (message-encode-message-body): Insert MIME warning. 
 
-       * nnmail.el: (nnmail-get-split-group): Use `regexp-quote'
-       when file name is a part of pattern.
+       * mml.el (mml-read-tag): Look for #tag.
 
-       * nnmail.el (nnmail-crosspost-link-function): Ditto.
+       * mm-util.el (mm-find-charset-region): Check whether
+       enable-multibyte-characters is bound. 
 
-       * gnus-ems.el: Use `symbol-name' instead of `(format "%s" ...)'.
+Sun Nov 15 02:01:31 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-score.el (gnus-score-load-file): Use `regexp-quote'
-       when file name is a part of pattern.
+       * gnus.el: Pterodactyl Gnus v0.46 is released.
 
-1998-05-06  Hrvoje Niksic  <hniksic@srce.hr>
+1998-11-15 01:54:40  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-cache.el (gnus-cache-generate-active): Use `regexp-quote'
-       when file name is a part of pattern.
+       * message.el (message-encode-message-body): Insert headers at the
+       right spot.
 
-Wed Jun  3 03:13:34 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Sun Nov 15 01:13:41 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * nnfolder.el (nnfolder-delete-mail): Changed parameters.
-       (nnfolder-request-replace-article): Rename X-From-Line.
+       * gnus.el: Pterodactyl Gnus v0.45 is released.
 
-Wed Jun  3 03:10:04 1998  Dan Christensen  <jdc@chow.mat.jhu.edu>
+1998-11-15 00:28:49  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * nnfolder.el (nnfolder-adjust-min-active): Work.
+       * nndraft.el (nndraft-save-mime-part): Removed.
+       (nndraft-get-mime-part): Ditto.
 
-Mon Jun  1 05:27:28 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * message.el (message-format-mime-old): Removed.
+       (message-encode-message-body): Removed.
+       (message-encode-message-body): Renamed.
 
-       * gnus-sum.el (gnus-summary-limit-to-age): Reversed time and
-       almost collapsed space!
+1998-11-14 18:27:19  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * nnmail.el (nnmail-days-to-time): Computed wrong time.
+       * gnus-sum.el (gnus-get-newsgroup-headers): Translate \r's.
 
-Mon Jun  1 05:19:46 1998  Kim-Minh Kaplan  <KimMinh.Kaplan@utopia.eunet.fr>
+       * message.el (message-format-mime): Check message-mime-part.
 
-       * gnus-sum.el (gnus-dependencies-add-header): Break loops.
+       * mm-encode.el (mm-mime-file-types): Removed.
+       (mm-default-file-encoding): New definition.
 
-Mon Jun  1 05:13:34 1998  Fabrice POPINEAU  <popineau@esemetz.ese-metz.fr>
+Sat Nov 14 01:29:39 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus-cache.el (gnus-cache-generate-active): Regexp-quote.
+       * mm-view.el (mm-inline-image): Use mm-insert-inline.
+       * gnus-art.el (gnus-mm-display-part): Go to correct position.
 
-Mon Jun  1 04:31:23 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+Sat Nov 14 05:47:57 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus.el: Gnus v5.6.10 is released.
+       * gnus.el: Pterodactyl Gnus v0.44 is released.
 
-Mon Jun  1 03:25:33 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-11-14 03:59:14  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-art.el (gnus-button-alist): Recognize bare mailto buttons
-       for Gnus.
+       * message.el (message-format-mime): New function.
 
-       * nntp.el: Replaced all `message' calls.
+       * nndraft.el (nndraft-save-mime-part): New function.
+       (nndraft-get-mime-part): New function.
 
-Mon Jun  1 03:13:46 1998  Wolfgang Rupprecht  <wolfgang@dailyplanet.wsrcc.com>
+       * mm-encode.el (mm-default-file-encoding): New function.
+       (mm-content-transfer-encoding): New function.
+       (mm-encode-buffer): New function.
 
-       * nntp.el (nntp-encode-text): Removed spurious forward-line.
+       * message.el: New command.
+       (message-mime-part): New variable.
+       (message-insert-mime-part): New command.
 
-Sat May 23 19:44:43 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-agent.el (gnus-agent-fetch-session): Would infloop if
-       opening failed.
-
-Tue May 19 04:11:33 1998  Yoshiki Hayashi  <g740685@komaba.ecc.u-tokyo.ac.jp>
-
-       * nnheader.el (nnheader-translate-file-chars): Don't change
-       string.
+       * mm-encode.el (mm-encode-content-transfer-encoding): New
+       function. 
 
-Tue May 19 03:07:45 1998  P. E. Jareth Hein  <jareth@camelot-soft.com>
+       * mm-util.el (mm-content-transfer-encoding-defaults): New
+       variable. 
+       (mm-mime-file-types): Taken from TM.
 
-       * gnus-util.el (gnus-dd-mmm): New version.
+Sat Nov 14 01:51:06 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-Tue May 19 03:00:39 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus.el: Pterodactyl Gnus v0.43 is released.
 
-       * gnus.el: Changed address.
+1998-11-07  Karl Kleinpaste  <karl@jprc.com>
 
-Tue May 12 06:12:42 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-cus.el (gnus-score-customize): Add "Extra" element.
+       * gnus-score.el (gnus-score-default-header): Ditto.
+       (gnus-header-index): Ditto.
+       (gnus-summary-increase-score): Ditto, & process "extra" requests.
+       (gnus-summary-header): Handle extra headers.
+       (gnus-summary-score-entry): Ditto, & provide new score element.
+       (gnus-summary-score-effect): Ditto.
+       (gnus-score-string): Avoid "extra" string sort, & modify match in
+       "extra" case.
+       * gnus-sum.el (gnus-make-score-map): Add "extra" element.
 
-       * gnus-agent.el (gnus-agent-expire): Delete more.
+1998-11-13 20:30:40  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sun May 10 19:08:28 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * message.el (message-resend): Bind message-required-mail-headers
+       to nil. 
 
-       * gnus-group.el (gnus-group-read-ephemeral-group): Don't add
-       `address'.
+       * mm-view.el (mm-inline-text): Bind w3-strict-width. 
 
-Sun May  3 18:01:01 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * nngateway.el (require): Require cl.
 
-       * nnmail.el (nnmail-within-headers-p): Renamed.
+       * gnus-art.el (gnus-button-alist): Exclude more chars from news:
+       things. 
 
-       * message.el (message-cancel-news): If a Sender header doesn't
-       exist, compare From against `message-make-from'.
+Wed Nov 11 02:15:06 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-Sun May  3 15:07:25 1998  Lars Balker Rasmussen  <lbr@image.dk>
+       * gnus-agent.el (gnus-agent-fetch-headers): Create directory even
+       when no articles.
 
-       * gnus-agent.el (gnus-agent-save-group-info): Fix
-       re-search-forward params.
+1998-11-13 19:25:10  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sun May  3 15:04:02 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * message.el (message-ignored-resent-headers): Remove X-Gnus.
 
-       * gnus-agent.el (gnus-agent-expire): Check for the size.
+1998-11-10  Colin Rafferty  <colin@xemacs.org>
 
-Sat May  2 01:50:20 1998  Dan Christensen  <jdc@chow.mat.jhu.edu>
+       * gnus-sum.el (gnus-ignored-from-addresses): Only quote
+       user-mail-address if non-nil.
 
-       * nnfolder.el (nnfolder-goto-article): New version.
-       (nnfolder-read-folder): Fix.
+1998-11-13 18:50:18  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * nnmail.el (nnmail-within-headers): New function.
+       * gnus-util.el (gnus-make-sort-function): Do `reverse'.
+       (gnus-make-sort-function-1): Ditto.
 
-Sat May  2 01:36:37 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-mm-display-part): Switch to mm in right
+       window. 
 
-       * nnfolder.el (nnfolder-goto-article): Thinkotypo search arguments.
+1998-11-12 22:31:58  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * nnheader.el (nnheader-find-file-noselect): Also bind
-       `find-file-hooks' to nil.
+       * mm-util.el (mm-with-unibyte-buffer): Ditto.
 
-       * nnmail.el (nnmail-process-unix-mail-format): Don't use
-       `find-file-noselect'.
+       * binhex.el (binhex-decode-region): Quote.
 
-       * gnus-group.el (gnus-group-make-menu-bar): Typo.
+1998-11-10 05:32:28  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Fri May  1 21:59:35 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * gnus-art.el (article-decode-charset): Don't downcase charset.
 
-       * gnus.el: Gnus v5.6.9 is released.
+       * gnus-sum.el (gnus-get-newsgroup-headers-xover): Translate CR's.
 
-Fri May  1 21:54:30 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Sun Nov  8 23:17:24 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * nnfolder.el (nnfolder-goto-article): Would infloop.
+       * gnus.el: Pterodactyl Gnus v0.42 is released.
 
-Fri May  1 19:45:50 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+Sun Nov  8 02:36:33 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus.el: Gnus v5.6.8 is released.
+       * gnus-art.el (gnus-display-mime): Add id for alternative part.
 
-Fri May  1 18:51:21 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-11-08 02:24:47  Simon Josefsson  <jas@pdc.kth.se>
 
-       * nntp.el (nntp-request-newgroups): Use format-time-string.
+       * nntp.el (nntp-send-mode-reader): Revert.
 
-       * message.el (message-fetch-field): Inhibit point-motion hooks.
+Sun Nov  8 00:45:13 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-Fri May  1 18:33:06 1998  Wes Hardaker  <wjhardaker@ucdavis.edu>
+       * gnus-agent.el (gnus-agent-fetch-articles): Use with-temp-buffer.
 
-       * gnus-score.el (gnus-adaptive-word-no-group-words): New variable.
+Sat Nov  7 23:07:24 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-Fri May  1 16:56:32 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * message.el (message-make-date): Fix for negative time zones.
 
-       * gnus-agent.el (gnus-agent-expire): Put point at the start of the
-       buffer.
+Sun Nov  8 01:00:16 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-soup.el (gnus-soup-parse-areas): Check whether the file
-       exists.
+       * gnus.el: Pterodactyl Gnus v0.41 is released.
 
-       * gnus-draft.el (gnus-draft-send): Use meta-information.
+1998-11-08 00:52:38  Hrvoje Niksic  <hniksic@srce.hr>
 
-       * nnagent.el (nnagent-request-post): Store meta-information.
+       * mm-decode.el (mm-dissect-multipart): Quote regexp.
 
-       * gnus-agent.el (gnus-agent-meta-information-header): New variable.
-       (gnus-agent-insert-meta-information): New function.
+1998-10-29  Sudish Joseph  <sj@eng.mindspring.net>
 
-Fri May  1 16:43:35 1998  Paul Franklin  <paul@cs.washington.edu>
+       * gnus.el (gnus-short-group-name): When shortening foreign select
+       methods, do not scan for plusses beyond the first colon.
 
-       * message.el (message-generate-headers): Insert Sender when
-       required.
+1998-11-07  Mike McEwan  <mike@lotusland.demon.co.uk>
 
-Fri May  1 15:28:55 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-agent.el (gnus-agent-save-group-info): Cater for group info 
+       lines where `group' is the last thing on the line.
 
-       * gnus-util.el (gnus-dd-mmm): Accept "" dates.
+1998-11-08 00:35:09  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-cite.el (gnus-article-hide-citation): Don't remove button
-       when hiding.
+       * gnus-art.el (gnus-article-view-part): Do alternative.
+       (gnus-mime-display-alternative): Insert marker.
 
-       * gnus-msg.el (gnus-post-method): Allow ARG to override
-       `current'.
+1998-11-07 14:33:46  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-sum.el (gnus-remove-thread): Remove the dummy root
-       properly.
+       * mm-decode.el (mm-dissect-multipart): Quote regexp.
 
-       * nnfolder.el (nnfolder-goto-article): New function.
-       (nnfolder-retrieve-headers): Use it.
-       (nnfolder-request-article): Ditto.
+       * nnmail.el (nnmail-expired-article-p): Protect against bogus
+       dates. 
 
-Wed Apr 29 22:48:33 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * gnus-cus.el (gnus-topic): Required.
 
-       * gnus.el: Gnus v5.6.7 is released.
+       * nnheader.el (nnheader-parse-nov): Parse extra.
+       (nnheader-nov-parse-extra): New macro.
 
-Wed Apr 29 20:54:35 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-31 12:33:22  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-sum.el (gnus-summary-update-info): Bind
-       gnuis-newsgroup-scored later.
-       (gnus-summary-prepare-threads): Check some more before inserting
-       dummy roots.
+       * gnus-art.el (gnus-article-view-part): Internal move.
 
-       * gnus-cache.el (gnus-cache-enter-article): Update marks
-       properly.
+1998-10-28  Per Abrahamsen  <abraham@dina.kvl.dk>
 
-       * gnus-xmas.el (gnus-xmas-draft-menu-add): New function.
+       * gnus-cus-new.el (gnus-custom-topic): New free variable.
+       (gnus-group-customize): Support editing topic parameters.
 
-       * nntp.el (nntp-connection-timeout): Removed.
+1998-10-29 12:09:20  Karl Kleinpaste  <karl@jprc.com>
 
-       * gnus-move.el (gnus-move-group-to-server): Delete nils.
+       * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Add
+       indicators. 
 
-       * nntp.el (nntp-close-server): Close more connections.
+1998-10-29 11:31:11  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-art.el (gnus-button-alist): Accept white space after colons
-       in <URL:news:> things.
+       * gnus-art.el (gnus-mm-display-part): Return.
+       (gnus-article-view-part): Only go if external.
+       (gnus-article-dumbquotes-map): Do 205.
 
-Wed Apr 29 20:18:45 1998  Kurt Swanson  <kurt@dna.lth.se>
+       * mm-decode.el (mm-display-part): Return what was done.
 
-       * gnus-art.el (article-update-date-lapsed): Bind
-       `deactivate-mark'.
+       * message.el (message-buffer-naming-style): New variable.
+       (message-generate-new-buffers): Extended.
+       (message-buffer-naming-style): Removed.
+       (message-buffer-name): Use it.
+       (message-do-send-housekeeping): Rename new styling.
 
-       * gnus-salt.el (gnus-pick-mode-map): Moved keys around to avoid
-       shadowing.
+       * gnus-sum.el (gnus-summary-recenter): Allow
+       gnus-auto-center-summary to be a number.
 
-       * gnus-art.el (gnus-article-read-summary-keys): New version.
+Wed Nov  4 02:24:39 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus-sum.el (gnus-summary-make-menu-bar): New for article mode.
+       * pop3.el (pop3-open-server): Use "binary" instead of
+       "no-conversion".
 
-       * gnus-msg.el (gnus-post-method): `current' custom.
+Sun Nov  1 01:26:42 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-Wed Apr 29 19:04:27 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-srvr.el (gnus-browse-foreign-server): Set
+       gnus-browse-current-method to the result of gnus-server-to-method.
 
-       * gnus-sum.el (gnus-summary-set-local-parameters): Ignore
-       quit-config.
-       (gnus-select-newsgroup): Use the value of gnus-fetch-old-headers.
+Thu Oct 29 01:47:44 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * message.el (message-post-method): Doc fix.
+       * gnus-util.el (gnus-pull): Another optional argument.
+       * nnweb.el (nnweb-request-delete-group): Delete from
+       nnweb-group-alist and update active file.
 
-       * gnus.el (gnus-directory): dox fix.
+Thu Oct 29 01:05:08 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-Tue Apr 28 03:32:17 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-group.el (gnus-group-make-group): Accept group of new
+       method.
 
-       * gnus-group.el (gnus-group-timestamp): Really get timestamp.
+Wed Oct 28 02:19:16 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus.el (gnus-group-parameter-value): Use explicit iteration.
+       * gnus-agent.el (gnus-agent-fetch-group-1): Update dribble.
 
-Tue Apr 28 03:15:50 1998  Hallvard B. Furuseth  <h.b.furuseth@usit.uio.no>
+Tue Oct 27 11:59:31 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus-util.el (gnus-alive-p): Check for binding.
+       * mm-view.el (mm-inline-text): Postion of html portion.
+       
+1998-10-29 10:26:54  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Tue Apr 28 03:00:16 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * nntp.el (nntp-list-active-group): Waited for short strings.
+       (nntp-send-mode-reader): Ditto.
+       (nntp-open-connection): Ditto.
 
-       * gnus-sum.el (gnus-parent-headers): Don't infloop on nil
-       References.
+       * gnus-int.el (gnus-request-group-articles): New function.
 
-       * gnus-art.el (gnus-article-mode): Don't kill local vars.
+       * nntp.el (nntp-request-listgroup): New function.
+       (nntp-request-group-articles): Renamed.
 
-       * score-mode.el (score-mode-syntax-table): Change syntax.
+1998-10-27 10:37:52  Karl Kleinpaste  <karl@jprc.com>
 
-Mon Apr 27 00:26:01 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * nnheader.el (nnheader-parse-nov): Supply extra.
 
-       * gnus.el: Gnus v5.6.6 is released.
+1998-10-26 23:03:48  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Mon Apr 27 00:07:11 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-button-push): Don't go to
+       gnus-article-buffer. 
 
-       * gnus-art.el (gnus-request-article-this-buffer): Viewing pseudos
-       in nneething groups bugged.
+       * mm-view.el (mm-inline-image): Add a newline.
 
-       * gnus-sum.el (gnus-summary-prepare-threads): Dummy roots and
-       dormants and stuff.
+       * gnus-start.el (gnus-check-first-time-used): Check more.
 
-Sun Apr 26 23:34:40 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-26 23:03:29  Francois Felix Ingrand  <felix@laas.fr>
 
-       * gnus-cache.el (gnus-cache-file-name): Use FULL.
+       * gnus-start.el (gnus-check-first-time-used): Check current.
 
-       * nnheader.el (nnheader-translate-file-chars): Allow FULL
-       parameter.
+1998-10-26 22:07:52  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-cache.el (gnus-cache-file-name): Translate all colons.
+       * mm-util.el (mm-find-charset-region): New function.
 
-Sun Apr 26 19:27:56 1998  Justin Sheehy  <justin@linus.mitre.org>
+       * ietf-drums.el (ietf-drums-narrow-to-header): Work when no header.
 
-       * nntp.el (nntp-rlogin-parameters): Doc fix.
+       * gnus-art.el (gnus-mime-button-menu): Fix.
 
-Sun Apr 26 19:21:12 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-26 22:07:43  Michael Welsh Duggan  <md5i@cs.cmu.edu>
 
-       * gnus-art.el (gnus-summary-save-in-mail): Not a command.
+       * gnus-art.el (gnus-mime-button-menu): New definition.
 
-Sun Apr 26 19:16:03 1998  James Troup  <J.J.Troup@scm.brad.ac.uk>
+1998-10-26 01:46:11  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-sum.el (gnus-summary-expire-articles-now): Work.
+       * gnus-art.el (article-decode-charset): Downcase charset.
+       (article-decode-charset): Pass on type.
+       (article-decode-charset): Check nil charsets.
+       (article-remove-cr): Translate CR to LF.
+       (gnus-ignored-mime-types): Default to nil.
 
-Sun Apr 26 14:34:06 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * nnheader.el (nnheader-insert-nov): Work when not Xref.
 
-       * gnus-sum.el (gnus-build-sparse-threads): Break loops.
-       (gnus-summary-print-article): Save excursion to try to preserve
-       local/bound variable messup.
+       * gnus-sum.el (gnus-ignored-from-addresses): Default to
+       user-mail-address. 
+       (gnus-nov-parse-extra): Didn't return right thing.
 
-       * gnus-salt.el (gnus-tree-read-summary-keys): Put point in article
-       buffer.
+1998-10-25 23:25:27  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-undo.el (gnus-undo): New group.
-       (gnus-undo-limit): New variable.
-       (gnus-undo-register-1): Use it.
+       * gnus-xmas.el: Use compiled-function-p.
 
-       * gnus-sum.el (gnus-summary-update-info): Don't nix out scores.
+Mon Oct 26 14:37:19 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus-start.el (gnus-active-to-gnus-format): Removed "." from
-       quoting.
+       * mm-decode.el (mm-copy-Yo-buffer): Make it works when no header.
 
-       * gnus.el (gnus-cache-directory): Moved here.
-       (gnus-predefined-server-alist): Use.
+Sun Oct 25 23:11:44 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * message.el (message-autosave-directory): Put back in.
-       (message-set-auto-save-file-name): Use if Gnus isn't running.
+       * gnus.el: Pterodactyl Gnus v0.40 is released.
 
-       * gnus-util.el (gnus-alive-p): Moved here.
+1998-10-25 21:41:05  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * message.el (message-autosave-directory): Removed.
-       (message-set-auto-save-file-name): Don't use it.
+       * gnus-sum.el (gnus-summary-mark-forward): Show thread.
 
-       * gnus.el: Use gnus-buffer-exists-p throughout.
+       * gnus-start.el (gnus-check-first-time-used): Ignore dribble. 
 
-       * gnus-uu.el (gnus-uu-save-article): Use gnus-kill-buffer.
+       * gnus-agent.el (gnus-agent-fetch-group-1): Bind name.
 
-       * message.el (message-make-in-reply-to): Check more for strange
-       From lines.
+       * nnml.el (nnml-possibly-create-directory): Check before making.
 
-       * gnus-art.el (gnus-article-mode): Don't nix out vars.
+1998-10-25 19:43:08  Kai Grossjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
 
-Sun Apr 26 14:05:40 1998  Frank Bennett  <bennett@rumple.soas.ac.uk>
+       * nnheader.el (nnheader-insert-nov): Don't infloop.
 
-       * nnmail.el (nnmail-move-inbox): Push error'ed mailboxes onto the
-       list.
+1998-10-25 19:26:11  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sun Apr 26 13:01:53 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-sum.el (gnus-set-mode-line): Check that the spec has been
+       set up. 
 
-       * gnus-score.el (gnus-score-save): Use it.
+1998-10-25 19:22:03  Joerg Lenneis  <lenneis@statrix2.wu-wien.ac.at>
 
-       * score-mode.el (score-mode-syntax-table): New table.
+       * nneething.el (nneething-file-name): New definition.
 
-       * nnmbox.el: Commentary fix.
+1998-10-25 17:56:23  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sun Apr 26 12:59:00 1998  Richard Stallman  <rms@santafe.edu>
+       * gnus-art.el (gnus-treatment-function-alist): Fix.
+       (gnus-summary-save-in-rmail): Use gnus-output-to-rmail. 
 
-       * message.el (message-mode): New adaptive fill defaults.
+       * nndoc.el (nndoc-dissect-mime-parts-sub): Recognize first part. 
 
-Sun Apr 26 12:50:38 1998  Jim Radford  <radford@robby.caltech.edu>
+Sun Oct 25 06:23:13 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-start.el (gnus-active-to-gnus-format): Groups that start
-       with dots.
+       * gnus.el: Pterodactyl Gnus v0.39 is released.
 
-1998-04-11  Richard Stallman  <rms@sucrose.gnu.org>
+1998-10-25 00:34:39  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus/gnus-art.el (gnus-emphasis-alist): Use nth, not caddr.
+       * gnus-art.el (gnus-ignored-mime-types): New variable.
+       (gnus-mime-display-single): Use it.
+       (gnus-treatment-function-alist): New variable.
 
-Sat Apr 25 15:33:57 1998  Kim-Minh Kaplan  <KimMinh.Kaplan@utopia.eunet.fr>
+       * gnus.el (gnus-mime): New group.
 
-       * gnus-sum.el (gnus-build-sparse-threads): Handle loops.
+       * gnus-art.el (gnus-mime-display-alternative): Don't destroy
+       things for other parts.
+       (gnus-mime-display-alternative): Place point.
 
-Sat Apr 25 15:09:54 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus.el: autoload gnus-uu-post-news.
 
-       * gnus.el (gnus-valid-select-methods): nngateway is post-mail.
+       * mailcap.el (mailcap-mailcap-entry-passes-test): Also check
+       needsterm/DISPLAY. 
 
-Fri Apr 24 21:32:14 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * mm-decode.el (mm-display-part): Default to inline text/.*
+       parts. 
 
-       * gnus.el: Gnus v5.6.5 is released.
+       * mm-bodies.el (mm-decode-content-transfer-encoding): Default to
+       8bit. 
 
-Fri Apr 24 21:19:21 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-mime-copy-part): Use normal-mode.
+       (gnus-mime-display-single): Inline all text parts.
+       (gnus-article-narrow-to-signature): Removed mime:: stubs.
 
-       * gnus-msg.el (gnus-post-method): Doc fix.
-       (gnus-post-method): Reversed semantics.
+1998-10-24 21:38:37  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-1998-04-01  Jan Vroonhof  <vroonhof@math.ethz.ch>
+       * nnml.el (nnml-possibly-create-directory): Rewrite.
+       (nnml-request-create-group): Change to right server.
 
-       * gnus-msg.el (gnus-post-method): Customized. Added 'native
-       option. In the function, added support for new value.
+       * gnus-xmas.el (gnus-xmas-define): Use byte-code-function-p. 
 
-Fri Apr 24 20:04:15 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-sum.el (gnus-set-mode-line): Use truncate-string-to-width. 
 
-       * nnmbox.el (nnmbox-request-create-group): New function.
+       * gnus.el: rmail-output-to-rmail-file autoload.
 
-Sun Apr 12 07:55:16 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-util.el (gnus-output-to-rmail): Didn't work if not in
+       Gnus. 
 
-       * gnus-agent.el (gnus-agent-save-group-info): Only do those that
-       are covered.
+       * nnheader.el (nnheader-parse-head): Checked wrong variable.
 
-Tue Apr  7 11:26:31 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-sum.el (gnus-summary-update-mark): Ignore nil'd marks.
 
-       * nntp.el (nntp-authinfo-file): Doc fix.
+Tue Oct 20 23:37:43 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-1998-03-31  Ken Raeburn  <raeburn@cygnus.com>
+       * gnus-art.el (gnus-mime-display-mixed): Multipart in
+       mixed part.
 
-       * nnml.el (nnml-request-expire-articles): Sort active-articles,
-       then only expire the intersection of that set with the requested
-       articles.
+Tue Oct 20 23:36:43 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-Wed Apr  1 16:01:44 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-sum.el (gnus-summary-exit): Use mm-destroy-parts.
+       
+       * gnus-sum.el (gnus-summary-exit-no-update): Ditto.
 
-       * message.el (message-supersede): Check Sender.
-       (message-cancel-news): Fix Sender check.
+Tue Oct 20 16:22:51 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-Sun Mar 29 11:54:33 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-uu.el (mm-uu-dissect): Create pseudo multipart head.
 
-       * nnkiboze.el (nnkiboze-generate-group): Would mess up newsrs
-       hashtb.
-       (nnkiboze-enter-nov): Created bogus Xrefs headers.
+1998-10-24 20:51:53  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-agent.el (gnus-agent-save-group-info): New function.
+       * gnus-sum.el (gnus-valid-move-group-p): Make sure group has a
+       value. 
 
-       * gnus-start.el (gnus-get-unread-articles): Use it.
+       * gnus-art.el (gnus-article-hidden-text-p): Return nil when not
+       hidden. 
 
-       * message.el (message-expand-group): Allow completion from in the
-       middle of strings.
-       (message-font-lock-keywords): Work when mail-header-separator is
-       "".
+       * gnus-spec.el (gnus-update-format-specifications): Use the
+       article mode line spec.
 
-Sun Mar 29 09:56:00 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * gnus-art.el (gnus-insert-mime-button): Put right type.
+       (gnus-insert-prev-page-button): Ditto.
+       (gnus-insert-next-page-button): Dutti.
 
-       * gnus.el: Gnus v5.6.4 is released.
+       * pop3.el: New version installed.
 
-Sun Mar 29 09:47:58 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Sat Oct 24 16:48:51 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * nnkiboze.el (nnkiboze-request-delete-group): Would bug out when
-       deleting files.
+       * mm-uu.el (mm-uu-dissect): Delete the begining spurious newline
+       and display last part.
 
-Sat Mar 28 08:48:31 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Sat Oct 24 20:31:55 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * nntp.el (nntp-encode-text): Use `nntp-end-of-line'.
+       * gnus.el: Pterodactyl Gnus v0.38 is released.
 
-Thu Mar 26 15:29:51 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-24 07:54:58  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-agent.el (gnus-agent-expire): Check size of history file.
+       * gnus-art.el (article-mime-decode-quoted-printable-buffer):
+       Removed. 
+       (article-de-quoted-unreadable): Narrow to default.
 
-       * message.el (message-mode): Doc fix.
+       * qp.el (quoted-printable-encode-region): Encode before QP-ing.
 
-Mon Mar 23 14:21:34 1998  Mike McEwan  <mike@lotusland.demon.co.uk>
+       * gnus-art.el (article-decode-charset): Decode even when broken
+       MIME. 
 
-       * gnus-score.el (gnus-score-default-type): Doc fix.
+       * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Return
+       name. 
 
-Mon Mar 23 14:12:01 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-msg.el (gnus-copy-article-buffer): Delete headers.
 
-       * gnus-int.el (gnus-request-body): Do the same as HEAD.
+       * gnus-cache.el (gnus-cache-possibly-enter-article): Use
+       nnheader. 
 
-       * gnus-art.el (gnus-article-edit-article-hook): Removed.
+       * nnmail.el (nnmail-extra-headers): New variable.
 
-Mon Mar 23 14:09:56 1998  jari aalto  <jari.aalto@poboxes.com>
+       * nnheader.el (nnheader-insert-nov): Insert extra.
 
-       * gnus-art.el (gnus-article-edit-article-hook): New hook.
+       * gnus.el (gnus-summary-line-format): Doc fix.
 
-1998-03-19  Jan Vroonhof  <vroonhof@math.ethz.ch>
+       * gnus-sum.el (gnus-get-newsgroup-headers): Parse extra.
+       (gnus-nov-parse-line): Ditto.
+       (gnus-nov-parse-extra): New macro.
+       (gnus-header): New function.
+       (gnus-update-summary-mark-positions): Change.
+       (gnus-ignored-from-addresses): New variable.
+       (gnus-summary-insert-from-or-to): New function.
 
-       * nntp.el (nntp-open-rlogin): Wrap in save-excursion
+       * gnus.el (gnus-extra-headers): New variable.
 
-Thu Mar 19 16:43:59 1998  Joe Buehler  <jhpb@hekimian.com>
+       * nnheader.el (make-mail-header): Expand.
+       (mail-header-extra): New macro.
+       (mail-header-set-extra): Ditto.
+       (make-full-mail-header): Expand.
 
-       * gnus-util.el (gnus-date-iso8601): Use simple string.
+Sat Oct 24 07:41:42 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-Thu Mar 19 15:18:00 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * gnus.el: Pterodactyl Gnus v0.37 is released.
 
-       * gnus.el: Gnus v5.6.3 is released.
+1998-10-24 07:29:11  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Thu Mar 19 15:09:14 1998  Wes Hardaker  <wjhardaker@ucdavis.edu>
+       * mm-bodies.el (mm-decode-body): Check for multibyticity.
 
-       * gnus-win.el (gnus-delete-windows-in-gnusey-frames): Make sure
-       there are no nil buffers.
+       * mm-util.el (mm-enable-multibyte): Don't always switch multibyte
+       on. 
 
-1998-03-17  Per Abrahamsen  <abraham@dina.kvl.dk>
+1998-10-22  Didier Verna  <verna@inf.enst.fr>
 
-       * gnus-uu.el (gnus-uu-digest-headers): Add `Content-Type' and
-       `Content-Transfer-Encoding'.
+       * gnus-spec.el (gnus-balloon-face-function): new function
+       (gnus-parse-format): understand the %< %> specifiers
+       (gnus-parse-complex-format): ditto.
 
-1998-03-18  Per Abrahamsen  <abraham@dina.kvl.dk>
+1998-10-24 06:31:33  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * message.el (message-header-lines): Added `:format'.
+       * gnus.el: Changed following-char to char-after throughout.
 
-1998-03-18  Simon Josefsson  <jas@pdc.kth.se>
+1998-10-22 04:05:55  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * nndoc.el: dummy request-accept-article
+       * mm-decode.el (mm-display-external): Protect more and message. 
 
-Thu Mar 19 14:10:25 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Wed Oct 21 03:26:30 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus-sum.el (gnus-summary-next-subject): Expand threads.
+       * gnus-xmas.el (gnus-xmas-article-push-button): Go to the
+       position.
 
-       * gnus-agent.el (gnus-agent-group-mode-hook,
-       gnus-agent-summary-mode-hook): New variables.
-       (gnus-agent-mode): Run them.
+Tue Oct 20 23:37:43 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-1998-03-14  SL Baur  <steve@altair.xemacs.org>
+       * gnus-art.el (gnus-mime-display-mixed): Multipart in
+       mixed part.
 
-       * gnus-xmas.el (gnus-xmas-group-startup-message): Tell gnus-start
-       we've already drawn the pretty Gnu graphic.
+Tue Oct 20 23:36:43 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-Thu Mar 19 12:44:12 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-sum.el (gnus-summary-exit): Use mm-destroy-parts.
+       
+       * gnus-sum.el (gnus-summary-exit-no-update): Ditto.
 
-       * gnus-msg.el: Would use nil group names.
+Tue Oct 20 16:22:51 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * nntp.el (nntp-send-authinfo): Send authinfo to "force"d
-       servers.
+       * mm-uu.el (mm-uu-dissect): Create pseudo multipart head.
 
-       * gnus-util.el (gnus-parse-netrc): Accept the "force" token.
+1998-10-21  Hrvoje Niksic  <hniksic@srce.hr>
 
-       * message.el (message-cancel-news): Compare Sender header, not
-       From header.
+       * mailcap.el (mailcap-save-binary-file): Use unwind-protect.
 
-Tue Mar 17 15:07:18 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el (mm-display-external): Set undisplayer to mm
+       buffer, not the current buffer; use unwind-protect.
 
-       * gnus-art.el (article-hide-headers): Fold case.
+1998-10-21 00:07:59  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sat Mar 14 17:57:35 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-sum.el (gnus-summary-exit): Destroy parts.
+       (gnus-summary-exit-no-update): Ditto.
 
-       * gnus-util.el (gnus-horizontal-recenter): New window-end may
-       return nil.
+1998-10-20 22:02:05  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Fri Mar 13 22:12:30 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el (mm-inline-media-tests): Look for w3.
 
-       * gnus-agent.el (gnus-agent-fetch-session): Check whether server
-       is up before fetching.
+       * mailcap.el (mailcap-mime-data): Inline html.
 
-       * gnus-win.el (gnus-window-frame-focus): New variable.
-       (gnus-configure-windows): Use it.
+Tue Oct 20 20:25:03 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-sum.el (gnus-summary-catchup-and-exit): Don't select next
-       when in an ephemeral group.
+       * gnus.el: Pterodactyl Gnus v0.36 is released.
 
-       * gnus-agent.el (gnus-agent-expire): Message end.
-       (gnus-agent-expire-all): New variable.
-       (gnus-agent-expire): Use it.
+1998-10-20 18:13:08  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Fri Mar 13 22:07:17 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
+       * gnus-art.el (article-translate-strings): 
+       (gnus-article-dumbquotes-map): Don't dot.
 
-       * gnus-agent.el (gnus-agent-high-scored-p): Wrong value.
+       * pop3.el (pop3-open-server): Set point right.
 
-Fri Mar 13 21:10:24 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el (mm-dissect-multipart): Dissect hierarchically. 
+       (mm-dissect-buffer): Ditto.
+       (mm-destroy-part): Ignore non-handles.
+       (mm-remove-part): Ditto.
+       (mm-destroy-parts): New function.
+       (mm-remove-parts): Ditto.
 
-       * nnvirtual.el (nnvirtual-request-group): Force updating of info.
+       * gnus-art.el (gnus-mm-display-part): Don't move point.
 
-Sun Mar  8 20:46:51 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Tue Oct 20 02:16:36 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * nnmail.el (nnmail-delete-incoming): Changed default.
+       * mm-uu.el : New file.
+       
+       * gnus-art.el (gnus-display-mime): Dissect uu stuffs.
+       
+       * mm-bodies.el (mm-decode-content-transfer-encoding): Encoding as
+       a function.
 
-Sun Mar  8 14:05:25 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-10-20 00:35:05  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.el: Gnus v5.6.2 is released.
+       * mm-decode.el (mm-display-external): Check before selecting.
 
-Sun Mar  8 00:35:09 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Sat Sep 26 02:03:00 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus-picon.el (gnus-get-buffer-name): Look in the assoc for the
+       * gnus-sum.el (gnus-multi-decode-encoded-word-string): Rewrite. 
+       
+       * gnus-sum.el (gnus-decode-encoded-word-methods): New variable.
+       
+       * gnus-sum.el (gnus-decode-encoded-word-methods-cache): New
        variable.
+       
+       * gnus-sum.el (gnus-encoded-word-method-alist): Deleted.
+       
+       * gnus-art.el (gnus-decode-header-methods): New variable.
 
-       * nntp.el (nntp-wait-for): Check more for dead connections.
-
-       * gnus-eform.el (gnus-edit-form-buffer): Moved back here.
-
-       * gnus-win.el (gnus-window-to-buffer-helper): Return nil when
-       buffers don't exist.
-
-       * nndraft.el (nndraft-request-restore-buffer): Remove Xref header,
-       not Xrefs.
-
-Sun Mar  8 00:00:04 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Gnus v5.6.1 is released.
-
-Sat Mar  7 22:15:46 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.el (gnus-edit-form-buffer): Moved here.
-
-       * gnus-agent.el (gnus-agent-expire-old): Removed.
-       (gnus-agent-expire-directory): Ditto.
-       (gnus-agent-expire-group): Even more ditto.
-
-Sat Mar  7 21:59:18 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Quassia Gnus v0.37 is released.
-
-Sat Mar  7 20:10:42 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-agent.el (gnus-agent-expire-days): New variable.
-       (gnus-agent-expire): New function.
-
-Sat Mar  7 17:35:53 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Quassia Gnus v0.36 is released.
-
-Sat Mar  7 17:29:20 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * nntp.el (nntp-wait-for): Reversed logic.
-
-Sat Mar  7 17:19:04 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Quassia Gnus v0.35 is released.
-
-Sat Mar  7 15:01:57 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-picon.el (gnus-picons-x-face-sentinel): Check whether
-       gnus-picons-x-face-file-name exists.
-
-       * gnus-art.el (gnus-article-read-summary-keys): Move window point
-       in the summary buffer.
-
-       * nndoc.el (nndoc-type-alist): Allow spaces around separator.
-
-       * gnus-sum.el (gnus-summary-edit-parameters): Interactive.
-
-Sat Mar  7 15:00:05 1998  Wes Hardaker  <wjhardaker@ucdavis.edu>
-
-       * gnus-art.el (gnus-article-prepare): Mark articles as
-       downloadable.
-
-Wed Mar  4 22:33:27 1998  Ken Raeburn  <raeburn@cygnus.com>
-
-       * gnus-int.el (gnus-get-function): New version, caches symbol
-       names.
+       * gnus-art.el (gnus-decode-header-methods-cache): New variable.
 
-Fri Mar  6 01:10:22 1998  Ken Raeburn  <raeburn@cygnus.com>
+       * gnus-art.el (gnus-multi-decode-header): New function.
+       
+Tue Oct 20 00:24:16 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * nnml.el (nnml-article-to-file): Build pathname using
-       expand-file-name.  (Thanks, Colin Rafferty, for catching
-       this.)
+       * gnus.el: Pterodactyl Gnus v0.35 is released.
 
-Sat Feb 28 23:33:40 1998  Ken Raeburn  <raeburn@cygnus.com>
+1998-10-20 00:00:36  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * nnml.el (nnml-article-to-file): Don't add extra "/" when
-       building pathname.
+       * uudecode.el (uudecode-decode-region-external): Insert
+       literally. 
 
-       * nnheader.el (nnheader-file-to-number): Check value of
-       nnheader-numerical-short-files instead of checking if jka-compr is
-       loaded.
+       * gnus-xmas.el (gnus-xmas-mime-button-menu): Moved here.
 
-1998-03-03  Dave Love  <d.love@dl.ac.uk>
+       * mm-bodies.el (mm-decode-body): Optional encoding.
 
-       * nnheader.el (nnheader-parse-head): Fix in-reply-to code. Return
-       nil consistently if not found.
+1998-10-19 23:57:57  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sat Mar  7 13:50:44 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-ems.el (gnus-mouse-3): New variable.
 
-       * nntp.el: Check whether the connection died.
+       * binhex.el (binhex-decode-region-external): Don't use -internally.
 
-1998-03-01  Kim-Minh Kaplan  <KimMinh.Kaplan@utopia.eunet.fr>
+1998-10-16 14:54:02  Simon Josefsson  <jas@pdc.kth.se>
 
-       * gnus.texi (Easy Picons): Removed references to
-       `gnus-group-display-picons'.
-       (Hard Picons): Ditto.
-
-Mon Mar  2 16:17:36 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-sum.el (gnus-summary-exit-no-update): Run
-       gnus-summary-prepare-exit-hook here as well.
-
-Sat Feb 28 13:35:26 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * nntp.el (nntp-authinforc-file): Changed default.
-       (nntp-authinfo-file): Changed name.
-       (nntp-record-commands): New variable.
-       (nntp-record-command): New function.
-
-       * gnus-agent.el (gnus-agent-group-path): Use real name of group.
-
-       * gnus-sum.el (gnus-summary-insert-subject): Don't allow nil
-       articles.
-       (gnus-summary-read-group): Respect backward movement.
-
-1998-03-01  Kim-Minh Kaplan  <KimMinh.Kaplan@utopia.eunet.fr>
-
-       * gnus-win.el (gnus-window-to-buffer): change "*Picons*" to
-       `gnus-picons-buffer'.
-       (gnus-window-to-buffer-helper): Support dynamic picon buffer
-       name (i.e a symbol that names a function to be called).
-       (gnus-configure-frame): Use it.
-       (gnus-delete-windows-in-gnusey-frames): Use it.
-       (gnus-all-windows-visible-p): Use it.
-       (gnus-remove-some-windows): Use it.
-
-       * gnus-picon.el (gnus-get-buffer-name): Use it.
-       (gnus-picons-kill-buffer): New function.
-       (gnus-picons-setup-buffer): New function.
-       (gnus-picons-set-buffer): Use them.
-       (gnus-picons-display-x-face): Put back the `buf' binding: it is
-       needed when `gnus-picons-display-where' is not set to article.
-       Also move the X-Face to the left, near the address.  It seems more
-       logical.
-
-Sat Feb 28 08:27:20 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Quassia Gnus v0.34 is released.
-
-Sat Feb 28 08:17:37 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Quassia Gnus v0.33 is released.
-
-Sat Feb 28 08:10:27 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-picon.el (gnus-picons-display-x-face): `buf' -- unbound
-       var.
-
-Sat Feb 28 08:03:23 1998  François Pinard  <pinard@iro.umontreal.ca>
-
-       * gnus: configure'd.
-
-Sat Feb 28 07:43:00 1998  Nelson Jose dos Santos Ferreira  <Nelson.Ferreira@inesc.pt>
-
-       * nnsoup.el (nnsoup-store-reply): Fix double sep error.
-
-Sat Feb 28 07:01:17 1998  Lasse Rasinen  <lrasinen@iki.fi>
-
-       * gnus-start.el (gnus-ask-server-for-new-groups): Message more.
-
-Fri Feb 27 13:26:34 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mailcap.el (mailcap-parse-mailcaps): Only open regular
+       files.
 
-       * message.el (message-resend): Allow arbitrary Also's.
+1998-09-26 22:28:01  Simon Josefsson  <jas@pdc.kth.se>
 
-1998-02-27  Dave Love  <d.love@dl.ac.uk>
+       * gnus-group.el (gnus-add-marked-articles): Request backend update
+       of flags.
 
-       * gnus-sum.el (gnus-simplify-subject-functions): Fix
-       customization, doc.
+1998-09-26 19:39:31  Simon Josefsson  <jas@pdc.kth.se>
 
-1998-02-25  Dave Love  <d.love@dl.ac.uk>
+       * gnus-sum.el (gnus-update-read-articles): 
+       (gnus-update-marks): Request backend update of mark.
 
-       * gnus-art.el (gnus-article-x-face-command): Replace leading `{'.
+1998-09-26 19:33:58  Simon Josefsson  <jas@pdc.kth.se>
 
-Mon Feb 23 18:26:48 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus.texi (Optional Backend Functions): New item,
+       nnchoke-request-set-mark.
 
-       * gnus-agent.el (gnus-plugged): New command and keystroke.
+1998-09-26 16:27:27  Simon Josefsson  <jas@pdc.kth.se>
 
-       * gnus-ems.el (gnus-ems-redefine): Define
-       'gnus-summary-set-display-table as a function that takes no
-       params.
+       * gnus-range.el (gnus-remove-from-range): Don't add stuff in
+          list to range.
 
-       * gnus.el (gnus-interactive): Don't use gnus-sum macros.
-       (gnus-valid-select-methods): Include nnlistserv.
+1998-10-19 23:45:13  Simon Josefsson  <jas@pdc.kth.se>
 
-       * gnus.el: Autoloaded things to make byte-comp silent.
+       * gnus-sum.el (gnus-summary-exit-no-update): Don't expire.
 
-Mon Feb 23 18:06:47 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-10-14  SL Baur  <steve@altair.xemacs.org>
 
-       * gnus.el: Quassia Gnus v0.32 is released.
+       * gnus-sum.el: Move gnus-save-hidden-threads above where it is
+       first used.
 
-Mon Feb 23 17:48:42 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-10  SL Baur  <steve@altair.xemacs.org>
 
-       * gnus-cite.el (gnus-article-hide-citation-maybe): Wrong
-       interactive specs.
-       (gnus-cite-toggle): Maybe parse.
+       * mm-view.el: Require mm-decode for macros.
 
-Mon Feb 23 05:26:11 1998  Rui-Tao Dong ~{6-HpLN~}  <rdong@internetmci.com>
+       * mm-decode.el (mm-handle-type): Move macro declarations above the
+       place where they are used.
 
-       * nnweb.el (nnweb-type-definition): Fixed.
+Sun Oct 18 13:59:07 1998  Kurt Swanson  <ksw@dna.lth.se>
 
-Sun Feb 22 18:10:53 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+        * gnus-msg.el (gnus-summary-mail-forward): Erase old forward
+        buffer.
 
-       * gnus-agent.el (gnus-agent-group-path): Translate right chars.
-       (gnus-agent-toggle-plugged): Allow proper closing.
+1998-10-19 23:38:11  Katsumi Yamaoka  <yamaoka@ga.sony.co.jp>
 
-       * gnus-srvr.el (gnus-browse-read-group): Allow entering
-       non-ephemeral groups.
+       * nnagent.el (nnagent-open-server): Error message.
 
-Sun Feb 22 04:21:15 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-10-19 23:35:08  Joerg Lenneis  <lenneis@statrix2.wu-wien.ac.at>
 
-       * gnus.el: Quassia Gnus v0.31 is released.
+       * nnheader.el (nnheader-article-p): Recognize lower-case headers. 
 
-Sun Feb 22 02:09:35 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-19  Hrvoje Niksic  <hniksic@srce.hr>
 
-       * gnus-sum.el (gnus-summary-highlight): Give undownloaded marks a
-       better face.
+       * score-mode.el (gnus-score-mode-map): Ditto.
 
-       * gnus-score.el (gnus-score-set): Take optional "warn".
-       (gnus-summary-score-entry): Use it.
+       * message.el (message-mode-map): Ditto.
 
-       * gnus.el: Removed spurious * in defcustoms.
+       * gnus-uu.el (gnus-uu-post-news): Ditto.
 
-       * gnus-score.el (gnus-score-load-file): Reverse logic.
+       * gnus-kill.el (gnus-kill-file-mode-map): Ditto.
 
-       * gnus-cite.el (gnus-article-hide-citation): Use markers to make
-       things work when wrapping.
+       * gnus-eform.el (gnus-edit-form-mode-map): Ditto.
 
-       * gnus-sum.el (gnus-summary-exit): Stop prefetch.
+       * gnus-art.el (gnus-article-edit-mode-map): Use
+       `set-keymap-parent' rather than `copy-keymap'.
 
-Sat Feb 21 02:12:42 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-18  Hrvoje Niksic  <hniksic@srce.hr>
 
-       * gnus-sum.el (gnus-get-newsgroup-headers): Buggy regexp.
+       * gnus-art.el (gnus-mime-button-commands): New variable.
+       (gnus-mime-button-map): Initialize it from
+       `gnus-mime-button-commands'.
+       (gnus-mime-button-menu): New function.
+       (gnus-insert-mime-button): Use `gnus-mime-button-map'.
 
-Sat Feb 21 00:51:22 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-10-11  Hrvoje Niksic  <hniksic@srce.hr>
 
-       * gnus.el: Quassia Gnus v0.30 is released.
+       * message.el (message-insert-to): Make `nobody' and `poster'
+       synonymous to `never' and `always' in Mail-Copies-To.
+       (message-reply): Ditto.
+       (message-followup): Ditto.
 
-Sat Feb 21 00:09:14 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-19 23:17:41  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-sum.el (gnus-summary-mark-article): Don't do anything if
-       the mark doesn't change.
+       * mailcap.el (mailcap-mime-data): Save sound.
 
-       * gnus-art.el (gnus-article-prepare): Don't enter article into
-       cache.
+1998-09-24  Hrvoje Niksic  <hniksic@srce.hr>
 
-       * gnus-sum.el (gnus-summary-reparent-thread): Don't mark as read.
-       (gnus-summary-mark-article): Don't do cache things here.
+       * message.el (message-ignored-supersedes-headers): Include
+       `NNTP-Posting-Date'.
 
-       * gnus-util.el (gnus-parse-netrc): Skip past macdefs.
+1998-10-19 01:25:27  Jonas Steverud  <d4jonas@dtek.chalmers.se>
 
-Fri Feb 20 22:56:22 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-article-dumbquotes-table): New variable.
 
-       * gnus-srvr.el (gnus-browse-unsubscribe-group): Wouldn't allow
-       unsubscription.
+1998-10-19 00:50:22  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-sum.el (gnus-summary-insert-subject): Allow inserting
-       articles outside limits.
+       * mm-bodies.el (mm-decode-content-transfer-encoding): Use
+       uudecode. 
 
-       * gnus-start.el (gnus-dribble-enter): Update mode line.
+1998-10-18 18:20:34  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-srvr.el (gnus-browse-unsubscribe-group): Allow
-       unsubscription.
+       * mm-decode.el (mm-display-external): Don't switch on save.
 
-       * gnus-picon.el (gnus-article-display-picons): Check that the
-       extents are live first.
+1998-10-18 18:14:06  Andy Piper  <andyp@parallax.co.uk>
 
-Thu Feb 19 15:13:44 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * nnmail.el (nnmail-movemail-args): New variable.
 
-       * gnus-group.el (gnus-useful-groups): Include gnus-bug.
+1998-10-18 00:17:02  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Thu Feb 19 02:28:17 1998  Jens-Ulrik Holger Petersen  <petersen@kurims.kyoto-u.ac.jp>
+       * gnus-art.el (article-translate-strings): 
 
-       * gnus.el (gnus-group-history): Defined twice.
+1998-10-17 22:51:31  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Thu Feb 19 01:58:47 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-article-view-part): Use it.
+       (gnus-mm-display-part): New function.
+       (article-de-quoted-unreadable): Yse mm-default-coding-system.
 
-       * gnus-sum.el (gnus-get-newsgroup-headers): Just use the header
-       value.
-       (gnus-summary-exit): Set global vars.
+       * mm-decode.el (mm-handle-displayed-p): New function.
 
-Tue Feb 17 07:17:49 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-mime-copy-part): Create better names.
+       (gnus-mime-button-line-format): Include dots spec.
 
-       * gnus-sum.el (gnus-summary-stop-page-breaking): Mark page as no
-       longer broken.
-       (gnus-summary-exit): Purge the real name.
+1998-10-15  Matt Pharr  <mmp@graphics.stanford.edu>
 
-Tue Feb 17 07:00:43 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+      * gnus-msg.el (gnus-summary-mail-forward): Erase contents of old
+      forward buffer first.
 
-       * gnus.el: Quassia Gnus v0.29 is released.
+1998-10-17 21:16:46  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Tue Feb 17 06:15:03 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-util.el (gnus-set-window-start): New function.
 
-       * nnmail.el (nnmail-purge-split-history): List of alists, not
-       alist.
+       * message.el (message-send): Don't check changed.
 
-Mon Feb 16 20:22:04 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-10-12 15:26:41  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.el: Quassia Gnus v0.28 is released.
+       * gnus-art.el (gnus-article-setup-buffer): Set params.
 
-1998-02-16  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el (mm-user-display-methods): Inline
+       "message/delivery-status". 
 
-       * message.el (message-dont-send): Make sure the article really is
-       saved.
+1998-10-11 07:06:38  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * nnmail.el (nnmail-purge-split-history): Alist; not a list of
-       alists.
+       * message.el (message-auto-save-directory): Rename.
+       (message-mode): Dof fix.
 
-1998-02-16  Hrvoje Niksic  <hniksic@srce.hr>
+       * gnus-art.el (gnus-summary-save-in-pipe): Default to "cat".
+       (gnus-summary-save-in-pipe): No, check gnus-last-shell-command. 
 
-       * message.el (message-kill-to-signature): Do the right thing when
-       there is no signature.
+       * nndoc.el (nndoc-mime-parts-type-p): Be a bit more forgiving.
 
-1998-02-16  Hrvoje Niksic  <hniksic@srce.hr>
+       * message.el (message-make-date): Avoid locale.
 
-       * message.el (message-elide-elipsis): Add type and group.
-       (message-elide-region): Docfix.
+       * gnus-art.el (gnus-article-edit-done): Allow update before doing
+       cache. 
 
-1998-02-16  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el (mm-display-inline): Goto point-min.
 
-       * gnus-util.el (gnus-run-hooks): Use unwind-protect instead of
-       save-excursion.
+       * gnus-art.el (gnus-article-prepare-display): Not read-only.
 
-1998-02-16  Per Abrahamsen  <abraham@dina.kvl.dk>
+       * mm-decode.el (mm-display-external): Reverse before sorting.
 
-       * nntp.el (nntp-authinforc-file): Customized.
+       * gnus-draft.el (gnus-draft-send): Allow mail.
 
-Mon Feb 16 03:18:33 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-10 -SL Baur  <steve@altair.xemacs.org>
 
-       * gnus-nocem.el (gnus-nocem-unwanted-article-p): Don't look if the
-       hashtable doesn't exist.
+       * message.el (message-check): Move message-check macro above where 
+       it is first used.
 
-       * gnus-start.el (gnus-ask-server-for-new-groups): Make sure the
-       killed groups hashtable exists.
+       * gnus-art.el (article-hide-pgp): Hide the PGP 5/GNUPG Hash: line.
 
-Sun Feb 15 23:02:11 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-11 06:45:37  Lloyd Zusman  <ljz@asfast.com>
 
-       * nntp.el (nntp-authinforc-file): Changed name and default.
-       (nntp-send-authinfo): Use it.
+       * gnus-sum.el (gnus-summary-make-menu-bar): Fix.
 
-Sun Feb 15 19:50:10 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+Sun Oct 11 02:28:40 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus.el: Quassia Gnus v0.27 is released.
+       * gnus.el: Pterodactyl Gnus v0.34 is released.
 
-Sun Feb 15 19:41:14 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-11 02:15:41  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.el (gnus-ephemeral-servers): New variable.
-       * gnus-srvr.el (gnus-server-prepare): Use it.
-       * gnus-group.el (gnus-group-read-ephemeral-group): Ditto.
+       * mm-decode.el (mm-inline-media-tests): delivery-status.
 
-Sun Feb 15 19:35:11 1998  Kurt Swanson  <kurt@dna.lth.se>
+       * mm-view.el (mm-inline-text): Provide default.
 
-       * gnus-art.el (gnus-article-read-summary-keys): Go to top on
-       some.
+1998-10-11 01:01:37  Lloyd Zusman  <ljz@asfast.com>
 
-Sun Feb 15 19:26:21 1998  SeokChan LEE  <chan@xfer.kren.nm.kr>
+       * mailcap.el (mailcap-possible-viewers): Fix nils.
 
-       * message.el (message-ignored-supersedes-headers): Fix.
+1998-10-11 00:03:37  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sun Feb 15 18:39:15 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-article-edit-exit): Don't do updates.
+       (article-update-date-lapsed): Record the buffer.
+       (article-update-date-lapsed): Do all windows that display article
+       buffers. 
 
-       * gnus-salt.el (gnus-tree-close): Start killing buffer again.
+       * nnml.el (nnml-generate-nov-databases-1): Ditto.
 
-       * gnus-sum.el (gnus-mark-article-as-read): Return t.
+       * gnus-score.el (gnus-score-score-files-1): Ignore dotted files. 
 
-       * gnus-art.el (gnus-article-edit-mode): Run text mode hook.
+       * gnus-art.el (gnus-insert-mime-button): Mark buttons as
+       annoations. 
 
-Sun Feb 15 17:31:19 1998  Roland Roberts  <rroberts@muller.com>
+       * gnus-msg.el (gnus-summary-mail-forward): Decode properly.
 
-       * gnus-sum.el (gnus-nov-parse-line): Would bug out on bogus
-       References headers.
+1998-10-10 22:07:03  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sun Feb 15 14:23:51 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-agent.el (gnus-category-add): Change default category to
+       'false. 
 
-       * gnus-art.el (gnus-article-current-summary): New variable.
-       (gnus-article-mode): Make it local.
+       * nnvirtual.el (nnvirtual-update-read-and-marked): Don't nix out
+       scores. 
 
-       * gnus-score.el (gnus-summary-increase-score): Find the right
-       global score file.
+       * gnus-draft.el (gnus-draft-send): Check server more.
 
-       * gnus-start.el (gnus-setup-news): Don't find new newsgroups
-       unless plugged.
+       * gnus-art.el (gnus-article-view-part): New command and keystroke.
+       (gnus-article-goto-part): New function.
 
-       * message.el (message-mode): Set font-lock things before running
-       mode hook.
+       * mm-view.el (mm-inline-text): Insert richtext properly.
 
-       * gnus-agent.el (gnus-agent-group-path): Respect long file names.
+       * gnus-art.el (gnus-insert-mime-button): Store handle in alist. 
 
-Sat Feb 14 21:31:25 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-03 15:04:27  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-sum.el (gnus-summary-goto-last-article): Force jumping to
-       articles outside limit.
+       * parse-time.el (parse-time-rules): Accept dates far into the past
+       and the future, and parse single-digit numbers as years.
 
-       * gnus-agent.el (gnus-agent-toggle-plugged): un/plug before hook.
+1998-10-02 04:46:46  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sat Feb 14 21:08:03 1998  Kim-Minh Kaplan  <KimMinh.Kaplan@utopia.eunet.fr>
+       * mm-decode.el (mm-display-external): Chop off directories.
 
-       * gnus-xmas.el (gnus-xmas-article-display-xface): t t would make
-       faces disappear.
+1998-10-01 07:33:35  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sat Feb 14 20:52:34 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * uudecode.el (uu-decode-region-external): Use
+       insert-file-contents-literally. 
 
-       * nntp.el (nntp-netrc-file): New variable.
+       * gnus-cache.el (gnus-cache-generate-active): Translate _ to :.
 
-Sat Feb 14 19:28:01 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-10-01 07:02:11  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus.el: Quassia Gnus v0.26 is released.
+       * uudecode.el: New file.
 
-Sat Feb 14 18:40:55 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-bodies.el (mm-decode-content-transfer-encoding): Do
+       x-uuencode. 
 
-       * gnus-agent.el (gnus-agent-directory): Translate file chars.
+1998-10-01 05:19:35  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-sum.el (gnus-summary-print-article): Don't display all
-       headers.
-       (gnus-summary-edit-parameters): New command and keystroke.
+       * gnus-art.el (gnus-mime-display-alternative): Set faces.
 
-       * gnus-group.el (gnus-group-rename-group): Mark dribble.
+       * message.el (message-fetch-field): Unfold properly.
 
-Sat Feb 14 18:39:45 1998  Fred Oberhauser  <foberhauser@psipenta.de>
+       * mm-bodies.el (mm-decode-content-transfer-encoding): Replace CRLF
+       in text/plain.
 
-       * nnmail.el (nnmail-process-babyl-mail-format): Fix point
-       movement.
+1998-09-30 05:47:49  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sat Feb 14 18:31:39 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-sum.el (gnus-summary-first-unread-subject): New command.
+       (gnus-auto-select-first): Removed.
+       (gnus-auto-select-first): Extended.
+       (gnus-summary-read-group-1): Use new value.
 
-       * gnus.el (gnus-group-get-parameter): Dix fix.
+1998-09-29 13:21:06  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sat Feb 14 18:29:12 1998  Kim-Minh Kaplan  <KimMinh.Kaplan@utopia.eunet.fr>
+       * message.el (message-fix-before-sending): Space.
 
-       * gnus-picon.el: Updated documentation.
+       * nnmail.el (nnmail-find-file): Don't erase.
 
-Sat Feb 14 18:26:53 1998  Joev Dubach  <dubach@dcepea.harvard.edu>
+Wed Sep 30 23:49:03 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * nntp.el (nntp-send-authinfo-from-file): Doc fix.
+       * gnus-agent.el (gnus-agent-fetch-headers): Do not decode headers.
 
-Sun Jan 11 23:44:12 1998  Ken Raeburn  <raeburn@cygnus.com>
+Wed Sep 30 23:46:29 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * nnagent.el (nnagent-request-update-info): New no-op fn.
+       * gnus-soup.el (gnus-soup-add-article): Do not decode headers.
 
-Sat Feb 14 17:41:44 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Wed Sep 30 23:44:08 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus-srvr.el (gnus-browse-unsubscribe-group): Wouldn't allow
-       subscription of visited groups.
+       * gnus-soup.el (gnus-soup-pack-packet): Pack only if necesary.
 
-       * gnus-util.el (gnus-run-hooks): New function.
-       Use it everywhere.
+Sat Sep 26 03:04:18 1998  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * nntp.el (nntp-authinfo-password): New variable.
-       (nntp-send-authinfo): Cache authinfo password.
+       * mm-util.el (mm-with-unibyte-buffer): Make it work in XEmacs
+       20.4.
 
-       * gnus-sum.el (gnus-summary-mark-article-as-unread): Don't do
-       anything if the mark doesn't change.
+1998-09-29 11:35:09  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-1998-01-17  Simon Josefsson  <jas@pdc.kth.se>
+       * gnus-art.el (gnus-mime-view-all-parts): New command and
+       keystroke. 
 
-       * gnus-sum.el (gnus-summary-work-articles): change buffer
-       before looking at marked articles
-       (gnus-summary-work-articles): better check of marked articles
+       * mm-decode.el (mm-display-external): Translate slashes.
 
-Sat Feb 14 15:10:36 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * nnmail.el (nnmail-find-file): Restrict auto-mode-alist.
 
-       * nntp.el (nntp-send-authinfo): Use new .netrc functionality.
+       * nndraft.el (nndraft-retrieve-headers): Don't copy so much. 
 
-       * gnus-util.el (gnus-netrc-syntax-table): New variable.
-       (gnus-parse-netrc): New function.
-       (gnus-netrc-machine): Ditto.
-       (gnus-netrc-get): Ditto.
+       * mm-decode.el (mm-quote-arg): Quote spaces.
+       (mm-display-external): Quote args.
 
-       * gnus-draft.el (gnus-draft-make-menu-bar): Added deletion.
+1998-09-24 22:27:55  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.el (gnus-expert-user): Dix fox.
+       * mm-decode.el (mm-inlinable-part-p): New function.
 
-       * nnmail.el (nnmail-article-group): Remove duplicates from split.
+1998-09-25 22:28:01  Simon Josefsson  <jas@pdc.kth.se>
 
-       * message.el (message-check-news-header-syntax): Check more on
-       Message-ID.
+       * mm-util.el (mm-disable-multibyte): New function.
 
-       * nnmh.el: Don't call nnmail-activate.
+Thu Sep 24 20:28:31 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus.el: User-variabelize all custom vars.
+       * gnus.el: Pterodactyl Gnus v0.33 is released.
 
-Fri Feb 13 22:40:39 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-09-24 18:47:31  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.el: Quassia Gnus v0.25 is released.
+       * gnus-art.el (gnus-insert-mime-button): Get buffer size.
 
-Fri Feb 13 19:01:19 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el (mm-display-external): Don't switch for externals. 
+       (mm-dissect-multipart): Don't include end-sep.
 
-       * nndoc.el (nndoc-type-alist): Allow blank lines to separate
-       headers from bodies.
+       * mm-util.el (mm-get-coding-system-list): New function.
+       (mm-coding-system-list): New variable.
 
-       * gnus-art.el (gnus-article-edit): Restore Date header.
+Thu Sep 24 02:08:10 1998  ZHU Shenghuo  <zsh@cs.rochester.edu>
 
-       * gnus-async.el (gnus-asynch-obarray): New variable.
-       (gnus-async-prefetched-article-entry): Use it.
-       (gnus-async-set-buffer): Use it.
+       * gnus-cus.el (gnus-group-parameters): Add charset as a parameter
 
-       * nnmh.el (nnmh-active-number): Create parent dirs.
+Thu Sep 24 02:05:48 1998  ZHU Shenghuo  <zsh@cs.rochester.edu>
 
-       * nntp.el (nntp-last-command): New variable.
-       (nntp-handle-authinfo): New function.
+       * gnus-cus.el (gnus-group-customize): Use variable as cons not as
+       group
 
-       * gnus-sum.el (gnus-summary-exit): Call purging function.
+Thu Sep 24 01:41:03 1998  ZHU Shenghuo  <zsh@cs.rochester.edu>
 
-Fri Feb 13 18:59:16 1998  François Pinard  <pinard@iro.umontreal.ca>
+       * base64.el (base64-run-command-on-region): External base64
+       decoder do not use coding system
 
-       * nnmail.el (nnmail-get-new-mail): Don't clear split-history.
-       (nnmail-purge-split-history): New function.
+Thu Sep 24 01:39:44 1998  ZHU Shenghuo  <zsh@cs.rochester.edu>
 
-Fri Feb 13 18:36:16 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el (mm-interactively-view-part): Typo.
 
-       * nntp.el (nntp-telnet-shell-prompt): Renamed.
+Thu Sep 24 01:37:30 1998  ZHU Shenghuo  <zsh@cs.rochester.edu>
 
-Fri Feb 13 18:35:23 1998  Sam Falkner  <samf@channelpoint.com>
+       * mm-decode.el (mm-dissect-multipart): Display last part when the
+       article has no close-delimiter
 
-       * nntp.el (nntp-open-telnet-envuser): New variable.
+Thu Sep 24 01:28:54 1998  ZHU Shenghuo  <zsh@cs.rochester.edu>
 
-Fri Feb 13 18:29:23 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el (mm-dissect-buffer): Display parts which have no
+       content-type.
 
-       * message.el (message-send-mail-function): Added smtpmail-send-it.
+Thu Sep 24 01:23:57 1998  ZHU Shenghuo  <zsh@cs.rochester.edu>
 
-1998-02-11  Dave Love  <d.love@dl.ac.uk>
+       * gnus-art.el (gnus-display-mime): Typo.
 
-       * gnus-art.el (gnus-button-url): Don't lose in Emacs 20 with
-       browse-url-browser-function an alist, not a function.
-       (gnus-button-embedded-url): Likewise.
+Thu Sep 24 02:29:57 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-Fri Feb 13 17:10:31 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus.el: Pterodactyl Gnus v0.32 is released.
 
-       * gnus-cite.el (gnus-cite-localize): New function.
-       (gnus-cite-close): Renamed.
-       (gnus-cite-parse-maybe): Use it.
+1998-09-24 00:27:11  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-sum.el (gnus-summary-move-article): Move back to summary
-       buffer.
+       * gnus-kill.el (gnus-batch-score): Protect against errors.
 
-       * nnfolder.el (nnfolder-request-accept-article): Save excursion.
-       (nnfolder-request-move-article): Ditto.
+       * gnus-art.el: Protect against broken headers.
 
-       * nntp.el (nntp-find-connection): Don't message.
+       * mm-decode.el (mm-display-external): Respect needsterm.
+       (mm-display-external): Create buffer for external commands. 
 
-Fri Feb 13 14:51:56 1998  MORIOKA Tomohiko  <steve@xemacs.org>
+1998-09-23 22:04:05  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * message.el (message-send-mail-with-qmail): Fix.
+       * mailcap.el (mailcap-mime-info): Return the proper viewer.
 
-1998-02-13  Per Abrahamsen  <abraham@dina.kvl.dk>
+       * mm-decode.el (mm-display-external): Use file name.
 
-       * gnus-draft.el (gnus-draft-make-menu-bar): Added missing commands.
+1998-09-22  Markus Rost  <markus.rost@mathematik.uni-regensburg.de>
 
-1998-01-06  Per Abrahamsen  <abraham@dina.kvl.dk>
+       * gnus-util.el (gnus-output-to-rmail):  adjust to
+          `rmail-output-to-rmail-file'
 
-       * gnus/gnus-cus.el (gnus-score-parameters): Make `files' and
-       `exclude-files' widgets inline.
+1998-09-23 20:07:00  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Fri Feb 13 12:46:23 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-util.el (gnus-output-to-rmail): Reinstated function.
 
-       * gnus-sum.el (gnus-article-mark): Dox dox.
+       * gnus-sum.el (gnus-select-newsgroup): Set global variables before
+       headers. 
 
-Wed Feb 11 15:05:03 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * gnus-art.el (article-decode-charset): Fold case.
 
-       * gnus.el: Quassia Gnus v0.24 is released.
+1998-09-17 15:49:10  Simon Josefsson  <jas@pdc.kth.se>
 
-Tue Feb 10 21:59:53 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+        * mailcap.el (mailcap-save-binary-file): Goto point-min.
 
-       * gnus-agent.el (gnus-agent-fetch-session): Reversed reversal.
+1998-09-23 19:48:52  Aaron M. Ucko  <amu@mit.edu>
 
-       * gnus-topic.el (gnus-topic-rename): Check whether the new name
-       exists.
+       * nnmail.el (nnmail-check-duplication): Enter into duplicate list
+       after being stored.
 
-Tue Feb 10 21:39:47 1998  dave edmondson  <dme@sco.com>
+Tue Sep 15 16:15:16 1998  Kurt Swanson  <ksw@dna.lth.se>
 
-       * message.el (message-font-lock-keywords): Allow : as a citation
-       ending.
+       * gnus-salt.el (gnus-pick-setup-message): Return from whence ye
+       come.
 
-Tue Feb 10 20:09:02 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-23 19:42:03  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * message.el (message-send): Removed dead code.
+       * gnus-xmas.el (wid-edit): Required.
 
-Mon Feb  9 17:02:09 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-ems.el (gnus-widget-button-keymap): New variable.
 
-       * message.el (message-fill-header): Fill to column 990.
+Sun Sep 20 00:27:55 1998  ZHU Shenghuo  <zsh@cs.rochester.edu>
 
-       * gnus-score.el (gnus-score-load-file): Exclude all excluded
-       files.
+       * gnus-art.el (gnus-mime-inline-part): remove part if necessary
 
-Mon Feb  9 16:55:41 1998  jari aalto  <jari.aalto@poboxes.com>
+1998-09-23 19:30:52  Matt Armstrong  <matta@geoworks.com>
 
-       * gnus-art.el (gnus-article-time-format): Extended variable.
+       * gnus-art.el (article-decode-charset): Narrow to the correct
+       region. 
 
-Mon Feb  9 16:27:59 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-bodies.el: Fix autoload.
 
-       * gnus-art.el (article-make-date-line): Make 8601 Dates.
-       (article-date-iso8601): New command and keystroke.
+1998-09-22 18:35:12  Lee Willis  <lee@gbdirect.co.uk>
 
-Sun Feb  8 21:19:15 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-mime-button-line-format): Doc fix.
 
-       * message.el (message-ignored-mail-headers): Remove Xrefs.
+1998-09-22 14:53:35  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * nndoc.el (nndoc-open-document-hook): New variable.
+       * rfc2047.el (rfc2047-decode): Use rfc2047-default-charset. 
 
-Sun Feb  8 21:01:33 1998  Istvan Marko  <istvan@cmdmail.amd.com>
+1998-09-19 13:58:35  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-agent.el (gnus-unplugged): Typo fix.
+       * gnus-art.el (gnus-insert-mime-button): Specify keymap.
+       (gnus-article-add-button): Ditto.
 
-Sun Feb  8 18:34:31 1998  Kurt Swanson  <kurt@dna.lth.se>
+       * gnus-sum.el (gnus-summary-insert-pseudos): Use mm.
 
-       * gnus-score.el (gnus-score-thread-simplify): New variable.
+       * gnus-art.el (gnus-article-prepare-display): Make article mode. 
+       (gnus-article-prepare-display): Bind url-standalone-mode.
 
-Sun Feb  8 18:31:35 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el (mm-remove-part): Also delete directory.
+       (mm-display-external): Create a private sub-dir.
 
-       * gnus-uu.el (gnus-uu-post-encode-mime): Call mmencode with
-       correct params.
+       * mailcap.el (mailcap-binary-suffixes): New variable.
+       (mailcap-command-p): Use it.
 
-Sun Feb  8 18:13:58 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-09-16 10:38:21  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.el: Quassia Gnus v0.23 is released.
+       * nnmbox.el (nnmbox-request-group): Change server.
+       (nnmbox-possibly-change-newsgroup): Enable multibyte.
 
-Sun Feb  8 17:20:40 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * message.el (message-encode-message-body): Don't stomp MIME
+       headers. 
 
-       * gnus-group.el (gnus-update-group-mark-positions): Bind `topic'.
+       * gnus-sum.el (gnus-summary-edit-article-done): Don't encode
+       unless useful.
+       (gnus-summary-exit): Check for a live article buffer.
+       (gnus-summary-exit-no-update): Ditto.
 
-       * message.el (message-expand-group): Added doc string.
+       * gnus-int.el (gnus-request-replace-article): Accept no-encode
+       param.
 
-       * nntp.el (nntp-wait-for): Don't change limit until after
-       accepting output.
+       * gnus-sum.el (gnus-article-decoded-p): New variable.
 
-Sun Feb  8 16:44:36 1998  Richard Hoskins  <rmh@interlaced.net>
+       * mm-decode.el (mm-display-external): Use no-conv.
 
-       * message.el (message-kill-to-signature): Don't kill the
-       delimiter.
+       * rfc2047.el (rfc2047-q-encode-region): Bound properly. 
+       (rfc2047-charset-encoding-alist): Use B encoding for koi8-r.
 
-Sun Feb  8 16:15:33 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-article-mode-map): Bind button2 to
+       mouse-click. 
 
-       * gnus-sum.el (gnus-summary-prepared-hook): New hook.
-       (gnus-summary-read-group-1): Use it.
+1998-09-15 14:38:02  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * message.el (message-cite-original-without-signature): New
-       function.
-       (message-cite-function): Added to custom.
+       * gnus-agent.el (gnus-agent-expire): Protect against nil infos.
 
-1998-01-13  Per Abrahamsen  <abraham@dina.kvl.dk>
+Mon Sep 14 18:55:38 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus/message.el (message-cite-original): Don't quote signature.
+       * gnus.el: Pterodactyl Gnus v0.31 is released.
 
-Sun Feb  8 15:50:20 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-14 15:12:59  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-group.el (gnus-group-unsubscribe-group): Protest against
-       empty group names.
+       * gnus-sum.el (gnus-summary-exit): Destroy MIME.
 
-Mon Feb  2 18:56:22 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el (mm-display-part): Accept no-default.
 
-       * gnus-draft.el (gnus-draft-setup): Associate with drafts group.
+       * gnus-art.el (gnus-insert-mime-button): buffer-size doesn't take
+       a parameter.
 
-       * message.el (message-header-format-alist): Fill references.
+       * gnus-sum.el (gnus-summary-insert-line): Don't exclude faces.
+       (gnus-summary-prepare-threads): Ditto.
 
-       * gnus-agent.el (gnus-category-read): Changed default.
-       (gnus-agent-handle-level): New variable.
-       (gnus-agent-fetch-session): Use it.
+       * gnus.el (gnus-article-mode-map): Make sparse keymap.
 
-       * gnus-art.el (article-strip-all-blank-lines): New command and
-       keystroke.
+       * gnus-art.el (gnus-mime-button-line-format-alist): Allow a %d spec.
+       (gnus-mime-button-line-format): Doc fix.
+       (gnus-insert-mime-button): Use it.
+       (gnus-article-add-button): Use widget-convert-button.
 
-Sun Feb  1 18:00:54 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus.el ((featurep 'gnus-xmas)): Defalias gnus-decode-rfc1522 to
+       ignore.
 
-       * gnus-msg.el (gnus-inews-reject-message): Removed function.
-       (gnus-sent-message-ids-file): Removed.
-       (gnus-sent-message-ids-length): Ditto.
+       * mm-decode.el (mm-alternative-precedence): Ditto.
 
-       * gnus-xmas.el (gnus-xmas-summary-set-display-table): Ditto.
+1998-09-14 15:12:49  Conrad Sauerwald  <conrad@stack.nl>
 
-       * gnus-sum.el (gnus-simplify-subject-fuzzy): Respect
-       `gnus-simplify-ignored-prefixes'.
-       (gnus-summary-set-display-table): Keep TAB.
+       * mm-decode.el (mm-user-automatic-display): Use enriched.
 
-Thu Jan 15 22:47:38 1998   <Use-Author-Address-Header@[127.1]>
+1998-09-14 15:09:12  Paul Fisher  <rao@gnu.org>
 
-       * gnus-art.el (gnus-request-article-this-buffer): Put it into the
-       backlog.
+       * mm-decode.el (mm-dissect-multipart): Have the part start on the
+       right place.
 
-Mon Jan 12 23:30:59 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-14 14:33:34  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-sum.el (gnus-get-newsgroup-headers): Use the longest ID.
+       * gnus-msg.el (gnus-inews-add-send-actions): Mark silently.
 
-       * nnheader.el (nnheader-parse-head): Ditto.
+       * gnus-art.el (article-update-date-lapsed): Only update header if
+       buffer is dispalyed in frame.
+       (gnus-article-prepare-display): New function.
+       (gnus-article-prepare): Use it.
 
-Thu Jan  8 09:47:18 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-14 08:16:43  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-start.el (gnus-1): Use gnus-alive-p.
+       * gnus-art.el (gnus-mime-inline-part): New command and keystroke.
 
-Tue Jan  6 11:53:09 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-view.el (mm-insert-inline): New function.
 
-       * gnus-art.el (gnus-article-prepare): Bind coding systems.
+       * mm-decode.el (mm-pipe-part): Bugged.
 
-Tue Jan  6 07:45:39 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * gnus-agent.el (gnus-agent-send-mail): Don't encode.
 
-       * gnus.el: Quassia Gnus v0.22 is released.
+       * mm-bodies.el (mm-encode-body): Move over the body.
 
-Tue Jan  6 07:32:02 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * nnmbox.el (nnmbox-read-mbox): Enable multibyte.
 
-       * message.el (message-kill-to-signature): Don't use mark.
+       * rfc2047.el (rfc2047-q-encode-region): Would bug out.
 
-Tue Jan  6 07:30:46 1998  Russ Allbery  <rra@stanford.edu>
+1998-09-13  François Pinard  <pinard@iro.umontreal.ca>
 
-       * message.el (message-kill-to-signature): New command and keystroke.
+       * nndoc.el: Make nndoc-dissection-alist simpler for MIME, adjust all
+          related functions.  Handle message/rfc822 parts.  Display subject on
+          multipart summary lines.  Display name on sub-parts when available.
 
-Tue Jan  6 06:39:29 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-14 07:36:38  Hallvard B. Furuseth  <h.b.furuseth@usit.uio.no>
 
-       * gnus-sum.el (gnus-summary-print-article): New defaults for
-       headers and stuff.
+       * mailcap.el (mailcap-command-p): New version.
 
-       * gnus-agent.el (gnus-agent-batch): New command.
+1998-09-13  Mike McEwan  <mike@lotusland.demon.co.uk>
 
-       * nnoo.el (nnoo-execute): Copy vars from parent into child.
-       (nnoo-parent-function): Ditto.
+       * gnus-agent.el (gnus-agent-expire): Stop expiry barfing on killed
+       groups.
 
-       * gnus-draft.el (gnus-draft-setup): Removed message.
+1998-09-13 18:34:06  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-start.el (gnus-read-descriptions-file): Naked muleism.
+       * message.el (message-make-date): Remove weekday name.
 
-Mon Jan  5 05:20:16 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el (mm-dissect-buffer): Protect against broken
+       headers.
 
-       * nnml.el (nnml-generate-nov-databases-1): Fix lower bound on
-       empty groups.
+       * mailcap.el (mailcap-command-in-path-p): New function.
+       (mailcap-command-p): Renamed.
 
-Sun Jan  4 14:38:36 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-09-13 17:58:47  Hallvard B. Furuseth  <h.b.furuseth@usit.uio.no>
 
-       * gnus.el: Quassia Gnus v0.21 is released.
+       * rfc2047.el (eval): Autoload.
 
-Sun Jan  4 14:28:35 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-09-13 12:22:40  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.el: Quassia Gnus v0.20 is released.
+       * gnus-sum.el (gnus-decode-encoded-word-functions): New variable.
+       (gnus-multi-decode-encoded-word-string): New function.
+       (gnus-encoded-word-method-alist): New variable.
+       (gnus-decode-encoded-word-functions): Removed.
 
-1997-12-10  Per Abrahamsen  <abraham@dina.kvl.dk>
+1998-09-13  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus/gnus-msg.el (gnus-inews-insert-mime-headers): Added
-       documentation.
-       (gnus-inews-insert-mime-headers): Made it work with Emacs MULE.
-       (gnus-inews-insert-mime-headers): Added as option to
-       `message-header-hook'.
+       * gnus-int.el (gnus-request-replace-article): Replace
+       message-narrow-to-headers with message-narrow-to-head
 
-1997-12-22  Per Abrahamsen  <abraham@dina.kvl.dk>
+1998-09-13 12:05:41  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus/gnus-art.el (gnus-button-alist): Assume msg-id after "in
-       message".
+       * drums.el (drums-quote-string): Reversed match.
 
-1997-12-22  Simon Josefsson  <jas@faun.nada.kth.se>
+       * message.el (message-make-date): Use weekday name.
 
-       * nnmail.el (nnmail-get-new-mail): Make nnmail-tmp-directory
+Sun Sep 11 10:27:15 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-1997-12-28  Per Abrahamsen  <abraham@dina.kvl.dk>
+       * gnus.el: Pterodactyl Gnus v0.30 is released.
 
-       * gnus/gnus-group.el (gnus-group-fetch-faq): Convert `.' in group
-       name to `/'.
+1998-09-13 08:00:41  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sun Jan  4 13:35:14 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (article-decode-encoded-words): Use it.
+       (gnus-decode-header-function): New variable.
 
-       * nndraft.el (nndraft-request-associate-buffer): Open the damn
-       server first.  Sheesh.
+       * gnus-sum.el (gnus-nov-parse-line): Use it.
+       (gnus-decode-encoded-word-function): New variable.
 
-       * gnus-draft.el (gnus-draft-send): Bind message-send-hook to nil.
+       * gnus-msg.el (gnus-copy-article-buffer): Decode the right
+       buffer.
 
-       * gnus-sum.el (gnus-summary-catchup): Don't nix out downloadable.
-       (gnus-summary-highlight): Highlight down/un as unread.
+       * gnus-art.el (gnus-insert-mime-button): Use widget.
+       (gnus-widget-press-button): New function.
+       (gnus-article-prev-button): Removed.
+       (gnus-article-next-button): Ditto.
+       (gnus-article-add-button): Ditto.
 
-Sun Jan  4 13:27:31 1998  Kim-Minh Kaplan  <KimMinh.Kaplan@utopia.eunet.fr>
+       * gnus.el (gnus-article-mode-map): Inherit from widget.
+       (gnus-article-mode-map): No, don't.
 
-       * gnus-start.el (gnus-strip-killed-list): Fix syntax.
+       * mm-decode.el (mm-dissect-buffer): Store Content-ID things.
+       (mm-content-id-alist): New variable.
+       (mm-get-content-id): New function.
 
-Sun Jan  4 13:18:04 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-request-article-this-buffer): Only decode
+       articles if we are fetching to the article buffer.
 
-       * nnsoup.el (nnsoup-store-reply): Bind mail-header-separator to
-       "".
+1998-09-13 07:58:59  Shenghuo ZHU  <zsh@cs.rochester.edu>
 
-       * gnus-xmas.el (gnus-xmas-agent-server-menu-add): New.
+       * gnus-sum.el (gnus-summary-move-article): Don't decode accepting
+       articles.
 
-       * nnoo.el (nnoo-change-server): Get the right values.
+1998-09-13 07:23:28  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-1998-01-04  Aki Vehtari  <Aki.Vehtari@hut.fi>
+       * mm-util.el (mm-mime-charset): Try to use safe-charsets.
+       (mm-default-mime-charset): New variable.
 
-       * gnus-art.el (gnus-signature-limit): Add default values for
-       choices suggested by Per Abrahamsen <abraham@dina.kvl.dk>.
-       (gnus-prompt-before-saving): Add :value t for sexp tag.
-       (gnus-split-methods): Add default values for choices.
+       * rfc2047.el (rfc2047-dissect-region): Dissect using tspecials.
 
-       * gnus-score.el (gnus-home-score-file): Add non-nil default for
-       function.
-       (gnus-home-adapt-file): Ditto.
+       * drums.el (drums-quote-string): Reversed test.
 
-       * gnus-sum.el (gnus-move-split-methods): Add default values for
-       choices.
+1998-09-12 14:29:21  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * nnmail.el (nnmail-list-identifiers): Add default values for
-       choices suggested by Per Abrahamsen <abraham@dina.kvl.dk>.
+       * mm-util.el (mm-insert-rfc822-headers): Possibly not quote
+       string.
 
-Sun Jan  4 11:31:42 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * drums.el (drums-quote-string): New function.
 
-       * gnus.el: Quassia Gnus v0.19 is released.
+       * rfc2047.el (rfc2047-encode-message-header): Goto point-min.
+       (rfc2047-b-encode-region): Chop lines.
+       (rfc2047-q-encode-region): Ditto.
 
-Sun Jan  4 10:42:53 1998  Felix Lee  <flee@teleport.com>
+Sat Sep 12 13:27:15 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * nntp.el (nntp-open-rlogin): Use a list of parameters.
+       * gnus.el: Pterodactyl Gnus v0.29 is released.
 
-Sun Jan  4 10:25:05 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-12 12:46:30  Istvan Marko  <imarko@pacificnet.net>
 
-       * gnus-agent.el (gnus-agent-fetch-groups): New command.
+       * mm-decode.el (mm-save-part): Message right.
 
-       * gnus-sum.el (gnus-summary-print-article): Changed order of
-       parameters.
+1998-09-12 11:30:01  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sun Jan  4 10:24:07 1998  Michael R. Cook  <mcook@cognex.com>
+       * drums.el (drums-parse-address): Returned a list instead of a
+       string.
+       (drums-remove-whitespace): Skip comments.
+       (drums-parse-addresses): Didn't work.
 
-       * gnus-sum.el (gnus-summary-print-article): Use process/prefix.
+Sat Sep 12 09:17:30 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-Sun Jan  4 05:29:38 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus.el: Pterodactyl Gnus v0.28 is released.
 
-       * gnus-uu.el: Changed spurious defconsts to defvars.
+1998-09-12 04:57:25  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * nnmail.el (nnmail-get-spool-files): Quote group name.
+       * gnus-art.el (gnus-mime-button-map): Use the article keymap as a
+       starting point.
+       (article-decode-encoded-words): Rename.
 
-       * gnus-agent.el (gnus-agent-fetch-group-1): Fetch ticked articles.
-       (gnus-agent-fetch-group-1): Never mind.
+       * message.el (message-narrow-to-headers-or-head): New function.
 
-Sat Dec 20 22:33:17 1997  Pete Ware  <ware@cis.ohio-state.edu>
+       * gnus-int.el (gnus-request-accept-article): Narrow to the right
+       region.
 
-       * message.el (message-rename-buffer): Check for nil dirs.
+       * message.el (message-send-news): Encode body after checking
+       syntax.
 
-Fri Dec 19 21:45:59 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-mime-button-line-format): Allow descriptions.
 
-       * nnml.el (nnml-request-create-group): Check for files.
+       * mm-decode.el (mm-save-part): Use Content-Disposition filename.
 
-Fri Dec 19 21:39:43 1997  Hrvoje Niksic  <hniksic@srce.hr>
+       * gnus-art.el (gnus-display-mime): Respect disposition.
 
-       * message.el (message-mode): Fixed font-lock.
+       * mm-decode.el (mm-preferred-alternative): Respect disposition.
 
-Fri Dec 19 21:26:08 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (article-strip-multiple-blank-lines): Don't delete
+       text with annotations.
 
-       * gnus-cache.el (gnus-cache-read-active): Check for empty files.
+       * message.el (message-make-date): Fix sign for negative time
+       zones.
 
-Sun Dec 14 11:46:50 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-view.el (mm-inline-image): Insert a space at the end of the
+       image.
 
-       * gnus-uu.el (gnus-uu-save-article): Quote all lines beginning
-       with a dash.
+       * mail-parse.el: New file.
 
-1997-12-10  SL Baur  <steve@altair.xemacs.org>
+       * rfc2231.el: New file.
 
-       * gnus-start.el (gnus-read-descriptions-file): Really bind and gag
-       Mule.
+       * drums.el (drums-content-type-get): Removed.
+       (drums-parse-content-type): Ditto.
 
-Fri Dec  5 15:15:05 1997  Danny Siu  <dsiu@adobe.com>
+       * mailcap.el (mailcap-mime-data): Use symbols instead of strings.
 
-       * nndoc.el (nndoc-babyl-body-begin): quote the regexp for the
-       string "*** EOOH ***" properly.
-       (nndoc-babyl-head-begin): Same as above.
+Fri Sep 11 18:23:34 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-Sun Dec 14 11:11:22 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus.el: Pterodactyl Gnus v0.27 is released.
 
-       * gnus-uu.el (gnus-uu-pre-uudecode-hook): New hook.
+1998-09-11 12:42:07  Lars Magne Ingebrigtsen- <larsi@gnus.org>
 
-       * gnus-sum.el (gnus-summary-read-group-1): Set mode line after
-       configuring.
+       * mm-decode.el (mm-alternative-precedence): New variable.
+       (mm-preferred-alternative): New function.
 
-Sun Dec 14 11:03:26 1997  Wes Hardaker  <wjhardaker@ucdavis.edu>
+       * gnus-art.el (gnus-mime-copy-part): New command.
 
-       * gnus-score.el (gnus-adaptive-word-minimum): New variable.
-       (gnus-score-adaptive): Use it.
+       * mm-decode.el (mm-get-part): New function.
 
-Sun Dec 14 09:19:18 1997  Roland B. Roberts  <roberts@panix.com>
+       * mm-view.el: New file.
 
-       * gnus-group.el: Fixed hardcoded levels.
+       * mm-decode.el (mm-dissect-buffer): Downcase cte.
+       (mm-display-part): Default to mailcap-save-binary-file.
 
-Sat Dec  6 17:40:33 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+Fri Sep 11 12:32:50 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus.el: Quassia Gnus v0.18 is released.
+       * gnus.el: Pterodactyl Gnus v0.26 is released.
 
-Sat Dec  6 17:27:04 1997  Kim-Minh Kaplan  <KimMinh.Kaplan@Utopia.EUnet.fr>
+1998-09-11 08:25:33  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-picon.el (gnus-picons-remove): Race condition.
+       * mm-decode.el (mm-interactively-view-part): New function.
 
-Sat Dec  6 17:23:26 1997  Christian von Roques  <roques@scalar.pond.sub.org>
+       * gnus-art.el (gnus-mime-view-part): New command.
 
-       * gnus-start.el (gnus-read-descriptions-file): Fix
-       enable-multibyte-characters.
+       * mm-decode.el (mm-last-shell-command): New variable.
 
-1997-12-05  Dave Love  <d.love@dl.ac.uk>
+       * mailcap.el (mailcap-mime-info): Allow returning all matches.
 
-       * gnus-nocem.el (gnus-nocem-message-wanted-p): Fix paren typpo.
-       (gnus-nocem-issuers): Allow sexp alternative in :type for alists.
+       * mm-decode.el (mm-save-part): New function.
 
-1997-12-05  Dave Love  <d.love@dl.ac.uk>
+       * gnus-art.el (article-decode-charset): Protect against buggy
+       content-types.
+       (gnus-mime-pipe-part): New command.
+       (gnus-mime-save-part): New command.
+       (gnus-mime-button-map): New keymap.
+       (gnus-mime-button-line-format): New variable.
+       (gnus-insert-mime-button): New function.
+       (gnus-display-mime): Use it.
 
-       * gnus-art.el (gnus-visible-headers): Add X-sent:.
+       * gnus-util.el (gnus-dd-mmm): Removed length spec.
 
-Sat Dec  6 17:16:28 1997  Lars Balker Rasmussen  <lbr@mjolner.dk>
+       * mm-decode.el (mm-inline-text): Decode charsets.
 
-       * gnus-art.el (article-make-date-line): Don't add extra newlines.
+       * gnus-art.el (gnus-article-save): Comment fix.
 
-1997-11-27  MORIOKA Tomohiko  <morioka@jaist.ac.jp>
+       * gnus-int.el (gnus-start-news-server): When in batch, don't
+       prompt.
 
-       * nnmail.el (nnmail-file-coding-system): Use `raw-text' in
-       default.
+       * gnus-cache.el (gnus-cache-possibly-enter-article): Don't
+       decode.
 
-       * nnheader.el (nnheader-file-coding-system): Use `raw-text' in
-       default.
+       * mm-decode.el (mm-inline-media-tests): Add audio.
+       (mm-inline-audio): New function.
 
-Sat Dec  6 17:04:40 1997  Kim-Minh Kaplan  <KimMinh.Kaplan@utopia.eunet.fr>
+1998-09-11 08:19:22  Katsumi Yamaoka  <yamaoka@ga.sony.co.jp>
 
-       * nnml.el (nnml-parse-head): Out-of-bounds fix.
+       * gnus-art.el (article-make-date-line): Didn't work.
 
-       * nndraft.el (nndraft-request-associate-buffer): Get proper file
-       name.
+       * parse-time.el (parse-time-string): One too many nils.
 
-Sat Dec  6 15:35:37 1997  Gary D. Foster  <Gary.Foster@Corp.Sun.COM>
+Fri Sep 11 08:09:40 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-group.el: Added backspace.
+       * gnus.el: Pterodactyl Gnus v0.25 is released.
 
-Thu Nov 27 19:56:59 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-11 07:38:14  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-agent.el (gnus-summary-set-agent-mark): Remove marks
-       properly.
+       * gnus-art.el (article-remove-trailing-blank-lines): Don't remove
+       annotations.
 
-1997-11-27  Christoph Wedler  <wedler@fmi.uni-passau.de>
+       * gnus.el ((featurep 'gnus-xmas)): New
+       'gnus-annotation-in-region-p alias.
 
-       * smiley.el (smiley-buffer): Provide `help-echo'.
+1998-09-10 06:20:52  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Thu Nov 27 17:33:45 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-util.el (mm-with-unibyte-buffer): New function.
 
-       * gnus-util.el (gnus-output-to-rmail): Always save buffer.
+       * gnus-uu.el (gnus-quote-arg-for-sh-or-csh): Renamed.
 
-       * nntp.el (nntp-close-server): Don't sleep for me, Argentina.
-       (nntp-request-close): You neither.
+       * mm-decode.el (mm-inline-media-tests): New variable.
 
-1997-11-19  Per Abrahamsen  <abraham@dina.kvl.dk>
+       * gnus-sum.el (gnus-summary-exit): Destroy handles.
 
-       * message.el (message-header-lines): New widget.
-       (message-default-headers): Use it.
-       (message-default-mail-headers): Use it.
-       (message-default-news-headers): Use it.
+       * gnus-art.el (gnus-article-mime-handles): New variable.
 
-1997-11-24  Andreas Jaeger  <aj@arthur.rhein-neckar.de>
+       * drums.el (drums-narrow-to-header): New function.
 
-       * gnus-start.el (gnus-read-descriptions-file): Add missing quote.
+       * gnus-art.el (article-decode-charset): Use it.
 
-Wed Nov 26 18:19:29 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * drums.el (drums-content-type-get): New function.
 
-       * nnweb.el (nnweb-type-definition): Rescued dejanewsold.
+       * mm-util.el (mm-content-type-charset): Removed.
 
-       * gnus-mh.el (gnus-summary-save-in-folder): Reverted to old
-       version.
+       * drums.el (drums-syntax-table): @ is word.
+       (drums-parse-content-type): New function.
 
-       * gnus-sum.el (gnus-kill-or-deaden-summary): Save excursion.
+       * parse-time.el (parse-time-rules): Parse "Wed, 29 Apr 98 0:26:01
+       EDT" times.
 
-       * gnus.el: Only require gnus-load in Emacsen 19.
+       * gnus-util.el (gnus-date-get-time): Use safe date.
 
-       * gnus-start.el (gnus-setup-news): Always push archive server.
+       * gnus-sum.el (gnus-show-mime): Removed.
+       (gnus-summary-toggle-mime): Removed.
 
-       * gnus-sum.el (gnus-read-header): Would bug out on sparse
-       articles.
+       * gnus-art.el (gnus-strict-mime): Removed.
+       (gnus-article-prepare): Don't do MIME.
+       (gnus-decode-encoded-word-method): Removed.
+       (gnus-show-mime-method): Removed.
 
-Wed Nov 26 17:50:41 1997  Kurt Swanson  <kurt@dna.lth.se>
+Thu Sep 10 04:03:29 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-ems.el (gnus-mule-cite-add-face): Work.
+       * gnus.el: Pterodactyl Gnus v0.24 is released.
 
-Wed Nov 26 17:40:57 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-09-10 01:58:24  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.el: Quassia Gnus v0.17 is released.
+       * gnus-sum.el (gnus-summary-show-article): Don't decode chars if
+       PREFIX.
 
-Wed Nov 26 16:04:25 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * parse-time.el (parse-time-rules): Accept times that look like
+       "h:mm".
 
-       * gnus-sum.el (gnus-summary-move-article): Don't work on canceled
-       articles.
+       * message.el (message-make-date): Use zone properly.
 
-       * gnus-start.el (gnus-subscribe-hierarchical-interactive): Use
-       `read-char-exclusive'.
+       * gnus.el: Autoload gnus-batch.
 
-       * gnus-sum.el (gnus-summary-mode): Localize
-       gnus-summary-dummy-line-format.
+       * gnus-art.el (article-de-quoted-unreadable): Do not do
+       gnus-article-decode-rfc1522.
 
-       * nnml.el (nnml-open-nov): Check that the file exists before
-       inserting it.
+       * gnus-msg.el (gnus-inews-do-gcc): Use it.
 
-       * gnus-art.el (article-date-ut): Insert a newline if needed.
+       * gnus-int.el (gnus-request-accept-article): Accept a no-encode
+       param.
 
-       * gnus-score.el (gnus-score-edit-current-scores): Protect against
-       nil score files.
+       * message.el (message-encode-message-body): Check for us-ascii.
 
-       * gnus-start.el (gnus-newsrc-parse-options): Be more correct --
-       match only hierarchies.
-       (gnus-gnus-to-quick-newsrc-format): Changed warning.
+       * gnus-msg.el (gnus-extended-version): Move Gnus version comments
+       to the left.
 
-Wed Nov 26 15:47:40 1997  Greg Klanderman  <greg@alphatech.com>
+1998-09-09 13:18:13  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * messagexmas.el (message-xmas-maybe-fontify): New definition.
+       * gnus-art.el (article-decode-charset): Rename.
 
-Wed Nov 26 15:43:53 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Wed Sep  9 12:25:48 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-start.el (gnus-setup-news): Protect against nil
-       gnus-message-archive-method.
+       * gnus.el: Pterodactyl Gnus v0.23 is released.
 
-1997-11-26  Christoph Wedler  <wedler@fmi.uni-passau.de>
+1998-09-09 12:14:47  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-art.el (gnus-article-edit-done): Update headers "Lines:",
-       "Content-Length:" and "X-Content-Length:" when present.
+       * gnus-util.el (gnus-parent-id): Ditto.
+       (gnus-put-text-property-excluding-newlines): Ditto.
 
-Wed Nov 26 15:08:17 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-sum.el (gnus-dependencies-add-header): Make into subst.
 
-       * nnmail.el (nnmail-process-unix-mail-format): Pop to the right
-       buffer on error.
-       (nnmail-process-mmdf-mail-format): Ditto.
+1998-09-08  Karl Kleinpaste  <karl@jprc.com>
 
-Wed Nov 26 13:54:04 1997  Joe Reiss  <jreiss@sprynet.com>
+       * message.el (message-generate-headers): Generate User-Agent
+       instead of X-Mailer & X-Newsreader.
 
-       * gnus-art.el (gnus-summary-save-in-rmail): Return the name of the
-       file.
+       * gnus-msg.el (gnus-extended-version): Reformat for USEFOR
+       User-Agent header format.
 
-Wed Nov 26 13:50:01 1997  Alastair Burt <alastair.burt@dfki.de>
+Tue Sep  8 22:38:27 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * smiley.el: Balloon help, etc.
+       * gnus.el: Pterodactyl Gnus v0.22 is released.
 
-Wed Nov 26 13:45:35 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-08 22:36:54  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-util.el (gnus-kill-all-overlays): Remove check for XEmacs.
+       * mm-util.el (mm-multibyte-p): Typo.
 
-1997-09-30  Dave Love  <d.love@dl.ac.uk>
+Tue Sep  8 22:25:53 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * message.el: Don't require rmail.
+       * gnus.el: Pterodactyl Gnus v0.21 is released.
 
-Wed Nov 26 13:37:50 1997  Kurt Swanson  <kurt@dna.lth.se>
+1998-09-08  Hrvoje Niksic  <hniksic@srce.hr>
 
-       * gnus-group.el (gnus-group-setup-buffer): set-buffer.
+       * gnus-art.el (article-treat-dumbquotes): Handle \224 correctly.
 
-Wed Nov 26 13:31:54 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-08 22:18:03  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-score.el (gnus-score-load-file): Don't create empty score
-       files when doing decays.
+       * mm-util.el (mm-multibyte-p): New function.
 
-Wed Nov 26 13:28:04 1997  Renaud Rioboo  <rioboo@calfor.lip6.fr>
+Tue Sep  8 21:43:03 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * nnmail.el (nnmail-move-inbox): Only bind default-directory when
-       calling external function.
+       * gnus.el: Pterodactyl Gnus v0.20 is released.
 
-Wed Nov 26 13:03:45 1997  IWAMURO Motonori  <iwa@mmp.fujitsu.co.jp>
+1998-09-08 11:40:45  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-kill.el (gnus-batch-score): Newsrc thinko.
+       * rfc2047.el (rfc2047-decode-region): Only decode when in
+       multibyte.
 
-Wed Nov 26 10:31:17 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * nnheader.el (nnheader-pathname-coding-system): Changed to binary.
 
-       * nnheader.el (nnheader-parse-head): Would break on Message-ID's
-       that spanned several lines.
+       * gnus-int.el (gnus-request-replace-article): Encode.
+       (gnus-request-accept-article): Encode.
 
-       * gnus-util.el (gnus-date-iso8601): Didn't pick out the date
-       header.
+       * gnus-art.el (gnus-request-article-this-buffer): Decode charsets
+       here.
 
-       * gnus-demon.el (gnus-demon-scan-mail): Clean inboxes.
+       * gnus.el (gnus-article-display-hook): Take the charset functions
+       out.
 
-1997-11-25  Christoph Wedler  <wedler@fmi.uni-passau.de>
+       * time-date.el (safe-date-to-time): New function.
 
-       * gnus-picon.el (gnus-picons-x-face-sentinel): Would bug out in
-       headers with two X-Face lines.
+       * gnus-util.el (gnus-dd-mmm): Protect against bogus dates.
 
-Wed Nov 26 08:54:26 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Tue Sep  8 07:09:28 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-sum.el (gnus-summary-update-info): Would use wrong group
-       name.
+       * gnus.el: Pterodactyl Gnus v0.19 is released.
 
-1997-11-26  Hrvoje Niksic  <hniksic@srce.hr>
+1998-09-08 04:51:39  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-spec.el (gnus-compile): Avoid multiple `c*addr's.
-       (gnus-compile): Require `bytecomp'.
+       * base64.el (base64-encode-region): Accept no-line-break.
 
-1997-11-25  Hrvoje Niksic  <hniksic@srce.hr>
+       * mm-util.el (mm-mime-charset): New function.
 
-       * gnus-util.el (gnus-prin1): Bind `print-readably' to t.
+       * gnus-draft.el (gnus-draft-edit-message): Delete article.
 
-       * gnus-xmas.el (gnus-xmas-kill-all-overlays): New function.
-       (gnus-xmas-define): Use it.
+Tue Sep  8 04:29:23 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-art.el (gnus-stop-date-timer): Use `nnheader-cancel-timer'.
+       * gnus.el: Pterodactyl Gnus v0.18 is released.
 
-       * message.el (message-header-lines): Specify format.
+1998-09-08 02:21:36  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-xmas.el (gnus-xmas-move-overlay): Use BUFFER.
-       (gnus-byte-code): Use `indirect-function'.
+       * message.el (message-send-and-exit): Return t on success.
+       (message-make-date): Make a proper time zone.
 
-       * gnus-cite.el (gnus-cite-add-face): Would assign free variable.
+       * gnus-draft.el (gnus-draft-send): Only remove article if the
+       sending is successful.
 
-Wed Nov 26 08:31:28 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * drums.el (drums-get-comment): Return the last comment.
+       (drums-parse-address): Parse old-style From headers.
 
-       * gnus-art.el (gnus-stop-date-timer): Cancel instead of delete.
-       (gnus-start-date-timer): Use the numerical prefix.
+1998-09-07  SL Baur  <steve@altair.xemacs.org>
 
-Tue Nov 25 20:03:34 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-sum.el (gnus-data-compute-positions): Move below
+       `gnus-save-hidden-threads' so the former is correctly detected as
+       a macro.
 
-       * gnus-draft.el (gnus-group-send-drafts): Activate group first.
+1998-09-06  Dave Love  <fx@gnu.org>
 
-Tue Nov 25 19:57:55 1997  Dan Christensen  <jdc@chow.mat.jhu.edu>
+       * gnus/nnweb.el (require): Wrap requirement of w3 and url in
+       ignore-errors too, eval'd when compile.  Require w3 stuff at load
+       time for nicer failure if it's not available.
 
-       * gnus-group.el (gnus-group-process-prefix): Skip topics.
+1998-09-08 00:38:39  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Tue Nov 25 19:54:00 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * time-date.el (time-to-seconds): Renamed.
 
-       * gnus-move.el (gnus-move-group-to-server): Protect agains
-       nil-ness.
+       * parse-time.el (parse-time-string): Downcase before handling.
+       (parse-time-rules): Times without seconds have 0 seconds.
 
-Tue Nov 25 19:03:38 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * rfc2047.el (rfc2047-encode-region): New version.
+       (rfc2047-dissect-region): New function.
 
-       * gnus.el: Quassia Gnus v0.16 is released.
+1998-09-07 01:08:35  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Tue Nov 25 16:05:01 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * message.el (message-make-date): Use symbolic zone.
 
-       * gnus-sum.el (gnus-read-header): Remove thread entry before
-       rebuilding.
+1998-09-06 23:23:06  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-cite.el (gnus-cite-add-face): Keep track of all overlays.
+       * time-date.el (parse-time): Always use parse-time.
 
-       * gnus-art.el (article-update-date-lapsed): New function.
-       (gnus-start-date-timer): New command.
-       (article-date-ut): Put the face in the right place.
-       (article-date-ut): Would move around.
+       * parse-time.el (parse-time-syntax): Use vectors.
 
-       * gnus-group.el (gnus-group-read-ephemeral-group): Accept server
-       names.
+Sun Sep  6 21:19:26 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-srvr.el (gnus-browse-foreign-server): Use proper server
-       names.
+       * gnus.el: Pterodactyl Gnus v0.17 is released.
 
-       * gnus.el (gnus-group-prefixed-name): Give the right result for
-       native groups.
+1998-09-06 05:45:17  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * nnheader.el (nnheader-directory-files): New function.
+       * time-date.el: Renamed from "date".
 
-       * nnmh.el (nnmh-request-list-1): Reversed check.
+       * gnus.el: Removed all timezone dependencies.
 
-       * nnfolder.el (nnfolder-delete-mail): Would skip backwards one
-       line too much.
+       * score-mode.el: Removed.
+       (gnus-score-edit-insert-date): Use date.
 
-Tue Nov 25 14:44:02 1997  SeokChan LEE  <chan@xfer.kren.nm.kr>
+       * date.el (float-to-time): New function.
 
-       * message.el (message-ignored-supersedes-headers): Typo.
+       * nnspool.el (nnspool-seconds-since-epoch): Removed.
 
-Mon Nov 24 18:46:37 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * date.el (time-to-float): New function.
 
-       * gnus.el: Quassia Gnus v0.15 is released.
+       * message.el (message-make-date): Use format-time-string.
+       (message-make-expires): Use make-date.
 
-Mon Nov 24 18:07:21 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-xmas.el (gnus-xmas-seconds-since-epoch): Removed.
 
-       * gnus-ems.el: Also check major version names.
+       * gnus-util.el (gnus-dd-mmm): Use date.
+       (gnus-sortable-date): Ditto.
 
-1997-10-05  SL Baur  <steve@altair.xemacs.org>
+       * message.el (message-make-date): Take an optional time.
 
-       * message.el (require 'rmail): Put guard around.
-       * nnbabyl.el (require 'rmail): Ditto.
+       * gnus: Applied patches from 5.6.43.
 
-Mon Nov 24 17:36:00 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * date.el (if): Use parse-time.
 
-       * message.el (message-reply): Respect Mail-Copies-To even when
-       `to-address'.
+       * gnus-score.el (gnus-summary-score-entry): Make into a command
+       again.
 
-Mon Nov 24 17:32:47 1997  Thor Kristoffersen  <thor@unik.no>
+       * gnus-group.el (gnus-group-get-new-news-this-group): Only call if
+       gnus-agent.
 
-       * nntp.el (nntp-request-close): Sleep one second.
+       * gnus.el (gnus-agent-meta-information-header): Moved here.
 
-Mon Nov 24 16:18:19 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-05  Mike McEwan  <mike@lotusland.demon.co.uk>
 
-       * gnus-sum.el (gnus-summary-read-group-1): Update marks when not
-       entering group.
+       * gnus-agent.el (gnus-agent-scoreable-headers): New variable.
+       (gnus-agent-fetch-group-1): Score article headers using normal
+       group score files if the download score rule of a category/group
+       is `file'.
+       (gnus-agent-fetch-group-1): Don't parse the entire .overview when
+       deciding what articles to download.
+       (gnus-agent-fetch-group-1): Don't push headers through scoring and
+       predicate processing if predicate is `true' or `false'.
 
-       * gnus-start.el (gnus-setup-news): Get correct value of archive
-       server.
+1998-09-06 01:56:02  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Wed Oct  8 20:29:35 1997  Robert Bihlmeyer  <robbe@orcus.priv.at>
+       * gnus-score.el (gnus-score-load-score-alist): Bind coding system.
 
-       * message.el (message-make-organization): Don't let the
-       environment variable override a user-set organization.
+       * gnus-art.el (gnus-article-setup-buffer): Enable multibyte.
 
-Mon Nov 24 14:09:00 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * score-mode.el (score-mode-coding-system): New variable.
+       (gnus-score-edit-exit): Use it.
 
-       * nnml.el (nnml-open-nov): Don't use find-file.
+1998-09-04  Jason R Mastaler  <jason@4b.org>
 
-       * gnus-sum.el (gnus-last-newsgroup-variables-set): New variable.
-       (gnus-set-global-variables): Don't do to much; gets run off of
-       pre-command-hook.
-       Got rid of gnus-set-global-variables throughout.
-       (gnus-summary-exit): Update adaptive scoring here.
-       (gnus-summary-isearch-article): Widen.
+       * drums.el: Corrected typo.
 
-       * nnml.el (nnml-parse-head): Work in empty buffers.
+1998-09-05 23:24:43  Hallvard B. Furuseth  <h.b.furuseth@usit.uio.no>
 
-1997-10-14  Hrvoje Niksic  <hniksic@srce.hr>
+       * mm-bodies.el (mm-body-encoding): Faster version.
 
-       * gnus-xmas.el (gnus-xmas-group-startup-message): Check for image
-       formats correctly.
-       (gnus-xmas-modeline-glyph): Ditto.
+1998-09-05 22:23:03  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Mon Nov 24 13:58:12 1997  Hrvoje Niksic  <hniksic@srce.hr>
+       * gnus-art.el (gnus-article-decode-charset): Only decode text
+       things.
 
-       * gnus-spec.el (gnus-compile): Work under XEmacs.
+       * message.el (message-output): Use rmail.
 
-Mon Nov 24 07:15:45 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * rfc2047.el (rfc2047-encoded-word-regexp): Allow spaces in the
+       word part.
 
-       * nnoo.el (nnoo-change-server): Push the right parent packend onto
-       the alist.
+       * mm-util.el (mm-charset-to-coding-system): Use
+       rfc2047-default-charset.
+       (mm-known-charsets): New variable.
 
-Sun Nov 23 16:21:41 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * message.el (message-caesar-region): Bugged out.
 
-       * gnus.el: Quassia Gnus v0.14 is released.
+1998-09-06  Mike McEwan  <mike@lotusland.demon.co.uk>
 
-Sun Nov 23 14:04:07 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-agent.el (gnus-agent-fetch-group-1): Allow lists when
+       specifying `agent-predicate' in a group's parameters.
 
-       * gnus-start.el (gnus-read-descriptions-file): Make sure Mule is
-       bound.  And gagged.
+Sat Sep  5 21:55:01 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * message.el (message-send-mail-with-mh): Use
-       `mh-new-draft-name'.
+       * gnus.el: Pterodactyl Gnus v0.16 is released.
 
-       * nnfolder.el (nnfolder-read-folder): Save new buffers.
+1998-09-05 17:30:11  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-sum.el (gnus-summary-make-menu-bar): Removed "write to
-       file".
+       * nnmail.el (nnmail-expired-article-p): Use predicate.
 
-       * gnus-util.el (gnus-byte-code): Use indirect-function.
+       * date.el (time-less-p): Renamed.
 
-       * nntp.el (nntp-open-telnet): Also accept 201.
+       * gnus-art.el (gnus-article-decode-charset): Really fetch headers
+       from the headers.
 
-       * gnus-sum.el (gnus-summary-reparent-thread): Update thread.
+       * rfc2047.el (rfc2047-decode-region): Use the mm decoding
+       functions.
 
-       * gnus-score.el (gnus-all-score-files): Don't do anything unless
-       GROUP.
+       * gnus-group.el (gnus-group-sort-selected-flat): Didn't work at
+       all.
+       (gnus-group-sort-selected-groups-by-alphabet): Changed interface
+       to all functions.
 
-       * nnmail.el (nnmail-split-it): Save-excursion.
-       (nnmail-group-pathname): Translate file chars.
+Sat Sep  5 01:45:52 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-Sun Nov 23 13:41:10 1997  Gunnar Horrigmo  <horrigmo@online.no>
+       * gnus.el: Pterodactyl Gnus v0.15 is released.
 
-       * gnus-sum.el (gnus-summary-exit): Don't skip if group
-       disappeared.
+1998-09-05 00:21:22  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sun Nov 23 13:32:55 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * date.el: New file.
 
-       * nnfolder.el (nnfolder-normalize-buffer): New function.
-       (nnfolder-save-mail): Use it.
-       (nnfolder-request-replace-article): Ditto.
+       * gnus-util.el (gnus-encode-date): Removed.
+       (gnus-time-less): Ditto.
 
-1997-11-19  Per Abrahamsen  <abraham@dina.kvl.dk>
+       * nnmail.el (nnmail-date-to-time): Removed.
+       (nnmail-time-less): Ditto.
+       (nnmail-days-to-time): Ditto.
+       (nnmail-time-since): Ditto.
 
-       * message.el (message-header-lines): New widget.
-       (message-default-headers): Use it.
-       (message-default-mail-headers): Use it.
-       (message-default-news-headers): Use it.
+       * drums.el: New file.
 
-Sun Nov 23 12:44:38 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-04 00:25:52  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-win.el (gnus-remove-some-windows): Also delete dead summary
-       windows.
+       * message.el (message-encode-message-body): Encode headers with
+       body encoding.
 
-       * gnus-score.el (gnus-score-adaptive): Check whether functions are
-       bound.
+       * rfc2047.el (rfc2047-default-charset): Renamed.
+       (rfc2047-encodable-p): Use it.
 
-Sun Nov 23 12:15:00 1997  Hallvard B. Furuseth  <h.b.furuseth@usit.uio.no>
+       * base64.el (mm-util): Required.
 
-       * gnus-sum.el (gnus-summary-limit-include-thread): Interactive
-       fix.
+1998-09-03 16:28:30  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sun Nov 23 07:06:58 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-msg.el (gnus-post-method): Peel off real info from opened
+       servers.
 
-       * gnus-sum.el (gnus-summary-reparent-thread): Insert Message-ID in
-       proper place.
+       * gnus-util.el (gnus-output-to-rmail): Removed.
 
-Sat Nov 22 18:30:33 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-summary-save-in-rmail): Use
+       gnus-output-to-rmailrmail-output-to-rmail-file.
 
-       * gnus-cus.el (gnus-group-parameters): Add visible.
+       * rfc2047.el (rfc2047-decode-region): Fold case.
+       (rfc2047-decode): Use decode-string.
 
-Sat Nov 22 18:19:39 1997  Kim-Minh Kaplan  <kkaplan@lpthe.jussieu.fr>
+       * mm-util.el: Provide mm-char-int.
 
-       * message.el (message-setup): Add a newline, if necessary.
+Thu Sep  3 15:23:22 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-Sat Nov 22 18:04:34 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus.el: Pterodactyl Gnus v0.14 is released.
 
-       * gnus-mh.el (gnus-summary-save-in-folder): Fix for default.
+1998-09-03 15:08:30  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sat Nov 22 18:01:26 1997  Didier Verna  <verna@inf.enst.fr>
+       * mm-bodies.el (mm-body-encoding): Go through the buffer to make
+       sure we have 7bit.
 
-       * gnus-sum.el (gnus-summary-remove-bookmark): Interactive spec.
+1998-09-02 14:38:18  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Mon Nov 17 23:50:51 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-msg.el (gnus-post-method): Use opened servers, and remove
+       ducplicates.
+       (gnus-inews-insert-mime-headers): Removed.
 
-       * gnus-art.el (article-display-x-face): Fold case.
+       * message.el (message-caesar-region): Protect against MULE chars.
 
-Thu Nov 13 22:57:23 1997  Kenichi Handa  <handa@etl.go.jp>
+1998-09-02 00:36:23  Hallvard B. Furuseth  <h.b.furuseth@usit.uio.no>
 
-       * gnus/gnus-start.el (gnus-read-descriptions-file): Decode
-       description if necessary.
+       * mm-util.el (if): fset the right function.
 
-       * gnus/nntp.el (nntp-coding-system-for-read): Set default value to
-       binary.
-       (nntp-coding-system-for-write): Likewise.
+1998-09-02 00:31:53  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Thu Nov 13 22:30:19 1997  seokchan lee  <chan@xfer.kren.nm.kr>
+       * gnus-art.el (gnus-article-decode-charset): Use real
+       read-coding-system.
 
-       * message.el (message-ignored-supersedes-headers): Ignore more
-       headers.
+1998-09-01 17:58:40  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Thu Nov 13 22:28:13 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-bodies.el (mm-decode-body): Protect against malformed
+       base64.
+       (mm-decode-body): Check that buffer-file-coding-system is
+       non-nil.
 
-       * message.el (message-separator-face): Lightened up.
-       (message-header-other-face): Ditto.
+Tue Sep  1 10:29:33 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-Thu Nov 13 22:22:11 1997  jari aalto  <jari.aalto@poboxes.com>
+       * gnus.el: Pterodactyl Gnus v0.13 is released.
 
-       * nnmail.el (nnmail-process-mmdf-mail-format): Pop to buffer.
+1998-09-01 09:14:33  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Thu Nov 13 22:09:39 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-util.el (gnus-strip-whitespace): Already defined.
+       Removed.
 
-       * gnus-start.el (gnus-start-draft-setup): Always create group.
+       * gnus-art.el (gnus-article-decode-charset): Strip whitespace.
 
-       * gnus-agent.el (gnus-agent-fetch-headers): Translate file chars.
+       * gnus-util.el (gnus-strip-whitespace): New function.
 
-Thu Nov  6 20:43:05 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * mm-util.el (mm-content-type-charset): Downcase.
 
-       * gnus.el: Quassia Gnus v0.13 is released.
+1998-08-31 23:04:29  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Thu Nov  6 20:30:14 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-article-decode-charset): Accept a prefix.
+       (gnus-article-decode-charset): Don't fetch all headers.
 
-       * nnlistserv.el: New backend.
+       * mm-util.el (mm-read-coding-system): New function.
 
-Thu Nov  6 01:53:51 1997  Stefan Waldherr  <swa@cs.cmu.edu>
+       * mm-bodies.el (mm-decode-body): Check the right charset.
 
-       * nnweb.el (nnweb-dejanewsold-search): New function.
+       * gnus-sum.el (gnus-summary-mode-line-format): Ditto.
 
-Thu Nov  6 01:52:43 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-article-mode-line-format): Use short group
+       format.
 
-       * gnus-topic.el (gnus-topic-change-level): Really delete multiple
-       instances.
+Mon Aug 31 23:03:13 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-Wed Nov  5 14:04:54 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus.el: Pterodactyl Gnus v0.12 is released.
 
-       * gnus-topic.el (gnus-topic-update-topic-line): Possibly fix nil
-       numbers.
+1998-08-31 22:39:36  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-sum.el (gnus-summary-show-article): New command and
-       keystroke.
+       * mm-bodies.el (mm-decode-body): Don't do charset unless MULE.
 
-Tue Nov  4 06:29:58 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-art.el (gnus-article-decode-charset): Supply cte.
+       (gnus-article-decode-charset): Always run.
 
-       * gnus-score.el (gnus-score-adaptive): Use the home score file.
+       * mm-bodies.el (mm-decode-body): Decode cte.
 
-Sat Oct 25 05:52:22 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Mon Aug 31 22:14:50 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-art.el (gnus-article-save): Hide headers in the right
-       buffer.
+       * gnus.el: Pterodactyl Gnus v0.11 is released.
 
-       * gnus-picon.el (gnus-picons-xbm-face): New face.
+1998-08-31 14:27:25  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sat Oct 25 00:39:42 1997  Lars Balker Rasmussen  <lbr@mjolner.dk>
+       * message.el (message-encode-message-body): Ditto.
 
-       * gnus-art.el (gnus-article-fill-paragraph): New command and
+       * gnus-art.el (gnus-article-decode-mime-words): New command and
        keystroke.
+       (gnus-article-decode-charset): Ditto.
+       (gnus-article-decode-charset): Only work under MULE.
 
-1997-10-16  Colin Rafferty  <craffert@ml.com>
-
-       * message.el (message-make-fqdn): Made certain that user-mail is
-                 not nil.
-
-Sat Oct 25 00:18:32 1997  David S. Goldberg  <dsg@linus.mitre.org>
-
-       * gnus-art.el (article-hide-boring-headers): Use many-to.
-
-Fri Oct 24 23:48:39 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-picon.el (gnus-picons-display-pairs): Don't add two bars.
-       (gnus-picons-try-face): Set the foreground color on the bar.
-       (gnus-picons-group-exluded-groups): New variable.
-       (gnus-group-display-picons): Use it.
-
-Mon Oct 13 00:01:35 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-agent.el (gnus-agent-group-path): Translate file chars.
-       (gnus-agent-batch-fetch): New command.
-       (gnus-agent-fetch-group): Message.
-
-Sun Oct 12 23:54:55 1997  ISO-2022-JP  <ichikawa@hv.epson.co.jp>
-
-       * gnus-agent.el (gnus-agent-article-file-coding-system): New
-       variable.
-
-Sun Oct 12 16:46:11 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * dgnushack.el (lpath): Reversed.
-
-       * gnus-msg.el (gnus-summary-cancel-article): Use sym prefix.
-
-       * gnus-art.el (article-translate-characters): New function.
-       (article-treat-dumbquotes): New command and keystroke.
-
-Sun Oct  5 20:09:31 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-art.el (gnus-button-alist): No ' and " in News:.
-
-       * gnus-msg.el (gnus-inews-insert-archive-gcc): Comp warn.
-
-Sat Oct  4 00:53:55 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Quassia Gnus v0.12 is released.
-
-Sat Oct  4 00:16:39 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.el (gnus-plugged): Moved here.
-
-       * nnmail.el (nnmail-delete-incoming): Changed default to nil.
-
-       * gnus-int.el (gnus-request-scan): Don't do anything if
-       unplugged.
-
-Fri Oct  3 21:09:19 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-art.el (gnus-ignored-headers): Doc fix.
-
-       * gnus-demon.el (gnus-demon-add-nntp-close-connection): New
-       function.
-       (gnus-demon-nntp-close-connection): Ditto.
-
-       * nntp.el (nntp-last-command-time): New variable.
-       (nntp-retrieve-data): Use it.
-
-       * message.el (message-news-p): Messages with Posted-To aren't
-       news.
-       (message-mode): Heed message-yank-prefix when filling.
-
-       * nndraft.el (nndraft-request-restore-buffer): Remove Xrefs and
-       Lines headers.
-
-       * nntp.el (nntp-encode-text): Encode according to RFC977.
-
-Wed Oct  1 18:27:26 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-msg.el (gnus-inews-insert-archive-gcc): gcc-self didn't
-       work if `gnus-message-archive-method' was nil.
-
-       * nnmail.el (nnmail-article-group): Allow \\1 substitution.
-
-Sat Sep 27 12:57:44 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-salt.el (gnus-pick-mouse-pick-region): Use it.
-
-       * gnus-xmas.el (gnus-xmas-window-edges): New function.
-
-       * gnus-score.el (gnus-score-edit-current-scores): Don't select
-       window.
-
-Sat Sep 27 12:52:31 1997  Hallvard B. Furuseth  <h.b.furuseth@usit.uio.no>
-
-       * messcompat.el ((boundp 'mail-mode-hook)): Check.
-
-Sat Sep 27 09:22:15 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * nndraft.el (nndraft-possibly-change-group): Always open server.
-
-       * gnus-sum.el (gnus-summary-pop-article): Force.
-
-       * gnus-art.el (gnus-article-prepare): Push the article onto the
-       history.
-
-       * gnus-sum.el (gnus-summary-pop-article): Pop to the right
-       article.
-
-       * gnus-demon.el (gnus-demon-scan-news): Save excursion.
-
-Sat Sep 27 09:06:55 1997  Hallvard B. Furuseth  <h.b.furuseth@usit.uio.no>
-
-       * gnus-cache.el (gnus-summary-limit-include-cached): New command
-       and keystroke.
-
-Sat Sep 27 06:45:58 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-uu.el (gnus-uu-invert-processable): Make interactive.
-
-Sat Sep 27 06:43:38 1997  Kim-Minh Kaplan  <kimminh.kaplan@utopia.eunet.fr>
-
-       * gnus-picon.el: Doc fixes.
-
-1997-09-23  Hrvoje Niksic  <hniksic@srce.hr>
+       * mm-util.el (mm-content-type-charset): New function.
 
-       * gnus.el: Removed definition of `custom-face-lookup'.
+       * nnmail.el (nnmail-delete-incoming): Changed to nil.
 
-Sat Sep 27 05:36:11 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * message.el (message-send-mail): Insert MIME headers.
+       (message-check-news-body-syntax): Don't warn for escape sequences.
+       (message-check-news-body-syntax): Insert MIME headers.
 
-       * nndraft.el: Would block nnmh.
+       * mm-bodies.el (mm-body-encoding): New function.
 
-       * gnus-sum.el (gnus-mark-article-as-unread): Don't allow marking
-       negative articles.
+       * message.el (message-encode-message-body): New function.
 
-       * gnus-group.el (gnus-fetch-group): Use `gnus-no-server'.
+       * mm-bodies.el: New file.
 
-       * gnus-agent.el (gnus-agent-with-fetch): Moved.
+       * mm-util.el (mm-narrow-to-head): New function.
 
-       * gnus-sum.el (gnus-nov-read-integer): Really skip to next field.
+       * rfc2047.el (rfc2047-encode): Use it.
 
-Sat Sep 27 04:32:45 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * mm-util.el: Provide mm-encode-coding-region.
 
-       * gnus.el: Quassia Gnus v0.11 is released.
+       * gnus-sum.el (gnus-summary-mode): Enable multibyte.
 
-Sat Sep 27 03:50:12 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-util.el (gnus-set-work-buffer): Enable multibyte.
 
-       * message.el (message-send): Post without asking.
-       (message-mode): Modify paragraphs-start and paragraph-separate.
-       (message-newline-and-reformat): New command and keystroke.
+       * mm-util.el (mm-enable-multibyte): New function.
 
-Thu Sep 25 00:13:41 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * message.el (message-set-work-buffer): Set multibyte.
 
-       * nnmail.el (nnmail-activate): Init server buffer.
+       * gnus.el (gnus-continuum-version): Be valid forever and ever.
 
-Wed Sep 24 04:11:59 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus-util.el (gnus-point-at-eol): Removed.
+       (gnus-point-at-bol): Ditto.
 
-       * gnus-draft.el (gnus-draft-setup): Inexplicable binding problem
-       worked around.
+       * base64.el (base64-decode-region): Commented out messaging.
 
-       * nnsoup.el (nnsoup-always-save): Renamed.
+1998-08-31  Didier Verna  <verna@inf.enst.fr>
 
-Wed Sep 24 04:11:02 1997  Nelson Jose dos Santos Ferreira  <Nelson.Ferreira@inesc.pt>
+       * gnus-msg.el (gnus-group-mail): make it behave like
+       gnus-group-post-news with regards to the prefix (this enables the
+       use of posting styles).
 
-       * nnsoup.el (nnsoup-commit-reply-now): New variable.
-       (nnsoup-store-reply): Use it.
+1998-08-31 12:53:32  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Wed Sep 24 02:30:44 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus.el (gnus-article-display-hook): Added
+       gnus-article-decode-rfc1522 to hook.
 
-       * gnus-ems.el (gnus-deactivate-mark): New alias.
+Mon Aug 31 12:43:46 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-Tue Sep 23 07:56:07 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus.el: Pterodactyl Gnus v0.10 is released.
 
-       * gnus.el: Win-away!
+1998-08-31 11:45:13  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-msg.el (gnus-setup-message): Don't trust make-symbol.
+       * nnfolder.el (nnfolder-delete-mail): Narrow to mail and allow
+       hook to be run.
 
-Tue Sep 23 07:45:11 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-08-30 17:59:07  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.el: Quassia Gnus v0.10 is released.
+       * rfc2047.el (rfc2047-encodable-p): Use find-charset-region.
 
-Tue Sep 23 01:41:04 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-util.el (mm-charsets-in-region): Removed.
 
-       * gnus-sum.el (gnus-read-all-headers): New function.
-       (gnus-select-newsgroup): Use it.
-       (gnus-summary-refer-thread): Ditto.
-       (gnus-refer-thread-limit): New variable.
-       (gnus-summary-refer-thread): Use it.
+       * rfc2047.el: Renamed file.
 
-       * gnus-nocem.el (gnus-nocem-message-wanted-p): New function.
-       (gnus-nocem-check-article): Use it.
-       (gnus-nocem-issuers): Dox ofx.
+       * gnus-msg.el (gnus-copy-article-buffer): Multibyte.
 
-       * dgnushack.el (dgnushack-compile): Check for cus-edit.
+       * message.el (message-mode): Set multibyte.
 
-       * message.el (message-included-forward-headers): Include Mime
-       headers.
-       (message-send): Allow posting without confirming from Agent.
-
-Mon Sep 22 05:43:14 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * dgnushack.el (byte-compile-warnings): Don't warn about obsolete
-       variables.
-
-       * gnus-sum.el (gnus-summary-refer-thread): New command and
-       keystroke.
-       (gnus-summary-limit-include-thread): New command and keystroke.
-       (gnus-summary-articles-in-thread): New function.
-       (gnus-articles-in-thread): Renamed.
-
-Sun Sep 21 23:54:50 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Quassia Gnus v0.9 is released.
-
-Sun Sep 21 23:38:46 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.el (gnus-splash-face): ForestGreen everywhere.
-
-       * gnus-sum.el (gnus-simplify-subject-fully): Use new variable.
-       (gnus-general-simplify-subject): Ditto.
-
-Sun Sep 21 23:34:13 1997  Kurt Swanson  <kurt@dna.lth.se>
-
-       * gnus-sum.el (gnus-simplify-subject-functions): New variable.
-       (gnus-simplify-whitespace): New function.
-
-       * gnus-util.el (gnus-map-function): New function.
-
-Sun Sep 21 23:22:04 1997  Michelangelo Grigni  <mic@mathcs.emory.edu>
-
-       * gnus-score.el (gnus-score-regexp-bad-p): New function.
-
-Sun Sep 21 00:14:40 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-util.el (mm-charsets-in-region): Copied here.
 
-       * gnus-score.el (gnus-summary-lower-score): Use sym pref.
-       (gnus-summary-increase-score): Use it.
+       * gnus-util.el: Removed gnus-truncate-string.
 
-       * gnus.el (gnus-current-prefix-symbol): New variable.
-       (gnus-current-prefix-symbols): New variable.
+       * gnus-art.el (gnus-article-decode-mime-words): Use 1522.
 
-       * gnus-score.el (gnus-summary-increase-score): Take symbolic
-       prefix.
+       * rfc1522.el (rfc1522-unencoded-charsets): New variable.
+       (rfc1522-encodable-p): New function.
+       (rfc1522-encode-message-header): Use it.
 
-       * gnus.el (gnus-interactive): Removed.
-       (gnus-interactive): Renamed from gnus-interactive-1.
-       (gnus-symbolic-argument): New command.
+Sun Aug 30 17:46:01 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-draft.el (gnus-draft-send-message): Disable message
-       checks.
-       (gnus-draft-send): Ditto.
-       (gnus-draft-setup): Don't save buffer.
+       * gnus.el: Pterodactyl Gnus v0.9 is released.
 
-       * dgnushack.el (dgnushack-compile): Warn people about Custom.
+1998-08-30 16:13:08  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-group.el (gnus-group-iterate): Use gensymmed variables.
+       * mm-util.el: Shadow encode-coding-string.
 
-       * pop3.el (pop3-md5): `with-temp-buffer' doesn't exist in Emacs
-       19.34.
+       * base64.el (base64-encode-region): Don't add newline.
 
-       * nneething.el (nneething-directory): Defvarred.
+       * rfc1522.el (rfc1522-narrow-to-field): Copied here.
 
-       * message.el: Autoloaded nndraft things.
-       (message-set-auto-save-file-name): Use it.
+       * mm-util.el: New file.
 
-       * dgnushack.el (dgnushack-compile): Warn about things.
+       * mm-decode.el: Somewhat depleted.
+       * mm-encode.el: Ditto.
 
-       * gnus-art.el: Autoload w3-region.
+       * rfc1522.el: New file.
 
-       * gnus-vm.el (gnus-summary-save-in-vm): Simplified.
+       * mm-util.el (mm-replace-chars-in-string): Copied here.
 
-       * gnus.el: Changed `compiled-function-p' to `byte-code-function-p'
-       throughout.
+       * mm-encode.el (mm-q-encode-region): New function.
 
-       * gnus-sum.el (gnus-summary-edit-article): Supply additional
+       * qp.el (quoted-printable-encode-region): Take an optional CLASS
        param.
 
-       * gnus-group.el (gnus-group-iterate): Undo bogus change.
+       * mm-encode.el (mm-encode-word-region): Downcase.
 
-       * gnus-agent.el (gnus-agentize): Just call gnus-open-agent
-       directly.
+Sun Aug 30 15:28:01 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus.el (gnus-interactive): New macro.
-       (gnus-interactive-1): New function.
+       * gnus.el: Pterodactyl Gnus v0.8 is released.
 
-       * gnus-sum.el (gnus-fetch-old-headers): Allow `invisible'.
-       (gnus-cut-thread): Use it.
-       (gnus-cut-threads): Ditto.
-       (gnus-summary-initial-limit): Ditto.
-       (gnus-summary-limit-children): Ditto.
+1998-08-30 12:23:03  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus-art.el (gnus-article-edit-done): Accept a prefix arg.
-       (gnus-boring-article-headers): Allow `long-to' param.
-       (article-hide-boring-headers): Use it.
+       * message.el (message-send-mail): Encode headers.
 
-       * gnus-sum.el (gnus-summary-edit-article-done): Accept a
-       no-highlight param.
+       * qp.el (quoted-printable-encode-region): Encode 8-bit words.
+       (quoted-printable-encode-region): Upcase.
 
-       * nntp.el (nntp-rlogin-program): New variable.
-       (nntp-open-rlogin): Use it.
+       * message.el (message-default-charset): New variable.
 
-       * nnvirtual.el (nnvirtual-request-post): New function.
+       * qp.el (quoted-printable-encode-region): Optional param FOLD.
 
-       * gnus-msg.el (gnus-message-group-art): New variable.
+       * message.el (message-narrow-to-field): Changed name.
 
-       * gnus-draft.el (gnus-draft-setup): Don't use message-setup.
+       * mm-encode.el: New file.
 
-       * nndraft.el (nndraft): Allow editing articles.
+       * message.el (message-narrow-to-header): New function.
 
-       * gnus-ems.el (gnus-x-splash): Ditto.
+       * gnus-art.el (gnus-article-decode-mime-words): Place point in the
+       right buffer.
 
-       * gnus.el (gnus-splash-face): Darker face.
+Sun Aug 30 12:15:54 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-draft.el (gnus-draft-setup): Clobbered variables.
+       * gnus.el: Pterodactyl Gnus v0.7 is released.
 
-Sat Sep 20 23:23:49 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+1998-08-30 01:26:12  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.el: Quassia Gnus v0.8 is released.
+       * gnus.el: Remove autoload for
+       gnus-article-mime-decode-quoted-printable.
 
-Sat Sep 20 20:41:16 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el (mm-charset-to-coding-system): Allow iso-8859-1 to
+       be decoded in non-MULE Emacsen.
 
-       * gnus-start.el (gnus-setup-news-hook): New hook.
+       * gnus-xmas.el (gnus-xmas-logo-color-alist): More brown.
 
-       * gnus-agent.el (gnus-agentize): Really set up queue group.
-       (gnus-open-agent): Setup queue here.
+1998-08-29  SL Baur  <steve@altair.xemacs.org>
 
-Sat Sep 20 20:23:07 1997  Matt Simmons  <simmonmt@acm.org>
+       * gnus-xmas.el (gnus-xmas-logo-color-alist): Try shades of brown.
 
-       * message.el (message-set-auto-save-file-name): Make things work
-       without drafts.
+1998-08-30 01:04:57  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sat Sep 20 18:32:02 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el: Check for coding-system-list.
 
-       * nnmh.el (nnmh-request-list-1): Check for links to ".".
+Sun Aug 30 00:59:15 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * nndraft.el (nndraft-possibly-change-group): New function.
+       * gnus.el: Pterodactyl Gnus v0.6 is released.
 
-       * gnus-agent.el (gnus-agent-queue-setup): New function.
+1998-08-30 00:36:28  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Thu Sep 18 04:54:59 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * nnheader.el (fboundp): Protect code-coding-string.
 
-       * gnus.el: Quassia Gnus v0.7 is released.
+       * gnus-art.el (gnus-article-mode): Check that set-buffer-multibyte
+       is available.
 
-Thu Sep 18 03:33:54 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Sat Aug 29 23:24:31 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-msg.el (gnus-setup-message): Slap a progn around forms.
+       * gnus.el: Pterodactyl Gnus v0.5 is released.
 
-       * nndraft.el (nndraft-articles): Make sure directory exists.
+1998-08-29 22:38:35  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * message.el (message-mode): Don't delete article.
+       * gnus-art.el (gnus-article-mode): Make article buffer multibyte.
+       (gnus-hack-decode-rfc1522): Removed.
 
-       * nnmh.el (nnmh-request-accept-article): Don't save when
-       noinsert.
+       * mm-decode.el (mm-charset-coding-system-alist): Check better.
 
-Wed Sep 17 03:37:59 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+Sat Aug 29 22:20:39 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * nndraft.el (nndraft-directory): Changed defaults.
+       * gnus.el: Gnus v0.4 is released.
 
-       * gnus-agent.el (gnus-agent-fetch-session): Bind command method.
+1998-08-29 20:53:29  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Wed Sep 17 03:28:36 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Quassia Gnus v0.6 is released.
-
-1997-08-17  SL Baur  <steve@altair.xemacs.org>
-
-       * dgnushack.el (dgnushack-compile): Ignore .el files beginning
-       with an `=' character.
-
-Wed Sep 17 02:30:04 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-sum.el (gnus-build-sparse-threads): Allow display of looped
-       References.
-
-       * gnus-agent.el (gnus-agent-fetch-group-1): Separated out into
-       function.
-
-       * message.el (message-delete-not-region): New command and
+       * gnus-art.el (gnus-article-decode-mime-words): New command and
        keystroke.
 
-Tue Sep 16 00:58:26 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * nndraft.el (nndraft-directory): Changed value.
-
-       * message.el (message-kill-buffer): Disassociate draft.
-       (message-mode): Use kill hook to disassociate.
-       (message-disassociate-draft): Double-check.
-
-       * gnus-agent.el (gnus-agentize): Don't set twice.
-
-       * gnus-art.el (gnus-article-prepare): Go to the right line before
-       marking.
-
-       * gnus-start.el: Renamed the drafts group.
-
-       * gnus-agent.el (gnus-agent-lib-file): Changed name of directory.
-
-       * gnus-draft.el (gnus-draft-mode): Simplify.
-
-Tue Sep 16 00:18:11 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Quassia Gnus v0.5 is released.
-
-Mon Sep 15 00:53:50 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-sum.el (gnus-alter-header-function): New variable.
-       (gnus-nov-parse-line): Use it.
-       (gnus-get-newsgroup-headers): Ditto.
-
-       * gnus-draft.el (gnus-group-send-drafts): Don't send when
-       unplugged.
-
-       * gnus-sum.el (gnus-summary-read-group): Don't show-all when
-       skipping groups.
-
-       * gnus-start.el (gnus-start-draft-setup): Changed name.
-
-Mon Sep 15 00:40:09 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Quassia Gnus v0.4 is released.
-
-Mon Sep 15 00:19:07 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-sum.el (gnus-summary-goto-article): Accept Message-ID's.
-
-Sun Sep 14 21:41:35 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-sum.el (gnus-group-make-articles-read): No params.
-
-       * nndraft.el (nndraft-status-string): Fix.
-
-       * gnus-draft.el (gnus-group-send-drafts): New command.
-
-       * gnus-sum.el (gnus-compute-read-articles): Separated.
-       (gnus-update-read-articles): Allow computation.
-
-       * nndraft.el (nndraft-articles): New function.
-
-       * message.el (message-send): Disabled test.
-
-Sun Sep 14 21:17:34 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
-
-       * gnus.el: Quassia Gnus v0.3 is released.
-
-Sun Sep 14 01:51:45 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus-agent.el (gnus-agent-short-article): New variables.
-
-       * message.el (message-set-auto-save-file-name): Use drafts.
-
-       * nndraft.el (nndraft-request-expire-articles): Use it.
-
-       * nnmh.el (nnmh-deletable-article-p): Change.
-       (nnmh-allow-delete-final): New variable.
-
-       * gnus-msg.el (gnus-summary-send-draft): Removed.
-
-       * gnus.el (gnus-article-mark-lists): Save unsendable marks.
-
-       * gnus-sum.el (gnus-newsgroup-unsendable): New variable.
-
-       * gnus-draft.el: New file.
-
-       * gnus-sum.el (gnus-unsendable-mark): New variable.
-
-       * nndraft.el (nndraft-execute-nnmh-command): Cleanup.
-
-       * message.el (message-send-news): Use `gnus-request-post'.
-
-       * gnus-agent.el (gnus-agentize): New command.
-
-       * gnus-bcklg.el (gnus-backlog-remove-article): Remove the ident
-       from the list.
+       * qp.el (quoted-printable-decode-region): Don't use hexl.
 
-Sun Sep 14 00:26:47 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+       * gnus-xmas.el (gnus-xmas-logo-color-style): Changed to dino.
 
-       * gnus.el: Quassia Gnus v0.2 is released.
+       * gnus-sum.el (gnus-parse-headers-hook): Default to nil.
+       (gnus-structured-field-decoder): Removed.
+       (gnus-unstructured-field-decoder): Ditto.
 
-Sun Sep 14 00:24:52 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * mm-decode.el: New file.
 
-       * gnus-score.el (gnus-score-headers): Make sure the summary buffer
-       exists.
+       * qp.el: New file.
 
-Sat Sep 13 23:35:28 1997  Greg Stark  <gsstark@mit.edu>
+       * gnus-art.el (article-mime-decode-quoted-printable): Removed.
 
-       * gnus-ems.el (gnus-x-splash): New function.
+       * gnus-ems.el (fboundp): Removed gnus-split-string.
 
-Sat Sep 13 22:46:16 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus.el (gnus-splash-face): Doc fix.
 
-       * gnus-start.el (gnus-1): Use it.
+       * gnus-ems.el (fboundp): Don't bind mail-file-babyl-p.
 
-       * gnus-ems.el (gnus-decode-coding-string): New alias.
+       * gnus-art.el (article-mime-decode-quoted-printable): Don't use
+       hexl.
 
-       * message.el (message-unix-mail-delimiter): Dox fox.
+       * nnheader.el (nnheader-temp-write): Removed.
 
-       * nnmh.el (nnmh-request-list-1): Don't use coding system.
+Sat Aug 29 20:34:17 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus-sum.el (gnus-summary-catchup): Reverse logic.
+       * gnus.el: Gnus v0.3 is released.
 
-Sat Sep 13 21:21:38 1997  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+Sat Aug 29 19:32:06 1998  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
-       * gnus.el: Quassia Gnus v0.1 is released.
+       * gnus.el: Gnus v0.2 is released.
index d143e8f..108c6fa 100644 (file)
@@ -12,22 +12,17 @@ INSTALL_DATA = @INSTALL_DATA@
 SHELL = /bin/sh
 VPATH = @srcdir@
 
-total:
-       rm -f *.elc ; $(EMACS) $(FLAGS) -f dgnushack-compile
-
-all:
+all total:
        rm -f *.elc ; $(EMACS) $(FLAGS) -f dgnushack-compile
 
 warn:
        rm -f *.elc ; $(EMACS) $(FLAGS) --eval '(dgnushack-compile t)' 2>&1 | egrep -v "variable G|inhibit-point-motion-hooks|coding-system|temp-results|variable gnus|variable nn|scroll-in-place|deactivate-mark|filladapt-mode|byte-code-function-p|print-quoted|ps-right-header|ps-left-header|article-inhibit|print-escape|ssl-program-arguments|message-log-max"
 
-clever:
-       $(EMACS) $(FLAGS) -f dgnushack-compile
-
-some:
+clever some:
        $(EMACS) $(FLAGS) -f dgnushack-compile
 
 install: clever
+       rm -f dgnushack.elc
        $(SHELL) $(top_srcdir)/mkinstalldirs $(lispdir)
        for p in *.elc; do \
          echo " $(INSTALL_DATA) $$p $(lispdir)/$$p"; \
index a5d1d65..c2b4f82 100644 (file)
@@ -30,7 +30,6 @@
 
 (require 'cl)
 (require 'bytecomp)
-(push "~/lisp/custom" load-path)
 (push "." load-path)
 (load "./lpath.el" nil t)
 
index 4302182..a698479 100644 (file)
@@ -74,8 +74,6 @@
 (defvar earcon-button-marker-list nil)
 (make-variable-buffer-local 'earcon-button-marker-list)
 
-
-
 ;;; FIXME!! clone of code from gnus-vis.el FIXME!!
 (defun earcon-article-push-button (event)
   "Check text under the mouse pointer for a callback function.
@@ -156,7 +154,6 @@ If N is negative, move backward instead."
        (setq entry nil)))
     entry))
 
-
 (defun earcon-button-push (marker)
   ;; Push button starting at MARKER.
   (save-excursion
index e76e124..5f80f82 100644 (file)
@@ -27,7 +27,9 @@
 (require 'gnus-cache)
 (require 'nnvirtual)
 (require 'gnus-sum)
-(eval-when-compile (require 'cl))
+(eval-when-compile
+  (require 'cl)
+  (require 'gnus-score))
 
 (defcustom gnus-agent-directory (nnheader-concat gnus-directory "agent/")
   "Where the Gnus agent will store its files."
@@ -77,8 +79,6 @@ If nil, only read articles will be expired."
 
 ;;; Internal variables
 
-(defvar gnus-agent-meta-information-header "X-Gnus-Agent-Meta-Information")
-
 (defvar gnus-agent-history-buffers nil)
 (defvar gnus-agent-buffer-alist nil)
 (defvar gnus-agent-article-alist nil)
@@ -94,6 +94,13 @@ If nil, only read articles will be expired."
 (defvar gnus-agent-send-mail-function nil)
 (defvar gnus-agent-file-coding-system 'no-conversion)
 
+(defconst gnus-agent-scoreable-headers
+  (list
+   "subject" "from" "date" "message-id" 
+   "references" "chars" "lines" "xref")
+  "Headers that are considered when scoring articles
+for download via the Agent.")
+
 ;; Dynamic variables
 (defvar gnus-headers)
 (defvar gnus-score)
@@ -108,6 +115,8 @@ If nil, only read articles will be expired."
   (gnus-category-read)
   (setq gnus-agent-overview-buffer
        (gnus-get-buffer-create " *Gnus agent overview*"))
+  (with-current-buffer gnus-agent-overview-buffer
+    (mm-enable-multibyte))
   (add-hook 'gnus-group-mode-hook 'gnus-agent-mode)
   (add-hook 'gnus-summary-mode-hook 'gnus-agent-mode)
   (add-hook 'gnus-server-mode-hook 'gnus-agent-mode))
@@ -127,7 +136,7 @@ If nil, only read articles will be expired."
 
 (defun gnus-agent-read-file (file)
   "Load FILE and do a `read' there."
-  (nnheader-temp-write nil
+  (with-temp-buffer
     (ignore-errors
       (nnheader-insert-file-contents file)
       (goto-char (point-min))
@@ -334,7 +343,7 @@ agent minor mode in all Gnus buffers."
      (concat "^" (regexp-quote mail-header-separator) "\n"))
     (replace-match "\n")
     (gnus-agent-insert-meta-information 'mail)
-    (gnus-request-accept-article "nndraft:queue")))
+    (gnus-request-accept-article "nndraft:queue" nil t t)))
 
 (defun gnus-agent-insert-meta-information (type &optional method)
   "Insert meta-information into the message that says how it's to be posted.
@@ -427,7 +436,7 @@ be a select method."
 
 (defun gnus-agent-write-servers ()
   "Write the alist of covered servers."
-  (nnheader-temp-write (nnheader-concat gnus-agent-directory "lib/servers")
+  (with-temp-file (nnheader-concat gnus-agent-directory "lib/servers")
     (prin1 gnus-agent-covered-methods (current-buffer))))
 
 ;;;
@@ -538,7 +547,7 @@ the actual number of articles toggled is returned."
                     (gnus-agent-lib-file "active")
                   (gnus-agent-lib-file "groups"))))
       (gnus-make-directory (file-name-directory file))
-      (nnheader-temp-write file
+      (with-temp-file file
        (when (file-exists-p file)
          (nnheader-insert-file-contents file))
        (goto-char (point-min))
@@ -549,7 +558,8 @@ the actual number of articles toggled is returned."
                (gnus-delete-line))
              (insert group " " (number-to-string (cdr active)) " "
                      (number-to-string (car active)) " y\n"))
-         (when (re-search-forward (concat (regexp-quote group) " ") nil t)
+         (when (re-search-forward
+                (concat (regexp-quote group) "\\($\\| \\)") nil t)
            (gnus-delete-line))
          (insert-buffer-substring nntp-server-buffer))))))
 
@@ -656,7 +666,7 @@ the actual number of articles toggled is returned."
       (let ((dir (concat
                  (gnus-agent-directory)
                  (gnus-agent-group-path group) "/"))
-           (date (gnus-time-to-day (current-time)))
+           (date (time-to-days (current-time)))
            (case-fold-search t)
            pos crosses id elem)
        (gnus-make-directory dir)
@@ -664,7 +674,7 @@ the actual number of articles toggled is returned."
        ;; Fetch the articles from the backend.
        (if (gnus-check-backend-function 'retrieve-articles group)
            (setq pos (gnus-retrieve-articles articles group))
-         (nnheader-temp-write nil
+         (with-temp-buffer
            (let (article)
              (while (setq article (pop articles))
                (when (gnus-request-article article group)
@@ -749,43 +759,43 @@ the actual number of articles toggled is returned."
                      nil 'silent))
       (pop gnus-agent-buffer-alist))
     (while gnus-agent-group-alist
-      (nnheader-temp-write (caar gnus-agent-group-alist)
+      (with-temp-file (caar gnus-agent-group-alist)
        (princ (cdar gnus-agent-group-alist))
        (insert "\n"))
       (pop gnus-agent-group-alist))))
 
 (defun gnus-agent-fetch-headers (group &optional force)
   (let ((articles (if (gnus-agent-load-alist group)   
-                     (gnus-sorted-intersection
-                      (gnus-list-of-unread-articles group)
-                      (gnus-uncompress-range
-                       (cons (1+ (caar (last gnus-agent-article-alist)))
-                             (cdr (gnus-active group)))))
-                   (gnus-list-of-unread-articles group))))
+                     (gnus-sorted-intersection
+                      (gnus-list-of-unread-articles group)
+                      (gnus-uncompress-range
+                       (cons (1+ (caar (last gnus-agent-article-alist)))
+                             (cdr (gnus-active group)))))
+                   (gnus-list-of-unread-articles group)))
+       (gnus-decode-encoded-word-function 'identity)
+       (file (gnus-agent-article-name ".overview" group))) 
     ;; Fetch them.
+    (gnus-make-directory (nnheader-translate-file-chars
+                         (file-name-directory file)))
     (when articles
       (gnus-message 7 "Fetching headers for %s..." group)
       (save-excursion
-       (set-buffer nntp-server-buffer)
-       (unless (eq 'nov (gnus-retrieve-headers articles group))
-         (nnvirtual-convert-headers))
-       ;; Save these headers for later processing.
-       (copy-to-buffer gnus-agent-overview-buffer (point-min) (point-max))
-       (let (file)
-         (when (file-exists-p
-                (setq file (gnus-agent-article-name ".overview" group)))
-           (gnus-agent-braid-nov group articles file))
-         (gnus-make-directory (nnheader-translate-file-chars
-                               (file-name-directory file)))
-         (let ((coding-system-for-write
-                gnus-agent-file-coding-system))
-           (write-region (point-min) (point-max) file nil 'silent))
-         (gnus-agent-save-alist group articles nil)
-         (gnus-agent-enter-history
-          "last-header-fetched-for-session"
-          (list (cons group (nth (- (length  articles) 1) articles)))
-          (gnus-time-to-day (current-time)))
-         articles)))))
+       (set-buffer nntp-server-buffer)
+       (unless (eq 'nov (gnus-retrieve-headers articles group))
+         (nnvirtual-convert-headers))
+       ;; Save these headers for later processing.
+       (copy-to-buffer gnus-agent-overview-buffer (point-min) (point-max))
+       (when (file-exists-p file)
+         (gnus-agent-braid-nov group articles file))
+       (let ((coding-system-for-write
+              gnus-agent-file-coding-system))
+         (write-region (point-min) (point-max) file nil 'silent))
+       (gnus-agent-save-alist group articles nil)
+       (gnus-agent-enter-history
+        "last-header-fetched-for-session"
+        (list (cons group (nth (- (length  articles) 1) articles)))
+        (time-to-days (current-time)))
+       articles))))
 
 (defsubst gnus-agent-copy-nov-line (article)
   (let (b e)
@@ -846,9 +856,9 @@ the actual number of articles toggled is returned."
 
 (defun gnus-agent-save-alist (group &optional articles state dir)
   "Save the article-state alist for GROUP."
-  (nnheader-temp-write (if dir
-                          (concat dir ".agentview")
-                        (gnus-agent-article-name ".agentview" group))
+  (with-temp-file (if dir
+                     (concat dir ".agentview")
+                   (gnus-agent-article-name ".agentview" group))
     (princ (setq gnus-agent-article-alist
                 (nconc gnus-agent-article-alist
                        (mapcar (lambda (article) (cons article state))
@@ -893,6 +903,7 @@ the actual number of articles toggled is returned."
 (defun gnus-agent-fetch-group-1 (group method)
   "Fetch GROUP."
   (let ((gnus-command-method method)
+       (gnus-newsgroup-name group)
        gnus-newsgroup-dependencies gnus-newsgroup-headers
        gnus-newsgroup-scored gnus-headers gnus-score
        gnus-use-cache articles arts
@@ -903,27 +914,64 @@ the actual number of articles toggled is returned."
       ;; Parse them and see which articles we want to fetch.
       (setq gnus-newsgroup-dependencies
            (make-vector (length articles) 0))
-      (setq gnus-newsgroup-headers
-           (gnus-get-newsgroup-headers-xover articles nil nil group))
+      ;; No need to call `gnus-get-newsgroup-headers-xover' with 
+      ;; the entire .overview for group as we still have the just
+      ;; downloaded headers in `gnus-agent-overview-buffer'.
+      (let ((nntp-server-buffer gnus-agent-overview-buffer))
+       (setq gnus-newsgroup-headers
+             (gnus-get-newsgroup-headers-xover articles nil nil group)))
       (setq category (gnus-group-category group))
       (setq predicate
            (gnus-get-predicate 
-            (or (gnus-group-get-parameter group 'agent-predicate)
+            (or (gnus-group-get-parameter group 'agent-predicate t)
                 (cadr category))))
-      (setq score-param
-           (or (gnus-group-get-parameter group 'agent-score)
-               (caddr category)))
-      (when score-param
-       (gnus-score-headers (list (list score-param))))
-      (setq arts nil)
-      (while (setq gnus-headers (pop gnus-newsgroup-headers))
-       (setq gnus-score
-             (or (cdr (assq (mail-header-number gnus-headers)
-                            gnus-newsgroup-scored))
-                 gnus-summary-default-score))
-       (when (funcall predicate)
-         (push (mail-header-number gnus-headers)
-               arts)))
+      ;; Do we want to download everything, or nothing?
+      (if (or (eq (caaddr predicate) 'gnus-agent-true)
+             (eq (caaddr predicate) 'gnus-agent-false))
+         ;; Yes.
+         (setq arts (symbol-value 
+                     (cadr (assoc (caaddr predicate) 
+                                  '((gnus-agent-true articles)
+                                    (gnus-agent-false nil))))))
+       ;; No, we need to decide what we want.
+       (setq score-param
+             (let ((score-method
+                    (or 
+                     (gnus-group-get-parameter group 'agent-score t)
+                     (caddr category))))
+               (when score-method
+                 (require 'gnus-score)
+                 (if (eq score-method 'file)
+                     (let ((entries
+                            (gnus-score-load-files
+                             (gnus-all-score-files group)))
+                           list score-file)
+                       (while (setq list (car entries))
+                         (push (car list) score-file)
+                         (setq list (cdr list))
+                         (while list
+                           (when (member (caar list)
+                                         gnus-agent-scoreable-headers)
+                             (push (car list) score-file))
+                           (setq list (cdr list)))
+                         (setq score-param 
+                               (append score-param (list (nreverse score-file)))
+                               score-file nil entries (cdr entries)))
+                       (list score-param))
+                   (if (stringp (car score-method))
+                       score-method
+                     (list (list score-method)))))))
+       (when score-param
+         (gnus-score-headers score-param))
+       (setq arts nil)
+       (while (setq gnus-headers (pop gnus-newsgroup-headers))
+         (setq gnus-score
+               (or (cdr (assq (mail-header-number gnus-headers)
+                              gnus-newsgroup-scored))
+                   gnus-summary-default-score))
+         (when (funcall predicate)
+           (push (mail-header-number gnus-headers)
+                 arts))))
       ;; Fetch the articles.
       (when arts
        (gnus-agent-fetch-articles group arts)))
@@ -934,7 +982,11 @@ the actual number of articles toggled is returned."
       (gnus-agent-fetch-articles
        group (gnus-uncompress-range (cdr arts)))
       (setq marks (delq arts (gnus-info-marks info)))
-      (gnus-info-set-marks info marks))))
+      (gnus-info-set-marks info marks)
+      (gnus-dribble-enter
+       (concat "(gnus-group-set-info '"
+              (gnus-prin1-to-string info)
+              ")")))))
 
 ;;;
 ;;; Agent Category Mode
@@ -1036,7 +1088,7 @@ The following commands are available:
   (gnus-set-default-directory)
   (setq mode-line-process nil)
   (use-local-map gnus-category-mode-map)
-  (buffer-disable-undo (current-buffer))
+  (buffer-disable-undo)
   (setq truncate-lines t)
   (setq buffer-read-only t)
   (gnus-run-hooks 'gnus-category-mode-hook))
@@ -1093,7 +1145,7 @@ The following commands are available:
   "Write the category alist."
   (setq gnus-category-predicate-cache nil
        gnus-category-group-cache nil)
-  (nnheader-temp-write (nnheader-concat gnus-agent-directory "lib/categories")
+  (with-temp-file (nnheader-concat gnus-agent-directory "lib/categories")
     (prin1 gnus-category-alist (current-buffer))))
 
 (defun gnus-category-edit-predicate (category)
@@ -1154,7 +1206,7 @@ The following commands are available:
   (interactive "SCategory name: ")
   (when (assq category gnus-category-alist)
     (error "Category %s already exists" category))
-  (push (list category 'true nil nil)
+  (push (list category 'false nil nil)
        gnus-category-alist)
   (gnus-category-write)
   (gnus-category-list))
@@ -1267,7 +1319,7 @@ The following commands are available:
   "Expire all old articles."
   (interactive)
   (let ((methods gnus-agent-covered-methods)
-       (day (- (gnus-time-to-day (current-time)) gnus-agent-expire-days))
+       (day (- (time-to-days (current-time)) gnus-agent-expire-days))
        gnus-command-method sym group articles
        history overview file histories elem art nov-file low info
        unreads marked article)
@@ -1384,10 +1436,11 @@ The following commands are available:
               ;; Maybe everything has been expired from `gnus-article-alist'
               ;; and so the above marking as read could not be conducted,
               ;; or there are expired article within the range of the alist.
-              (when (and (car expired)
+              (when (and info
+                         expired
                          (or (not (caar gnus-agent-article-alist))
                              (> (car expired)
-                                (caar gnus-agent-article-alist))) )
+                                (caar gnus-agent-article-alist))))
                 (setcar (nthcdr 2 info)
                         (gnus-add-to-range
                          (nth 2 info)
index 4eab8db..9936748 100644 (file)
 (require 'gnus-spec)
 (require 'gnus-int)
 (require 'browse-url)
+(require 'mm-bodies)
+(require 'mail-parse)
+(require 'mm-decode)
+(require 'mm-view)
+(require 'wid-edit)
+(require 'mm-uu)
 
 (defgroup gnus-article nil
   "Article display."
@@ -92,7 +98,7 @@
 
 (defcustom gnus-ignored-headers
   '("^Path:" "^Expires:" "^Date-Received:" "^References:" "^Xref:" "^Lines:"
-    "^Relay-Version:" "^Message-ID:" "^Approved:" "^Sender:" "^Received:" 
+    "^Relay-Version:" "^Message-ID:" "^Approved:" "^Sender:" "^Received:"
     "^X-UIDL:" "^MIME-Version:" "^Return-Path:" "^In-Reply-To:"
     "^Content-Type:" "^Content-Transfer-Encoding:" "^X-WebTV-Signature:"
     "^X-MimeOLE:" "^X-MSMail-Priority:" "^X-Priority:" "^X-Loop:"
     "^X-Complaints-To:" "^X-NNTP-Posting-Host:" "^X-Orig.*:"
     "^Abuse-Reports-To:" "^Cache-Post-Path:" "^X-Article-Creation-Date:"
     "^X-Poster:" "^X-Mail2News-Path:" "^X-Server-Date:" "^X-Cache:"
-    "^Originator:" "^X-Problems-To:" "^X-Auth-User:" "^X-Post-Time:" 
+    "^Originator:" "^X-Problems-To:" "^X-Auth-User:" "^X-Post-Time:"
     "^X-Admin:" "^X-UID:" "^Resent-[-A-Za-z]+:" "^X-Mailing-List:"
     "^Precedence:" "^Original-[-A-Za-z]+:" "^X-filename:" "^X-Orcpt:"
     "^Old-Received:" "^X-Pgp-Fingerprint:" "^X-Pgp-Key-Id:"
@@ -272,8 +278,6 @@ be fed to `format-time-string'."
   :group 'gnus-article-washing)
 
 (eval-and-compile
-  (autoload 'hexl-hex-string-to-integer "hexl")
-  (autoload 'timezone-make-date-arpa-standard "timezone")
   (autoload 'mail-extract-address-components "mail-extr"))
 
 (defcustom gnus-save-all-headers t
@@ -375,23 +379,6 @@ be used as possible file names."
                         (cons :value ("" "") regexp (repeat string))
                         (sexp :value nil))))
 
-(defcustom gnus-strict-mime t
-  "*If nil, MIME-decode even if there is no Mime-Version header."
-  :group 'gnus-article-mime
-  :type 'boolean)
-
-(defcustom gnus-show-mime-method 'metamail-buffer
-  "Function to process a MIME message.
-The function is called from the article buffer."
-  :group 'gnus-article-mime
-  :type 'function)
-
-(defcustom gnus-decode-encoded-word-method 'gnus-article-de-quoted-unreadable
-  "*Function to decode MIME encoded words.
-The function is called from the article buffer."
-  :group 'gnus-article-mime
-  :type 'function)
-
 (defcustom gnus-page-delimiter "^\^L"
   "*Regexp describing what to use as article page delimiters.
 The default value is \"^\^L\", which is a form linefeed at the
@@ -399,7 +386,7 @@ beginning of a line."
   :type 'regexp
   :group 'gnus-article-various)
 
-(defcustom gnus-article-mode-line-format "Gnus: %%b %S"
+(defcustom gnus-article-mode-line-format "Gnus: %g %S"
   "*The format specification for the article mode line.
 See `gnus-summary-mode-line-format' for a closer description."
   :type 'string
@@ -546,8 +533,67 @@ displayed by the first non-nil matching CONTENT face."
                               (item :tag "skip" nil)
                               (face :value default)))))
 
+(defcustom gnus-article-decode-hook
+  '(article-decode-charset article-decode-encoded-words)
+  "*Hook run to decode charsets in articles."
+  :group 'gnus-article-headers
+  :type 'hook)
+
+(defcustom gnus-display-mime-function 'gnus-display-mime
+  "Function to display MIME articles."
+  :group 'gnus-article-headers
+  :type 'function)
+
+(defvar gnus-decode-header-function 'mail-decode-encoded-word-region
+  "Function used to decode headers.")
+
+(defvar gnus-article-dumbquotes-map
+  '(("\202" ",")
+    ("\203" "f")
+    ("\204" ",,")
+    ("\205" "...")
+    ("\213" "<")
+    ("\214" "OE")
+    ("\205" "...")
+    ("\221" "`")
+    ("\222" "'")
+    ("\223" "``")
+    ("\224" "''")
+    ("\225" "*")
+    ("\226" "-")
+    ("\227" "-")
+    ("\231" "(TM)")
+    ("\233" ">")
+    ("\234" "oe")
+    ("\264" "'"))
+  "Table for MS-to-Latin1 translation.")
+
+(defcustom gnus-ignored-mime-types nil
+  "List of MIME types that should be ignored by Gnus."
+  :group 'gnus-mime
+  :type '(repeat regexp))
+
+(defcustom gnus-treat-body-highlight-signature t
+  "Highlight the signature."
+  :group 'gnus-article
+  :type '(choice (const :tag "Off" nil)
+                (const :tag "On" t)
+                (const :tag "Last" last)
+                (integer :tag "Less")
+                (sexp :tag "Predicate")))
+
+(defcustom gnus-article-mime-part-function nil
+  "Function called with a MIME handle as the argument."
+  :group 'gnus-article
+  :type 'function)
+
 ;;; Internal variables
 
+(defvar gnus-treatment-function-alist 
+  '((gnus-treat-body-highlight-signature gnus-article-highlight-signature nil)
+    ))
+
+(defvar gnus-article-mime-handle-alist nil)
 (defvar article-lapsed-timer nil)
 (defvar gnus-article-current-summary nil)
 
@@ -769,7 +815,7 @@ always hide."
             ((eq elem 'date)
              (let ((date (message-fetch-field "date")))
                (when (and date
-                          (< (gnus-days-between (current-time-string) date)
+                          (< (days-between (current-time-string) date)
                              4))
                  (gnus-article-hide-header "date"))))
             ((eq elem 'long-to)
@@ -807,7 +853,7 @@ always hide."
 (defun article-treat-dumbquotes ()
   "Translate M******** sm*rtq**t*s into proper text."
   (interactive)
-  (article-translate-characters "\221\222\223\223" "`'\"\""))
+  (article-translate-strings gnus-article-dumbquotes-map))
 
 (defun article-translate-characters (from to)
   "Translate all characters in the body of the article according to FROM and TO.
@@ -827,6 +873,19 @@ characters to translate to."
          (incf i))
        (translate-region (point) (point-max) x)))))
 
+(defun article-translate-strings (map)
+  "Translate all string in the body of the article according to MAP.
+MAP is an alist where the elements are on the form (\"from\" \"to\")."
+  (save-excursion
+    (goto-char (point-min))
+    (when (search-forward "\n\n" nil t)
+      (let ((buffer-read-only nil)
+           elem)
+       (while (setq elem (pop map))
+         (save-excursion
+           (while (search-forward (car elem) nil t)
+             (replace-match (cadr elem)))))))))
+
 (defun article-treat-overstrike ()
   "Translate overstrikes into bold text."
   (interactive)
@@ -835,7 +894,7 @@ characters to translate to."
     (when (search-forward "\n\n" nil t)
       (let ((buffer-read-only nil))
        (while (search-forward "\b" nil t)
-         (let ((next (following-char))
+         (let ((next (char-after))
                (previous (char-after (- (point) 2))))
            ;; We do the boldification/underlining by hiding the
            ;; overstrikes and putting the proper text property
@@ -873,13 +932,16 @@ characters to translate to."
          (end-of-line 2))))))
 
 (defun article-remove-cr ()
-  "Remove carriage returns from an article."
+  "Translate CRLF pairs into LF, and then CR into LF.."
   (interactive)
   (save-excursion
     (let ((buffer-read-only nil))
       (goto-char (point-min))
+      (while (search-forward "\r$" nil t)
+       (replace-match "" t t))
+      (goto-char (point-min))
       (while (search-forward "\r" nil t)
-       (replace-match "" t t)))))
+       (replace-match "\n" t t)))))
 
 (defun article-remove-trailing-blank-lines ()
   "Remove all trailing blank lines from the article."
@@ -891,7 +953,9 @@ characters to translate to."
        (point)
        (progn
         (while (and (not (bobp))
-                    (looking-at "^[ \t]*$"))
+                    (looking-at "^[ \t]*$")
+                    (not (gnus-annotation-in-region-p
+                          (point) (gnus-point-at-eol))))
           (forward-line -1))
         (forward-line 1)
         (point))))))
@@ -946,84 +1010,74 @@ characters to translate to."
                  (process-send-region "article-x-face" beg end)
                  (process-send-eof "article-x-face"))))))))))
 
-(defun gnus-hack-decode-rfc1522 ()
-  "Emergency hack function for avoiding problems when decoding."
-  (let ((buffer-read-only nil))
-    (goto-char (point-min))
-    ;; Remove encoded TABs.
-    (while (search-forward "=09" nil t)
-      (replace-match " " t t))
-    ;; Remove encoded newlines.
-    (goto-char (point-min))
-    (while (search-forward "=10" nil t)
-      (replace-match " " t t))))
-
-(defalias 'gnus-decode-rfc1522 'article-decode-rfc1522)
-(defalias 'gnus-article-decode-rfc1522 'article-decode-rfc1522)
-(defun article-decode-rfc1522 ()
-  "Hack to remove QP encoding from headers."
-  (let ((case-fold-search t)
-       (inhibit-point-motion-hooks t)
-       (buffer-read-only nil)
-       string)
+(defun article-decode-mime-words ()
+  "Decode all MIME-encoded words in the article."
+  (interactive)
+  (save-excursion
+    (set-buffer gnus-article-buffer)
+    (let ((inhibit-point-motion-hooks t)
+         buffer-read-only)
+      (mail-decode-encoded-word-region (point-min) (point-max)))))
+
+(defun article-decode-charset (&optional prompt)
+  "Decode charset-encoded text in the article.
+If PROMPT (the prefix), prompt for a coding system to use."
+  (interactive "P")
+  (save-excursion
     (save-restriction
-      (narrow-to-region
-       (goto-char (point-min))
-       (or (search-forward "\n\n" nil t) (point-max)))
-      (goto-char (point-min))
-      (while (re-search-forward
-             "=\\?iso-8859-1\\?q\\?\\([^?\t\n]*\\)\\?=" nil t)
-       (setq string (match-string 1))
-       (save-restriction
-         (narrow-to-region (match-beginning 0) (match-end 0))
-         (delete-region (point-min) (point-max))
-         (insert string)
-         (article-mime-decode-quoted-printable
-          (goto-char (point-min)) (point-max))
-         (subst-char-in-region (point-min) (point-max) ?_ ? )
-         (goto-char (point-max)))
-       (goto-char (point-min))))))
+      (message-narrow-to-head)
+      (let* ((inhibit-point-motion-hooks t)
+            (case-fold-search t)
+            (ct (message-fetch-field "Content-Type" t))
+            (cte (message-fetch-field "Content-Transfer-Encoding" t))
+            (ctl (and ct (condition-case ()
+                             (mail-header-parse-content-type ct)
+                           (error nil))))
+            (charset (cond
+                      (prompt
+                       (mm-read-coding-system "Charset to decode: "))
+                      (ctl
+                       (mail-content-type-get ctl 'charset))
+                      (gnus-newsgroup-name
+                       (gnus-group-find-parameter
+                        gnus-newsgroup-name 'charset))))
+            buffer-read-only)
+       (goto-char (point-max))
+       (widen)
+       (forward-line 1)
+       (narrow-to-region (point) (point-max))
+       (when (or (not ctl)
+                 (equal (car ctl) "text/plain"))
+         (mm-decode-body
+          charset (and cte (intern (downcase
+                                    (gnus-strip-whitespace cte))))
+          (car ctl)))))))
+
+(defun article-decode-encoded-words ()
+  "Remove encoded-word encoding from headers."
+  (let ((inhibit-point-motion-hooks t)
+       (buffer-read-only nil))
+    (save-restriction
+      (message-narrow-to-head)
+      (funcall gnus-decode-header-function (point-min) (point-max)))))
 
 (defun article-de-quoted-unreadable (&optional force)
-  "Do a naive translation of a quoted-printable-encoded article.
-This is in no way, shape or form meant as a replacement for real MIME
-processing, but is simply a stop-gap measure until MIME support is
-written.
+  "Translate a quoted-printable-encoded article.
 If FORCE, decode the article whether it is marked as quoted-printable
 or not."
   (interactive (list 'force))
   (save-excursion
-    (let ((case-fold-search t)
-         (buffer-read-only nil)
+    (let ((buffer-read-only nil)
          (type (gnus-fetch-field "content-transfer-encoding")))
-      (gnus-article-decode-rfc1522)
       (when (or force
                (and type (string-match "quoted-printable" (downcase type))))
        (goto-char (point-min))
        (search-forward "\n\n" nil 'move)
-       (article-mime-decode-quoted-printable (point) (point-max))))))
-
-(defun article-mime-decode-quoted-printable-buffer ()
-  "Decode Quoted-Printable in the current buffer."
-  (article-mime-decode-quoted-printable (point-min) (point-max)))
-
-(defun article-mime-decode-quoted-printable (from to)
-  "Decode Quoted-Printable in the region between FROM and TO."
-  (interactive "r")
-  (goto-char from)
-  (while (search-forward "=" to t)
-    (cond ((eq (following-char) ?\n)
-          (delete-char -1)
-          (delete-char 1))
-         ((looking-at "[0-9A-F][0-9A-F]")
-          (subst-char-in-region
-           (1- (point)) (point) ?=
-           (hexl-hex-string-to-integer
-            (buffer-substring (point) (+ 2 (point)))))
-          (delete-char 2))
-         ((looking-at "=")
-          (delete-char 1))
-         ((gnus-message 3 "Malformed MIME quoted-printable message")))))
+       (save-restriction
+         (narrow-to-region (point) (point-max))
+         (quoted-printable-decode-region (point-min) (point-max))
+         (when mm-default-coding-system
+           (mm-decode-body mm-default-coding-system)))))))
 
 (defun article-hide-pgp (&optional arg)
   "Toggle hiding of any PGP headers and signatures in the current article.
@@ -1039,6 +1093,9 @@ always hide."
        ;; Hide the "header".
        (when (search-forward "\n-----BEGIN PGP SIGNED MESSAGE-----\n" nil t)
          (delete-region (1+ (match-beginning 0)) (match-end 0))
+         ;; PGP 5 and GNU PG add a `Hash: <>' comment, hide that too
+         (when (looking-at "Hash:.*$")
+           (delete-region (point) (1+ (gnus-point-at-eol))))
          (setq beg (point))
          ;; Hide the actual signature.
          (and (search-forward "\n-----BEGIN PGP SIGNATURE-----\n" nil t)
@@ -1123,12 +1180,16 @@ always hide."
       (goto-char (point-min))
       (search-forward "\n\n" nil t)
       (while (re-search-forward "^[ \t]+$" nil t)
-       (replace-match "" nil t))
+       (unless (gnus-annotation-in-region-p
+                (match-beginning 0) (match-end 0))
+         (replace-match "" nil t)))
       ;; Then replace multiple empty lines with a single empty line.
       (goto-char (point-min))
       (search-forward "\n\n" nil t)
       (while (re-search-forward "\n\n\n+" nil t)
-       (replace-match "\n\n" t t)))))
+       (unless (gnus-annotation-in-region-p
+                (match-beginning 0) (match-end 0))
+         (replace-match "\n\n" t t))))))
 
 (defun article-strip-leading-space ()
   "Remove all white space from the beginning of the lines in the article."
@@ -1159,21 +1220,10 @@ always hide."
       (while (re-search-forward "^[ \t]*\n" nil t)
        (replace-match "" t t)))))
 
-(defvar mime::preview/content-list)
-(defvar mime::preview-content-info/point-min)
 (defun gnus-article-narrow-to-signature ()
   "Narrow to the signature; return t if a signature is found, else nil."
   (widen)
   (let ((inhibit-point-motion-hooks t))
-    (when (and (boundp 'mime::preview/content-list)
-              mime::preview/content-list)
-      ;; We have a MIMEish article, so we use the MIME data to narrow.
-      (let ((pcinfo (car (last mime::preview/content-list))))
-       (ignore-errors
-         (narrow-to-region
-          (funcall (intern "mime::preview-content-info/point-min") pcinfo)
-          (point-max)))))
-
     (when (gnus-article-search-signature)
       (forward-line 1)
       ;; Check whether we have some limits to what we consider
@@ -1231,7 +1281,7 @@ Put point at the beginning of the signature separator."
           (setq b (point))
         (point-max))
        (setq e (point-max)))
-      (nnheader-temp-write nil
+      (with-temp-buffer
        (insert-buffer-substring gnus-article-buffer b e)
        (require 'url)
        (save-window-excursion
@@ -1279,7 +1329,7 @@ means show, 0 means toggle."
            (text-property-any (1+ pos) (point-max) 'article-type type)))
     (if pos
        'hidden
-      'shown)))
+      nil)))
 
 (defun gnus-article-show-hidden-text (type &optional hide)
   "Show all hidden text of type TYPE.
@@ -1353,103 +1403,92 @@ how much time has lapsed since DATE."
 
 (defun article-make-date-line (date type)
   "Return a DATE line of TYPE."
-  (cond
-   ;; Convert to the local timezone.  We have to slap a
-   ;; `condition-case' round the calls to the timezone
-   ;; functions since they aren't particularly resistant to
-   ;; buggy dates.
-   ((eq type 'local)
-    (concat "Date: " (condition-case ()
-                        (timezone-make-date-arpa-standard date)
-                      (error date))))
-   ;; Convert to Universal Time.
-   ((eq type 'ut)
-    (concat "Date: "
-           (condition-case ()
-               (timezone-make-date-arpa-standard date nil "UT")
-             (error date))))
-   ;; Get the original date from the article.
-   ((eq type 'original)
-    (concat "Date: " date))
-   ;; Let the user define the format.
-   ((eq type 'user)
-    (if (gnus-functionp gnus-article-time-format)
-       (funcall
-        gnus-article-time-format
-        (ignore-errors
-          (gnus-encode-date
-           (timezone-make-date-arpa-standard
-            date nil "UT"))))
+  (let ((time (condition-case ()
+                 (date-to-time date)
+               (error '(0 0)))))
+    (cond
+     ;; Convert to the local timezone.  We have to slap a
+     ;; `condition-case' round the calls to the timezone
+     ;; functions since they aren't particularly resistant to
+     ;; buggy dates.
+     ((eq type 'local)
+      (let ((tz (car (current-time-zone))))
+       (format "Date: %s %s%04d" (current-time-string time)
+               (if (> tz 0) "+" "-") (abs (/ tz 36)))))
+     ;; Convert to Universal Time.
+     ((eq type 'ut)
+      (concat "Date: "
+             (current-time-string
+              (let* ((e (parse-time-string date))
+                    (tm (apply 'encode-time e))
+                    (ms (car tm))
+                    (ls (- (cadr tm) (car (current-time-zone)))))
+                (cond ((< ls 0) (list (1- ms) (+ ls 65536)))
+                      ((> ls 65535) (list (1+ ms) (- ls 65536)))
+                      (t (list ms ls)))))
+             " UT"))
+     ;; Get the original date from the article.
+     ((eq type 'original)
+      (concat "Date: " (if (string-match "\n+$" date)
+                          (substring date 0 (match-beginning 0))
+                        date)))
+     ;; Let the user define the format.
+     ((eq type 'user)
+      (if (gnus-functionp gnus-article-time-format)
+         (funcall gnus-article-time-format time)
+       (concat
+        "Date: "
+        (format-time-string gnus-article-time-format time))))
+     ;; ISO 8601.
+     ((eq type 'iso8601)
       (concat
        "Date: "
-       (format-time-string gnus-article-time-format
-                          (ignore-errors
-                            (gnus-encode-date
-                             (timezone-make-date-arpa-standard
-                              date nil "UT")))))))
-   ;; ISO 8601.
-   ((eq type 'iso8601)
-    (concat
-     "Date: "
-     (format-time-string "%Y%M%DT%h%m%s"
-                        (ignore-errors
-                          (gnus-encode-date
-                           (timezone-make-date-arpa-standard
-                            date nil "UT"))))))
-   ;; Do an X-Sent lapsed format.
-   ((eq type 'lapsed)
-    ;; If the date is seriously mangled, the timezone functions are
-    ;; liable to bug out, so we ignore all errors.
-    (let* ((now (current-time))
-          (real-time
-           (ignore-errors
-             (gnus-time-minus
-              (gnus-encode-date
-               (timezone-make-date-arpa-standard
-                (current-time-string now)
-                (current-time-zone now) "UT"))
-              (gnus-encode-date
-               (timezone-make-date-arpa-standard
-                date nil "UT")))))
-          (real-sec (and real-time
-                         (+ (* (float (car real-time)) 65536)
-                            (cadr real-time))))
-          (sec (and real-time (abs real-sec)))
-          num prev)
-      (cond
-       ((null real-time)
-       "X-Sent: Unknown")
-       ((zerop sec)
-       "X-Sent: Now")
-       (t
-       (concat
-        "X-Sent: "
-        ;; This is a bit convoluted, but basically we go
-        ;; through the time units for years, weeks, etc,
-        ;; and divide things to see whether that results
-        ;; in positive answers.
-        (mapconcat
-         (lambda (unit)
-           (if (zerop (setq num (ffloor (/ sec (cdr unit)))))
-               ;; The (remaining) seconds are too few to
-               ;; be divided into this time unit.
-               ""
-             ;; It's big enough, so we output it.
-             (setq sec (- sec (* num (cdr unit))))
-             (prog1
-                 (concat (if prev ", " "") (int-to-string
-                                            (floor num))
-                         " " (symbol-name (car unit))
-                         (if (> num 1) "s" ""))
-               (setq prev t))))
-         article-time-units "")
-        ;; If dates are odd, then it might appear like the
-        ;; article was sent in the future.
-        (if (> real-sec 0)
-            " ago"
-          " in the future"))))))
-   (t
-    (error "Unknown conversion type: %s" type))))
+       (format-time-string "%Y%M%DT%h%m%s" time)))
+     ;; Do an X-Sent lapsed format.
+     ((eq type 'lapsed)
+      ;; If the date is seriously mangled, the timezone functions are
+      ;; liable to bug out, so we ignore all errors.
+      (let* ((now (current-time))
+            (real-time (subtract-time now time))
+            (real-sec (and real-time
+                           (+ (* (float (car real-time)) 65536)
+                              (cadr real-time))))
+            (sec (and real-time (abs real-sec)))
+            num prev)
+       (cond
+        ((null real-time)
+         "X-Sent: Unknown")
+        ((zerop sec)
+         "X-Sent: Now")
+        (t
+         (concat
+          "X-Sent: "
+          ;; This is a bit convoluted, but basically we go
+          ;; through the time units for years, weeks, etc,
+          ;; and divide things to see whether that results
+          ;; in positive answers.
+          (mapconcat
+           (lambda (unit)
+             (if (zerop (setq num (ffloor (/ sec (cdr unit)))))
+                 ;; The (remaining) seconds are too few to
+                 ;; be divided into this time unit.
+                 ""
+               ;; It's big enough, so we output it.
+               (setq sec (- sec (* num (cdr unit))))
+               (prog1
+                   (concat (if prev ", " "") (int-to-string
+                                              (floor num))
+                           " " (symbol-name (car unit))
+                           (if (> num 1) "s" ""))
+                 (setq prev t))))
+           article-time-units "")
+          ;; If dates are odd, then it might appear like the
+          ;; article was sent in the future.
+          (if (> real-sec 0)
+              " ago"
+            " in the future"))))))
+     (t
+      (error "Unknown conversion type: %s" type)))))
 
 (defun article-date-local (&optional highlight)
   "Convert the current article date to the local timezone."
@@ -1473,11 +1512,13 @@ function and want to see what the date was before converting."
   (let (deactivate-mark)
     (save-excursion
       (ignore-errors
-        (when (gnus-buffer-live-p gnus-article-buffer)
-          (set-buffer gnus-article-buffer)
-          (goto-char (point-min))
-          (when (re-search-forward "^X-Sent:" nil t)
-            (article-date-lapsed t)))))))
+       (walk-windows
+        (lambda (w)
+          (set-buffer (window-buffer w))
+          (when (eq major-mode 'gnus-article-mode)
+            (goto-char (point-min))
+            (when (re-search-forward "^X-Sent:" nil t)
+              (article-date-lapsed t)))))))))
 
 (defun gnus-start-date-timer (&optional n)
   "Start a timer to update the X-Sent header in the article buffers.
@@ -1563,7 +1604,7 @@ This format is defined by the `gnus-article-time-format' variable."
     (if (not gnus-default-article-saver)
        (error "No default saver is defined")
       ;; !!! Magic!  The saving functions all save
-      ;; `gnus-original-article-buffer' (or so they think), but we
+      ;; `gnus-save-article-buffer' (or so they think), but we
       ;; bind that variable to our save-buffer.
       (set-buffer gnus-article-buffer)
       (let* ((gnus-save-article-buffer save-buffer)
@@ -1697,7 +1738,7 @@ Directory to save to is default to `gnus-article-save-directory'."
        (widen)
        (if (and (file-readable-p filename)
                 (mail-file-babyl-p filename))
-           (gnus-output-to-rmail filename t)
+           (rmail-output-to-rmail-file filename t)
          (gnus-output-to-mail filename)))))
   filename)
 
@@ -1746,7 +1787,8 @@ The directory to save in defaults to `gnus-article-save-directory'."
 (defun gnus-summary-save-in-pipe (&optional command)
   "Pipe this article to subprocess."
   (setq command
-       (cond ((eq command 'default)
+       (cond ((and (eq command 'default)
+                   gnus-last-shell-command)
               gnus-last-shell-command)
              (command command)
              (t (read-string
@@ -1873,6 +1915,9 @@ If variable `gnus-use-long-file-name' is non-nil, it is
      article-date-iso8601
      article-date-original
      article-date-ut
+     article-decode-mime-words
+     article-decode-charset
+     article-decode-encoded-words
      article-date-user
      article-date-lapsed
      article-emphasize
@@ -1885,6 +1930,8 @@ If variable `gnus-use-long-file-name' is non-nil, it is
 
 (put 'gnus-article-mode 'mode-class 'special)
 
+(set-keymap-parent gnus-article-mode-map widget-keymap)
+
 (gnus-define-keys gnus-article-mode-map
   " " gnus-article-goto-next-page
   "\177" gnus-article-goto-prev-page
@@ -1894,10 +1941,6 @@ If variable `gnus-use-long-file-name' is non-nil, it is
   "s" gnus-article-show-summary
   "\C-c\C-m" gnus-article-mail
   "?" gnus-article-describe-briefly
-  gnus-mouse-2 gnus-article-push-button
-  "\r" gnus-article-press-button
-  "\t" gnus-article-next-button
-  "\M-\t" gnus-article-prev-button
   "e" gnus-article-edit
   "<" beginning-of-buffer
   ">" end-of-buffer
@@ -1966,18 +2009,20 @@ commands:
   (setq mode-name "Article")
   (setq major-mode 'gnus-article-mode)
   (make-local-variable 'minor-mode-alist)
-  (unless (assq 'gnus-show-mime minor-mode-alist)
-    (push (list 'gnus-show-mime " MIME") minor-mode-alist))
   (use-local-map gnus-article-mode-map)
   (gnus-update-format-specifications nil 'article-mode)
   (set (make-local-variable 'page-delimiter) gnus-page-delimiter)
   (make-local-variable 'gnus-page-broken)
   (make-local-variable 'gnus-button-marker-list)
   (make-local-variable 'gnus-article-current-summary)
+  (make-local-variable 'gnus-article-mime-handles)
+  (make-local-variable 'gnus-article-decoded-p)
+  (make-local-variable 'gnus-article-mime-handle-alist)
   (gnus-set-default-directory)
-  (buffer-disable-undo (current-buffer))
+  (buffer-disable-undo)
   (setq buffer-read-only t)
   (set-syntax-table gnus-article-mode-syntax-table)
+  (mm-enable-multibyte)
   (gnus-run-hooks 'gnus-article-mode-hook))
 
 (defun gnus-article-setup-buffer ()
@@ -1990,6 +2035,7 @@ commands:
                         (substring name (match-end 0))))))
     (setq gnus-article-buffer name)
     (setq gnus-original-article-buffer original)
+    (setq gnus-article-mime-handle-alist nil)
     ;; This might be a variable local to the summary buffer.
     (unless gnus-single-article-buffer
       (save-excursion
@@ -2000,13 +2046,13 @@ commands:
     ;; Init original article buffer.
     (save-excursion
       (set-buffer (gnus-get-buffer-create gnus-original-article-buffer))
-      (buffer-disable-undo (current-buffer))
+      (mm-enable-multibyte)
       (setq major-mode 'gnus-original-article-mode)
       (make-local-variable 'gnus-original-article))
     (if (get-buffer name)
        (save-excursion
          (set-buffer name)
-         (buffer-disable-undo (current-buffer))
+         (buffer-disable-undo)
          (setq buffer-read-only t)
          (unless (eq major-mode 'gnus-article-mode)
            (gnus-article-mode))
@@ -2015,6 +2061,7 @@ commands:
        (set-buffer (gnus-get-buffer-create name))
        (gnus-article-mode)
        (make-local-variable 'gnus-summary-buffer)
+       (gnus-summary-set-local-parameters gnus-newsgroup-name)
        (current-buffer)))))
 
 ;; Set article window start at LINE, where LINE is the number of lines
@@ -2125,21 +2172,7 @@ If ALL-HEADERS is non-nil, no headers are hidden."
                      (or all-headers gnus-show-all-headers))))
            (when (or (numberp article)
                      (stringp article))
-             ;; Hooks for getting information from the article.
-             ;; This hook must be called before being narrowed.
-             (let (buffer-read-only)
-               (gnus-run-hooks 'gnus-tmp-internal-hook)
-               (gnus-run-hooks 'gnus-article-prepare-hook)
-               ;; Decode MIME message.
-               (when gnus-show-mime
-                 (if (or (not gnus-strict-mime)
-                         (gnus-fetch-field "Mime-Version"))
-                     (let ((coding-system-for-write 'binary)
-                           (coding-system-for-read 'binary))
-                       (funcall gnus-show-mime-method))
-                   (funcall gnus-decode-encoded-word-method)))
-               ;; Perform the article display hooks.
-               (gnus-run-hooks 'gnus-article-display-hook))
+             (gnus-article-prepare-display)
              ;; Do page break.
              (goto-char (point-min))
              (setq gnus-page-broken
@@ -2153,6 +2186,361 @@ If ALL-HEADERS is non-nil, no headers are hidden."
            (set-window-point (get-buffer-window (current-buffer)) (point))
            t))))))
 
+(defun gnus-article-prepare-display ()
+  "Make the current buffer look like a nice article."
+  ;; Hooks for getting information from the article.
+  ;; This hook must be called before being narrowed.
+  (let ((gnus-article-buffer (current-buffer))
+       buffer-read-only)
+    (unless (eq major-mode 'gnus-article-mode)
+      (gnus-article-mode))
+    (setq buffer-read-only nil)
+    (gnus-run-hooks 'gnus-tmp-internal-hook)
+    (gnus-run-hooks 'gnus-article-prepare-hook)
+    (when gnus-display-mime-function
+      (let ((url-standalone-mode (not gnus-plugged)))
+       (funcall gnus-display-mime-function)))
+    ;; Perform the article display hooks.
+    (gnus-run-hooks 'gnus-article-display-hook)))
+
+;;;
+;;; Gnus MIME viewing functions
+;;;
+
+(defvar gnus-mime-button-line-format "%{%([%p. %t%d%n]%)%}%e\n"
+  "The following specs can be used:
+%t  The MIME type
+%n  The `name' parameter
+%d  The description, if any
+%l  The length of the encoded part
+%p  The part identifier
+%e  Dots if the part isn't displayed")
+
+(defvar gnus-mime-button-line-format-alist
+  '((?t gnus-tmp-type ?s)
+    (?n gnus-tmp-name ?s)
+    (?d gnus-tmp-description ?s)
+    (?p gnus-tmp-id ?s)
+    (?l gnus-tmp-length ?d)
+    (?e gnus-tmp-dots ?s)))
+
+(defvar gnus-mime-button-commands
+  '((gnus-article-press-button "\r"    "Toggle Display")
+    ;(gnus-mime-view-part      "\M-\r" "View Interactively...")
+    (gnus-mime-view-part       "v"     "View Interactively...")
+    (gnus-mime-save-part       "o"     "Save...")
+    (gnus-mime-copy-part       "c"     "View In Buffer")
+    (gnus-mime-inline-part     "i"     "View Inline")
+    (gnus-mime-pipe-part       "|"     "Pipe To Command...")))
+
+(defvar gnus-mime-button-map nil)
+(unless gnus-mime-button-map
+  (setq gnus-mime-button-map (make-sparse-keymap))
+  (set-keymap-parent gnus-mime-button-map gnus-article-mode-map)
+  (define-key gnus-mime-button-map gnus-mouse-2 'gnus-article-push-button)
+  (define-key gnus-mime-button-map gnus-mouse-3 'gnus-mime-button-menu)
+  (mapcar (lambda (c)
+           (define-key gnus-mime-button-map (cadr c) (car c)))
+         gnus-mime-button-commands))
+
+(defun gnus-mime-button-menu (event)
+  "Construct a context-sensitive menu of MIME commands."
+  (interactive "e")
+  (let ((response (x-popup-menu 
+                  t `("MIME Part" 
+                      ("" ,@(mapcar (lambda (c)
+                                      (cons (caddr c) (car c)))
+                                    gnus-mime-button-commands)))))
+        (pos (event-start event)))
+    (when response
+      (set-buffer (window-buffer (posn-window pos)))
+      (goto-char (posn-point pos))
+      (funcall response))))
+
+(defun gnus-mime-view-all-parts ()
+  "View all the MIME parts."
+  (interactive)
+  (let ((handles gnus-article-mime-handles))
+    (while handles
+      (mm-display-part (pop handles)))))
+
+(defun gnus-mime-save-part ()
+  "Save the MIME part under point."
+  (interactive)
+  (let ((data (get-text-property (point) 'gnus-data)))
+    (mm-save-part data)))
+
+(defun gnus-mime-pipe-part ()
+  "Pipe the MIME part under point to a process."
+  (interactive)
+  (let ((data (get-text-property (point) 'gnus-data)))
+    (mm-pipe-part data)))
+
+(defun gnus-mime-view-part ()
+  "Interactively choose a view method for the MIME part under point."
+  (interactive)
+  (let ((data (get-text-property (point) 'gnus-data))
+       (url-standalone-mode (not gnus-plugged)))
+    (mm-interactively-view-part data)))
+
+(defun gnus-mime-copy-part ()
+  "Put the the MIME part under point into a new buffer."
+  (interactive)
+  (let* ((handle (get-text-property (point) 'gnus-data))
+        (contents (mm-get-part handle))
+        (buffer (generate-new-buffer
+                      (file-name-nondirectory
+                       (or
+                        (mail-content-type-get (mm-handle-type handle) 'name)
+                        (mail-content-type-get (mm-handle-type handle)
+                                               'filename)
+                        "*decoded*")))))
+    (switch-to-buffer buffer)
+    (insert contents)
+    (normal-mode)
+    (goto-char (point-min))))
+
+(defun gnus-mime-inline-part ()
+  "Insert the MIME part under point into the current buffer."
+  (interactive)
+  (let* ((data (get-text-property (point) 'gnus-data))
+        (contents (mm-get-part data))
+        (url-standalone-mode (not gnus-plugged))
+        (b (point))
+        buffer-read-only)
+    (if (mm-handle-undisplayer data)
+       (mm-remove-part data)
+      (forward-line 2)
+      (mm-insert-inline data contents)
+      (goto-char b))))
+
+(defun gnus-article-view-part (n)
+  "View MIME part N, which is the numerical prefix."
+  (interactive "p")
+  (save-current-buffer
+    (set-buffer gnus-article-buffer)
+    (when (> n (length gnus-article-mime-handle-alist))
+      (error "No such part"))
+    (let ((handle (cdr (assq n gnus-article-mime-handle-alist))))
+      (when (gnus-article-goto-part n)
+       (if (equal (car handle) "multipart/alternative")
+           (gnus-article-press-button)
+         (when (eq (gnus-mm-display-part handle) 'internal)
+           (gnus-set-window-start)))))))
+
+(defun gnus-mm-display-part (handle)
+  "Display HANDLE and fix MIME button."
+  (let ((id (get-text-property (point) 'gnus-part))
+       (point (point))
+       buffer-read-only)
+    (delete-region (gnus-point-at-bol) (progn (forward-line 1) (point)))
+    (gnus-insert-mime-button
+     handle id (list (not (mm-handle-displayed-p handle))))
+    (prog1
+       (let ((window (selected-window)))
+         (save-excursion
+           (unwind-protect
+               (let ((win (get-buffer-window (current-buffer) t)))
+                 (if win
+                     (select-window win))
+                 (goto-char point)
+                 (forward-line)
+                 (mm-display-part handle))
+             (select-window window))))
+      (goto-char point))))
+
+(defun gnus-article-goto-part (n)
+  "Go to MIME part N."
+  (let ((point (text-property-any (point-min) (point-max) 'gnus-part n)))
+    (when point
+      (goto-char point))))
+
+(defun gnus-insert-mime-button (handle gnus-tmp-id &optional displayed)
+  (let ((gnus-tmp-name (mail-content-type-get (mm-handle-type handle) 'name))
+       (gnus-tmp-type (car (mm-handle-type handle)))
+       (gnus-tmp-description (mm-handle-description handle))
+       (gnus-tmp-dots
+        (if (if displayed (car displayed)
+              (mm-handle-displayed-p handle))
+            "" "..."))
+       (gnus-tmp-length (save-excursion
+                          (set-buffer (mm-handle-buffer handle))
+                          (buffer-size)))
+       b e)
+    (setq gnus-tmp-name
+         (if gnus-tmp-name
+             (concat " (" gnus-tmp-name ")")
+           ""))
+    (setq gnus-tmp-description
+         (if gnus-tmp-description
+             (concat " (" gnus-tmp-description ")")
+           ""))
+    (unless (bolp)
+      (insert "\n"))
+    (setq b (point))
+    (gnus-eval-format
+     gnus-mime-button-line-format gnus-mime-button-line-format-alist
+     `(local-map ,gnus-mime-button-map
+                keymap ,gnus-mime-button-map
+                gnus-callback gnus-mm-display-part
+                gnus-part ,gnus-tmp-id
+                article-type annotation
+                gnus-data ,handle))
+    (setq e (point))
+    (widget-convert-button 'link b e :action 'gnus-widget-press-button
+                          :button-keymap gnus-mime-button-map)))
+
+(defun gnus-widget-press-button (elems el)
+  (goto-char (widget-get elems :from))
+  (let ((url-standalone-mode (not gnus-plugged)))
+    (gnus-article-press-button)))
+
+(defun gnus-display-mime (&optional ihandles)
+  "Insert MIME buttons in the buffer."
+  (let* ((handles (or ihandles (mm-dissect-buffer) (mm-uu-dissect)))
+        handle name type b e display)
+    (unless ihandles
+      ;; Top-level call; we clean up.
+      (mm-destroy-parts gnus-article-mime-handles)
+      (setq gnus-article-mime-handles handles
+           gnus-article-mime-handle-alist nil)
+      ;; We allow users to glean info from the handles.
+      (when gnus-article-mime-part-function
+       (gnus-mime-part-function handles)))
+    (when (and handles
+              (or (not (stringp (car handles)))
+                  (cdr handles)))
+      (unless ihandles
+       ;; Clean up for mime parts.
+       (goto-char (point-min))
+       (search-forward "\n\n" nil t)
+       (delete-region (point) (point-max)))
+      (if (stringp (car handles))
+         (if (equal (car handles) "multipart/alternative")
+             (let ((id (1+ (length gnus-article-mime-handle-alist))))
+               (push (cons id handles) gnus-article-mime-handle-alist)
+               (gnus-mime-display-alternative (cdr handles) nil nil id))
+           (gnus-mime-display-mixed (cdr handles)))
+       (gnus-mime-display-single handles)))))
+
+(defun gnus-mime-part-function (handles)
+  (if (stringp (car handles))
+      (mapcar 'gnus-mime-part-function (cdr handles))
+    (funcall gnus-article-mime-part-function handles)))
+
+(defun gnus-mime-display-mixed (handles)
+  (let (handle)
+    (while (setq handle (pop handles))
+      (if (stringp (car handle))
+         (if (equal (car handle) "multipart/alternative")
+             (let ((id (1+ (length gnus-article-mime-handle-alist))))
+               (push (cons id handle) gnus-article-mime-handle-alist)
+               (gnus-mime-display-alternative (cdr handle) nil nil id))
+           (gnus-mime-display-mixed (cdr handle)))
+       (gnus-mime-display-single handle)))))
+
+(defun gnus-mime-display-single (handle)
+  (let ((type (car (mm-handle-type handle)))
+       (ignored gnus-ignored-mime-types)
+       display text)
+    (catch 'ignored
+      (progn
+       (while ignored
+         (when (string-match (pop ignored) type)
+           (throw 'ignored nil)))
+       (if (and (mm-automatic-display-p type)
+                  (mm-inlinable-part-p type)
+                  (or (not (mm-handle-disposition handle))
+                      (equal (car (mm-handle-disposition handle))
+                             "inline")))
+           (setq display t)
+         (when (equal (car (split-string type "/"))
+                      "text")
+           (setq text t)))
+       (let ((id (1+ (length gnus-article-mime-handle-alist))))
+         (push (cons id handle) gnus-article-mime-handle-alist)
+         (gnus-insert-mime-button handle id (list (or display text))))
+       (insert "\n\n")
+       (cond
+        (display
+         (forward-line -2)
+         (mm-display-part handle t)
+         (goto-char (point-max)))
+        (text
+         (forward-line -2)
+         (insert "\n")
+         (mm-insert-inline handle (mm-get-part handle))
+         (goto-char (point-max))))))))
+
+(defun gnus-mime-display-alternative (handles &optional preferred ibegend id)
+  (let* ((preferred (or preferred (mm-preferred-alternative handles)))
+        (ihandles handles)
+        (point (point))
+        handle buffer-read-only from props begend not-pref)
+    (save-restriction
+      (when ibegend
+       (narrow-to-region (car ibegend) (cdr ibegend))
+       (delete-region (point-min) (point-max))
+       (mm-remove-parts handles))
+      (setq begend (list (point-marker)))
+      ;; Do the toggle.
+      (unless (setq not-pref (cadr (member preferred ihandles)))
+       (setq not-pref (car ihandles)))
+      (gnus-add-text-properties
+       (setq from (point))
+       (progn
+        (insert (format "%d.  " id))
+        (point))
+       `(gnus-callback
+        (lambda (handles)
+          (gnus-mime-display-alternative
+           ',ihandles ',not-pref
+           ',begend ,id))
+        local-map ,gnus-mime-button-map
+        ,gnus-mouse-face-prop ,gnus-article-mouse-face
+        face ,gnus-article-button-face
+        keymap ,gnus-mime-button-map
+        gnus-part ,id
+        gnus-data ,handle))
+      (widget-convert-button 'link from (point)
+                            :action 'gnus-widget-press-button
+                            :button-keymap gnus-widget-button-keymap)
+      ;; Do the handles
+      (while (setq handle (pop handles))
+       (gnus-add-text-properties
+        (setq from (point))
+        (progn
+          (insert (format "[%c] %-18s"
+                          (if (equal handle preferred) ?* ? )
+                          (if (stringp (car handle))
+                              (car handle)
+                            (car (mm-handle-type handle)))))
+          (point))
+        `(gnus-callback
+          (lambda (handles)
+            (gnus-mime-display-alternative
+             ',ihandles ',handle
+             ',begend ,id))
+          local-map ,gnus-mime-button-map
+          ,gnus-mouse-face-prop ,gnus-article-mouse-face
+          face ,gnus-article-button-face
+          keymap ,gnus-mime-button-map
+          gnus-part ,id
+          gnus-data ,handle))
+       (widget-convert-button 'link from (point)
+                              :action 'gnus-widget-press-button
+                              :button-keymap gnus-widget-button-keymap)
+       (insert "  "))
+      (insert "\n\n")
+      (when preferred
+       (if (stringp (car preferred))
+           (gnus-display-mime preferred)
+         (mm-display-part preferred)
+         (goto-char (point-max)))
+       (setcdr begend (point-marker))))
+    (when ibegend
+      (goto-char point))))
+
 (defun gnus-article-wash-status ()
   "Return a string which display status of article washing."
   (save-excursion
@@ -2164,15 +2552,13 @@ If ALL-HEADERS is non-nil, no headers are hidden."
          (pem (gnus-article-hidden-text-p 'pem))
          (signature (gnus-article-hidden-text-p 'signature))
          (overstrike (gnus-article-hidden-text-p 'overstrike))
-         (emphasis (gnus-article-hidden-text-p 'emphasis))
-         (mime gnus-show-mime))
-      (format "%c%c%c%c%c%c%c"
+         (emphasis (gnus-article-hidden-text-p 'emphasis)))
+      (format "%c%c%c%c%c%c"
              (if cite ?c ? )
              (if (or headers boring) ?h ? )
              (if (or pgp pem) ?p ? )
              (if signature ?s ? )
              (if overstrike ?o ? )
-             (if mime ?m ? )
              (if emphasis ?e ? )))))
 
 (fset 'gnus-article-hide-headers-if-wanted 'gnus-article-maybe-hide-headers)
@@ -2189,7 +2575,7 @@ Provided for backwards compatibility."
 (defun gnus-output-to-file (file-name)
   "Append the current article to a file named FILE-NAME."
   (let ((artbuf (current-buffer)))
-    (nnheader-temp-write nil
+    (with-temp-buffer
       (insert-buffer-substring artbuf)
       ;; Append newline at end of the buffer as separator, and then
       ;; save it to file.
@@ -2562,13 +2948,18 @@ If given a prefix, show the hidden text instead."
          (if (get-buffer gnus-original-article-buffer)
              (set-buffer gnus-original-article-buffer)
            (set-buffer (gnus-get-buffer-create gnus-original-article-buffer))
-           (buffer-disable-undo (current-buffer))
+           (buffer-disable-undo)
            (setq major-mode 'gnus-original-article-mode)
            (setq buffer-read-only t))
          (let (buffer-read-only)
            (erase-buffer)
            (insert-buffer-substring gnus-article-buffer))
-         (setq gnus-original-article (cons group article))))
+         (setq gnus-original-article (cons group article)))
+
+       ;; Decode charsets.
+       (run-hooks 'gnus-article-decode-hook)
+       ;; Mark article as decoded or not.
+       (setq gnus-article-decoded-p gnus-article-decode-hook))
 
       ;; Update sparse articles.
       (when (and do-update-line
@@ -2595,8 +2986,10 @@ If given a prefix, show the hidden text instead."
 
 (defvar gnus-article-edit-mode-map nil)
 
+;; Should we be using derived.el for this?
 (unless gnus-article-edit-mode-map
-  (setq gnus-article-edit-mode-map (copy-keymap text-mode-map))
+  (setq gnus-article-edit-mode-map (make-sparse-keymap))
+  (set-keymap-parent gnus-article-edit-mode-map text-mode-map)
 
   (gnus-define-keys gnus-article-edit-mode-map
     "\C-c\C-c" gnus-article-edit-done
@@ -2682,7 +3075,19 @@ groups."
     (save-excursion
       (set-buffer buf)
       (let ((buffer-read-only nil))
-       (funcall func arg)))
+       (funcall func arg))
+      ;; The cache and backlog have to be flushed somewhat.
+      (when gnus-keep-backlog
+       (gnus-backlog-remove-article
+        (car gnus-article-current) (cdr gnus-article-current)))
+      ;; Flush original article as well.
+      (save-excursion
+       (when (get-buffer gnus-original-article-buffer)
+         (set-buffer gnus-original-article-buffer)
+         (setq gnus-original-article nil)))
+      (when gnus-use-cache
+       (gnus-cache-update-article
+        (car gnus-article-current) (cdr gnus-article-current))))
     (set-buffer buf)
     (set-window-start (get-buffer-window buf) start)
     (set-window-point (get-buffer-window buf) (point))))
@@ -2699,25 +3104,12 @@ groups."
     (insert buf)
     (let ((winconf gnus-prev-winconf))
       (gnus-article-mode)
-      ;; The cache and backlog have to be flushed somewhat.
-      (when gnus-use-cache
-       (gnus-cache-update-article
-        (car gnus-article-current) (cdr gnus-article-current)))
-      (when gnus-keep-backlog
-       (gnus-backlog-remove-article
-        (car gnus-article-current) (cdr gnus-article-current)))
-      ;; Flush original article as well.
-      (save-excursion
-       (when (get-buffer gnus-original-article-buffer)
-         (set-buffer gnus-original-article-buffer)
-         (setq gnus-original-article nil)))
       (set-window-configuration winconf)
       ;; Tippy-toe some to make sure that point remains where it was.
-      (let ((buf (current-buffer)))
+      (save-current-buffer
        (set-buffer curbuf)
        (set-window-start (get-buffer-window (current-buffer)) window-start)
-       (goto-char p)
-       (set-buffer buf)))))
+       (goto-char p)))))
 
 (defun gnus-article-edit-full-stops ()
   "Interactively repair spacing at end of sentences."
@@ -2742,9 +3134,9 @@ groups."
   :type 'regexp)
 
 (defcustom gnus-button-alist
-  `(("<\\(url:[>\n\t ]*?\\)?news:[>\n\t ]*\\([^>\n\t ]*@[^>\n\t ]*\\)>" 0 t
-     gnus-button-message-id 2)
-    ("\\bnews:\\([^>\n\t ]*@[^>\n\t ]*\\)" 0 t gnus-button-message-id 1)
+  `(("<\\(url:[>\n\t ]*?\\)?news:[>\n\t ]*\\([^>\n\t ]*@[^>\n\t ]*\\)>"
+     0 t gnus-button-message-id 2)
+    ("\\bnews:\\([^>\n\t ]*@[^>)!;:,\n\t ]*\\)" 0 t gnus-button-message-id 1)
     ("\\(\\b<\\(url:[>\n\t ]*\\)?news:[>\n\t ]*\\(//\\)?\\([^>\n\t ]*\\)>\\)"
      1 t
      gnus-button-fetch-group 4)
@@ -2752,7 +3144,7 @@ groups."
     ("\\bin\\( +article\\| +message\\)? +\\(<\\([^\n @<>]+@[^\n @<>]+\\)>\\)" 2
      t gnus-button-message-id 3)
     ("\\(<URL: *\\)mailto: *\\([^> \n\t]+\\)>" 0 t gnus-url-mailto 2)
-    ("mailto:\\([a-zA-Z.-@_+0-9%]+\\)" 0 t gnus-url-mailto 1)
+    ("mailto:\\([-a-zA-Z.@_+0-9%]+\\)" 0 t gnus-url-mailto 1)
     ("\\bmailto:\\([^ \n\t]+\\)" 0 t gnus-url-mailto 1)
     ;; This is how URLs _should_ be embedded in text...
     ("<URL: *\\([^>]*\\)>" 0 t gnus-button-embedded-url 1)
@@ -2842,40 +3234,6 @@ call it with the value of the `gnus-data' text property."
     (when fun
       (funcall fun data))))
 
-(defun gnus-article-prev-button (n)
-  "Move point to N buttons backward.
-If N is negative, move forward instead."
-  (interactive "p")
-  (gnus-article-next-button (- n)))
-
-(defun gnus-article-next-button (n)
-  "Move point to N buttons forward.
-If N is negative, move backward instead."
-  (interactive "p")
-  (let ((function (if (< n 0) 'previous-single-property-change
-                   'next-single-property-change))
-       (inhibit-point-motion-hooks t)
-       (backward (< n 0))
-       (limit (if (< n 0) (point-min) (point-max))))
-    (setq n (abs n))
-    (while (and (not (= limit (point)))
-               (> n 0))
-      ;; Skip past the current button.
-      (when (get-text-property (point) 'gnus-callback)
-       (goto-char (funcall function (point) 'gnus-callback nil limit)))
-      ;; Go to the next (or previous) button.
-      (gnus-goto-char (funcall function (point) 'gnus-callback nil limit))
-      ;; Put point at the start of the button.
-      (when (and backward (not (get-text-property (point) 'gnus-callback)))
-       (goto-char (funcall function (point) 'gnus-callback nil limit)))
-      ;; Skip past intangible buttons.
-      (when (get-text-property (point) 'intangible)
-       (incf n))
-      (decf n))
-    (unless (zerop n)
-      (gnus-message 5 "No more buttons"))
-    n))
-
 (defun gnus-article-highlight (&optional force)
   "Highlight current article.
 This function calls `gnus-article-highlight-headers',
@@ -3058,7 +3416,9 @@ specified by `gnus-button-alist'."
    (nconc (and gnus-article-mouse-face
               (list gnus-mouse-face-prop gnus-article-mouse-face))
          (list 'gnus-callback fun)
-         (and data (list 'gnus-data data)))))
+         (and data (list 'gnus-data data))))
+  (widget-convert-button 'link from to :action 'gnus-widget-press-button
+                        :button-keymap gnus-widget-button-keymap))
 
 ;;; Internal functions:
 
@@ -3090,7 +3450,6 @@ specified by `gnus-button-alist'."
 (defun gnus-button-push (marker)
   ;; Push button starting at MARKER.
   (save-excursion
-    (set-buffer gnus-article-buffer)
     (goto-char marker)
     (let* ((entry (gnus-button-entry))
           (inhibit-point-motion-hooks t)
@@ -3135,7 +3494,7 @@ specified by `gnus-button-alist'."
 
 (defun gnus-url-parse-query-string (query &optional downcase)
   (let (retval pairs cur key val)
-    (setq pairs (gnus-split-string query "&"))
+    (setq pairs (split-string query "&"))
     (while pairs
       (setq cur (car pairs)
             pairs (cdr pairs))
@@ -3247,7 +3606,7 @@ forbidden in URL encoding."
      gnus-prev-page-line-format nil
      `(gnus-prev t local-map ,gnus-prev-page-map
                 gnus-callback gnus-article-button-prev-page
-                gnus-type annotation))))
+                article-type annotation))))
 
 (defvar gnus-next-page-map nil)
 (unless gnus-next-page-map
@@ -3278,7 +3637,7 @@ forbidden in URL encoding."
                      `(gnus-next
                        t local-map ,gnus-next-page-map
                        gnus-callback gnus-article-button-next-page
-                       gnus-type annotation))))
+                       article-type annotation))))
 
 (defun gnus-article-button-next-page (arg)
   "Go to the next page."
@@ -3296,6 +3655,44 @@ forbidden in URL encoding."
     (gnus-article-prev-page)
     (select-window win)))
 
+(defvar gnus-decode-header-methods
+  '(mail-decode-encoded-word-region)
+  "List of methods used to decode headers
+
+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-region-by-guess)
+ mail-decode-encoded-word-region 
+ (\"chinese\" . rfc1843-decode-region))
+")
+
+(defvar gnus-decode-header-methods-cache nil)
+
+(defun gnus-multi-decode-header (start end)
+  "Apply the functions from `gnus-encoded-word-methods' that match."
+  (unless (and gnus-decode-header-methods-cache
+              (eq gnus-newsgroup-name 
+                  (car gnus-decode-header-methods-cache)))
+    (setq gnus-decode-header-methods-cache (list gnus-newsgroup-name))
+    (mapc '(lambda (x) 
+            (if (symbolp x)
+                (nconc gnus-decode-header-methods-cache (list x))
+              (if (and gnus-newsgroup-name 
+                       (string-match (car x) gnus-newsgroup-name))
+                  (nconc gnus-decode-header-methods-cache 
+                         (list (cdr x))))))
+         gnus-decode-header-methods))
+  (let ((xlist gnus-decode-header-methods-cache))
+    (pop xlist)
+    (save-restriction
+      (narrow-to-region start end)
+      (while xlist
+       (funcall (pop xlist) (point-min) (point-max))))))
+
 (gnus-ems-redefine)
 
 (provide 'gnus-art)
index d370673..51c6e7f 100644 (file)
@@ -42,7 +42,7 @@
   (or (get-buffer gnus-backlog-buffer)
       (save-excursion
        (set-buffer (gnus-get-buffer-create gnus-backlog-buffer))
-       (buffer-disable-undo (current-buffer))
+       (buffer-disable-undo)
        (setq buffer-read-only t)
        (get-buffer gnus-backlog-buffer))))
 
index acf13b3..d7034ca 100644 (file)
@@ -77,6 +77,9 @@ it's not cached."
 (defvar gnus-cache-overview-coding-system 'raw-text
   "Coding system used on Gnus cache files.")
 
+(defvar gnus-cache-coding-system 'binary
+  "Coding system used on Gnus cache files.")
+
 \f
 
 ;;; Internal variables.
@@ -175,7 +178,8 @@ it's not cached."
            t                           ; The article already is saved.
          (save-excursion
            (set-buffer nntp-server-buffer)
-           (let ((gnus-use-cache nil))
+           (let ((gnus-use-cache nil)
+                 (gnus-article-decode-hook nil))
              (gnus-request-article-this-buffer number group))
            (when (> (buffer-size) 0)
              (gnus-write-buffer file)
@@ -200,17 +204,7 @@ it's not cached."
                    (beginning-of-line))
                (forward-line 1))
              (beginning-of-line)
-             ;; [number subject from date id references chars lines xref]
-             (insert (format "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n"
-                             (mail-header-number headers)
-                             (mail-header-subject headers)
-                             (mail-header-from headers)
-                             (mail-header-date headers)
-                             (mail-header-id headers)
-                             (or (mail-header-references headers) "")
-                             (or (mail-header-chars headers) "")
-                             (or (mail-header-lines headers) "")
-                             (or (mail-header-xref headers) "")))
+             (nnheader-insert-nov headers)
              ;; Update the active info.
              (set-buffer gnus-summary-buffer)
              (gnus-cache-update-active group number)
@@ -264,7 +258,8 @@ it's not cached."
     (when (file-exists-p file)
       (erase-buffer)
       (gnus-kill-all-overlays)
-      (insert-file-contents file)
+      (let ((coding-system-for-read gnus-cache-coding-system))
+       (insert-file-contents file))
       t)))
 
 (defun gnus-cache-possibly-alter-active (group active)
@@ -395,7 +390,6 @@ Returns the list of articles removed."
            (cons group
                  (set-buffer (gnus-get-buffer-create
                               " *gnus-cache-overview*"))))
-      (buffer-disable-undo (current-buffer))
       ;; Insert the contents of this group's cache overview.
       (erase-buffer)
       (let ((file (gnus-cache-file-name group ".overview")))
@@ -487,7 +481,6 @@ Returns the list of articles removed."
     (gnus-cache-save-buffers)
     (save-excursion
       (set-buffer cache-buf)
-      (buffer-disable-undo (current-buffer))
       (erase-buffer)
       (insert-file-contents (or file (gnus-cache-file-name group ".overview")))
       (goto-char (point-min))
@@ -517,7 +510,6 @@ Returns the list of articles removed."
   (let ((cache-buf (gnus-get-buffer-create " *gnus-cache*")))
     (save-excursion
       (set-buffer cache-buf)
-      (buffer-disable-undo (current-buffer))
       (erase-buffer))
     (set-buffer nntp-server-buffer)
     (goto-char (point-min))
@@ -595,7 +587,7 @@ $ emacs -batch -l ~/.emacs -l gnus -f gnus-jog-cache"
   (when (or force
            (and gnus-cache-active-hashtb
                 gnus-cache-active-altered))
-    (nnheader-temp-write gnus-cache-active-file
+    (with-temp-file gnus-cache-active-file
       (mapatoms
        (lambda (sym)
         (when (and sym (boundp sym))
index 025273b..5a839e8 100644 (file)
@@ -28,6 +28,7 @@
 
 (require 'wid-edit)
 (require 'gnus-score)
+(require 'gnus-topic)
 
 ;;; Widgets:
 
@@ -159,7 +160,11 @@ An arbitrary comment on the group.")
 
     (visible (const :tag "Permanently visible" t) "\
 Always display this group, even when there are no unread articles
-in it.."))
+in it..")
+
+    (charset (string :tag "Charset") "\
+The default charset to use in the group.") 
+)
   "Alist of valid group parameters.
 
 Each entry has the form (NAME TYPE DOC), where NAME is the parameter
@@ -169,10 +174,11 @@ DOC is a documentation string for the parameter.")
 (defvar gnus-custom-params)
 (defvar gnus-custom-method)
 (defvar gnus-custom-group)
+(defvar gnus-custom-topic)
 
-(defun gnus-group-customize (group)
-  "Edit the group on the current line."
-  (interactive (list (gnus-group-group-name)))
+(defun gnus-group-customize (group &optional topic)
+  "Edit the group or topic on the current line."
+  (interactive (list (gnus-group-group-name) (gnus-group-topic-name)))
   (let (info
        (types (mapcar (lambda (entry)
                         `(cons :format "%v%h\n"
@@ -180,9 +186,11 @@ DOC is a documentation string for the parameter.")
                                (const :format "" ,(nth 0 entry))
                                ,(nth 1 entry)))
                       gnus-group-parameters)))
-    (unless group
+    (unless (or group topic)
       (error "No group on current line"))
-    (unless (setq info (gnus-get-info group))
+    (when (and group topic)
+      (error "Both a group an topic on current line"))
+    (unless (or topic (setq info (gnus-get-info group)))
       (error "Killed group; can't be edited"))
     ;; Ready.
     (kill-buffer (gnus-get-buffer-create "*Gnus Customize*"))
@@ -190,13 +198,20 @@ DOC is a documentation string for the parameter.")
     (gnus-custom-mode)
     (make-local-variable 'gnus-custom-group)
     (setq gnus-custom-group group)
+    (make-local-variable 'gnus-custom-topic)
+    (setq gnus-custom-topic topic)
     (widget-insert "Customize the ")
-    (widget-create 'info-link
-                  :help-echo "Push me to learn more."
-                  :tag "group parameters"
-                  "(gnus)Group Parameters")
+    (if group 
+       (widget-create 'info-link
+                      :help-echo "Push me to learn more."
+                      :tag "group parameters"
+                      "(gnus)Group Parameters")
+      (widget-create 'info-link
+                    :help-echo "Push me to learn more."
+                    :tag  "topic parameters"
+                    "(gnus)Topic Parameters"))
     (widget-insert " for <")
-    (widget-insert group)
+    (widget-insert (or group topic))
     (widget-insert "> and press ")
     (widget-create 'push-button
                   :tag "done"
@@ -206,15 +221,17 @@ DOC is a documentation string for the parameter.")
     (make-local-variable 'gnus-custom-params)
     (setq gnus-custom-params
          (widget-create 'group
-                        :value (gnus-info-params info)
+                        :value (if group 
+                                   (gnus-info-params info)
+                                 (gnus-topic-parameters topic))
                         `(set :inline t
                               :greedy t
                               :tag "Parameters"
                               :format "%t:\n%h%v"
                               :doc "\
 These special paramerters are recognized by Gnus.
-Check the [ ] for the parameters you want to apply to this group, then
-edit the value to suit your taste."
+Check the [ ] for the parameters you want to apply to this group or
+to the groups in this topic, then edit the value to suit your taste."
                               ,@types)
                         '(repeat :inline t
                                  :tag "Variables"
@@ -232,7 +249,7 @@ like.  If you want to hear a beep when you enter a group, you could
 put something like `(dummy-variable (ding))' in the parameters of that
 group.  `dummy-variable' will be set to the result of the `(ding)'
 form, but who cares?"
-                                 (group :value (nil nil)
+                                 (cons :format "%v" :value (nil .  nil)
                                         (symbol :tag "Variable")
                                         (sexp :tag
                                               "Value")))
@@ -240,26 +257,30 @@ form, but who cares?"
                         '(repeat :inline t
                                  :tag "Unknown entries"
                                  sexp)))
-    (widget-insert "\n\nYou can also edit the ")
-    (widget-create 'info-link
-                  :tag "select method"
-                  :help-echo "Push me to learn more about select methods."
-                  "(gnus)Select Methods")
-    (widget-insert " for the group.\n")
-    (setq gnus-custom-method
-         (widget-create 'sexp
-                        :tag "Method"
-                        :value (gnus-info-method info)))
+    (when group
+      (widget-insert "\n\nYou can also edit the ")
+      (widget-create 'info-link
+                    :tag "select method"
+                    :help-echo "Push me to learn more about select methods."
+                    "(gnus)Select Methods")
+      (widget-insert " for the group.\n")
+      (setq gnus-custom-method
+           (widget-create 'sexp
+                          :tag "Method"
+                          :value (gnus-info-method info))))
     (use-local-map widget-keymap)
     (widget-setup)))
 
 (defun gnus-group-customize-done (&rest ignore)
   "Apply changes and bury the buffer."
   (interactive)
-  (gnus-group-edit-group-done 'params gnus-custom-group
-                             (widget-value gnus-custom-params))
-  (gnus-group-edit-group-done 'method gnus-custom-group
-                             (widget-value gnus-custom-method))
+  (if gnus-custom-topic
+      (gnus-topic-set-parameters gnus-custom-topic 
+                                (widget-value gnus-custom-params))
+    (gnus-group-edit-group-done 'params gnus-custom-group
+                               (widget-value gnus-custom-params))
+    (gnus-group-edit-group-done 'method gnus-custom-group
+                               (widget-value gnus-custom-method)))
   (bury-buffer))
 
 ;;; Score Customization:
@@ -580,6 +601,7 @@ if you do all your changes will be lost.  ")
                                     (gnus-score-string :tag "Subject")
                                     (gnus-score-string :tag "References")
                                     (gnus-score-string :tag "Xref")
+                                    (gnus-score-string :tag "Extra")
                                     (gnus-score-string :tag "Message-ID")
                                     (gnus-score-integer :tag "Lines")
                                     (gnus-score-integer :tag "Chars")
index 0015a90..d239dda 100644 (file)
@@ -82,10 +82,6 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's."
 (defvar gnus-inhibit-demon nil
   "*If non-nil, no daemonic function will be run.")
 
-(eval-and-compile
-  (autoload 'timezone-parse-date "timezone")
-  (autoload 'timezone-make-arpa-date "timezone"))
-
 ;;; Functions.
 
 (defun gnus-demon-add-handler (function time idle)
@@ -155,9 +151,9 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's."
       time
     (let* ((now (current-time))
            ;; obtain NOW as discrete components -- make a vector for speed
-           (nowParts (apply 'vector (decode-time now)))
+           (nowParts (decode-time now))
            ;; obtain THEN as discrete components
-           (thenParts (timezone-parse-time time))
+           (thenParts (parse-time-string time))
            (thenHour (string-to-int (elt thenParts 0)))
            (thenMin (string-to-int (elt thenParts 1)))
            ;; convert time as elements into number of seconds since EPOCH.
@@ -268,8 +264,7 @@ minutes, the connection is closed."
 
 (defun gnus-demon-nntp-close-connection ()
   (save-window-excursion
-    (when (nnmail-time-less '(0 300)
-                           (nnmail-time-since nntp-last-command-time))
+    (when (time-less-p '(0 300) (time-since nntp-last-command-time))
       (nntp-close-server))))
 
 (defun gnus-demon-add-scanmail ()
index 88a132e..27b4ad6 100644 (file)
@@ -97,6 +97,8 @@
     (gnus-draft-setup article gnus-newsgroup-name)
     (set-buffer-modified-p t)
     (save-buffer)
+    (let ((gnus-verbose-backends nil))
+      (gnus-request-expire-articles (list article) gnus-newsgroup-name t))
     (push
      `((lambda ()
         (when (gnus-buffer-exists-p ,gnus-summary-buffer)
index 6958f02..b289639 100644 (file)
@@ -98,7 +98,7 @@ seen in the same session."
   "Save the duplicate suppression list."
   (when (and gnus-save-duplicate-list
             gnus-dup-list-dirty)
-    (nnheader-temp-write gnus-duplicate-file
+    (with-temp-file gnus-duplicate-file
       (gnus-prin1 `(setq gnus-dup-list ',gnus-dup-list))))
   (setq gnus-dup-list-dirty nil))
 
index 6a93242..dff64d7 100644 (file)
@@ -53,7 +53,8 @@
 
 (defvar gnus-edit-form-mode-map nil)
 (unless gnus-edit-form-mode-map
-  (setq gnus-edit-form-mode-map (copy-keymap emacs-lisp-mode-map))
+  (setq gnus-edit-form-mode-map (make-sparse-keymap))
+  (set-keymap-parent gnus-edit-form-mode-map emacs-lisp-mode-map)
   (gnus-define-keys gnus-edit-form-mode-map
     "\C-c\C-c" gnus-edit-form-done
     "\C-c\C-k" gnus-edit-form-exit))
index 0e95762..2438b31 100644 (file)
@@ -33,7 +33,9 @@
   "Non-nil if running under XEmacs.")
 
 (defvar gnus-mouse-2 [mouse-2])
+(defvar gnus-mouse-3 [mouse-3])
 (defvar gnus-down-mouse-2 [down-mouse-2])
+(defvar gnus-widget-button-keymap nil)
 (defvar gnus-mode-line-modified
   (if (or gnus-xemacs
          (< emacs-major-version 20))
@@ -45,9 +47,6 @@
   (autoload 'gnus-xmas-redefine "gnus-xmas")
   (autoload 'appt-select-lowest-window "appt"))
 
-(or (fboundp 'mail-file-babyl-p)
-    (fset 'mail-file-babyl-p 'rmail-file-p))
-
 ;;; Mule functions.
 
 (defun gnus-mule-cite-add-face (number prefix face)
            (valstr (if (numberp val)
                        (int-to-string val) val)))
        (if (> (length valstr) (, max-width))
-          (truncate-string valstr (, max-width))
+          (truncate-string-to-width valstr (, max-width))
         valstr))))
 
-(defun gnus-encode-coding-string (string system)
-  string)
-
-(defun gnus-decode-coding-string (string system)
-  string)
-
 (eval-and-compile
   (if (string-match "XEmacs\\|Lucid" emacs-version)
       nil
    ((string-match "XEmacs\\|Lucid" emacs-version)
     (gnus-xmas-define))
 
-   ((or (not (boundp 'emacs-minor-version))
-       (and (< emacs-major-version 20)
-            (< emacs-minor-version 30)))
-    ;; Remove the `intangible' prop.
-    (let ((props (and (boundp 'gnus-hidden-properties)
-                     gnus-hidden-properties)))
-      (while (and props (not (eq (car (cdr props)) 'intangible)))
-       (setq props (cdr props)))
-      (when props
-       (setcdr props (cdr (cdr (cdr props))))))
-    (unless (fboundp 'buffer-substring-no-properties)
-      (defun buffer-substring-no-properties (beg end)
-       (format "%s" (buffer-substring beg end)))))
-
    ((boundp 'MULE)
     (provide 'gnusutil))))
 
       (while funcs
        (unless (fboundp (car funcs))
          (fset (car funcs) 'gnus-dummy-func))
-       (setq funcs (cdr funcs))))))
-  (unless (fboundp 'file-regular-p)
-    (defun file-regular-p (file)
-      (and (not (file-directory-p file))
-          (not (file-symlink-p file))
-          (file-exists-p file))))
-  (unless (fboundp 'face-list)
-    (defun face-list (&rest args))))
+       (setq funcs (cdr funcs)))))))
 
 (eval-and-compile
   (let ((case-fold-search t))
     ;; `emacs-version'. In this case, implementation for XEmacs/mule
     ;; may be able to share between XEmacs and XEmacs/mule.
 
-    (defalias 'gnus-truncate-string 'truncate-string)
-
     (defvar gnus-summary-display-table nil
       "Display table used in summary mode buffers.")
     (fset 'gnus-cite-add-face 'gnus-mule-cite-add-face)
     (fset 'gnus-max-width-function 'gnus-mule-max-width-function)
     (fset 'gnus-summary-set-display-table (lambda ()))
-    (fset 'gnus-encode-coding-string 'encode-coding-string)
-    (fset 'gnus-decode-coding-string 'decode-coding-string)
     
     (when (boundp 'gnus-check-before-posting)
       (setq gnus-check-before-posting
          (format "%4d: %-20s"
                  gnus-tmp-lines
                  (if (> (length gnus-tmp-name) 20)
-                     (truncate-string gnus-tmp-name 20)
+                     (truncate-string-to-width gnus-tmp-name 20)
                    gnus-tmp-name))
          gnus-tmp-closing-bracket)
         (point))
        (erase-buffer)
        (when (and dir
                   (file-exists-p (setq file (concat dir "x-splash"))))
-         (nnheader-temp-write nil
+         (with-temp-buffer
            (insert-file-contents file)
            (goto-char (point-min))
            (ignore-errors
            (make-face 'gnus-splash))
          (setq height (/ (car pixmap) (frame-char-height))
                width (/ (cadr pixmap) (frame-char-width)))
-         (set-face-foreground 'gnus-splash "ForestGreen")
+         (set-face-foreground 'gnus-splash "Brown")
          (set-face-stipple 'gnus-splash pixmap)
          (insert-char ?\n (* (/ (window-height) 2 height) height))
          (setq i height)
          (goto-char (point-min))
          (sit-for 0))))))
 
-(if (fboundp 'split-string)
-    (fset 'gnus-split-string 'split-string)
-  (defun gnus-split-string (string pattern)
-    "Return a list of substrings of STRING which are separated by PATTERN."
-    (let (parts (start 0))
-      (while (string-match pattern string start)
-       (setq parts (cons (substring string start (match-beginning 0)) parts)
-             start (match-end 0)))
-      (nreverse (cons (substring string start) parts)))))
-
 (provide 'gnus-ems)
 
 ;; Local Variables:
index d56f5ce..be3a549 100644 (file)
@@ -35,6 +35,7 @@
 (require 'gnus-range)
 (require 'gnus-win)
 (require 'gnus-undo)
+(require 'time-date)
 
 (defcustom gnus-group-archive-directory
   "*ftp@ftp.hpc.uh.edu:/pub/emacs/ding-list/"
@@ -298,6 +299,18 @@ variable."
      gnus-group-news-3-empty-face)
     ((and (not mailp) (eq level 3)) .
      gnus-group-news-3-face)
+    ((and (= unread 0) (not mailp) (eq level 4)) .
+     gnus-group-news-4-empty-face)
+    ((and (not mailp) (eq level 4)) .
+     gnus-group-news-4-face)
+    ((and (= unread 0) (not mailp) (eq level 5)) .
+     gnus-group-news-5-empty-face)
+    ((and (not mailp) (eq level 5)) .
+     gnus-group-news-5-face)
+    ((and (= unread 0) (not mailp) (eq level 6)) .
+     gnus-group-news-6-empty-face)
+    ((and (not mailp) (eq level 6)) .
+     gnus-group-news-6-face)
     ((and (= unread 0) (not mailp)) .
      gnus-group-news-low-empty-face)
     ((and (not mailp)) .
@@ -763,7 +776,7 @@ The following commands are available:
   (gnus-group-set-mode-line)
   (setq mode-line-process nil)
   (use-local-map gnus-group-mode-map)
-  (buffer-disable-undo (current-buffer))
+  (buffer-disable-undo)
   (setq truncate-lines t)
   (setq buffer-read-only t)
   (gnus-set-default-directory)
@@ -1327,7 +1340,7 @@ If FIRST-TOO, the current line is also eligible as a target."
        (beginning-of-line)
        (forward-char (or (cdr (assq 'process gnus-group-mark-positions)) 2))
        (subst-char-in-region
-        (point) (1+ (point)) (following-char)
+        (point) (1+ (point)) (char-after)
         (if unmark
             (progn
               (setq gnus-group-marked (delete group gnus-group-marked))
@@ -1802,7 +1815,7 @@ ADDRESS."
     (gnus-read-method "From method: ")))
 
   (when (stringp method)
-    (setq method (gnus-server-to-method method)))
+    (setq method (or (gnus-server-to-method method) method)))
   (let* ((meth (when (and method
                          (not (gnus-server-equal method gnus-select-method)))
                 (if address (list (intern method) address)
@@ -2155,7 +2168,7 @@ score file entries for articles to include in the group."
        (push (cons header regexps) scores))
       scores)))
   (gnus-group-make-group group "nnkiboze" address)
-  (nnheader-temp-write (gnus-score-file-name (concat "nnkiboze:" group))
+  (with-temp-file (gnus-score-file-name (concat "nnkiboze:" group))
     (let (emacs-lisp-mode-hook)
       (pp scores (current-buffer)))))
 
@@ -2300,46 +2313,52 @@ If REVERSE, sort in reverse order."
     ;; Go through all the infos and replace the old entries
     ;; with the new infos.
     (while infos
-      (setcar entries (pop infos))
+      (setcar (car entries) (pop infos))
       (pop entries))
     ;; Update the hashtable.
     (gnus-make-hashtable-from-newsrc-alist)))
 
-(defun gnus-group-sort-selected-groups-by-alphabet (&optional reverse)
+(defun gnus-group-sort-selected-groups-by-alphabet (&optional n reverse)
   "Sort the group buffer alphabetically by group name.
-If REVERSE, sort in reverse order."
-  (interactive "P")
-  (gnus-group-sort-selected-groups 'gnus-group-sort-by-alphabet reverse))
+Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
+sort in reverse order."
+  (interactive (gnus-interactive "P\ny"))
+  (gnus-group-sort-selected-groups n 'gnus-group-sort-by-alphabet reverse))
 
-(defun gnus-group-sort-selected-groups-by-unread (&optional reverse)
+(defun gnus-group-sort-selected-groups-by-unread (&optional n reverse)
   "Sort the group buffer by number of unread articles.
-If REVERSE, sort in reverse order."
-  (interactive "P")
-  (gnus-group-sort-selected-groups 'gnus-group-sort-by-unread reverse))
+Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
+sort in reverse order."
+  (interactive (gnus-interactive "P\ny"))
+  (gnus-group-sort-selected-groups n 'gnus-group-sort-by-unread reverse))
 
-(defun gnus-group-sort-selected-groups-by-level (&optional reverse)
+(defun gnus-group-sort-selected-groups-by-level (&optional n reverse)
   "Sort the group buffer by group level.
-If REVERSE, sort in reverse order."
-  (interactive "P")
-  (gnus-group-sort-selected-groups 'gnus-group-sort-by-level reverse))
+Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
+sort in reverse order."
+  (interactive (gnus-interactive "P\ny"))
+  (gnus-group-sort-selected-groups n 'gnus-group-sort-by-level reverse))
 
-(defun gnus-group-sort-selected-groups-by-score (&optional reverse)
+(defun gnus-group-sort-selected-groups-by-score (&optional n reverse)
   "Sort the group buffer by group score.
-If REVERSE, sort in reverse order."
-  (interactive "P")
-  (gnus-group-sort-selected-groups 'gnus-group-sort-by-score reverse))
+Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
+sort in reverse order."
+  (interactive (gnus-interactive "P\ny"))
+  (gnus-group-sort-selected-groups n 'gnus-group-sort-by-score reverse))
 
-(defun gnus-group-sort-selected-groups-by-rank (&optional reverse)
+(defun gnus-group-sort-selected-groups-by-rank (&optional n reverse)
   "Sort the group buffer by group rank.
-If REVERSE, sort in reverse order."
-  (interactive "P")
-  (gnus-group-sort-selected-groups 'gnus-group-sort-by-rank reverse))
+Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
+sort in reverse order."
+  (interactive (gnus-interactive "P\ny"))
+  (gnus-group-sort-selected-groups n 'gnus-group-sort-by-rank reverse))
 
-(defun gnus-group-sort-selected-groups-by-method (&optional reverse)
+(defun gnus-group-sort-selected-groups-by-method (&optional n reverse)
   "Sort the group buffer alphabetically by backend name.
-If REVERSE, sort in reverse order."
-  (interactive "P")
-  (gnus-group-sort-selected-groups 'gnus-group-sort-by-method reverse))
+Obeys the process/prefix convention.  If REVERSE (the symbolic prefix),
+sort in reverse order."
+  (interactive (gnus-interactive "P\ny"))
+  (gnus-group-sort-selected-groups n 'gnus-group-sort-by-method reverse))
 
 ;;; Sorting predicates.
 
@@ -2940,8 +2959,9 @@ If N is negative, this group and the N-1 previous groups will be checked."
             (gnus-get-info group) (gnus-active group) t)
            (unless (gnus-virtual-group-p group)
              (gnus-close-group group))
-           (gnus-agent-save-group-info
-            method (gnus-group-real-name group) (gnus-active group))
+           (when gnus-agent
+             (gnus-agent-save-group-info
+              method (gnus-group-real-name group) (gnus-active group)))
            (gnus-group-update-group group))
        (if (eq (gnus-server-status (gnus-find-method-for-group group))
                'denied)
@@ -3055,7 +3075,7 @@ to use."
       ;; Print out all the groups.
       (save-excursion
        (pop-to-buffer "*Gnus Help*")
-       (buffer-disable-undo (current-buffer))
+       (buffer-disable-undo)
        (erase-buffer)
        (setq groups (sort groups 'string<))
        (while groups
@@ -3327,26 +3347,26 @@ and the second element is the address."
 
 (defun gnus-add-marked-articles (group type articles &optional info force)
   ;; Add ARTICLES of TYPE to the info of GROUP.
-  ;; If INFO is non-nil, use that info.         If FORCE is non-nil, don't
+  ;; If INFO is non-nil, use that info.         If FORCE is non-nil, don't
   ;; add, but replace marked articles of TYPE with ARTICLES.
   (let ((info (or info (gnus-get-info group)))
        marked m)
     (or (not info)
        (and (not (setq marked (nthcdr 3 info)))
             (or (null articles)
-                (setcdr (nthcdr 2 info)
-                        (list (list (cons type (gnus-compress-sequence
-                                                articles t)))))))
+                (setcdr (nthcdr 2 info)
+                        (list (list (cons type (gnus-compress-sequence
+                                                articles t)))))))
        (and (not (setq m (assq type (car marked))))
             (or (null articles)
-                (setcar marked
-                        (cons (cons type (gnus-compress-sequence articles t) )
-                              (car marked)))))
+                (setcar marked
+                        (cons (cons type (gnus-compress-sequence articles t) )
+                              (car marked)))))
        (if force
            (if (null articles)
-               (setcar (nthcdr 3 info)
-                       (gnus-delete-alist type (car marked)))
-             (setcdr m (gnus-compress-sequence articles t)))
+               (setcar (nthcdr 3 info)
+                       (gnus-delete-alist type (car marked)))
+             (setcdr m (gnus-compress-sequence articles t)))
          (setcdr m (gnus-compress-sequence
                     (sort (nconc (gnus-uncompress-range (cdr m))
                                  (copy-sequence articles)) '<) t))))))
@@ -3372,7 +3392,7 @@ or `gnus-group-catchup-group-hook'."
   "Return the offset in seconds from the timestamp for GROUP to the current time, as a floating point number."
   (let* ((time (or (gnus-group-timestamp group)
                  (list 0 0)))
-         (delta (gnus-time-minus (current-time) time)))
+         (delta (subtract-time (current-time) time)))
     (+ (* (nth 0 delta) 65536.0)
        (nth 1 delta))))
 
index 8143d0d..4ba7f40 100644 (file)
@@ -91,6 +91,7 @@ If CONFIRM is non-nil, the user will be asked for an NNTP server."
        ;; gnus-open-server-hook might have opened it
        (gnus-server-opened gnus-select-method)
        (gnus-open-server gnus-select-method)
+       gnus-batch-mode
        (gnus-y-or-n-p
        (format
         "%s (%s) open error: '%s'.  Continue? "
@@ -268,6 +269,14 @@ this group uses will be queried."
       (funcall (gnus-get-function gnus-command-method func)
               (gnus-group-real-name group) (nth 1 gnus-command-method)))))
 
+(defun gnus-request-group-articles (group)
+  "Request a list of existing articles in GROUP."
+  (let ((gnus-command-method (gnus-find-method-for-group group))
+       (func 'request-group-articles))
+    (when (gnus-check-backend-function func group)
+      (funcall (gnus-get-function gnus-command-method func)
+              (gnus-group-real-name group) (nth 1 gnus-command-method)))))
+
 (defun gnus-close-group (group)
   "Request the GROUP be closed."
   (let ((gnus-command-method (inline (gnus-find-method-for-group group))))
@@ -307,6 +316,16 @@ If FETCH-OLD, retrieve all headers (or some subset thereof) in the group."
       (funcall (gnus-get-function gnus-command-method 'request-type)
               (gnus-group-real-name group) article))))
 
+(defun gnus-request-set-mark (group action)
+  "Set marks on articles in the backend."
+  (let ((gnus-command-method (gnus-find-method-for-group group)))
+    (if (not (gnus-check-backend-function
+             'request-set-mark (car gnus-command-method)))
+       action
+      (funcall (gnus-get-function gnus-command-method 'request-set-mark)
+              (gnus-group-real-name group) action
+              (nth 1 gnus-command-method)))))
+
 (defun gnus-request-update-mark (group article mark)
   "Allow the backend to change the mark the user tries to put on an article."
   (let ((gnus-command-method (gnus-find-method-for-group group)))
@@ -423,7 +442,8 @@ If GROUP is nil, all groups on GNUS-COMMAND-METHOD are scanned."
             article (gnus-group-real-name group)
             (nth 1 gnus-command-method) accept-function last)))
 
-(defun gnus-request-accept-article (group &optional gnus-command-method last)
+(defun gnus-request-accept-article (group &optional gnus-command-method last
+                                         no-encode)
   ;; Make sure there's a newline at the end of the article.
   (when (stringp gnus-command-method)
     (setq gnus-command-method (gnus-server-to-method gnus-command-method)))
@@ -433,6 +453,11 @@ If GROUP is nil, all groups on GNUS-COMMAND-METHOD are scanned."
   (goto-char (point-max))
   (unless (bolp)
     (insert "\n"))
+  (unless no-encode
+    (save-restriction
+      (message-narrow-to-head)
+      (mail-encode-encoded-word-buffer))
+    (message-encode-message-body))
   (let ((func (car (or gnus-command-method
                       (gnus-find-method-for-group group)))))
     (funcall (intern (format "%s-request-accept-article" func))
@@ -440,7 +465,12 @@ If GROUP is nil, all groups on GNUS-COMMAND-METHOD are scanned."
             (cadr gnus-command-method)
             last)))
 
-(defun gnus-request-replace-article (article group buffer)
+(defun gnus-request-replace-article (article group buffer &optional no-encode)
+  (unless no-encode
+    (save-restriction
+      (message-narrow-to-head)
+      (mail-encode-encoded-word-buffer))
+    (message-encode-message-body))
   (let ((func (car (gnus-group-name-to-method group))))
     (funcall (intern (format "%s-request-replace-article" func))
             article (gnus-group-real-name group) buffer)))
index abcc401..2e3b064 100644 (file)
@@ -429,7 +429,7 @@ Returns the number of articles marked as read."
 (defun gnus-score-insert-help (string alist idx)
   (save-excursion
     (pop-to-buffer "*Score Help*")
-    (buffer-disable-undo (current-buffer))
+    (buffer-disable-undo)
     (erase-buffer)
     (insert string ":\n\n")
     (while alist
@@ -524,7 +524,7 @@ COMMAND must be a lisp expression or a string representing a key sequence."
                  ;; It's on the form (regexp . date).
                  (if (zerop (gnus-execute field (car kill-list)
                                           command nil (not all)))
-                     (when (> (gnus-days-between date (cdr kill-list))
+                     (when (> (days-between date (cdr kill-list))
                               gnus-kill-expiry-days)
                        (setq regexp nil))
                    (setcdr kill-list date))
@@ -535,7 +535,7 @@ COMMAND must be a lisp expression or a string representing a key sequence."
                        (setq kdate (cdr kill))
                        (if (zerop (gnus-execute
                                    field (car kill) command nil (not all)))
-                           (when (> (gnus-days-between date kdate)
+                           (when (> (days-between date kdate)
                                     gnus-kill-expiry-days)
                              ;; Time limit has been exceeded, so we
                              ;; remove the match.
@@ -566,7 +566,7 @@ COMMAND must be a lisp expression or a string representing a key sequence."
       (concat "\n" (gnus-prin1-to-string object))
     (save-excursion
       (set-buffer (gnus-get-buffer-create "*Gnus PP*"))
-      (buffer-disable-undo (current-buffer))
+      (buffer-disable-undo)
       (erase-buffer)
       (insert (format "\n(%S %S\n  '(" (nth 0 object) (nth 1 object)))
       (let ((klist (cadr (nth 2 object)))
@@ -702,7 +702,9 @@ Usage: emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score"
                 (and (car entry)
                      (or (eq (car entry) t)
                          (not (zerop (car entry))))))
-       (gnus-summary-read-group group nil t nil t)
+       (condition-case ()
+           (gnus-summary-read-group group nil t nil t)
+         (error nil))
        (when (eq (current-buffer) (get-buffer gnus-summary-buffer))
          (gnus-summary-exit))))
     ;; Exit Emacs.
index c276a0b..2c5517a 100644 (file)
      ((eq type 'at)
       (equal date match))
      ((eq type 'before)
-      (gnus-time-less match date))
+      (time-less-p match date))
      ((eq type 'after)
-      (gnus-time-less date match))
+      (time-less-p date match))
      (t
       (error "No such date score type: %s" type)))))
 
index b0e73aa..09a3f47 100644 (file)
@@ -228,11 +228,20 @@ Thank you for your help in stamping out bugs.
 
 ;;; Post news commands of Gnus group mode and summary mode
 
-(defun gnus-group-mail ()
-  "Start composing a mail."
-  (interactive)
-  (gnus-setup-message 'message
-    (message-mail)))
+(defun gnus-group-mail (&optional arg)
+  "Start composing a mail.
+If ARG, use the group under the point to find a posting style.
+If ARG is 1, prompt for a group name to find the posting style."
+  (interactive "P")
+  (let ((gnus-newsgroup-name
+        (if arg
+            (if (= 1 (prefix-numeric-value arg))
+                (completing-read "Use posting style of group: "
+                                 gnus-active-hashtb nil
+                                 (gnus-read-active-file-p))
+              (gnus-group-group-name))
+          "")))
+    (gnus-setup-message 'message (message-mail))))
 
 (defun gnus-group-post-news (&optional arg)
   "Start composing a news message.
@@ -353,7 +362,9 @@ header line with the old Message-ID."
   ;; if ARTICLE-BUFFER is nil, gnus-article-buffer is used
   ;; this buffer should be passed to all mail/news reply/post routines.
   (setq gnus-article-copy (gnus-get-buffer-create " *gnus article copy*"))
-  (buffer-disable-undo gnus-article-copy)
+  (save-excursion
+    (set-buffer gnus-article-copy)
+    (mm-enable-multibyte))
   (let ((article-buffer (or article-buffer gnus-article-buffer))
        end beg)
     (if (not (and (get-buffer article-buffer)
@@ -384,10 +395,10 @@ header line with the old Message-ID."
          ;; Delete the headers from the displayed articles.
          (set-buffer gnus-article-copy)
          (delete-region (goto-char (point-min))
-                        (or (search-forward "\n\n" nil t) (point)))
+                        (or (search-forward "\n\n" nil t) (point-max)))
          ;; Insert the original article headers.
          (insert-buffer-substring gnus-original-article-buffer beg end)
-         (gnus-article-decode-rfc1522)))
+         (article-decode-encoded-words)))
       gnus-article-copy)))
 
 (defun gnus-post-news (post &optional group header article-buffer yank subject
@@ -483,14 +494,16 @@ If SILENT, don't prompt the user."
                   (list gnus-post-method)))
               gnus-secondary-select-methods
               (mapcar 'cdr gnus-server-alist)
+              (mapcar 'car gnus-opened-servers)
               (list gnus-select-method)
               (list group-method)))
             method-alist post-methods method)
        ;; Weed out all mail methods.
        (while methods
          (setq method (gnus-server-get-method "" (pop methods)))
-         (when (or (gnus-method-option-p method 'post)
-                   (gnus-method-option-p method 'post-mail))
+         (when (and (or (gnus-method-option-p method 'post)
+                        (gnus-method-option-p method 'post-mail))
+                    (not (member method post-methods)))
            (push method post-methods)))
        ;; Create a name-method alist.
        (setq method-alist
@@ -514,7 +527,7 @@ If SILENT, don't prompt the user."
      ((and (eq gnus-post-method 'current)
           (not (eq (car group-method) 'nndraft))
           (not arg))
-      group-method) 
+      group-method)
      ((and gnus-post-method
           (not (eq gnus-post-method 'current)))
       gnus-post-method)
@@ -523,69 +536,32 @@ If SILENT, don't prompt the user."
 
 \f
 
-;; Dummy to avoid byte-compile warning.
+;; Dummies to avoid byte-compile warning.
 (defvar nnspool-rejected-article-hook)
 (defvar xemacs-codename)
 
-;;; Since the X-Newsreader/X-Mailer are ``vanity'' headers, they might
-;;; as well include the Emacs version as well.
-;;; The following function works with later GNU Emacs, and XEmacs.
 (defun gnus-extended-version ()
   "Stringified Gnus version and Emacs version."
   (interactive)
   (concat
-   gnus-version
-   "/"
+   "Gnus/" (prin1-to-string (gnus-continuum-version gnus-version) t)
+   " (" gnus-version ")"
+   " "
    (cond
     ((string-match "^\\([0-9]+\\.[0-9]+\\)\\.[.0-9]+$" emacs-version)
-     (concat "Emacs " (substring emacs-version
-                                (match-beginning 1)
-                                (match-end 1))))
+     (concat "Emacs/" (match-string 1 emacs-version)))
     ((string-match "\\([A-Z]*[Mm][Aa][Cc][Ss]\\)[^(]*\\(\\((beta.*)\\|'\\)\\)?"
                   emacs-version)
-     (concat (substring emacs-version
-                       (match-beginning 1)
-                       (match-end 1))
-            (format " %d.%d" emacs-major-version emacs-minor-version)
+     (concat (match-string 1 emacs-version)
+            (format "/%d.%d" emacs-major-version emacs-minor-version)
             (if (match-beginning 3)
-                (substring emacs-version
-                           (match-beginning 3)
-                           (match-end 3))
+                (match-string 3 emacs-version)
               "")
             (if (boundp 'xemacs-codename)
-                (concat " - \"" xemacs-codename "\""))))
+                (concat " (" xemacs-codename ")")
+              "")))
     (t emacs-version))))
 
-;; Written by "Mr. Per Persson" <pp@gnu.ai.mit.edu>.
-(defun gnus-inews-insert-mime-headers ()
-  "Insert MIME headers.
-Assumes ISO-Latin-1 is used iff 8-bit characters are present."
-  (goto-char (point-min))
-  (let ((mail-header-separator
-        (progn
-          (goto-char (point-min))
-          (if (and (search-forward (concat "\n" mail-header-separator "\n")
-                                   nil t)
-                   (not (search-backward "\n\n" nil t)))
-              mail-header-separator
-            ""))))
-    (or (mail-position-on-field "Mime-Version")
-       (insert "1.0")
-       (cond ((save-restriction
-                (widen)
-                (goto-char (point-min))
-                (re-search-forward "[^\000-\177]" nil t))
-              (or (mail-position-on-field "Content-Type")
-                  (insert "text/plain; charset=ISO-8859-1"))
-              (or (mail-position-on-field "Content-Transfer-Encoding")
-                  (insert "8bit")))
-             (t (or (mail-position-on-field "Content-Type")
-                    (insert "text/plain; charset=US-ASCII"))
-                (or (mail-position-on-field "Content-Transfer-Encoding")
-                    (insert "7bit")))))))
-
-(custom-add-option 'message-header-hook 'gnus-inews-insert-mime-headers)
-
 \f
 ;;;
 ;;; Gnus Mail Functions
@@ -639,10 +615,17 @@ If FULL-HEADERS (the prefix), include full headers when forwarding."
   (interactive "P")
   (gnus-setup-message 'forward
     (gnus-summary-select-article)
-    (set-buffer gnus-original-article-buffer)
-    (let ((message-included-forward-headers
-          (if full-headers "" message-included-forward-headers)))
-      (message-forward post))))
+    (let (text)
+      (save-excursion
+       (set-buffer gnus-original-article-buffer)
+       (setq text (buffer-string)))
+      (set-buffer (gnus-get-buffer-create " *Gnus forward*"))
+      (erase-buffer)
+      (insert text)
+      (run-hooks 'gnus-article-decode-hook)
+      (let ((message-included-forward-headers
+            (if full-headers "" message-included-forward-headers)))
+       (message-forward post)))))
 
 (defun gnus-summary-resend-message (address n)
   "Resend the current article to ADDRESS."
@@ -692,7 +675,8 @@ The current group name will be inserted at \"%s\".")
        (gnus-summary-select-article)
        (set-buffer gnus-original-article-buffer)
        (if (and (<= (length (message-tokenize-header
-                             (setq newsgroups (mail-fetch-field "newsgroups"))
+                             (setq newsgroups
+                                   (mail-fetch-field "newsgroups"))
                              ", "))
                     1)
                 (or (not (setq followup-to (mail-fetch-field "followup-to")))
@@ -855,7 +839,6 @@ The source file has to be in the Emacs load path."
     ;; Go through all the files looking for non-default values for variables.
     (save-excursion
       (set-buffer (gnus-get-buffer-create " *gnus bug info*"))
-      (buffer-disable-undo (current-buffer))
       (while files
        (erase-buffer)
        (when (and (setq file (locate-library (pop files)))
@@ -967,7 +950,7 @@ this is a reply."
                       (concat "^" (regexp-quote mail-header-separator) "$")
                       nil t)
                  (replace-match "" t t ))
-               (unless (gnus-request-accept-article group method t)
+               (unless (gnus-request-accept-article group method t t)
                  (gnus-message 1 "Couldn't store article in group %s: %s"
                                group (gnus-status-message method))
                  (sit-for 2))
@@ -998,7 +981,7 @@ this is a reply."
          (and gnus-newsgroup-name
               (gnus-group-find-parameter
                gnus-newsgroup-name 'gcc-self)))
-        result 
+        result
         (groups
          (cond
           ((null gnus-message-archive-method)
@@ -1102,7 +1085,7 @@ this is a reply."
            (if (and (not (stringp (car attribute)))
                     (not (eq 'body (car attribute)))
                     (not (setq variable
-                               (cdr (assq (car attribute) 
+                               (cdr (assq (car attribute)
                                           gnus-posting-style-alist)))))
                (message "Couldn't find attribute %s" (car attribute))
              ;; We get the value.
index d678531..8659779 100644 (file)
@@ -146,7 +146,7 @@ matches an previously scanned and verified nocem message."
          (save-excursion
            (let ((dependencies (make-vector 10 nil))
                  headers header)
-             (nnheader-temp-write nil
+             (with-temp-buffer
                (setq headers
                      (if (eq 'nov
                              (gnus-retrieve-headers
@@ -190,9 +190,9 @@ matches an previously scanned and verified nocem message."
   (let ((date (mail-header-date header))
        issuer b e type)
     (when (or (not date)
-             (nnmail-time-less
-              (nnmail-time-since (nnmail-date-to-time date))
-              (nnmail-days-to-time gnus-nocem-expiry-wait)))
+             (time-less-p
+              (time-since (date-to-time date))
+              (days-to-time gnus-nocem-expiry-wait)))
       (gnus-request-article-this-buffer (mail-header-number header) group)
       (goto-char (point-min))
       (when (re-search-forward "-----BEGIN PGP MESSAGE-----" nil t)
@@ -271,7 +271,7 @@ matches an previously scanned and verified nocem message."
                              gnus-nocem-real-group-hashtb)
            ;; Valid group.
            (beginning-of-line)
-           (while (= (following-char) ?\t)
+           (while (eq (char-after) ?\t)
              (forward-line -1))
            (setq id (buffer-substring (point) (1- (search-forward "\t"))))
            (unless (gnus-gethash id gnus-nocem-hashtb)
@@ -279,7 +279,7 @@ matches an previously scanned and verified nocem message."
              (gnus-sethash id t gnus-nocem-hashtb)
              (push id ncm))
            (forward-line 1)
-           (while (= (following-char) ?\t)
+           (while (eq (char-after) ?\t)
              (forward-line 1))))))
       (when ncm
        (setq gnus-nocem-touched-alist t)
@@ -302,13 +302,13 @@ matches an previously scanned and verified nocem message."
   "Save the NoCeM cache."
   (when (and gnus-nocem-alist
             gnus-nocem-touched-alist)
-    (nnheader-temp-write (gnus-nocem-cache-file)
+    (with-temp-file (gnus-nocem-cache-file)
       (gnus-prin1 `(setq gnus-nocem-alist ',gnus-nocem-alist)))
     (setq gnus-nocem-touched-alist nil)))
 
 (defun gnus-nocem-save-active ()
   "Save the NoCeM active file."
-  (nnheader-temp-write (gnus-nocem-active-file)
+  (with-temp-file (gnus-nocem-active-file)
     (gnus-prin1 `(setq gnus-nocem-active ',gnus-nocem-active))))
 
 (defun gnus-nocem-alist-to-hashtb ()
@@ -316,11 +316,11 @@ matches an previously scanned and verified nocem message."
   (let* ((alist gnus-nocem-alist)
         (pprev (cons nil alist))
         (prev pprev)
-        (expiry (nnmail-days-to-time gnus-nocem-expiry-wait))
+        (expiry (days-to-time gnus-nocem-expiry-wait))
         entry)
     (setq gnus-nocem-hashtb (gnus-make-hashtable (* (length alist) 51)))
     (while (setq entry (car alist))
-      (if (not (nnmail-time-less (nnmail-time-since (car entry)) expiry))
+      (if (not (time-less-p (time-since (car entry)) expiry))
          ;; This entry has expired, so we remove it.
          (setcdr prev (cdr alist))
        (setq prev alist)
index 672e726..895505e 100644 (file)
@@ -229,7 +229,7 @@ Note: LIST has to be sorted over `<'."
 Note: LIST has to be sorted over `<'."
   ;; !!! This function shouldn't look like this, but I've got a headache.
   (gnus-compress-sequence
-   (gnus-sorted-complement
+   (gnus-set-difference
     (gnus-uncompress-range ranges) list)))
 
 (defun gnus-member-of-range (number ranges)
index e98762e..b50341d 100644 (file)
@@ -131,7 +131,8 @@ It accepts the same format specs that `gnus-summary-line-format' does."
               (set-buffer gnus-summary-buffer)
               gnus-pick-mode))
     (message-add-action
-     '(gnus-configure-windows 'pick t) 'send 'exit 'postpone 'kill)))
+     '(gnus-configure-windows ,gnus-current-window-configuration t)
+     'send 'exit 'postpone 'kill)))
 
 (defvar gnus-pick-line-number 1)
 (defun gnus-pick-line-number ()
@@ -468,7 +469,7 @@ Two predefined functions are available:
   (setq mode-name "Tree")
   (setq major-mode 'gnus-tree-mode)
   (use-local-map gnus-tree-mode-map)
-  (buffer-disable-undo (current-buffer))
+  (buffer-disable-undo)
   (setq buffer-read-only t)
   (setq truncate-lines t)
   (save-excursion
@@ -519,12 +520,14 @@ Two predefined functions are available:
 
 (defun gnus-tree-article-region (article)
   "Return a cons with BEG and END of the article region."
-  (let ((pos (text-property-any (point-min) (point-max) 'gnus-number article)))
+  (let ((pos (text-property-any
+             (point-min) (point-max) 'gnus-number article)))
     (when pos
       (cons pos (next-single-property-change pos 'gnus-number)))))
 
 (defun gnus-tree-goto-article (article)
-  (let ((pos (text-property-any (point-min) (point-max) 'gnus-number article)))
+  (let ((pos (text-property-any
+             (point-min) (point-max) 'gnus-number article)))
     (when pos
       (goto-char pos))))
 
@@ -702,7 +705,7 @@ Two predefined functions are available:
          (while (progn
                   (forward-line -1)
                   (forward-char col)
-                  (= (following-char) ? ))
+                  (eq (char-after) ? ))
            (delete-char 1)
            (insert (caddr gnus-tree-parent-child-edges)))
          (goto-char beg)))
@@ -760,7 +763,7 @@ Two predefined functions are available:
          (forward-char -1)
          ;; Draw "-" lines leftwards.
          (while (and (> (point) 1)
-                     (= (char-after (1- (point))) ? ))
+                     (eq (char-after (1- (point))) ? ))
            (delete-char -1)
            (insert (car gnus-tree-parent-child-edges))
            (forward-char -1))
@@ -967,7 +970,7 @@ The following commands are available:
   (setq mode-name "Gnus Carpal")
   (setq mode-line-process nil)
   (use-local-map gnus-carpal-mode-map)
-  (buffer-disable-undo (current-buffer))
+  (buffer-disable-undo)
   (setq buffer-read-only t)
   (make-local-variable 'gnus-carpal-attached-buffer)
   (gnus-run-hooks 'gnus-carpal-mode-hook))
index c429950..ff791fa 100644 (file)
@@ -308,6 +308,7 @@ Should be one of the following symbols.
  i: message-id
  t: references
  x: xref
+ e: `extra' (non-standard overview)
  l: lines
  d: date
  f: followup
@@ -321,6 +322,7 @@ If nil, the user will be asked for a header."
                 (const :tag "message-id" i)
                 (const :tag "references" t)
                 (const :tag "xref" x)
+                (const :tag "extra" e)
                 (const :tag "lines" l)
                 (const :tag "date" d)
                 (const :tag "followup" f)
@@ -444,6 +446,7 @@ of the last successful match.")
     ("chars" 6 gnus-score-integer)
     ("lines" 7 gnus-score-integer)
     ("xref" 8 gnus-score-string)
+    ("extra" 9 gnus-score-string)
     ("head" -1 gnus-score-body)
     ("body" -1 gnus-score-body)
     ("all" -1 gnus-score-body)
@@ -502,6 +505,7 @@ used as score."
            (?i "message-id" nil t string)
            (?r "references" "message-id" nil string)
            (?x "xref" nil nil string)
+           (?e "extra" nil nil string)
            (?l "lines" nil nil number)
            (?d "date" nil nil date)
            (?f "followup" nil nil string)
@@ -530,7 +534,7 @@ used as score."
                     (aref (symbol-name gnus-score-default-type) 0)))
         (pchar (and gnus-score-default-duration
                     (aref (symbol-name gnus-score-default-duration) 0)))
-        entry temporary type match)
+        entry temporary type match extra)
 
     (unwind-protect
        (progn
@@ -622,9 +626,26 @@ used as score."
       ;; Always kill the score help buffer.
       (gnus-score-kill-help-buffer))
 
+    ;; If scoring an extra (non-standard overview) header,
+    ;; we must find out which header is in question.
+    (setq extra
+         (and gnus-extra-headers
+              (equal (nth 1 entry) "extra")
+              (intern                                  ; need symbol
+               (gnus-completing-read
+                (symbol-name (car gnus-extra-headers)) ; default response
+                "Score extra header:"                  ; prompt
+                (mapcar (lambda (x)                    ; completion list
+                          (cons (symbol-name x) x))
+                        gnus-extra-headers)
+                nil                                    ; no completion limit
+                t))))                                  ; require match
+    ;; extra is now nil or a symbol.
+
     ;; We have all the data, so we enter this score.
     (setq match (if (string= (nth 2 entry) "") ""
-                 (gnus-summary-header (or (nth 2 entry) (nth 1 entry)))))
+                 (gnus-summary-header (or (nth 2 entry) (nth 1 entry))
+                                      nil extra)))
 
     ;; Modify the match, perhaps.
     (cond
@@ -660,7 +681,9 @@ used as score."
      (if (eq temporary 'perm)          ; Temp
         nil
        temporary)
-     (not (nth 3 entry)))              ; Prompt
+     (not (nth 3 entry))               ; Prompt
+     nil                               ; not silent 
+     extra)                            ; non-standard overview.
 
     (when (eq symp 'a)
       ;; We change the score file back to the previous one.
@@ -672,7 +695,7 @@ used as score."
   (setq gnus-score-help-winconf (current-window-configuration))
   (save-excursion
     (set-buffer (gnus-get-buffer-create "*Score Help*"))
-    (buffer-disable-undo (current-buffer))
+    (buffer-disable-undo)
     (delete-windows-on (current-buffer))
     (erase-buffer)
     (insert string ":\n\n")
@@ -709,14 +732,16 @@ used as score."
       (shrink-window-if-larger-than-buffer))
     (select-window (get-buffer-window gnus-summary-buffer))))
 
-(defun gnus-summary-header (header &optional no-err)
+(defun gnus-summary-header (header &optional no-err extra)
   ;; Return HEADER for current articles, or error.
   (let ((article (gnus-summary-article-number))
        headers)
     (if article
        (if (and (setq headers (gnus-summary-article-header article))
                 (vectorp headers))
-           (aref headers (nth 1 (assoc header gnus-header-index)))
+           (if extra                   ; `header' must be "extra"
+               (or (cdr (assq extra (mail-header-extra headers))) "")
+             (aref headers (nth 1 (assoc header gnus-header-index))))
          (if no-err
              nil
            (error "Pseudo-articles can't be scored")))
@@ -742,7 +767,8 @@ used as score."
                  (gnus-newsgroup-score-alist)))))
 
 (defun gnus-summary-score-entry (header match type score date
-                                       &optional prompt silent)
+                                       &optional prompt silent extra)
+  (interactive)
   "Enter score file entry.
 HEADER is the header being scored.
 MATCH is the string we are looking for.
@@ -750,7 +776,8 @@ TYPE is the match type: substring, regexp, exact, fuzzy.
 SCORE is the score to add.
 DATE is the expire date, or nil for no expire, or 'now for immediate expire.
 If optional argument `PROMPT' is non-nil, allow user to edit match.
-If optional argument `SILENT' is nil, show effect of score entry."
+If optional argument `SILENT' is nil, show effect of score entry.
+If optional argument `EXTRA' is non-nil, it's a non-standard overview header."
   ;; Regexp is the default type.
   (when (eq type t)
     (setq type 'r))
@@ -791,12 +818,17 @@ If optional argument `SILENT' is nil, show effect of score entry."
            elem)
        (setq new
              (cond
+              (extra
+               (list match score
+                     (and date (if (numberp date) date
+                                 (date-to-day date)))
+                     type (symbol-name extra)))
               (type
                (list match score
                      (and date (if (numberp date) date
-                                 (gnus-day-number date)))
+                                 (date-to-day date)))
                      type))
-              (date (list match score (gnus-day-number date)))
+              (date (list match score (date-to-day date)))
               (score (list match score))
               (t (list match))))
        ;; We see whether we can collapse some score entries.
@@ -821,18 +853,19 @@ If optional argument `SILENT' is nil, show effect of score entry."
       (if (and (>= (nth 1 (assoc header gnus-header-index)) 0)
               (eq (nth 2 (assoc header gnus-header-index))
                   'gnus-score-string))
-         (gnus-summary-score-effect header match type score)
+         (gnus-summary-score-effect header match type score extra)
        (gnus-summary-rescore)))
 
     ;; Return the new scoring rule.
     new))
 
-(defun gnus-summary-score-effect (header match type score)
+(defun gnus-summary-score-effect (header match type score extra)
   "Simulate the effect of a score file entry.
 HEADER is the header being scored.
 MATCH is the string we are looking for.
 TYPE is the score type.
-SCORE is the score to add."
+SCORE is the score to add.
+EXTRA is the possible non-standard header."
   (interactive (list (completing-read "Header: "
                                      gnus-header-index
                                      (lambda (x) (fboundp (nth 2 x)))
@@ -853,7 +886,7 @@ SCORE is the score to add."
                        (t
                         (regexp-quote match)))))
       (while (not (eobp))
-       (let ((content (gnus-summary-header header 'noerr))
+       (let ((content (gnus-summary-header header 'noerr extra))
              (case-fold-search t))
          (and content
               (when (if (eq type 'f)
@@ -1121,7 +1154,7 @@ SCORE is the score to add."
                 (or (not decay)
                     (gnus-decay-scores alist decay)))
        (gnus-score-set 'touched '(t) alist)
-       (gnus-score-set 'decay (list (gnus-time-to-day (current-time))) alist))
+       (gnus-score-set 'decay (list (time-to-days (current-time))) alist))
       ;; We do not respect eval and files atoms from global score
       ;; files.
       (when (and files (not global))
@@ -1202,9 +1235,9 @@ SCORE is the score to add."
        ;; Couldn't read file.
        (setq gnus-score-alist nil)
       ;; Read file.
-      (save-excursion
-       (gnus-set-work-buffer)
-       (insert-file-contents file)
+      (with-temp-buffer
+       (let ((coding-system-for-write score-mode-coding-system))
+         (insert-file-contents file))
        (goto-char (point-min))
        ;; Only do the loading if the score file isn't empty.
        (when (save-excursion (re-search-forward "[()0-9a-zA-Z]" nil t))
@@ -1290,7 +1323,7 @@ SCORE is the score to add."
              (setcar scor
                      (list (caar scor) (nth 2 (car scor))
                            (and (nth 3 (car scor))
-                                (gnus-day-number (nth 3 (car scor))))
+                                (date-to-day (nth 3 (car scor))))
                            (if (nth 1 (car scor)) 'r 's)))
              (setq scor (cdr scor))))
        (push (if (not (listp (cdr entry)))
@@ -1337,7 +1370,8 @@ SCORE is the score to add."
              (delete-file file)
            ;; There are scores, so we write the file.
            (when (file-writable-p file)
-             (gnus-write-buffer file)
+             (let ((coding-system-for-write score-mode-coding-system))
+               (gnus-write-buffer file))
              (when gnus-score-after-write-file-function
                (funcall gnus-score-after-write-file-function file)))))
        (and gnus-score-uncacheable-files
@@ -1385,7 +1419,7 @@ SCORE is the score to add."
       (when (and gnus-summary-default-score
                 scores)
        (let* ((entries gnus-header-index)
-              (now (gnus-day-number (current-time-string)))
+              (now (date-to-day (current-time-string)))
               (expire (and gnus-score-expiry-days
                            (- now gnus-score-expiry-days)))
               (headers gnus-newsgroup-headers)
@@ -1404,7 +1438,7 @@ SCORE is the score to add."
 
          (save-excursion
            (set-buffer (gnus-get-buffer-create "*Headers*"))
-           (buffer-disable-undo (current-buffer))
+           (buffer-disable-undo)
            (when (gnus-buffer-live-p gnus-summary-buffer)
              (message-clone-locals gnus-summary-buffer))
 
@@ -1864,12 +1898,23 @@ SCORE is the score to add."
     ;; and U is the number of unique headers.  It is assumed (but
     ;; untested) this will be a net win because of the large constant
     ;; factor involved with string matching.
-    (setq gnus-scores-articles (sort gnus-scores-articles 'gnus-score-string<)
+    (setq gnus-scores-articles
+         ;; We cannot string-sort the extra headers list.  *sigh*
+         (if (= gnus-score-index 9)
+             gnus-scores-articles
+           (sort gnus-scores-articles 'gnus-score-string<))
          articles gnus-scores-articles)
 
     (erase-buffer)
     (while (setq art (pop articles))
       (setq this (aref (car art) gnus-score-index))
+
+      ;; If we're working with non-standard headers, we are stuck
+      ;; with working on them as a group.  What a hassle.
+      ;; Just wait 'til you see what horrors we commit against `match'...
+      (if (= gnus-score-index 9)
+         (setq this (prin1-to-string this)))   ; ick.
+
       (if simplify
          (setq this (gnus-map-function gnus-simplify-subject-functions this)))
       (if (equal last this)
@@ -1900,6 +1945,7 @@ SCORE is the score to add."
               (type (or (nth 3 kill) 's))
               (score (or (nth 1 kill) gnus-score-interactive-default-score))
               (date (nth 2 kill))
+              (extra (nth 4 kill))     ; non-standard header; string.
               (found nil)
               (mt (aref (symbol-name type) 0))
               (case-fold-search (not (memq mt '(?R ?S ?E ?F))))
@@ -1915,6 +1961,12 @@ SCORE is the score to add."
                      ((or (= dmt ?e) (= dmt ?s) (= dmt ?f)) 'search-forward)
                      ((= dmt ?w) nil)
                      (t (error "Illegal match type: %s" type)))))
+
+         ;; Evil hackery to make match usable in non-standard headers.
+         (when extra
+           (setq match (concat "[ (](" extra " \\. \"[^)]*" match "[^(]*\")[ )]")
+                 search-func 're-search-forward))      ; XXX danger?!?
+
          (cond
           ;; Fuzzy matches.  We save these for later.
           ((= dmt ?f)
@@ -2209,9 +2261,9 @@ SCORE is the score to add."
     ;; Perform adaptive word scoring.
     (when (and (listp gnus-newsgroup-adaptive)
               (memq 'word gnus-newsgroup-adaptive))
-      (nnheader-temp-write nil
+      (with-temp-buffer
        (let* ((hashtb (gnus-make-hashtable 1000))
-              (date (gnus-day-number (current-time-string)))
+              (date (date-to-day (current-time-string)))
               (data gnus-newsgroup-data)
               (syntab (syntax-table))
               word d score val)
@@ -2289,11 +2341,10 @@ SCORE is the score to add."
           1 "No score rules apply to the current article (default score %d)."
           gnus-summary-default-score)
        (set-buffer "*Score Trace*")
+       (setq truncate-lines t)
        (while trace
          (insert (format "%S  ->  %s\n" (cdar trace)
-                         (if (caar trace)
-                             (file-name-nondirectory (caar trace))
-                           "(non-file rule)")))
+                         (or (caar trace) "(non-file rule)")))
          (setq trace (cdr trace)))
        (goto-char (point-min))
        (gnus-configure-windows 'score-trace)))
@@ -2471,8 +2522,8 @@ SCORE is the score to add."
        seen out file)
     (while (setq file (pop files))
       (cond
-       ;; Ignore "." and "..".
-       ((member (file-name-nondirectory file) '("." ".."))
+       ;; Ignore files that start with a dot.
+       ((string-match "^\\." (file-name-nondirectory file))
        nil)
        ;; Add subtrees of directory to also be searched.
        ((and (file-directory-p file)
@@ -2505,7 +2556,7 @@ GROUP using BNews sys file syntax."
         ofiles not-match regexp)
     (save-excursion
       (set-buffer (gnus-get-buffer-create "*gnus score files*"))
-      (buffer-disable-undo (current-buffer))
+      (buffer-disable-undo)
       ;; Go through all score file names and create regexp with them
       ;; as the source.
       (while sfiles
@@ -2625,7 +2676,7 @@ Destroys the current buffer."
 
 (defun gnus-sort-score-files (files)
   "Sort FILES so that the most general files come first."
-  (nnheader-temp-write nil
+  (with-temp-buffer
     (let ((alist
           (mapcar
            (lambda (file)
@@ -2837,7 +2888,7 @@ If ADAPT, return the home adaptive file instead."
 
 (defun gnus-decay-scores (alist day)
   "Decay non-permanent scores in ALIST."
-  (let ((times (- (gnus-time-to-day (current-time)) day))
+  (let ((times (- (time-to-days (current-time)) day))
        kill entry updated score n)
     (unless (zerop times)              ;Done decays today already?
       (while (setq entry (pop alist))
index ae9909b..29c2a31 100644 (file)
@@ -65,8 +65,6 @@
                                         "site-lisp/bbdb-1.51/")
   "Directory where Big Brother Database is found.")
 
-(defvar gnus-use-tm running-xemacs
-  "Set this if you want MIME support for Gnus")
 (defvar gnus-use-mhe nil
   "Set this if you want to use MH-E for mail reading")
 (defvar gnus-use-rmail nil
 ;;; We can't do this until we know where Gnus is.
 (require 'message)
 
-;;; Tools for MIME by
-;;; UMEDA Masanobu <umerin@mse.kyutech.ac.jp>
-;;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
-
-(when gnus-use-tm
-  (when (and (not gnus-use-installed-tm)
-            (null (member gnus-tm-lisp-directory load-path)))
-    (setq load-path (cons gnus-tm-lisp-directory load-path)))
-  ;; tm may or may not be dumped with XEmacs.  In Sunpro it is, otherwise
-  ;; it isn't.
-  (unless (featurep 'mime-setup)
-    (load "mime-setup")))
-
 ;;; Mailcrypt by
 ;;; Jin Choi <jin@atype.com>
 ;;; Patrick LoPresti <patl@lcs.mit.edu>
index 08f8176..4e32484 100644 (file)
@@ -140,21 +140,19 @@ move those articles instead."
     (buffer-disable-undo tmp-buf)
     (save-excursion
       (while articles
-       ;; Find the header of the article.
-       (set-buffer gnus-summary-buffer)
-       (when (setq headers (gnus-summary-article-header (car articles)))
          ;; Put the article in a buffer.
-         (set-buffer tmp-buf)
-         (when (gnus-request-article-this-buffer
-                (car articles) gnus-newsgroup-name)
-           (save-restriction
-             (message-narrow-to-head)
-             (message-remove-header gnus-soup-ignored-headers t))
-           (gnus-soup-store gnus-soup-directory prefix headers
-                            gnus-soup-encoding-type
-                            gnus-soup-index-type)
-           (gnus-soup-area-set-number
-            area (1+ (or (gnus-soup-area-number area) 0)))))
+       (set-buffer tmp-buf)
+       (when (gnus-request-article-this-buffer
+              (car articles) gnus-newsgroup-name)
+         (setq headers (nnheader-parse-head t))
+         (save-restriction
+           (message-narrow-to-head)
+           (message-remove-header gnus-soup-ignored-headers t))
+         (gnus-soup-store gnus-soup-directory prefix headers
+                          gnus-soup-encoding-type
+                          gnus-soup-index-type)
+         (gnus-soup-area-set-number
+          area (1+ (or (gnus-soup-area-number area) 0))))
        ;; Mark article as read.
        (set-buffer gnus-summary-buffer)
        (gnus-summary-remove-process-mark (car articles))
@@ -168,11 +166,11 @@ move those articles instead."
   "Make a SOUP packet from the SOUP areas."
   (interactive)
   (gnus-soup-read-areas)
-  (unless (file-exists-p gnus-soup-directory)
-    (message "No such directory: %s" gnus-soup-directory))
-  (when (null (directory-files gnus-soup-directory nil "\\.MSG$"))
-    (message "No files to pack."))
-  (gnus-soup-pack gnus-soup-directory gnus-soup-packer))
+  (if (file-exists-p gnus-soup-directory)
+      (if (directory-files gnus-soup-directory nil "\\.MSG$")
+         (gnus-soup-pack gnus-soup-directory gnus-soup-packer)
+       (message "No files to pack."))
+    (message "No such directory: %s" gnus-soup-directory)))
 
 (defun gnus-group-brew-soup (n)
   "Make a soup packet from the current group.
@@ -374,7 +372,7 @@ though the two last may be nil if they are missing."
     (when (file-exists-p file)
       (save-excursion
        (set-buffer (nnheader-find-file-noselect file 'force))
-       (buffer-disable-undo (current-buffer))
+       (buffer-disable-undo)
        (goto-char (point-min))
        (while (not (eobp))
          (push (vector (gnus-soup-field)
@@ -397,7 +395,7 @@ file.  The vector contain three strings, [prefix name encoding]."
   (let (replies)
     (save-excursion
       (set-buffer (nnheader-find-file-noselect file))
-      (buffer-disable-undo (current-buffer))
+      (buffer-disable-undo)
       (goto-char (point-min))
       (while (not (eobp))
        (push (vector (gnus-soup-field) (gnus-soup-field)
@@ -422,7 +420,7 @@ file.  The vector contain three strings, [prefix name encoding]."
   "Write the AREAS file."
   (interactive)
   (when gnus-soup-areas
-    (nnheader-temp-write (concat gnus-soup-directory "AREAS")
+    (with-temp-file (concat gnus-soup-directory "AREAS")
       (let ((areas gnus-soup-areas)
            area)
        (while (setq area (pop areas))
@@ -443,7 +441,7 @@ file.  The vector contain three strings, [prefix name encoding]."
 
 (defun gnus-soup-write-replies (dir areas)
   "Write a REPLIES file in DIR containing AREAS."
-  (nnheader-temp-write (concat dir "REPLIES")
+  (with-temp-file (concat dir "REPLIES")
     (let (area)
       (while (setq area (pop areas))
        (insert (format "%s\t%s\t%s\n"
index d910ae6..0cd6ed1 100644 (file)
                  (gnus-parse-format
                   new-format
                   (symbol-value
-                   (intern (format "gnus-%s-line-format-alist"
-                                   (if (eq type 'article-mode)
-                                       'summary-mode type))))
+                   (intern (format "gnus-%s-line-format-alist" type)))
                   (not (string-match "mode$" (symbol-name type))))))
          ;; Enter the new format spec into the list.
          (if entry
     (point) (progn ,@form (point))
     '(gnus-face t face ,(symbol-value (intern (format "gnus-face-%d" type))))))
 
+(defun gnus-balloon-face-function (form type)
+  `(gnus-put-text-property 
+    (point) (progn ,@form (point))
+    'balloon-help
+    ,(intern (format "gnus-balloon-face-%d" type))))
+
 (defun gnus-tilde-max-form (el max-width)
   "Return a form that limits EL to MAX-WIDTH."
   (let ((max (abs max-width)))
   ;; SPEC-ALIST and returns a list that can be eval'ed to return the
   ;; string.  If the FORMAT string contains the specifiers %( and %)
   ;; the text between them will have the mouse-face text property.
+  ;; If the FORMAT string contains the specifiers %< and %>, the text between
+  ;; them will have the balloon-help text property.
   (if (string-match
-       "\\`\\(.*\\)%[0-9]?[{(]\\(.*\\)%[0-9]?[})]\\(.*\n?\\)\\'"
+       "\\`\\(.*\\)%[0-9]?[{(<]\\(.*\\)%[0-9]?[})>]\\(.*\n?\\)\\'"
        format)
       (gnus-parse-complex-format format spec-alist)
     ;; This is a simple format.
       (replace-match "\\\"" nil t))
     (goto-char (point-min))
     (insert "(\"")
-    (while (re-search-forward "%\\([0-9]+\\)?\\([{}()]\\)" nil t)
+    (while (re-search-forward "%\\([0-9]+\\)?\\([{}()<>]\\)" nil t)
       (let ((number (if (match-beginning 1)
                        (match-string 1) "0"))
            (delim (aref (match-string 2) 0)))
        (if (or (= delim ?\()
-               (= delim ?\{))
-           (replace-match (concat "\"(" (if (= delim ?\() "mouse" "face")
+               (= delim ?\{)
+               (= delim ?\<))
+           (replace-match (concat "\"(" 
+                                  (cond ((= delim ?\() "mouse")
+                                        ((= delim ?\{) "face")
+                                        (t "balloon"))
                                   " " number " \""))
          (replace-match "\")\""))))
     (goto-char (point-max))
             (t
              nil)))
        ;; User-defined spec -- find the spec name.
-       (when (= (setq spec (following-char)) ?u)
+       (when (eq (setq spec (char-after)) ?u)
          (forward-char 1)
-         (setq user-defined (following-char)))
+         (setq user-defined (char-after)))
        (forward-char 1)
        (delete-region spec-beg (point))
 
@@ -519,7 +529,7 @@ If PROPS, insert the result."
                       (not (eq 'byte-code (car form)))
                       ;; Under XEmacs, it's (funcall #<compiled-function ...>)
                       (not (and (eq 'funcall (car form))
-                                (compiled-function-p (cadr form)))))
+                                (byte-code-function-p (cadr form)))))
              (fset 'gnus-tmp-func `(lambda () ,form))
              (byte-compile 'gnus-tmp-func)
              (setcar (cddr entry) (gnus-byte-code 'gnus-tmp-func))))))
index 21abf17..0f492e8 100644 (file)
@@ -161,7 +161,7 @@ The following commands are available:
   (gnus-set-default-directory)
   (setq mode-line-process nil)
   (use-local-map gnus-server-mode-map)
-  (buffer-disable-undo (current-buffer))
+  (buffer-disable-undo)
   (setq truncate-lines t)
   (setq buffer-read-only t)
   (gnus-run-hooks 'gnus-server-mode-hook))
@@ -550,9 +550,9 @@ The following commands are available:
 
 (defun gnus-browse-foreign-server (server &optional return-buffer)
   "Browse the server SERVER."
-  (setq gnus-browse-current-method server)
+  (setq gnus-browse-current-method (gnus-server-to-method server))
   (setq gnus-browse-return-buffer return-buffer)
-  (let* ((method (gnus-server-to-method server))
+  (let* ((method gnus-browse-current-method)
         (gnus-select-method method)
         groups group)
     (gnus-message 5 "Connecting to %s..." (nth 1 method))
@@ -575,7 +575,7 @@ The following commands are available:
       (when gnus-carpal
        (gnus-carpal-setup-buffer 'browse))
       (gnus-configure-windows 'browse)
-      (buffer-disable-undo (current-buffer))
+      (buffer-disable-undo)
       (let ((buffer-read-only nil))
        (erase-buffer))
       (gnus-browse-mode)
@@ -636,7 +636,7 @@ buffer.
   (setq mode-name "Browse Server")
   (setq mode-line-process nil)
   (use-local-map gnus-browse-mode-map)
-  (buffer-disable-undo (current-buffer))
+  (buffer-disable-undo)
   (setq truncate-lines t)
   (gnus-set-default-directory)
   (setq buffer-read-only t)
@@ -706,7 +706,7 @@ buffer.
     (save-excursion
       (beginning-of-line)
       ;; If this group it killed, then we want to subscribe it.
-      (when (= (following-char) ?K)
+      (when (eq (char-after) ?K)
        (setq sub t))
       (setq group (gnus-browse-group-name))
       (when (and sub
index 97ab9b8..c7f1f8e 100644 (file)
@@ -785,7 +785,7 @@ prompt the user for the name of an NNTP server to use."
       (erase-buffer)
       (setq buffer-file-name dribble-file)
       (auto-save-mode t)
-      (buffer-disable-undo (current-buffer))
+      (buffer-disable-undo)
       (bury-buffer (current-buffer))
       (set-buffer-modified-p nil)
       (let ((auto (make-auto-save-file-name))
@@ -1103,11 +1103,16 @@ for new groups, and subscribe the new groups as zombies."
     got-new))
 
 (defun gnus-check-first-time-used ()
-  (if (or (> (length gnus-newsrc-alist) 1)
-         (file-exists-p gnus-startup-file)
-         (file-exists-p (concat gnus-startup-file ".el"))
-         (file-exists-p (concat gnus-startup-file ".eld")))
-      nil
+  (catch 'ended
+    (let ((files (list gnus-current-startup-file
+                      (concat gnus-current-startup-file ".el")
+                      (concat gnus-current-startup-file ".eld")
+                      gnus-startup-file
+                      (concat gnus-startup-file ".el")
+                      (concat gnus-startup-file ".eld"))))
+      (while files
+       (when (file-exists-p (pop files))
+         (throw 'ended nil))))
     (gnus-message 6 "First time user; subscribing you to default groups")
     (unless (gnus-read-active-file-p)
       (let ((gnus-read-active-file t))
@@ -1705,7 +1710,6 @@ newsgroup."
                (gnus-message 5 "%sdone" mesg))))))
        (setq methods (cdr methods))))))
 
-
 (defun gnus-ignored-newsgroups-has-to-p ()
   "Non-nil iff gnus-ignored-newsgroups includes \"^to\\\\.\" as an element."
   ;; note this regexp is the same as:
@@ -1772,13 +1776,13 @@ newsgroup."
                       (progn
                         (skip-chars-forward " \t")
                         (not
-                         (or (= (following-char) ?=)
-                             (= (following-char) ?x)
-                             (= (following-char) ?j)))))
+                         (or (eq (char-after) ?=)
+                             (eq (char-after) ?x)
+                             (eq (char-after) ?j)))))
                  (progn
                    (set group (cons min max))
                    ;; if group is moderated, stick in moderation table
-                   (when (= (following-char) ?m)
+                   (when (eq (char-after) ?m)
                      (unless gnus-moderated-hashtb
                        (setq gnus-moderated-hashtb (gnus-make-hashtable)))
                      (gnus-sethash (symbol-name group) t
@@ -1836,7 +1840,7 @@ newsgroup."
       (let (min max group)
        (while (not (eobp))
          (condition-case ()
-             (when (= (following-char) ?2)
+             (when (eq (char-after) ?2)
                (read cur) (read cur)
                (setq min (read cur)
                      max (read cur))
@@ -1877,7 +1881,7 @@ If FORCE is non-nil, the .newsrc file is read."
        (save-excursion
          (gnus-message 5 "Reading %s..." newsrc-file)
          (set-buffer (nnheader-find-file-noselect newsrc-file))
-         (buffer-disable-undo (current-buffer))
+         (buffer-disable-undo)
          (gnus-newsrc-to-gnus-format)
          (kill-buffer (current-buffer))
          (gnus-message 5 "Reading %s...done" newsrc-file)))
@@ -2053,7 +2057,7 @@ If FORCE is non-nil, the .newsrc file is read."
        (unless (boundp symbol)
          (set symbol nil))
        ;; It was a group name.
-       (setq subscribed (= (following-char) ?:)
+       (setq subscribed (eq (char-after) ?:)
              group (symbol-name symbol)
              reads nil)
        (if (eolp)
@@ -2077,7 +2081,7 @@ If FORCE is non-nil, the .newsrc file is read."
                           (read buf)))
              (widen)
              ;; If the next character is a dash, then this is a range.
-             (if (= (following-char) ?-)
+             (if (eq (char-after) ?-)
                  (progn
                    ;; We read the upper bound of the range.
                    (forward-char 1)
@@ -2099,8 +2103,8 @@ If FORCE is non-nil, the .newsrc file is read."
                (push num1 reads))
              ;; If the next char in ?\n, then we have reached the end
              ;; of the line and return nil.
-             (/= (following-char) ?\n))
-            ((= (following-char) ?\n)
+             (not (eq (char-after) ?\n)))
+            ((eq (char-after) ?\n)
              ;; End of line, so we end.
              nil)
             (t
@@ -2226,7 +2230,7 @@ If FORCE is non-nil, the .newsrc file is read."
                  (gnus-point-at-eol)))
        ;; Search for all "words"...
        (while (re-search-forward "[^ \t,\n]+" eol t)
-         (if (= (char-after (match-beginning 0)) ?!)
+         (if (eq (char-after (match-beginning 0)) ?!)
              ;; If the word begins with a bang (!), this is a "not"
              ;; spec.  We put this spec (minus the bang) and the
              ;; symbol `ignore' into the list.
@@ -2274,7 +2278,7 @@ If FORCE is non-nil, the .newsrc file is read."
          (setq buffer-file-name
                (concat gnus-current-startup-file ".eld"))
          (setq default-directory (file-name-directory buffer-file-name))
-         (buffer-disable-undo (current-buffer))
+         (buffer-disable-undo)
          (erase-buffer)
          (gnus-message 5 "Saving %s.eld..." gnus-current-startup-file)
          (gnus-gnus-to-quick-newsrc-format)
@@ -2338,7 +2342,7 @@ If FORCE is non-nil, the .newsrc file is read."
          info ranges range method)
       (setq buffer-file-name gnus-current-startup-file)
       (setq default-directory (file-name-directory buffer-file-name))
-      (buffer-disable-undo (current-buffer))
+      (buffer-disable-undo)
       (erase-buffer)
       ;; Write options.
       (when gnus-newsrc-options
@@ -2424,7 +2428,6 @@ If FORCE is non-nil, the .newsrc file is read."
       (gnus-message 7 "Reading slave newsrcs...")
       (save-excursion
        (set-buffer (gnus-get-buffer-create " *gnus slave*"))
-       (buffer-disable-undo (current-buffer))
        (setq slave-files
              (sort (mapcar (lambda (file)
                              (list (nth 5 (file-attributes file)) file))
@@ -2530,8 +2533,8 @@ If FORCE is non-nil, the .newsrc file is read."
                          enable-multibyte-characters
                          (fboundp 'gnus-mule-get-coding-system)
                          (gnus-mule-get-coding-system (symbol-name group)))))
-               (if coding
-                   (setq str (gnus-decode-coding-string str (car coding))))
+               (when coding
+                 (setq str (mm-decode-coding-string str (car coding))))
                (set group str)))
            (forward-line 1))))
       (gnus-message 5 "Reading descriptions file...done")
index 3084fc5..829bc3f 100644 (file)
@@ -34,6 +34,7 @@
 (require 'gnus-int)
 (require 'gnus-undo)
 (require 'gnus-util)
+(require 'mm-decode)
 (autoload 'gnus-summary-limit-include-cached "gnus-cache" nil t)
 
 (defcustom gnus-kill-summary-on-exit t
@@ -252,8 +253,12 @@ equal will be included."
 (defcustom gnus-auto-select-first t
   "*If nil, don't select the first unread article when entering a group.
 If this variable is `best', select the highest-scored unread article
-in the group.  If neither nil nor `best', select the first unread
-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
@@ -261,7 +266,10 @@ in some newsgroups, set the variable to nil in
   :group 'gnus-group-select
   :type '(choice (const :tag "none" nil)
                 (const best)
-                (sexp :menu-tag "first" t)))
+                (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.
@@ -302,6 +310,7 @@ and non-`vertical', do both horizontal and vertical recentering."
   :group 'gnus-summary-maneuvering
   :type '(choice (const :tag "none" nil)
                 (const vertical)
+                (integer :tag "height")
                 (sexp :menu-tag "both" t)))
 
 (defcustom gnus-show-all-headers nil
@@ -314,7 +323,7 @@ and non-`vertical', do both horizontal and vertical recentering."
   "*If non-nil, ignore articles with identical Message-ID headers."
   :group 'gnus-summary
   :type 'boolean)
-  
+
 (defcustom gnus-single-article-buffer t
   "*If non-nil, display all articles in the same buffer.
 If nil, each group will get its own article buffer."
@@ -328,13 +337,6 @@ variable."
   :group 'gnus-article-various
   :type 'boolean)
 
-(defcustom gnus-show-mime nil
-  "*If non-nil, do mime processing of articles.
-The articles will simply be fed to the function given by
-`gnus-show-mime-method'."
-  :group 'gnus-article-mime
-  :type 'boolean)
-
 (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."
@@ -473,6 +475,19 @@ It uses the same syntax as the `gnus-split-methods' variable."
   :group 'gnus-extract-view
   :type 'boolean)
 
+(defcustom gnus-auto-expirable-marks
+  (list gnus-killed-mark gnus-del-mark gnus-catchup-mark
+       gnus-low-score-mark gnus-ancient-mark gnus-read-mark
+       gnus-souped-mark gnus-duplicate-mark)
+  "*The list of marks converted into expiration if a group is auto-expirable."
+  :group 'gnus-summary
+  :type '(repeat character))
+
+(defcustom gnus-inhibit-user-auto-expire nil
+  "*If non-nil, user marking commands will not mark an article as expirable, even if the group has auto-expire turned on."
+  :group 'gnus-summary
+  :type 'boolean)
+
 (defcustom gnus-view-pseudos nil
   "*If `automatic', pseudo-articles will be viewed automatically.
 If `not-confirm', pseudos will be viewed automatically, and the user
@@ -504,7 +519,7 @@ with some simple extensions.
   :group 'gnus-threading
   :type 'string)
 
-(defcustom gnus-summary-mode-line-format "Gnus: %%b [%A] %Z"
+(defcustom gnus-summary-mode-line-format "Gnus: %g [%A] %Z"
   "*The format specification for the summary mode line.
 It works along the same lines as a normal formatting string,
 with some simple extensions:
@@ -663,18 +678,7 @@ is not run if `gnus-visual' is nil."
   :group 'gnus-summary-visual
   :type 'hook)
 
-(defcustom gnus-structured-field-decoder 'identity
-  "Function to decode non-ASCII characters in structured field for summary."
-  :group 'gnus-various
-  :type 'function)
-
-(defcustom gnus-unstructured-field-decoder 'identity
-  "Function to decode non-ASCII characters in unstructured field for summary."
-  :group 'gnus-various
-  :type 'function)
-
-(defcustom gnus-parse-headers-hook
-  (list 'gnus-hack-decode-rfc1522 'gnus-decode-rfc1522)
+(defcustom gnus-parse-headers-hook nil
   "*A hook called before parsing the headers."
   :group 'gnus-various
   :type 'hook)
@@ -779,8 +783,24 @@ mark:    The articles mark."
 The function is called with one parameter, the article header vector,
 which it may alter in any way.")
 
+(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."
+  :group 'gnus-summary
+  :type '(repeat symbol))
+
+(defcustom gnus-ignored-from-addresses
+  (and user-mail-address (regexp-quote user-mail-address))
+  "*Regexp of From headers that may be suppressed in favor of To headers."
+  :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)
 
@@ -837,6 +857,7 @@ which it may alter in any way.")
     (?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)
@@ -1000,6 +1021,45 @@ variable (string, integer, character, etc).")
 ;; Byte-compiler warning.
 (defvar gnus-article-mode-map)
 
+;; MIME stuff.
+
+(defvar gnus-decode-encoded-word-methods
+  '(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))
+")
+
+(defvar gnus-decode-encoded-word-methods-cache nil)
+
+(defun gnus-multi-decode-encoded-word-string (string)
+  "Apply the functions from `gnus-encoded-word-methods' that match."
+  (unless (and gnus-decode-encoded-word-methods-cache
+              (eq gnus-newsgroup-name 
+                  (car gnus-decode-encoded-word-methods-cache)))
+    (setq gnus-decode-encoded-word-methods-cache (list gnus-newsgroup-name))
+    (mapc '(lambda (x) 
+            (if (symbolp x)
+                (nconc gnus-decode-encoded-word-methods-cache (list x))
+              (if (and gnus-newsgroup-name 
+                       (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
+      (setq string (funcall (pop xlist) string))))
+  string)
+
 ;; Subject simplification.
 
 (defun gnus-simplify-whitespace (str)
@@ -1199,7 +1259,6 @@ increase the score of each group you read."
     "\M-g" gnus-summary-rescan-group
     "w" gnus-summary-stop-page-breaking
     "\C-c\C-r" gnus-summary-caesar-message
-    "\M-t" gnus-summary-toggle-mime
     "f" gnus-summary-followup
     "F" gnus-summary-followup-with-original
     "C" gnus-summary-cancel-article
@@ -1228,6 +1287,7 @@ increase the score of each group you read."
     "\C-d" gnus-summary-enter-digest-group
     "\M-\C-d" gnus-summary-read-document
     "\M-\C-e" gnus-summary-edit-parameters
+    "\M-\C-g" gnus-summary-customize-parameters
     "\C-c\C-b" gnus-bug
     "*" gnus-cache-enter-article
     "\M-*" gnus-cache-remove-article
@@ -1237,6 +1297,7 @@ increase the score of each group you read."
     "L" gnus-summary-lower-score
     "\M-i" gnus-symbolic-argument
     "h" gnus-summary-select-article-buffer
+    "b" gnus-article-view-part
     
     "V" gnus-summary-score-map
     "X" gnus-uu-extract-map
@@ -1374,7 +1435,6 @@ increase the score of each group you read."
     "r" gnus-summary-caesar-message
     "t" gnus-article-hide-headers
     "v" gnus-summary-verbose-headers
-    "m" gnus-summary-toggle-mime
     "h" gnus-article-treat-html
     "d" gnus-article-treat-dumbquotes)
 
@@ -1395,6 +1455,12 @@ increase the score of each group you read."
     "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
@@ -1494,6 +1560,11 @@ increase the score of each group you read."
               ["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]
+             ["View all" gnus-mime-view-all-parts t])
              ("Date"
               ["Local" gnus-article-date-local t]
               ["ISO8601" gnus-article-date-iso8601 t]
@@ -1522,7 +1593,6 @@ increase the score of each group you read."
               ["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]
-              ["Toggle MIME" gnus-summary-toggle-mime t]
               ["Verbose header" gnus-summary-verbose-headers t]
               ["Toggle header" gnus-summary-toggle-header t])
              ("Output"
@@ -1737,6 +1807,7 @@ increase the score of each group you read."
        ["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 t]
@@ -1767,6 +1838,7 @@ increase the score of each group you read."
                     ("article body" "body" string)
                     ("article head" "head" string)
                     ("xref" "xref" string)
+                    ("extra header" "extra" string)
                     ("lines" "lines" number)
                     ("followups to author" "followup" string)))
          (types '((number ("less than" <)
@@ -1868,7 +1940,7 @@ The following commands are available:
   (setq mode-name "Summary")
   (make-local-variable 'minor-mode-alist)
   (use-local-map gnus-summary-mode-map)
-  (buffer-disable-undo (current-buffer))
+  (buffer-disable-undo)
   (setq buffer-read-only t)            ;Disable modification
   (setq truncate-lines t)
   (setq selective-display t)
@@ -1886,6 +1958,7 @@ The following commands are available:
   (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))
 
@@ -2032,21 +2105,6 @@ The following commands are available:
     (setcar (nthcdr 2 (car data)) (+ offset (nth 2 (car data))))
     (setq data (cdr data))))
 
-(defun gnus-data-compute-positions ()
-  "Compute the positions of all articles."
-  (setq gnus-newsgroup-data-reverse nil)
-  (let ((data gnus-newsgroup-data))
-    (save-excursion
-      (gnus-save-hidden-threads
-       (gnus-summary-show-all-threads)
-       (goto-char (point-min))
-       (while data
-         (while (get-text-property (point) 'gnus-intangible)
-           (forward-line 1))
-         (gnus-data-set-pos (car data) (+ (point) 3))
-         (setq data (cdr data))
-         (forward-line 1))))))
-
 (defun gnus-summary-article-pseudo-p (article)
   "Say whether this article is a pseudo article or not."
   (not (vectorp (gnus-data-header (gnus-data-find article)))))
@@ -2214,6 +2272,21 @@ marks of articles."
             ,@forms)
         (gnus-restore-hidden-threads-configuration ,config)))))
 
+(defun gnus-data-compute-positions ()
+  "Compute the positions of all articles."
+  (setq gnus-newsgroup-data-reverse nil)
+  (let ((data gnus-newsgroup-data))
+    (save-excursion
+      (gnus-save-hidden-threads
+       (gnus-summary-show-all-threads)
+       (goto-char (point-min))
+       (while data
+         (while (get-text-property (point) 'gnus-intangible)
+           (forward-line 1))
+         (gnus-data-set-pos (car data) (+ (point) 3))
+         (setq data (cdr data))
+         (forward-line 1))))))
+
 (defun gnus-hidden-threads-configuration ()
   "Return the current hidden threads configuration."
   (save-excursion
@@ -2229,7 +2302,7 @@ marks of articles."
     (while (setq point (pop config))
       (when (and (< point (point-max))
                 (goto-char point)
-                (= (following-char) ?\n))
+                (eq (char-after) ?\n))
        (subst-char-in-region point (1+ point) ?\n ?\r)))))
 
 ;; Various summary mode internalish functions.
@@ -2333,7 +2406,7 @@ marks of articles."
 (defun gnus-summary-last-article-p (&optional article)
   "Return whether ARTICLE is the last article in the buffer."
   (if (not (setq article (or article (gnus-summary-article-number))))
-      t                ; All non-existent numbers are the last article.  :-)
+      t                                        ; All non-existent numbers are the last article.  :-)
     (not (cdr (gnus-data-find-list article)))))
 
 (defun gnus-make-thread-indent-array ()
@@ -2363,7 +2436,7 @@ marks of articles."
        (let ((gnus-summary-line-format-spec spec)
              (gnus-newsgroup-downloadable '((0 . t))))
          (gnus-summary-insert-line
-          [0 "" "" "" "" "" 0 0 ""]  0 nil 128 t nil "" nil 1)
+          [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) 2)))))
@@ -2387,6 +2460,29 @@ marks of articles."
    (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)))))
+    (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
@@ -2433,7 +2529,7 @@ marks of articles."
       (setq gnus-tmp-name gnus-tmp-from))
     (unless (numberp gnus-tmp-lines)
       (setq gnus-tmp-lines 0))
-    (gnus-put-text-property-excluding-characters-with-faces
+    (gnus-put-text-property
      (point)
      (progn (eval gnus-summary-line-format-spec) (point))
      'gnus-number gnus-tmp-number)
@@ -2534,7 +2630,7 @@ If NO-DISPLAY, don't generate a summary buffer."
                                   kill-buffer no-display
                                   select-articles)
                                  (setq show-all nil
-                                  select-articles nil)))))
+                                       select-articles nil)))))
                (eq gnus-auto-select-next 'quietly))
       (set-buffer gnus-group-buffer)
       ;; The entry function called above goes to the next
@@ -2673,16 +2769,21 @@ If NO-DISPLAY, don't generate a summary buffer."
                 (not no-display)
                 gnus-newsgroup-unreads
                 gnus-auto-select-first)
-           (unless (if (eq gnus-auto-select-first 'best)
-                       (gnus-summary-best-unread-article)
-                     (gnus-summary-first-unread-article))
-             (gnus-configure-windows 'summary))
+           (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))        
+         (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.
@@ -2882,7 +2983,7 @@ If NO-DISPLAY, don't generate a summary buffer."
     threads))
 
 ;; Build the thread tree.
-(defun gnus-dependencies-add-header (header dependencies force-new)
+(defsubst gnus-dependencies-add-header (header dependencies force-new)
   "Enter HEADER into the DEPENDENCIES table if it is not already there.
 
 If FORCE-NEW is not nil, enter HEADER into the DEPENDENCIES table even
@@ -3028,12 +3129,9 @@ Returns HEADER if it was entered in the DEPENDENCIES.  Returns nil otherwise."
             (setq heads nil)))))
      gnus-newsgroup-dependencies)))
 
-;; The following macros and functions were written by Felix Lee
-;; <flee@cse.psu.edu>.
-
 (defmacro gnus-nov-read-integer ()
   '(prog1
-       (if (= (following-char) ?\t)
+       (if (eq (char-after) ?\t)
           0
         (let ((num (ignore-errors (read buffer))))
           (if (numberp num) num 0)))
@@ -3046,6 +3144,16 @@ Returns HEADER if it was entered in the DEPENDENCIES.  Returns nil otherwise."
 (defmacro gnus-nov-field ()
   '(buffer-substring (point) (if (gnus-nov-skip-field) (1- (point)) eol)))
 
+(defmacro gnus-nov-parse-extra ()
+  '(let (out string)
+     (while (not (memq (char-after) '(?\n nil)))
+       (setq string (gnus-nov-field))
+       (when (string-match "^\\([^ :]+\\): " string)
+        (push (cons (intern (match-string 1 string))
+                    (substring string (match-end 0)))
+              out)))
+     out))
+
 ;; 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)
@@ -3063,18 +3171,19 @@ Returns HEADER if it was entered in the DEPENDENCIES.  Returns nil otherwise."
          (setq header
                (make-full-mail-header
                 number                 ; number
-                (funcall
-                 gnus-unstructured-field-decoder (gnus-nov-field)) ; subject
-                (funcall
-                 gnus-structured-field-decoder (gnus-nov-field)) ; from
+                (funcall gnus-decode-encoded-word-function
+                         (gnus-nov-field)) ; subject
+                (funcall gnus-decode-encoded-word-function
+                         (gnus-nov-field)) ; from
                 (gnus-nov-field)       ; date
                 (or (gnus-nov-field)
                     (nnheader-generate-fake-message-id)) ; id
                 (gnus-nov-field)       ; refs
                 (gnus-nov-read-integer) ; chars
                 (gnus-nov-read-integer) ; lines
-                (unless (= (following-char) ?\n)
-                  (gnus-nov-field))))) ; misc
+                (unless (eq (char-after) ?\n)
+                  (gnus-nov-field))    ; misc
+                (gnus-nov-parse-extra)))) ; extra
 
       (widen))
 
@@ -3489,7 +3598,7 @@ If LINE, insert the rebuilt thread starting on line LINE."
 
 (defsubst gnus-article-sort-by-date (h1 h2)
   "Sort articles by root article date."
-  (gnus-time-less
+  (time-less-p
    (gnus-date-get-time (mail-header-date h1))
    (gnus-date-get-time (mail-header-date h2))))
 
@@ -3550,6 +3659,12 @@ Unscored articles will be counted as having a score of zero."
 (defvar gnus-tmp-root-expunged nil)
 (defvar gnus-tmp-dummy-line nil)
 
+(defvar gnus-tmp-header)
+(defun gnus-extra-header (type &optional header)
+  "Return the extra header of TYPE."
+  (or (cdr (assq type (mail-header-extra (or header gnus-tmp-header))))
+      ""))
+
 (defun gnus-summary-prepare-threads (threads)
   "Prepare summary buffer from THREADS and indentation LEVEL.
 THREADS is either a list of `(PARENT [(CHILD1 [(GRANDCHILD ...]...) ...])'
@@ -3777,7 +3892,7 @@ or a straight list of headers."
              (setq gnus-tmp-name gnus-tmp-from))
            (unless (numberp gnus-tmp-lines)
              (setq gnus-tmp-lines 0))
-           (gnus-put-text-property-excluding-characters-with-faces
+           (gnus-put-text-property
             (point)
             (progn (eval gnus-summary-line-format-spec) (point))
             'gnus-number number)
@@ -3900,6 +4015,7 @@ If SELECT-ARTICLES, only select those articles from GROUP."
       ;; Init the dependencies hash table.
       (setq gnus-newsgroup-dependencies
            (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
@@ -4110,7 +4226,7 @@ If SELECT-ARTICLES, only select those articles from GROUP."
   (let ((types gnus-article-mark-lists)
        (info (gnus-get-info gnus-newsgroup-name))
        (uncompressed '(score bookmark killed))
-       type list newmarked symbol)
+       type list newmarked symbol delta-marks)
     (when info
       ;; Add all marks lists that are non-nil to the list of marks lists.
       (while (setq type (pop types))
@@ -4159,7 +4275,9 @@ If SELECT-ARTICLES, only select those articles from GROUP."
   "This function sets the mode line of the article or summary buffers.
 If WHERE is `summary', the summary mode line format will be used."
   ;; Is this mode line one we keep updated?
-  (when (memq where gnus-updated-mode-lines)
+  (when (and (memq where gnus-updated-mode-lines)
+            (symbol-value
+             (intern (format "gnus-%s-mode-line-format-spec" where))))
     (let (mode-string)
       (save-excursion
        ;; We evaluate this in the summary buffer since these
@@ -4209,7 +4327,7 @@ If WHERE is `summary', the summary mode line format will be used."
          ;; We might have to chop a bit of the string off...
          (when (> (length mode-string) max-len)
            (setq mode-string
-                 (concat (gnus-truncate-string mode-string (- max-len 3))
+                 (concat (truncate-string-to-width mode-string (- max-len 3))
                          "...")))
          ;; Pad the mode string a bit.
          (setq mode-string (format (format "%%-%ds" max-len) mode-string))))
@@ -4315,7 +4433,7 @@ The resulting hash table is returned, or nil if no Xrefs were found."
       ;; Then we add the read articles to the range.
       (gnus-add-to-range
        ninfo (setq articles (sort articles '<))))))
-  
+
 (defun gnus-group-make-articles-read (group articles)
   "Update the info of GROUP to say that ARTICLES are read."
   (let* ((num 0)
@@ -4378,6 +4496,7 @@ The resulting hash table is returned, or nil if no Xrefs were found."
       (set-buffer nntp-server-buffer)
       ;; 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)
       (gnus-run-hooks 'gnus-parse-headers-hook)
       (let ((case-fold-search t)
            in-reply-to header p lines chars)
@@ -4409,15 +4528,15 @@ The resulting hash table is returned, or nil if no Xrefs were found."
            (progn
              (goto-char p)
              (if (search-forward "\nsubject: " nil t)
-                 (funcall
-                  gnus-unstructured-field-decoder (nnheader-header-value))
+                 (funcall gnus-decode-encoded-word-function
+                          (nnheader-header-value))
                "(none)"))
            ;; From.
            (progn
              (goto-char p)
              (if (search-forward "\nfrom: " nil t)
-                 (funcall
-                  gnus-structured-field-decoder (nnheader-header-value))
+                 (funcall gnus-decode-encoded-word-function
+                          (nnheader-header-value))
                "(nobody)"))
            ;; Date.
            (progn
@@ -4487,7 +4606,19 @@ The resulting hash table is returned, or nil if no Xrefs were found."
            (progn
              (goto-char p)
              (and (search-forward "\nxref: " nil t)
-                  (nnheader-header-value)))))
+                  (nnheader-header-value)))
+           ;; Extra.
+           (when gnus-extra-headers
+             (let ((extra gnus-extra-headers)
+                   out)
+               (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))
+               out))))
          (when (equal id ref)
            (setq ref nil))
 
@@ -4518,6 +4649,7 @@ list of headers that match SEQUENCE (see `nntp-retrieve-headers')."
        number headers header)
     (save-excursion
       (set-buffer nntp-server-buffer)
+      (subst-char-in-region (point-min) (point-max) ?\r ?  t)
       ;; Allow the user to mangle the headers before parsing them.
       (gnus-run-hooks 'gnus-parse-headers-hook)
       (goto-char (point-min))
@@ -4571,7 +4703,7 @@ This is meant to be called in `gnus-article-internal-prepare-hook'."
          (save-restriction
            (nnheader-narrow-to-headers)
            (goto-char (point-min))
-           (when (or (and (eq (downcase (following-char)) ?x)
+           (when (or (and (eq (downcase (char-after)) ?x)
                           (looking-at "Xref:"))
                      (search-forward "\nXref:" nil t))
              (goto-char (1+ (match-end 0)))
@@ -4586,14 +4718,14 @@ the subject line on."
   (let* ((line (and (numberp old-header) old-header))
         (old-header (and (vectorp old-header) old-header))
         (header (cond ((and old-header use-old-header)
-                      old-header)
-                     ((and (numberp id)
-                           (gnus-number-to-header id))
-                      (gnus-number-to-header id))
-                     (t
-                      (gnus-read-header id))))
-       (number (and (numberp id) id))
-       d)
+                       old-header)
+                      ((and (numberp id)
+                            (gnus-number-to-header id))
+                       (gnus-number-to-header id))
+                      (t
+                       (gnus-read-header id))))
+        (number (and (numberp id) id))
+        d)
     (when header
       ;; Rebuild the thread that this article is part of and go to the
       ;; article we have fetched.
@@ -4835,7 +4967,9 @@ displayed, no centering will be performed."
   ;; Recenter only when requested.  Suggested by popovich@park.cs.columbia.edu.
   (let* ((top (cond ((< (window-height) 4) 0)
                    ((< (window-height) 7) 1)
-                   (t 2)))
+                   (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))
@@ -5017,7 +5151,7 @@ The prefix argument ALL means to select all articles."
          (gnus-update-read-articles
           group (append gnus-newsgroup-unreads gnus-newsgroup-unselected))
          ;; Set the current article marks.
-         (let ((gnus-newsgroup-scored 
+         (let ((gnus-newsgroup-scored
                 (if (and (not gnus-save-score)
                          (not non-destructive))
                     nil
@@ -5092,6 +5226,10 @@ gnus-exit-group-hook is called with no arguments if that value is non-nil."
     (setq group-point (point))
     (if temporary
        nil                             ;Nothing to do.
+      (when (gnus-buffer-live-p gnus-article-buffer)
+       (save-excursion
+         (set-buffer gnus-article-buffer)
+         (mm-destroy-parts gnus-article-mime-handles)))
       ;; If we have several article buffers, we kill them at exit.
       (unless gnus-single-article-buffer
        (gnus-kill-buffer gnus-article-buffer)
@@ -5135,7 +5273,12 @@ gnus-exit-group-hook is called with no arguments if that value is non-nil."
              gnus-expert-user
              (gnus-y-or-n-p "Discard changes to this group and exit? "))
       (gnus-async-halt-prefetch)
-      (gnus-run-hooks 'gnus-summary-prepare-exit-hook)
+      (gnus-run-hooks (delq 'gnus-summary-expire-articles 
+                           (copy-list gnus-summary-prepare-exit-hook)))
+      (when (gnus-buffer-live-p gnus-article-buffer)
+       (save-excursion
+         (set-buffer gnus-article-buffer)
+         (mm-destroy-parts gnus-article-mime-handles)))
       ;; If we have several article buffers, we kill them at exit.
       (unless gnus-single-article-buffer
        (gnus-kill-buffer gnus-article-buffer)
@@ -5803,15 +5946,25 @@ Return nil if there are no unread articles."
        (gnus-summary-display-article (gnus-summary-article-number)))
     (gnus-summary-position-point)))
 
+(defun gnus-summary-first-unread-subject ()
+  "Place the point on the subject line of the first unread article.
+Return nil if there are no unread articles."
+  (interactive)
+  (prog1
+      (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."
   (interactive)
   (prog1
       (when (gnus-summary-first-subject)
-      (gnus-summary-show-thread)
-      (gnus-summary-first-subject)
-      (gnus-summary-display-article (gnus-summary-article-number)))
+       (gnus-summary-show-thread)
+       (gnus-summary-first-subject)
+       (gnus-summary-display-article (gnus-summary-article-number)))
     (gnus-summary-position-point)))
 
 (defun gnus-summary-best-unread-article ()
@@ -5936,13 +6089,13 @@ articles that are younger than AGE days."
   (interactive "nTime in days: \nP")
   (prog1
       (let ((data gnus-newsgroup-data)
-           (cutoff (nnmail-days-to-time age))
+           (cutoff (days-to-time age))
            articles d date is-younger)
        (while (setq d (pop data))
          (when (and (vectorp (gnus-data-header d))
                     (setq date (mail-header-date (gnus-data-header d))))
-           (setq is-younger (nnmail-time-less
-                             (nnmail-time-since (nnmail-date-to-time date))
+           (setq is-younger (time-less-p
+                             (time-since (date-to-time date))
                              cutoff))
            (when (if younger-p
                      is-younger
@@ -6147,7 +6300,7 @@ If ALL, mark even excluded ticked and dormants as read."
 (defsubst gnus-cut-thread (thread)
   "Go forwards in the thread until we find an article that we want to display."
   (when (or (eq gnus-fetch-old-headers 'some)
-           (eq gnus-fetch-old-headers 'invisible)          
+           (eq gnus-fetch-old-headers 'invisible)
            (eq gnus-build-sparse-threads 'some)
            (eq gnus-build-sparse-threads 'more))
     ;; Deal with old-fetched headers and sparse threads.
@@ -6451,6 +6604,11 @@ or `gnus-select-method', no matter what backend the article comes from."
   (interactive)
   (gnus-group-edit-group gnus-newsgroup-name 'params))
 
+(defun gnus-summary-customize-parameters ()
+  "Customize the group parameters of the current group."
+  (interactive)
+  (gnus-group-customize gnus-newsgroup-name))
+
 (defun gnus-summary-enter-digest-group (&optional force)
   "Enter an nndoc group based on the current article.
 If FORCE, force a digest interpretation.  If not, try
@@ -6515,7 +6673,7 @@ Obeys the standard process/prefix convention."
       (gnus-summary-remove-process-mark article)
       (when (gnus-summary-display-article article)
        (save-excursion
-         (nnheader-temp-write nil
+         (with-temp-buffer
            (insert-buffer-substring gnus-original-article-buffer)
            ;; Remove some headers that may lead nndoc to make
            ;; the wrong guess.
@@ -6595,6 +6753,7 @@ Optional argument BACKWARD means do search for backward.
   ;; We have to require this here to make sure that the following
   ;; dynamic binding isn't shadowed by autoloading.
   (require 'gnus-async)
+  (require 'gnus-art)
   (let ((gnus-select-article-hook nil) ;Disable hook.
        (gnus-article-display-hook nil)
        (gnus-mark-article-hook nil)    ;Inhibit marking as read.
@@ -6602,6 +6761,7 @@ Optional argument BACKWARD means do search for backward.
        (gnus-xmas-force-redisplay nil) ;Inhibit XEmacs redisplay.
        (gnus-use-trees nil)            ;Inhibit updating tree buffer.
        (sum (current-buffer))
+       (gnus-display-mime-function nil)
        (found nil)
        point)
     (gnus-save-hidden-threads
@@ -6749,14 +6909,14 @@ to save in."
              (set-buffer buffer)
              (gnus-article-delete-invisible-text)
              (let ((ps-left-header
-                    (list 
+                    (list
                      (concat "("
                              (mail-header-subject gnus-current-headers) ")")
                      (concat "("
                              (mail-header-from gnus-current-headers) ")")))
-                   (ps-right-header 
-                    (list 
-                     "/pagenumberstring load" 
+                   (ps-right-header
+                    (list
+                     "/pagenumberstring load"
                      (concat "("
                              (mail-header-date gnus-current-headers) ")"))))
                (gnus-run-hooks 'gnus-ps-print-hook)
@@ -6776,8 +6936,9 @@ article massaging functions being run."
     (let ((gnus-have-all-headers t)
          gnus-article-display-hook
          gnus-article-prepare-hook
+         gnus-article-decode-hook
+         gnus-display-mime-function
          gnus-break-pages
-         gnus-show-mime
          gnus-visual)
       (gnus-summary-select-article nil 'force)))
   (gnus-summary-goto-subject gnus-current-article)
@@ -6828,15 +6989,6 @@ If ARG is a negative number, hide the unwanted header lines."
   (interactive)
   (gnus-article-show-all-headers))
 
-(defun gnus-summary-toggle-mime (&optional arg)
-  "Toggle MIME processing.
-If ARG is a positive number, turn MIME processing on."
-  (interactive "P")
-  (setq gnus-show-mime
-       (if (null arg) (not gnus-show-mime)
-         (> (prefix-numeric-value arg) 0)))
-  (gnus-summary-select-article t 'force))
-
 (defun gnus-summary-caesar-message (&optional arg)
   "Caesar rotate the current article by 13.
 The numerical prefix specifies how many places to rotate each letter
@@ -6940,7 +7092,7 @@ and `request-accept' functions."
                  gnus-newsgroup-name)) ; Server
          (list 'gnus-request-accept-article
                to-newsgroup (list 'quote select-method)
-               (not articles))         ; Accept form
+               (not articles) t)               ; Accept form
          (not articles)))              ; Only save nov last time
        ;; Copy the article.
        ((eq action 'copy)
@@ -6948,7 +7100,7 @@ and `request-accept' functions."
           (set-buffer copy-buf)
           (when (gnus-request-article-this-buffer article gnus-newsgroup-name)
             (gnus-request-accept-article
-             to-newsgroup select-method (not articles)))))
+             to-newsgroup select-method (not articles) t))))
        ;; Crosspost the article.
        ((eq action 'crosspost)
         (let ((xref (message-tokenize-header
@@ -7062,7 +7214,7 @@ and `request-accept' functions."
 
        ;;;!!!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))))
@@ -7156,7 +7308,6 @@ latter case, they will be copied into the relevant groups."
        (error "Can't read %s" file))
     (save-excursion
       (set-buffer (gnus-get-buffer-create " *import file*"))
-      (buffer-disable-undo (current-buffer))
       (erase-buffer)
       (insert-file-contents file)
       (goto-char (point-min))
@@ -7166,10 +7317,7 @@ latter case, they will be copied into the relevant groups."
              lines (count-lines (point-min) (point-max)))
        (insert "From: " (read-string "From: ") "\n"
                "Subject: " (read-string "Subject: ") "\n"
-               "Date: " (timezone-make-date-arpa-standard
-                         (current-time-string (nth 5 atts))
-                         (current-time-zone now)
-                         (current-time-zone now))
+               "Date: " (message-make-date (nth 5 atts))
                "\n"
                "Message-ID: " (message-make-message-id) "\n"
                "Lines: " (int-to-string lines) "\n"
@@ -7320,12 +7468,13 @@ groups."
   (interactive)
   ;; Replace the article.
   (let ((buf (current-buffer)))
-    (nnheader-temp-write nil
+    (with-temp-buffer
       (insert-buffer buf)
       (if (and (not read-only)
               (not (gnus-request-replace-article
                     (cdr gnus-article-current) (car gnus-article-current)
-                    (current-buffer))))
+                    (current-buffer)
+                    (not gnus-article-decoded-p))))
          (error "Couldn't replace article")
        ;; Update the summary buffer.
        (if (and references
@@ -7338,7 +7487,7 @@ groups."
                (message-narrow-to-head)
                (let ((head (buffer-string))
                      header)
-                 (nnheader-temp-write nil
+                 (with-temp-buffer
                    (insert (format "211 %d Article retrieved.\n"
                                    (cdr gnus-article-current)))
                    (insert head)
@@ -7526,7 +7675,7 @@ the actual number of articles marked is returned."
   "Mark ARTICLE replied and update the summary line."
   (push article gnus-newsgroup-replied)
   (let ((buffer-read-only nil))
-    (when (gnus-summary-goto-subject article)
+    (when (gnus-summary-goto-subject article nil t)
       (gnus-summary-update-secondary-mark article))))
 
 (defun gnus-summary-set-bookmark (article)
@@ -7608,6 +7757,7 @@ If N is negative, mark backwards instead.  Mark with MARK, ?r by default.
 The difference between N and the actual number of articles marked is
 returned."
   (interactive "p")
+  (gnus-summary-show-thread)
   (let ((backward (< n 0))
        (gnus-summary-goto-unread
         (and gnus-summary-goto-unread
@@ -7645,11 +7795,7 @@ returned."
     (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark))
     ;; Check for auto-expiry.
     (when (and gnus-newsgroup-auto-expire
-              (or (= mark gnus-killed-mark) (= mark gnus-del-mark)
-                  (= mark gnus-catchup-mark) (= mark gnus-low-score-mark)
-                  (= mark gnus-ancient-mark)
-                  (= mark gnus-read-mark) (= mark gnus-souped-mark)
-                  (= mark gnus-duplicate-mark)))
+              (memq mark gnus-auto-expirable-marks))
       (setq mark gnus-expirable-mark)
       ;; Let the backend know about the mark change.
       (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark))
@@ -7700,25 +7846,21 @@ returned."
   "Mark ARTICLE with MARK.  MARK can be any character.
 Four MARK strings are reserved: `? ' (unread), `?!' (ticked),
 `??' (dormant) and `?E' (expirable).
-If MARK is nil, then the default character `?D' is used.
+If MARK is nil, then the default character `?r' is used.
 If ARTICLE is nil, then the article on the current line will be
 marked."
   ;; The mark might be a string.
   (when (stringp mark)
     (setq mark (aref mark 0)))
   ;; If no mark is given, then we check auto-expiring.
-  (and (not no-expire)
-       gnus-newsgroup-auto-expire
-       (or (not mark)
-          (and (gnus-characterp mark)
-               (or (= mark gnus-killed-mark) (= mark gnus-del-mark)
-                   (= mark gnus-catchup-mark) (= mark gnus-low-score-mark)
-                   (= mark gnus-read-mark) (= mark gnus-souped-mark)
-                   (= mark gnus-duplicate-mark))))
-       (setq mark gnus-expirable-mark))
-  (let* ((mark (or mark gnus-del-mark))
-        (article (or article (gnus-summary-article-number)))
-        (old-mark (gnus-summary-article-mark article)))
+  (when (null mark)
+    (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)))
     ;; Allow the backend to change the mark.
     (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark))
     (if (eq mark old-mark)
@@ -7770,19 +7912,19 @@ marked."
   (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 (looking-at "\r")
-      (incf forward))
-    (when (and forward
-               (<= (+ forward (point)) (point-max)))
-      ;; Go to the right position on the line.
-      (goto-char (+ forward (point)))
-      ;; Replace the old mark with the new mark.
-      (subst-char-in-region (point) (1+ (point)) (following-char) mark)
-      ;; Optionally update the marks by some user rule.
-      (when (eq type 'unread)
-        (gnus-data-set-mark
-         (gnus-data-find (gnus-summary-article-number)) mark)
-        (gnus-summary-update-line (eq mark gnus-unread-mark))))))
+    (when forward
+      (when (looking-at "\r")
+       (incf forward))
+      (when (<= (+ forward (point)) (point-max))
+       ;; Go to the right position on the line.
+       (goto-char (+ forward (point)))
+       ;; Replace the old mark with the new mark.
+       (subst-char-in-region (point) (1+ (point)) (char-after) mark)
+       ;; Optionally update the marks by some user rule.
+       (when (eq type 'unread)
+         (gnus-data-set-mark
+          (gnus-data-find (gnus-summary-article-number)) mark)
+         (gnus-summary-update-line (eq mark gnus-unread-mark)))))))
 
 (defun gnus-mark-article-as-read (article &optional mark)
   "Enter ARTICLE in the pertinent lists and remove it from others."
@@ -7863,14 +8005,14 @@ If N is negative, mark backwards instead.
 The difference between N and the actual number of articles marked is
 returned."
   (interactive "p")
-  (gnus-summary-mark-forward n gnus-del-mark t))
+  (gnus-summary-mark-forward n gnus-del-mark gnus-inhibit-user-auto-expire))
 
 (defun gnus-summary-mark-as-read-backward (n)
   "Mark the N articles as read backwards.
 The difference between N and the actual number of articles marked is
 returned."
   (interactive "p")
-  (gnus-summary-mark-forward (- n) gnus-del-mark t))
+  (gnus-summary-mark-forward (- n) gnus-del-mark gnus-inhibit-user-auto-expire))
 
 (defun gnus-summary-mark-as-read (&optional article mark)
   "Mark current article as read.
@@ -8158,7 +8300,7 @@ is non-nil or the Subject: of both articles are the same."
          (gnus-summary-select-article t t nil current-article))
        (set-buffer gnus-original-article-buffer)
        (let ((buf (format "%s" (buffer-string))))
-         (nnheader-temp-write nil
+         (with-temp-buffer
            (insert buf)
            (goto-char (point-min))
            (if (re-search-forward "^References: " nil t)
@@ -8415,17 +8557,15 @@ Argument REVERSE means reverse order."
   (let* ((thread (intern (format "gnus-thread-sort-by-%s" predicate)))
         (article (intern (format "gnus-article-sort-by-%s" predicate)))
         (gnus-thread-sort-functions
-         (list
-          (if (not reverse)
-              thread
-            `(lambda (t1 t2)
-               (,thread t2 t1)))))
+         (if (not reverse)
+             thread
+           `(lambda (t1 t2)
+              (,thread t2 t1))))
         (gnus-article-sort-functions
-         (list
-          (if (not reverse)
-              article
-            `(lambda (t1 t2)
-               (,article t2 t1)))))
+         (if (not reverse)
+             article
+           `(lambda (t1 t2)
+              (,article t2 t1))))
         (buffer-read-only)
         (gnus-summary-prepare-hook nil))
     ;; We do the sorting by regenerating the threads.
@@ -8501,7 +8641,7 @@ 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")
-  (let ((gnus-default-article-saver 'gnus-summary-save-in-rmail))
+  (let ((gnus-default-article-saver 'rmail-output-to-rmail-file))
     (gnus-summary-save-article arg)))
 
 (defun gnus-summary-save-article-file (&optional arg)
@@ -8586,6 +8726,7 @@ save those articles instead."
 (defun gnus-valid-move-group-p (group)
   (and (boundp group)
        (symbol-name group)
+       (symbol-value group)
        (memq 'respool
             (assoc (symbol-name
                     (car (gnus-find-method-for-group
@@ -8676,7 +8817,7 @@ save those articles instead."
                                (lambda (f)
                                  (if (equal f " ")
                                      f
-                                   (gnus-quote-arg-for-sh-or-csh f)))
+                                   (mm-quote-arg f)))
                                files " ")))))
          (setq ps (cdr ps)))))
     (if (and gnus-view-pseudos (not not-view))
@@ -8920,8 +9061,9 @@ save those articles instead."
        (setq unread (cdr unread)))
       (when (<= prev (cdr active))
        (push (cons prev (cdr active)) read))
+      (setq read (if (> (length read) 1) (nreverse read) read))
       (if compute
-         (if (> (length read) 1) (nreverse read) read)
+         read
        (save-excursion
          (set-buffer gnus-group-buffer)
          (gnus-undo-register
@@ -8931,8 +9073,7 @@ save those articles instead."
               (gnus-get-unread-articles-in-group ',info (gnus-active ,group))
               (gnus-group-update-group ,group t))))
        ;; Enter this list into the group info.
-       (gnus-info-set-read
-        info (if (> (length read) 1) (nreverse read) read))
+       (gnus-info-set-read info read)
        ;; Set the number of unread articles in gnus-newsrc-hashtb.
        (gnus-get-unread-articles-in-group info (gnus-active group))
        t))))
index 3f2b2af..03bb313 100644 (file)
@@ -444,7 +444,8 @@ articles in the topic and its subtopics."
        (if (stringp entry)
            ;; Dead groups.
            (gnus-group-insert-group-line
-            entry (if (member entry gnus-zombie-list) gnus-level-zombie gnus-level-killed)
+            entry (if (member entry gnus-zombie-list)
+                      gnus-level-zombie gnus-level-killed)
             nil (- (1+ (cdr (setq active (gnus-active entry))))
                    (car active))
             nil)
@@ -906,6 +907,7 @@ articles in the topic and its subtopics."
     "=" gnus-topic-select-group
     "\r" gnus-topic-select-group
     " " gnus-topic-read-group
+    "\C-c\C-x" gnus-topic-expire-articles
     "\C-k" gnus-topic-kill-group
     "\C-y" gnus-topic-yank-group
     "\M-g" gnus-topic-get-new-news-this-topic
@@ -1039,6 +1041,19 @@ If performed over a topic line, toggle folding the topic."
   (mouse-set-point e)
   (gnus-topic-read-group nil))
 
+(defun gnus-topic-expire-articles (topic)
+  "Expire articles in this topic or group."
+  (interactive (list (gnus-group-topic-name)))
+  (if (not topic)
+      (call-interactively 'gnus-group-expire-articles)
+    (save-excursion
+      (gnus-message 5 "Expiring groups in %s..." topic)
+      (let ((gnus-group-marked
+            (mapcar (lambda (entry) (car (nth 2 entry)))
+                    (gnus-topic-find-groups topic gnus-level-killed t))))
+       (gnus-group-expire-articles nil))
+      (gnus-message 5 "Expiring groups in %s...done" topic))))
+
 (defun gnus-topic-read-group (&optional all no-article group)
   "Read news in this newsgroup.
 If the prefix argument ALL is non-nil, already read articles become
index 8320698..29052c6 100644 (file)
 (require 'custom)
 (eval-when-compile (require 'cl))
 (require 'nnheader)
-(require 'timezone)
 (require 'message)
-(eval-when-compile (require 'rmail))
+(require 'time-date)
 
 (eval-and-compile
-  (autoload 'nnmail-date-to-time "nnmail")
   (autoload 'rmail-insert-rmail-file-header "rmail")
   (autoload 'rmail-count-new-messages "rmail")
   (autoload 'rmail-show-message "rmail"))
@@ -76,9 +74,6 @@
         (set symbol nil))
      symbol))
 
-(defun gnus-truncate-string (str width)
-  (substring str 0 width))
-
 ;; Added by Geoffrey T. Dairiki <dairiki@u.washington.edu>.  A safe way
 ;; to limit the length of a string.  This function is necessary since
 ;; `(substr "abc" 0 30)' pukes with "Args out of range".
      (when (gnus-buffer-exists-p buf)
        (kill-buffer buf))))
 
-(if (fboundp 'point-at-bol)
-    (fset 'gnus-point-at-bol 'point-at-bol)
-  (defun gnus-point-at-bol ()
-    "Return point at the beginning of the line."
-    (let ((p (point)))
-      (beginning-of-line)
-      (prog1
-         (point)
-       (goto-char p)))))
-
-(if (fboundp 'point-at-eol)
-    (fset 'gnus-point-at-eol 'point-at-eol)
-  (defun gnus-point-at-eol ()
-    "Return point at the end of the line."
-    (let ((p (point)))
-      (end-of-line)
-      (prog1
-         (point)
-       (goto-char p)))))
+(fset 'gnus-point-at-bol
+      (if (fboundp 'point-at-bol)
+         'point-at-bol
+       'line-beginning-position))
+
+(fset 'gnus-point-at-eol
+      (if (fboundp 'point-at-eol)
+         'point-at-eol
+       'line-end-position))
 
 (defun gnus-delete-first (elt list)
   "Delete by side effect the first occurrence of ELT as a member of LIST."
 
 ;;; Time functions.
 
-(defun gnus-days-between (date1 date2)
-  ;; Return the number of days between date1 and date2.
-  (- (gnus-day-number date1) (gnus-day-number date2)))
-
-(defun gnus-day-number (date)
-  (let ((dat (mapcar (lambda (s) (and s (string-to-int s)) )
-                    (timezone-parse-date date))))
-    (timezone-absolute-from-gregorian
-     (nth 1 dat) (nth 2 dat) (car dat))))
-
-(defun gnus-time-to-day (time)
-  "Convert TIME to day number."
-  (let ((tim (decode-time time)))
-    (timezone-absolute-from-gregorian
-     (nth 4 tim) (nth 3 tim) (nth 5 tim))))
-
-(defun gnus-encode-date (date)
-  "Convert DATE to internal time."
-  (let* ((parse (timezone-parse-date date))
-        (date (mapcar (lambda (d) (and d (string-to-int d))) parse))
-        (time (mapcar 'string-to-int (timezone-parse-time (aref parse 3)))))
-    (encode-time (caddr time) (cadr time) (car time)
-                (caddr date) (cadr date) (car date)
-                (* 60 (timezone-zone-to-minute (nth 4 date))))))
-
-(defun gnus-time-minus (t1 t2)
-  "Subtract two internal times."
-  (let ((borrow (< (cadr t1) (cadr t2))))
-    (list (- (car t1) (car t2) (if borrow 1 0))
-         (- (+ (if borrow 65536 0) (cadr t1)) (cadr t2)))))
-
-(defun gnus-time-less (t1 t2)
-  "Say whether time T1 is less than time T2."
-  (or (< (car t1) (car t2))
-      (and (= (car t1) (car t2))
-          (< (nth 1 t1) (nth 1 t2)))))
-
 (defun gnus-file-newer-than (file date)
   (let ((fdate (nth 5 (file-attributes file))))
     (or (> (car fdate) (car date))
 
 (defun gnus-dd-mmm (messy-date)
   "Return a string like DD-MMM from a big messy string."
-  (let ((datevec (ignore-errors (timezone-parse-date messy-date))))
-    (if (or (not datevec)
-           (string-equal "0" (aref datevec 1)))
-       "??-???"
-      (format "%2s-%s"
-             (condition-case ()
-                 ;; Make sure leading zeroes are stripped.
-                 (number-to-string (string-to-number (aref datevec 2)))
-               (error "??"))
-             (capitalize
-              (or (car
-                   (nth (1- (string-to-number (aref datevec 1)))
-                        timezone-months-assoc))
-                  "???"))))))
+  (format-time-string "%d-%b" (safe-date-to-time messy-date)))
 
 (defmacro gnus-date-get-time (date)
   "Convert DATE string to Emacs time.
@@ -367,7 +302,7 @@ Cache the result as a text property stored in DATE."
         '(0 0)
        (or (get-text-property 0 'gnus-time d)
           ;; or compute the value...
-          (let ((time (nnmail-date-to-time d)))
+          (let ((time (safe-date-to-time d)))
             ;; and store it back in the string.
             (put-text-property 0 1 'gnus-time time d)
             time)))))
@@ -451,7 +386,7 @@ jabbering all the time."
            ids))
     (nreverse ids)))
 
-(defun gnus-parent-id (references &optional n)
+(defsubst gnus-parent-id (references &optional n)
   "Return the last Message-ID in REFERENCES.
 If N, return the Nth ancestor instead."
   (when references
@@ -498,20 +433,8 @@ If N, return the Nth ancestor instead."
     (cons (and (numberp event) event) event)))
 
 (defun gnus-sortable-date (date)
-  "Make sortable string by string-lessp from DATE.
-Timezone package is used."
-  (condition-case ()
-      (progn
-       (setq date (inline (timezone-fix-time
-                           date nil
-                           (aref (inline (timezone-parse-date date)) 4))))
-       (inline
-         (timezone-make-sortable-date
-          (aref date 0) (aref date 1) (aref date 2)
-          (inline
-            (timezone-make-time-string
-             (aref date 3) (aref date 4) (aref date 5))))))
-    (error "")))
+  "Make string suitable for sorting from DATE."
+  (gnus-time-iso8601 (date-to-time date)))
 
 (defun gnus-copy-file (file &optional to)
   "Copy FILE to TO."
@@ -543,7 +466,7 @@ Timezone package is used."
        (erase-buffer))
     (set-buffer (gnus-get-buffer-create gnus-work-buffer))
     (kill-all-local-variables)
-    (buffer-disable-undo (current-buffer))))
+    (mm-enable-multibyte)))
 
 (defmacro gnus-group-real-name (group)
   "Find the real name of a foreign newsgroup."
@@ -555,21 +478,35 @@ Timezone package is used."
 (defun gnus-make-sort-function (funs)
   "Return a composite sort condition based on the functions in FUNC."
   (cond
-   ((not (listp funs)) funs)
+   ;; Just a simple function.
+   ((gnus-functionp funs) funs)
+   ;; No functions at all.
    ((null funs) funs)
-   ((cdr funs)
+   ;; A list of functions.
+   ((or (cdr funs)
+       (listp (car funs)))
     `(lambda (t1 t2)
        ,(gnus-make-sort-function-1 (reverse funs))))
+   ;; A list containing just one function.
    (t
     (car funs))))
 
 (defun gnus-make-sort-function-1 (funs)
   "Return a composite sort condition based on the functions in FUNC."
-  (if (cdr funs)
-      `(or (,(car funs) t1 t2)
-          (and (not (,(car funs) t2 t1))
-               ,(gnus-make-sort-function-1 (cdr funs))))
-    `(,(car funs) t1 t2)))
+  (let ((function (car funs))
+       (first 't1)
+       (last 't2))
+    (when (consp function)
+      (if (eq (car function) 'not)
+         (setq function (cadr function)
+               first 't2
+               last 't1)
+       (error "Invalid sort spec: %s" function)))
+    (if (cdr funs)
+       `(or (,function ,first ,last)
+            (and (not (,function ,last ,first))
+                 ,(gnus-make-sort-function-1 (cdr funs))))
+      `(,function ,first ,last))))
 
 (defun gnus-turn-off-edit-menu (type)
   "Turn off edit menu in `gnus-TYPE-mode-map'."
@@ -616,7 +553,7 @@ Bind `print-quoted' and `print-readably' to t while printing."
     (setq string (replace-match "" t t string)))
   string)
 
-(defun gnus-put-text-property-excluding-newlines (beg end prop val)
+(defsubst gnus-put-text-property-excluding-newlines (beg end prop val)
   "The same as `put-text-property', but don't put this prop on any newlines in the region."
   (save-match-data
     (save-excursion
@@ -973,11 +910,12 @@ ARG is passed to the first function."
       (setq alist (delq entry alist)))
     alist))
 
-(defmacro gnus-pull (key alist)
+(defmacro gnus-pull (key alist &optional assoc-p)
   "Modify ALIST to be without KEY."
   (unless (symbolp alist)
     (error "Not a symbol: %s" alist))
-  `(setq ,alist (delq (assq ,key ,alist) ,alist)))
+  (let ((fun (if assoc-p 'assoc 'assq)))
+    `(setq ,alist (delq (,fun ,key ,alist) ,alist))))
 
 (defun gnus-globalify-regexp (re)
   "Returns a regexp that matches a whole line, iff RE matches a part of it."
@@ -985,6 +923,12 @@ ARG is passed to the first function."
          re
          (unless (string-match "\\$$" re) ".*$")))
 
+(defun gnus-set-window-start (&optional point)
+  "Set the window start to POINT, or (point) if nil."
+  (let ((win (get-buffer-window (current-buffer) t)))
+    (when win
+      (set-window-start win (or point (point))))))
+
 (provide 'gnus-util)
 
 ;;; gnus-util.el ends here
index 19929f3..19f07a2 100644 (file)
@@ -32,6 +32,7 @@
 (require 'gnus-art)
 (require 'message)
 (require 'gnus-msg)
+(require 'mm-decode)
 
 (defgroup gnus-extract nil
   "Extracting encoded files."
@@ -833,8 +834,9 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
              (eq in-state 'first-and-last))
          (progn
            (setq state (list 'begin))
-           (save-excursion (set-buffer (gnus-get-buffer-create "*gnus-uu-body*"))
-                           (erase-buffer))
+           (save-excursion
+             (set-buffer (gnus-get-buffer-create "*gnus-uu-body*"))
+             (erase-buffer))
            (save-excursion
              (set-buffer (gnus-get-buffer-create "*gnus-uu-pre*"))
              (erase-buffer)
@@ -1024,7 +1026,7 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
   ;; finally just replaces the next to last number with "[0-9]+".
   (save-excursion
     (set-buffer (gnus-get-buffer-create gnus-uu-output-buffer-name))
-    (buffer-disable-undo (current-buffer))
+    (buffer-disable-undo)
     (erase-buffer)
     (insert (regexp-quote string))
 
@@ -1124,7 +1126,7 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
        string)
     (save-excursion
       (set-buffer (gnus-get-buffer-create gnus-uu-output-buffer-name))
-      (buffer-disable-undo (current-buffer))
+      (buffer-disable-undo)
       (while string-list
        (erase-buffer)
        (insert (caar string-list))
@@ -1694,23 +1696,11 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
     (when (setq buf (get-buffer gnus-uu-output-buffer-name))
       (kill-buffer buf))))
 
-(defun gnus-quote-arg-for-sh-or-csh (arg)
-  (let ((pos 0) new-pos accum)
-    ;; *** bug: we don't handle newline characters properly
-    (while (setq new-pos (string-match "[!`\"$\\& \t{}]" arg pos))
-      (push (substring arg pos new-pos) accum)
-      (push "\\" accum)
-      (push (list (aref arg new-pos)) accum)
-      (setq pos (1+ new-pos)))
-    (if (= pos 0)
-        arg
-      (apply 'concat (nconc (nreverse accum) (list (substring arg pos)))))))
-
 ;; Inputs an action and a filename and returns a full command, making sure
 ;; that the filename will be treated as a single argument when the shell
 ;; executes the command.
 (defun gnus-uu-command (action file)
-  (let ((quoted-file (gnus-quote-arg-for-sh-or-csh file)))
+  (let ((quoted-file (mm-quote-arg file)))
     (if (string-match "%s" action)
        (format action quoted-file)
       (concat action " " quoted-file))))
@@ -1806,7 +1796,9 @@ is t."
 
   (gnus-summary-post-news)
 
-  (use-local-map (copy-keymap (current-local-map)))
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map (current-local-map))
+    (use-local-map map))
   (local-set-key "\C-c\C-c" 'gnus-summary-edit-article-done)
   (local-set-key "\C-c\C-c" 'gnus-uu-post-news-inews)
   (local-set-key "\C-c\C-s" 'gnus-uu-post-news-inews)
index 00fc583..b323db1 100644 (file)
@@ -28,6 +28,7 @@
 (require 'text-props)
 (defvar menu-bar-mode (featurep 'menubar))
 (require 'messagexmas)
+(require 'wid-edit)
 
 (defgroup gnus-xmas nil
   "XEmacsoid support for Gnus"
@@ -41,6 +42,8 @@ automatically."
                 directory)
   :group 'gnus-xmas)
 
+;;(format "%02x%02x%02x" 114 66 20) "724214"
+
 (defvar gnus-xmas-logo-color-alist
   '((flame "#cc3300" "#ff2200")
     (pine "#c0cc93" "#f8ffb8")
@@ -52,16 +55,18 @@ automatically."
     (grape "#b264cc" "#cf7df")
     (labia "#cc64c2" "#fd7dff")
     (berry "#cc6485" "#ff7db5")
+    (dino "#724214" "#1e3f03")
     (neutral "#b4b4b4" "#878787")
     (september "#bf9900" "#ffcc00"))
   "Color alist used for the Gnus logo.")
 
-(defcustom gnus-xmas-logo-color-style 'moss
+(defcustom gnus-xmas-logo-color-style 'dino
   "*Color styles used for the Gnus logo."
   :type '(choice (const flame) (const pine) (const moss)
                 (const irish) (const sky) (const tin)
                 (const velvet) (const grape) (const labia)
-                (const berry) (const neutral) (const september))
+                (const berry) (const neutral) (const september)
+                (const dino))
   :group 'gnus-xmas)
 
 (defvar gnus-xmas-logo-colors
@@ -241,6 +246,7 @@ call it with the value of the `gnus-data' text property."
   (let* ((pos (event-closest-point event))
         (data (get-text-property pos 'gnus-data))
         (fun (get-text-property pos 'gnus-callback)))
+    (goto-char pos)
     (when fun
       (funcall fun data))))
 
@@ -253,21 +259,6 @@ call it with the value of the `gnus-data' text property."
                 (delete-extent extent)
                 nil)))
 
-;; Fixed by Christopher Davis <ckd@loiosh.kei.com>.
-(defun gnus-xmas-article-add-button (from to fun &optional data)
-  "Create a button between FROM and TO with callback FUN and data DATA."
-  (when gnus-article-button-face
-    (gnus-overlay-put (gnus-make-overlay from to)
-                     'face gnus-article-button-face))
-  (gnus-add-text-properties
-   from to
-   (nconc
-    (and gnus-article-mouse-face
-        (list 'mouse-face gnus-article-mouse-face))
-    (list 'gnus-callback fun)
-    (and data (list 'gnus-data data))
-    (list 'highlight t))))
-
 (defun gnus-xmas-window-top-edge (&optional window)
   (nth 1 (window-pixel-edges window)))
 
@@ -394,26 +385,10 @@ call it with the value of the `gnus-data' text property."
               (event-to-character event))
          event)))
 
-(defun gnus-xmas-seconds-since-epoch (date)
-  "Return a floating point number that says how many seconds have lapsed between Jan 1 12:00:00 1970 and DATE."
-  (let* ((tdate (mapcar (lambda (ti) (and ti (string-to-int ti)))
-                       (timezone-parse-date date)))
-        (ttime (mapcar (lambda (ti) (and ti (string-to-int ti)))
-                       (timezone-parse-time
-                        (aref (timezone-parse-date date) 3))))
-        (edate (mapcar (lambda (ti) (and ti (string-to-int ti)))
-                       (timezone-parse-date "Jan 1 12:00:00 1970")))
-        (tday (- (timezone-absolute-from-gregorian
-                  (nth 1 tdate) (nth 2 tdate) (nth 0 tdate))
-                 (timezone-absolute-from-gregorian
-                  (nth 1 edate) (nth 2 edate) (nth 0 edate)))))
-    (+ (nth 2 ttime)
-       (* (nth 1 ttime) 60)
-       (* (float (nth 0 ttime)) 60 60)
-       (* (float tday) 60 60 24))))
-
 (defun gnus-xmas-define ()
   (setq gnus-mouse-2 [button2])
+  (setq gnus-mouse-3 [button3])
+  (setq gnus-widget-button-keymap widget-button-keymap)
 
   (unless (memq 'underline (face-list))
     (and (fboundp 'make-face)
@@ -456,16 +431,6 @@ call it with the value of the `gnus-data' text property."
 
   (defvar gnus-mouse-face-prop 'highlight)
 
-  (unless (fboundp 'encode-time)
-    (defun encode-time (sec minute hour day month year &optional zone)
-      (let ((seconds
-            (gnus-xmas-seconds-since-epoch
-             (timezone-make-arpa-date
-              year month day (timezone-make-time-string hour minute sec)
-              zone))))
-       (list (floor (/ seconds (expt 2 16)))
-             (round (mod seconds (expt 2 16)))))))
-
   (defun gnus-byte-code (func)
     "Return a form that can be `eval'ed based on FUNC."
     (let ((fval (indirect-function func)))
@@ -487,7 +452,6 @@ call it with the value of the `gnus-data' text property."
   (fset 'gnus-summary-recenter 'gnus-xmas-summary-recenter)
   (fset 'gnus-extent-start-open 'gnus-xmas-extent-start-open)
   (fset 'gnus-article-push-button 'gnus-xmas-article-push-button)
-  (fset 'gnus-article-add-button 'gnus-xmas-article-add-button)
   (fset 'gnus-window-top-edge 'gnus-xmas-window-top-edge)
   (fset 'gnus-read-event-char 'gnus-xmas-read-event-char)
   (fset 'gnus-group-startup-message 'gnus-xmas-group-startup-message)
@@ -500,7 +464,9 @@ call it with the value of the `gnus-data' text property."
        'gnus-xmas-mode-line-buffer-identification)
   (fset 'gnus-key-press-event-p 'key-press-event-p)
   (fset 'gnus-region-active-p 'region-active-p)
-
+  (fset 'gnus-annotation-in-region-p 'gnus-xmas-annotation-in-region-p)
+  (fset 'gnus-mime-button-menu 'gnus-xmas-mime-button-menu)
+  
   (add-hook 'gnus-group-mode-hook 'gnus-xmas-group-menu-add)
   (add-hook 'gnus-summary-mode-hook 'gnus-xmas-summary-menu-add)
   (add-hook 'gnus-article-mode-hook 'gnus-xmas-article-menu-add)
@@ -826,6 +792,20 @@ XEmacs compatibility workaround."
   (when (eq (device-type) 'x)
     (gnus-splash)))
 
+(defun gnus-xmas-annotation-in-region-p (b e)
+  (map-extents (lambda (e u) t) nil b e nil nil 'mm t))
+
+(defun gnus-xmas-mime-button-menu (event)
+  "Construct a context-sensitive menu of MIME commands."
+  (interactive "e")
+  (let ((response (get-popup-menu-response
+                  `("MIME Part"
+                    ,@(mapcar (lambda (c) `[,(caddr c) ,(car c) t])
+                              gnus-mime-button-commands)))))
+    (set-buffer (event-buffer event))
+    (goto-char (event-point event))
+    (funcall (event-function response) (event-object response))))
+
 (provide 'gnus-xmas)
 
 ;;; gnus-xmas.el ends here
index 18a398f..426f8ec 100644 (file)
@@ -245,15 +245,19 @@ is restarted, and sometimes reloaded."
   :link '(custom-manual "(gnus)Various Various")
   :group 'gnus)
 
+(defgroup gnus-mime nil
+  "Variables for controlling the Gnus MIME interface."
+  :group 'gnus)
+
 (defgroup gnus-exit nil
   "Exiting gnus."
   :link '(custom-manual "(gnus)Exiting Gnus")
   :group 'gnus)
 
-(defconst gnus-version-number "5.6.45"
+(defconst gnus-version-number "0.51"
   "Version number for this version of Gnus.")
 
-(defconst gnus-version (format "Gnus v%s" gnus-version-number)
+(defconst gnus-version (format "Pterodactyl Gnus v%s" gnus-version-number)
   "Version string for this version of Gnus.")
 
 (defcustom gnus-inhibit-startup-message nil
@@ -268,8 +272,6 @@ be set in `.emacs' instead."
   :group 'gnus-start
   :type 'boolean)
 
-;;; Kludges to help the transition from the old `custom.el'.
-
 (unless (featurep 'gnus-xmas)
   (defalias 'gnus-make-overlay 'make-overlay)
   (defalias 'gnus-delete-overlay 'delete-overlay)
@@ -289,7 +291,9 @@ be set in `.emacs' instead."
   (defalias 'gnus-characterp 'numberp)
   (defalias 'gnus-deactivate-mark 'deactivate-mark)
   (defalias 'gnus-window-edges 'window-edges)
-  (defalias 'gnus-key-press-event-p 'numberp))
+  (defalias 'gnus-key-press-event-p 'numberp)
+  (defalias 'gnus-annotation-in-region-p 'ignore)
+  (defalias 'gnus-decode-rfc1522 'ignore))
 
 ;; We define these group faces here to avoid the display
 ;; update forced when creating new faces.
@@ -360,6 +364,72 @@ be set in `.emacs' instead."
      ()))
   "Level 3 empty newsgroup face.")
 
+(defface gnus-group-news-4-face
+  '((((class color)
+      (background dark))
+     (:bold t))
+    (((class color)
+      (background light))
+     (:bold t))
+    (t
+     ()))
+  "Level 4 newsgroup face.")
+
+(defface gnus-group-news-4-empty-face
+  '((((class color)
+      (background dark))
+     ())
+    (((class color)
+      (background light))
+     ())
+    (t
+     ()))
+  "Level 4 empty newsgroup face.")
+
+(defface gnus-group-news-5-face
+  '((((class color)
+      (background dark))
+     (:bold t))
+    (((class color)
+      (background light))
+     (:bold t))
+    (t
+     ()))
+  "Level 5 newsgroup face.")
+
+(defface gnus-group-news-5-empty-face
+  '((((class color)
+      (background dark))
+     ())
+    (((class color)
+      (background light))
+     ())
+    (t
+     ()))
+  "Level 5 empty newsgroup face.")
+
+(defface gnus-group-news-6-face
+  '((((class color)
+      (background dark))
+     (:bold t))
+    (((class color)
+      (background light))
+     (:bold t))
+    (t
+     ()))
+  "Level 6 newsgroup face.")
+
+(defface gnus-group-news-6-empty-face
+  '((((class color)
+      (background dark))
+     ())
+    (((class color)
+      (background light))
+     ())
+    (t
+     ()))
+  "Level 6 empty newsgroup face.")
+
 (defface gnus-group-news-low-face
   '((((class color)
       (background dark))
@@ -637,13 +707,13 @@ be set in `.emacs' instead."
 (defface gnus-splash-face
   '((((class color)
       (background dark))
-     (:foreground "ForestGreen"))
+     (:foreground "Brown"))
     (((class color)
       (background light))
-     (:foreground "ForestGreen"))
+     (:foreground "Brown"))
     (t
      ()))
-  "Level 1 newsgroup face.")
+  "Face of the splash screen.")
 
 (defun gnus-splash ()
   (save-excursion
@@ -773,7 +843,7 @@ used to 899, you would say something along these lines:
   :group 'gnus-files
   :group 'gnus-server
   :type 'file)
-  
+
 ;; This function is used to check both the environment variable
 ;; NNTPSERVER and the /etc/nntpserver file to see whether one can find
 ;; an nntp server name default.
@@ -782,7 +852,6 @@ used to 899, you would say something along these lines:
       (and (file-readable-p gnus-nntpserver-file)
           (save-excursion
             (set-buffer (gnus-get-buffer-create " *gnus nntp*"))
-            (buffer-disable-undo (current-buffer))
             (insert-file-contents gnus-nntpserver-file)
             (let ((name (buffer-string)))
               (prog1
@@ -866,6 +935,7 @@ that case, just return a fully prefixed name of the group --
 \"nnml+private:mail.misc\", for instance."
   :group 'gnus-message
   :type '(choice (const :tag "none" nil)
+                function
                 sexp
                 string))
 
@@ -1373,7 +1443,6 @@ want."
             gnus-summary-stop-page-breaking
             ;; gnus-summary-caesar-message
             ;; gnus-summary-verbose-headers
-            gnus-summary-toggle-mime
             gnus-article-hide
             gnus-article-hide-headers
             gnus-article-hide-boring-headers
@@ -1408,6 +1477,7 @@ want."
 \f
 ;;; Internal variables
 
+(defvar gnus-agent-meta-information-header "X-Gnus-Agent-Meta-Information")
 (defvar gnus-group-get-parameter-function 'gnus-group-get-parameter)
 (defvar gnus-original-article-buffer " *Original Article*")
 (defvar gnus-newsgroup-name nil)
@@ -1483,7 +1553,6 @@ want."
   '((gnus-group-mode "(gnus)The Group Buffer")
     (gnus-summary-mode "(gnus)The Summary Buffer")
     (gnus-article-mode "(gnus)The Article Buffer")
-    (mime/viewer-mode "(gnus)The Article Buffer")
     (gnus-server-mode "(gnus)The Server Buffer")
     (gnus-browse-mode "(gnus)Browse Foreign Server")
     (gnus-tree-mode "(gnus)Tree Display"))
@@ -1569,18 +1638,16 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
          (cdr package)))))
    '(("metamail" metamail-buffer)
      ("info" Info-goto-node)
-     ("hexl" hexl-hex-string-to-integer)
      ("pp" pp pp-to-string pp-eval-expression)
+     ("qp" quoted-printable-decode-region quoted-printable-decode-string)
      ("ps-print" ps-print-preprint)
      ("mail-extr" mail-extract-address-components)
      ("browse-url" browse-url)
      ("message" :interactive t
       message-send-and-exit message-yank-original)
-     ("nnmail" nnmail-split-fancy nnmail-article-group nnmail-date-to-time)
+     ("nnmail" nnmail-split-fancy nnmail-article-group)
      ("nnvirtual" nnvirtual-catchup-group nnvirtual-convert-headers)
-     ("timezone" timezone-make-date-arpa-standard timezone-fix-time
-      timezone-make-sortable-date timezone-make-time-string)
-     ("rmailout" rmail-output)
+     ("rmailout" rmail-output rmail-output-to-rmail-file)
      ("rmail" rmail-insert-rmail-file-header rmail-count-new-messages
       rmail-show-message rmail-summary-exists
       rmail-select-summary rmail-update-summary)
@@ -1613,7 +1680,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
       gnus-article-hide-citation-in-followups)
      ("gnus-kill" gnus-kill gnus-apply-kill-file-internal
       gnus-kill-file-edit-file gnus-kill-file-raise-followups-to-author
-      gnus-execute gnus-expunge)
+      gnus-execute gnus-expunge gnus-batch-kill gnus-batch-score)
      ("gnus-cache" gnus-cache-possibly-enter-article gnus-cache-save-buffers
       gnus-cache-possibly-remove-articles gnus-cache-request-article
       gnus-cache-retrieve-headers gnus-cache-possibly-alter-active
@@ -1651,9 +1718,8 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
       gnus-uu-decode-uu-and-save-view gnus-uu-decode-unshar-view
       gnus-uu-decode-unshar-and-save-view gnus-uu-decode-save-view
       gnus-uu-decode-binhex-view gnus-uu-unmark-thread
-      gnus-uu-mark-over gnus-uu-post-news gnus-uu-post-news)
-     ("gnus-uu" gnus-uu-delete-work-dir gnus-quote-arg-for-sh-or-csh
-      gnus-uu-unmark-thread)
+      gnus-uu-mark-over gnus-uu-post-news)
+     ("gnus-uu" gnus-uu-delete-work-dir gnus-uu-unmark-thread)
      ("gnus-msg" (gnus-summary-send-map keymap)
       gnus-article-mail gnus-copy-article-buffer gnus-extended-version)
      ("gnus-msg" :interactive t
@@ -1695,20 +1761,21 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
       gnus-article-next-page gnus-article-prev-page
       gnus-request-article-this-buffer gnus-article-mode
       gnus-article-setup-buffer gnus-narrow-to-page
-      gnus-article-delete-invisible-text gnus-hack-decode-rfc1522)
+      gnus-article-delete-invisible-text)
      ("gnus-art" :interactive t
       gnus-article-hide-headers gnus-article-hide-boring-headers
       gnus-article-treat-overstrike gnus-article-word-wrap
       gnus-article-remove-cr gnus-article-remove-trailing-blank-lines
       gnus-article-display-x-face gnus-article-de-quoted-unreadable
-      gnus-article-mime-decode-quoted-printable gnus-article-hide-pgp
+      gnus-article-hide-pgp
       gnus-article-hide-pem gnus-article-hide-signature
       gnus-article-strip-leading-blank-lines gnus-article-date-local
       gnus-article-date-original gnus-article-date-lapsed
       gnus-article-show-all-headers
       gnus-article-edit-mode gnus-article-edit-article
-      gnus-article-edit-done gnus-decode-rfc1522 article-decode-rfc1522
-      gnus-start-date-timer gnus-stop-date-timer)
+      gnus-article-edit-done gnus-article-decode-encoded-words
+      gnus-start-date-timer gnus-stop-date-timer
+      gnus-mime-view-all-parts)
      ("gnus-int" gnus-request-type)
      ("gnus-start" gnus-newsrc-parse-options gnus-1 gnus-no-server-1
       gnus-dribble-enter gnus-read-init-file gnus-dribble-touch)
@@ -1749,6 +1816,7 @@ with some simple extensions.
 %a   Extracted name of the poster (string)
 %A   Extracted address of the poster (string)
 %F   Contents of the From: header (string)
+%f   Contents of the From: or To: headers (string)
 %x   Contents of the Xref: header (string)
 %D   Date of the article (string)
 %d   Date of the article (string) in DD-MMM format
@@ -1809,7 +1877,7 @@ This restriction may disappear in later versions of Gnus."
       (define-key keymap (pop keys) 'undefined))))
 
 (defvar gnus-article-mode-map
-  (let ((keymap (make-keymap)))
+  (let ((keymap (make-sparse-keymap)))
     (gnus-suppress-keymap keymap)
     keymap))
 (defvar gnus-summary-mode-map
@@ -2004,14 +2072,13 @@ If ARG, insert string at point."
       (string-to-number
        (if (zerop major)
           (format "%s00%02d%02d"
-                  (cond
-                   ((member alpha '("(ding)" "d")) "4.99")
-                   ((member alpha '("September" "s")) "5.01")
-                   ((member alpha '("Red" "r")) "5.03")
-                   ((member alpha '("Quassia" "q")) "5.05")
-                   ((member alpha '("p")) "5.07")
-                   ((member alpha '("o")) "5.09")
-                   ((member alpha '("n")) "5.11"))
+                  (if (member alpha '("(ding)" "d"))
+                      "4.99"
+                    (+ 5 (* 0.02
+                            (abs
+                             (- (mm-char-int (aref (downcase alpha) 0))
+                                (mm-char-int ?t))))
+                       -0.01))
                   minor least)
         (format "%d.%02d%02d" major minor least))))))
 
@@ -2520,22 +2587,18 @@ just the host name."
     ;; separate foreign select method from group name and collapse.
     ;; if method contains a server, collapse to non-domain server name,
     ;; otherwise collapse to select method
-    (when (string-match ":" group)
-      (cond ((string-match "+" group)
-            (let* ((plus (string-match "+" group))
-                   (colon (string-match ":" group (or plus 0)))
-                   (dot (string-match "\\." group)))
-              (setq foreign (concat
-                             (substring group (+ 1 plus)
-                                        (cond ((null dot) colon)
-                                              ((< colon dot) colon)
-                                              ((< dot colon) dot)))
-                             ":")
-                    group (substring group (+ 1 colon)))))
-           (t
-            (let* ((colon (string-match ":" group)))
-              (setq foreign (concat (substring group 0 (+ 1 colon)))
-                    group (substring group (+ 1 colon)))))))
+    (let* ((colon  (string-match ":" group))
+          (server (and colon (substring group 0 colon)))
+          (plus   (and server (string-match "+" server))))
+      (when server
+       (cond (plus
+              (setq foreign (substring server (+ 1 plus)
+                                       (string-match "\\." server))
+                    group (substring group (+ 1 colon))))
+              (t
+               (setq foreign server
+                     group (substring group (+ 1 colon)))))
+       (setq foreign (concat foreign ":"))))
     ;; collapse group name leaving LEVELS uncollapsed elements
     (while group
       (if (and (string-match "\\." group) (> levels 0))
@@ -2623,6 +2686,7 @@ If NEWSGROUP is nil, return the global kill file name instead."
   (let ((opened gnus-opened-servers))
     (while (and method opened)
       (when (and (equal (cadr method) (cadaar opened))
+                (equal (car method) (caaar opened))
                 (not (equal method (caar opened))))
        (setq method nil))
       (pop opened))
index d41172b..110cb42 100644 (file)
                     run-with-idle-timer mouse-minibuffer-check window-edges
                     event-click-count track-mouse read-event mouse-movement-p
                     event-end mouse-scroll-subr overlay-lists delete-overlay
-                    set-face-stipple mail-abbrevs-setup char-int
+                    set-face-stipple mail-abbrevs-setup 
                     make-char-table set-char-table-range font-create-object
                     x-color-values widget-make-intangible error-message-string
                     w3-form-encode-xwfu gnus-mule-get-coding-system
-                    decode-coding-string mail-aliases-setup))
+                    decode-coding-string mail-aliases-setup
+                    mm-copy-tree url-view-url w3-prepare-buffer
+                    set-buffer-multibyte
+                    find-non-ascii-charset-region char-charset
+                    mule-write-region-no-coding-system
+                    find-charset-region 
+                    find-coding-systems-region get-charset-property
+                    coding-system-get w3-region
+                    rmail-summary-exists rmail-select-summary
+                    rmail-update-summary
+                    ))
       (maybe-bind '(global-face-data
                    mark-active transient-mark-mode mouse-selection-click-count
                    mouse-selection-click-count-buffer buffer-display-table
                    font-lock-defaults user-full-name user-login-name
                    gnus-newsgroup-name gnus-article-x-face-too-ugly
                    mail-mode-hook enable-multibyte-characters
-                   adaptive-fill-first-line-regexp adaptive-fill-regexp)))
+                   adaptive-fill-first-line-regexp adaptive-fill-regexp
+                   url-current-mime-headers buffer-file-coding-system)))
   (maybe-bind '(mail-mode-hook
                enable-multibyte-characters browse-url-browser-function
-               adaptive-fill-first-line-regexp adaptive-fill-regexp))
+               adaptive-fill-first-line-regexp adaptive-fill-regexp
+               url-current-mime-headers))
   (maybe-fbind '(color-instance-rgb-components
                 make-color-instance color-instance-name specifier-instance
                 device-type device-class get-popup-menu-response event-object
                 device-on-window-system-p make-gui-button Info-goto-node
                 pp-to-string color-name 
                 gnus-mule-get-coding-system decode-coding-string
-                mail-aliases-setup)))
+                mail-aliases-setup
+                mm-copy-tree url-view-url w3-prepare-buffer
+                mule-write-region-no-coding-system char-int
+                annotationp delete-annotation make-image-specifier
+                make-annotation 
+                w3-do-setup w3-region
+                rmail-summary-exists rmail-select-summary rmail-update-summary
+                )))
 
 (setq load-path (cons "." load-path))
 (require 'custom)
index 5e2b097..6eb5669 100644 (file)
@@ -60,7 +60,7 @@ that name."
        start end)
     (while (and (setq start (point))
                (> (skip-chars-forward "^\0- :") 0)
-               (= (following-char) ?:)
+               (eq (char-after) ?:)
                (setq end (point))
                (progn (forward-char)
                       (> (skip-chars-forward " \t") 0)))
index 20f2c33..0ca380b 100644 (file)
 
 (require 'mailheader)
 (require 'nnheader)
-(require 'timezone)
 (require 'easymenu)
 (require 'custom)
 (if (string-match "XEmacs\\|Lucid" emacs-version)
     (require 'mail-abbrevs)
   (require 'mailabbrev))
+(require 'mail-parse)
+(require 'mm-bodies)
+(require 'mm-encode)
+(require 'mml)
 
 (defgroup message '((user-mail-address custom-variable)
                    (user-full-name custom-variable))
@@ -172,11 +175,11 @@ shorten-followup-to existing-newsgroups buffer-file-name unchanged."
 (defcustom message-required-news-headers
   '(From Newsgroups Subject Date Message-ID
         (optional . Organization) Lines
-        (optional . X-Newsreader))
+        (optional . User-Agent))
   "*Headers to be generated or prompted for when posting an article.
 RFC977 and RFC1036 require From, Date, Newsgroups, Subject,
 Message-ID.  Organization, Lines, In-Reply-To, Expires, and
-X-Newsreader are optional.  If don't you want message to insert some
+User-Agent are optional.  If don't you want message to insert some
 header, remove it from this list."
   :group 'message-news
   :group 'message-headers
@@ -184,10 +187,10 @@ header, remove it from this list."
 
 (defcustom message-required-mail-headers
   '(From Subject Date (optional . In-Reply-To) Message-ID Lines
-        (optional . X-Mailer))
+        (optional . User-Agent))
   "*Headers to be generated or prompted for when mailing a message.
 RFC822 required that From, Date, To, Subject and Message-ID be
-included.  Organization, Lines and X-Mailer are optional."
+included.  Organization, Lines and User-Agent are optional."
   :group 'message-mail
   :group 'message-headers
   :type '(repeat sexp))
@@ -210,7 +213,7 @@ included.  Organization, Lines and X-Mailer are optional."
   :group 'message-headers
   :type 'regexp)
 
-(defcustom message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|^X-Trace:\\|^X-Complaints-To:\\|Return-Path:\\|^Supersedes:\\|^X-Trace:\\|^X-Complaints-To:"
+(defcustom message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|^X-Trace:\\|^X-Complaints-To:\\|Return-Path:\\|^Supersedes:\\|^NNTP-Posting-Date:\\|^X-Trace:\\|^X-Complaints-To:"
   "*Header lines matching this regexp will be deleted before posting.
 It's best to delete old Path and Date headers before posting to avoid
 any confusion."
@@ -240,14 +243,15 @@ nil means let mailer mail back a message to report errors."
   :group 'message-mail
   :type 'boolean)
 
-(defcustom message-generate-new-buffers t
+(defcustom message-generate-new-buffers 'unique
   "*Non-nil means that a new message buffer will be created whenever `message-setup' is called.
 If this is a function, call that function with three parameters:  The type,
 the to address and the group name.  (Any of these may be nil.)  The function
 should return the new buffer name."
   :group 'message-buffers
   :type '(choice (const :tag "off" nil)
-                (const :tag "on" t)
+                (const :tag "unique" unique)
+                (const :tag "unsuniqueent" unsent)
                 (function fun)))
 
 (defcustom message-kill-buffer-on-exit nil
@@ -318,7 +322,7 @@ The provided functions are:
   :group 'message-forwarding
   :type 'boolean)
 
-(defcustom message-ignored-resent-headers "^Return-receipt"
+(defcustom message-ignored-resent-headers "^Return-receipt\\|^X-Gnus"
   "*All headers that match this regexp will be deleted when resending a message."
   :group 'message-interface
   :type 'regexp)
@@ -651,12 +655,21 @@ If nil, Message won't auto-save."
   :group 'message-buffers
   :type 'directory)
 
+(defcustom message-buffer-naming-style 'unique
+  "*The way new message buffers are named.
+Valid valued are `unique' and `unsent'."
+  :group 'message-buffers
+  :type '(choice (const :tag "unique" unique)
+                (const :tag "unsent" unsent)))
+
 ;;; Internal variables.
 ;;; Well, not really internal.
 
 (defvar message-mode-syntax-table
   (let ((table (copy-syntax-table text-mode-syntax-table)))
     (modify-syntax-entry ?% ". " table)
+    (modify-syntax-entry ?> ". " table)
+    (modify-syntax-entry ?< ". " table)
     table)
   "Syntax table used while in Message mode.")
 
@@ -776,6 +789,18 @@ Defaults to `text-mode-abbrev-table'.")
   "Face used for displaying cited text names."
   :group 'message-faces)
 
+(defface message-mml-face
+  '((((class color)
+      (background dark))
+     (:foreground "ForestGreen"))
+    (((class color)
+      (background light))
+     (:foreground "ForestGreen"))
+    (t
+     (:bold t)))
+  "Face used for displaying MML."
+  :group 'message-faces)
+
 (defvar message-font-lock-keywords
   (let* ((cite-prefix "A-Za-z")
         (cite-suffix (concat cite-prefix "0-9_.@-"))
@@ -806,7 +831,9 @@ Defaults to `text-mode-abbrev-table'.")
       (,(concat "^[ \t]*"
                "\\([" cite-prefix "]+[" cite-suffix "]*\\)?"
                "[:>|}].*")
-       (0 'message-cited-text-face))))
+       (0 'message-cited-text-face))
+      ("<#/?\\(multi\\)part.*>"
+       (0 'message-mml-face))))
   "Additional expressions to highlight in Message mode.")
 
 ;; XEmacs does it like this.  For Emacs, we have to set the
@@ -848,10 +875,12 @@ The cdr of ech entry is a function for applying the face to a region.")
 
 ;;; Internal variables.
 
+(defvar message-default-charset nil)
 (defvar message-buffer-list nil)
 (defvar message-this-is-news nil)
 (defvar message-this-is-mail nil)
 (defvar message-draft-article nil)
+(defvar message-mime-part nil)
 
 ;; Byte-compiler warning
 (defvar gnus-active-hashtb)
@@ -937,8 +966,7 @@ The cdr of ech entry is a function for applying the face to a region.")
     (Expires)
     (Message-ID)
     (References . message-shorten-references)
-    (X-Mailer)
-    (X-Newsreader))
+    (User-Agent))
   "Alist used for formatting headers.")
 
 (eval-and-compile
@@ -948,7 +976,6 @@ The cdr of ech entry is a function for applying the face to a region.")
   (autoload 'gnus-point-at-eol "gnus-util")
   (autoload 'gnus-point-at-bol "gnus-util")
   (autoload 'gnus-output-to-mail "gnus-util")
-  (autoload 'gnus-output-to-rmail "gnus-util")
   (autoload 'mail-abbrev-in-expansion-header-p "mailabbrev")
   (autoload 'nndraft-request-associate-buffer "nndraft")
   (autoload 'nndraft-request-expire-articles "nndraft")
@@ -996,12 +1023,12 @@ The cdr of ech entry is a function for applying the face to a region.")
                               (not paren))))
                 (push (buffer-substring beg (point)) elems)
                 (setq beg (match-end 0)))
-               ((= (following-char) ?\")
+               ((eq (char-after) ?\")
                 (setq quoted (not quoted)))
-               ((and (= (following-char) ?\()
+               ((and (eq (char-after) ?\()
                      (not quoted))
                 (setq paren t))
-               ((and (= (following-char) ?\))
+               ((and (eq (char-after) ?\))
                      (not quoted))
                 (setq paren nil))))
        (nreverse elems)))))
@@ -1011,7 +1038,7 @@ The cdr of ech entry is a function for applying the face to a region.")
   (when (and (file-exists-p file)
             (file-readable-p file)
             (file-regular-p file))
-    (nnheader-temp-write nil
+    (with-temp-buffer
       (nnheader-insert-file-contents file)
       (goto-char (point-min))
       (looking-at message-unix-mail-delimiter))))
@@ -1021,7 +1048,23 @@ The cdr of ech entry is a function for applying the face to a region.")
   (let* ((inhibit-point-motion-hooks t)
         (value (mail-fetch-field header nil (not not-all))))
     (when value
-      (nnheader-replace-chars-in-string value ?\n ? ))))
+      (while (string-match "\n[\t ]+" value)
+       (setq value (replace-match " " t t value)))
+      value)))
+
+(defun message-narrow-to-field ()
+  "Narrow the buffer to the header on the current line."
+  (beginning-of-line)
+  (narrow-to-region
+   (point)
+   (progn
+     (forward-line 1)
+     (if (re-search-forward "^[^ \n\t]" nil t)
+        (progn
+          (beginning-of-line)
+          (point))
+       (point-max))))
+  (goto-char (point-min)))
 
 (defun message-add-header (&rest headers)
   "Add the HEADERS to the message header, skipping those already present."
@@ -1051,7 +1094,7 @@ The cdr of ech entry is a function for applying the face to a region.")
        (erase-buffer))
     (set-buffer (get-buffer-create " *message work*"))
     (kill-all-local-variables)
-    (buffer-disable-undo (current-buffer))))
+    (mm-enable-multibyte)))
 
 (defun message-functionp (form)
   "Return non-nil if FORM is funcallable."
@@ -1111,7 +1154,8 @@ Return the number of headers removed."
   (goto-char (point-min)))
 
 (defun message-narrow-to-head ()
-  "Narrow the buffer to the head of the message."
+  "Narrow the buffer to the head of the message.
+Point is left at the beginning of the narrowed-to region."
   (widen)
   (narrow-to-region
    (goto-char (point-min))
@@ -1120,6 +1164,21 @@ Return the number of headers removed."
      (point-max)))
   (goto-char (point-min)))
 
+(defun message-narrow-to-headers-or-head ()
+  "Narrow the buffer to the head of the message."
+  (widen)
+  (narrow-to-region
+   (goto-char (point-min))
+   (cond
+    ((re-search-forward
+      (concat "^" (regexp-quote mail-header-separator) "\n") nil t)
+     (match-beginning 0))
+    ((search-forward "\n\n" nil t)
+     (1- (point)))
+    (t
+     (point-max))))
+  (goto-char (point-min)))
+
 (defun message-news-p ()
   "Say whether the current buffer contains a news message."
   (and (not message-this-is-mail)
@@ -1194,7 +1253,8 @@ Return the number of headers removed."
 (defvar message-mode-map nil)
 
 (unless message-mode-map
-  (setq message-mode-map (copy-keymap text-mode-map))
+  (setq message-mode-map (make-keymap))
+  (set-keymap-parent message-mode-map text-mode-map)
   (define-key message-mode-map "\C-c?" 'describe-mode)
 
   (define-key message-mode-map "\C-c\C-f\C-t" 'message-goto-to)
@@ -1231,6 +1291,8 @@ Return the number of headers removed."
   (define-key message-mode-map "\C-c\C-z" 'message-kill-to-signature)
   (define-key message-mode-map "\M-\r" 'message-newline-and-reformat)
 
+  (define-key message-mode-map "\C-c\C-a" 'message-insert-mime-part)
+
   (define-key message-mode-map "\t" 'message-tab))
 
 (easy-menu-define
@@ -1294,12 +1356,12 @@ C-c C-w  message-insert-signature (insert `message-signature-file' file).
 C-c C-y  message-yank-original (insert current message, if any).
 C-c C-q  message-fill-yanked-message (fill what was yanked).
 C-c C-e  message-elide-region (elide the text between point and mark).
+C-c C-v  message-delete-not-region (remove the text outside the region).
 C-c C-z  message-kill-to-signature (kill the text up to the signature).
 C-c C-r  message-caesar-buffer-body (rot13 the message body)."
   (interactive)
   (kill-all-local-variables)
-  (make-local-variable 'message-reply-buffer)
-  (setq message-reply-buffer nil)
+  (set (make-local-variable 'message-reply-buffer) nil)
   (make-local-variable 'message-send-actions) 
   (make-local-variable 'message-exit-actions) 
   (make-local-variable 'message-kill-actions)
@@ -1341,10 +1403,9 @@ C-c C-r  message-caesar-buffer-body (rot13 the message body)."
   (make-local-variable 'message-newsreader)
   (make-local-variable 'message-mailer)
   (make-local-variable 'message-post-method)
-  (make-local-variable 'message-sent-message-via)
-  (setq message-sent-message-via nil)
-  (make-local-variable 'message-checksum)
-  (setq message-checksum nil)
+  (set (make-local-variable 'message-sent-message-via) nil)
+  (set (make-local-variable 'message-checksum) nil)
+  (set (make-local-variable 'message-mime-part) 0)
   ;;(when (fboundp 'mail-hist-define-keys)
   ;;  (mail-hist-define-keys))
   (when (string-match "XEmacs\\|Lucid" emacs-version)
@@ -1369,6 +1430,7 @@ C-c C-r  message-caesar-buffer-body (rot13 the message body)."
   (setq adaptive-fill-first-line-regexp
        (concat "[ \t]*[-a-z0-9A-Z]*>+[ \t]*\\|"
                adaptive-fill-first-line-regexp))
+  (mm-enable-multibyte)
   (run-hooks 'text-mode-hook 'message-mode-hook))
 
 \f
@@ -1469,7 +1531,8 @@ With the prefix argument FORCE, insert the header anyway."
   (let ((co (message-fetch-reply-field "mail-copies-to")))
     (when (and (null force)
               co
-              (equal (downcase co) "never"))
+              (or (equal (downcase co) "never")
+                  (equal (downcase co) "nobody")))
       (error "The user has requested not to have copies sent via mail")))
   (when (and (message-position-on-field "To")
             (mail-fetch-field "to")
@@ -1604,9 +1667,10 @@ text was killed."
     ;; Then we translate the region.  Do it this way to retain
     ;; text properties.
     (while (< b e)
-      (subst-char-in-region
-       b (1+ b) (char-after b)
-       (aref message-caesar-translation-table (char-after b)))
+      (when (< (char-after b) 255)
+       (subst-char-in-region
+        b (1+ b) (char-after b)
+        (aref message-caesar-translation-table (char-after b))))
       (incf b))))
 
 (defun message-make-caesar-translation-table (n)
@@ -1762,6 +1826,11 @@ prefix, and don't delete any headers."
           (if (listp message-indent-citation-function)
               message-indent-citation-function
             (list message-indent-citation-function)))))
+    (goto-char start)
+    ;; Quote parts.
+    (while (re-search-forward "<#/?!*\\(multi\\|part\\)>" end t)
+      (goto-char (match-beginning 1))
+      (insert "!"))
     (goto-char end)
     (when (re-search-backward "^-- $" start t)
       ;; Also peel off any blank lines before the signature.
@@ -1785,12 +1854,18 @@ prefix, and don't delete any headers."
           mail-citation-hook)
       (run-hooks 'mail-citation-hook)
     (let ((start (point))
+         (end (mark t))
          (functions
           (when message-indent-citation-function
             (if (listp message-indent-citation-function)
                 message-indent-citation-function
               (list message-indent-citation-function)))))
       (goto-char start)
+      ;; Quote parts.
+      (while (re-search-forward "<#/?!*\\(multi\\|part\\)>" end t)
+       (goto-char (match-beginning 1))
+       (insert "!"))
+      (goto-char start)
       (while functions
        (funcall (pop functions)))
       (when message-citation-line-function
@@ -1910,46 +1985,42 @@ or error messages, and inform user.
 Otherwise any failure is reported in a message back to
 the user from the mailer."
   (interactive "P")
-  ;; Disabled test.
-  (when (or (buffer-modified-p)
-           (message-check-element 'unchanged)
-           (y-or-n-p "No changes in the buffer; really send? "))
-    ;; Make it possible to undo the coming changes.
-    (undo-boundary)
-    (let ((inhibit-read-only t))
-      (put-text-property (point-min) (point-max) 'read-only nil))
-    (message-fix-before-sending)
-    (run-hooks 'message-send-hook)
-    (message "Sending...")
-    (let ((alist message-send-method-alist)
-         (success t)
-         elem sent)
-      (while (and success
-                 (setq elem (pop alist)))
-       (when (and (or (not (funcall (cadr elem)))
-                      (and (or (not (memq (car elem)
-                                          message-sent-message-via))
-                               (y-or-n-p
-                                (format
-                                 "Already sent message via %s; resend? "
-                                 (car elem))))
-                           (setq success (funcall (caddr elem) arg)))))
-         (setq sent t)))
-      (when (and success sent)
-       (message-do-fcc)
-       ;;(when (fboundp 'mail-hist-put-headers-into-history)
-       ;; (mail-hist-put-headers-into-history))
-       (run-hooks 'message-sent-hook)
-       (message "Sending...done")
-       ;; Mark the buffer as unmodified and delete auto-save.
-       (set-buffer-modified-p nil)
-       (delete-auto-save-file-if-necessary t)
-       (message-disassociate-draft)
-       ;; Delete other mail buffers and stuff.
-       (message-do-send-housekeeping)
-       (message-do-actions message-send-actions)
-       ;; Return success.
-       t))))
+  ;; Make it possible to undo the coming changes.
+  (undo-boundary)
+  (let ((inhibit-read-only t))
+    (put-text-property (point-min) (point-max) 'read-only nil))
+  (message-fix-before-sending)
+  (run-hooks 'message-send-hook)
+  (message "Sending...")
+  (let ((alist message-send-method-alist)
+       (success t)
+       elem sent)
+    (while (and success
+               (setq elem (pop alist)))
+      (when (and (or (not (funcall (cadr elem)))
+                    (and (or (not (memq (car elem)
+                                        message-sent-message-via))
+                             (y-or-n-p
+                              (format
+                               "Already sent message via %s; resend? "
+                               (car elem))))
+                         (setq success (funcall (caddr elem) arg)))))
+       (setq sent t)))
+    (when (and success sent)
+      (message-do-fcc)
+      ;;(when (fboundp 'mail-hist-put-headers-into-history)
+      ;; (mail-hist-put-headers-into-history))
+      (run-hooks 'message-sent-hook)
+      (message "Sending...done")
+      ;; Mark the buffer as unmodified and delete auto-save.
+      (set-buffer-modified-p nil)
+      (delete-auto-save-file-if-necessary t)
+      (message-disassociate-draft)
+      ;; Delete other mail buffers and stuff.
+      (message-do-send-housekeeping)
+      (message-do-actions message-send-actions)
+      ;; Return success.
+      t)))
 
 (defun message-send-via-mail (arg)
   "Send the current message via mail."
@@ -1959,18 +2030,27 @@ the user from the mailer."
   "Send the current message via news."
   (funcall message-send-news-function arg))
 
+(defmacro message-check (type &rest forms)
+  "Eval FORMS if TYPE is to be checked."
+  `(or (message-check-element ,type)
+       (save-excursion
+        ,@forms)))
+
+(put 'message-check 'lisp-indent-function 1)
+(put 'message-check 'edebug-form-spec '(form body))
+
 (defun message-fix-before-sending ()
   "Do various things to make the message nice before sending it."
   ;; Make sure there's a newline at the end of the message.
   (goto-char (point-max))
   (unless (bolp)
     (insert "\n"))
-  ;; Make all invisible text visible.
-  ;;(when (text-property-any (point-min) (point-max) 'invisible t)
-  ;;  (put-text-property (point-min) (point-max) 'invisible nil)
-  ;;  (unless (yes-or-no-p "Invisible text found and made visible; continue posting?")
-  ;;    (error "Invisible text found and made visible")))
-  )
+  ;; Delete all invisible text.
+  (message-check 'invisible-text
+    (when (text-property-any (point-min) (point-max) 'invisible t)
+      (put-text-property (point-min) (point-max) 'invisible nil)
+      (unless (yes-or-no-p "Invisible text found and made visible; continue posting? ")
+       (error "Invisible text found and made visible")))))
 
 (defun message-add-action (action &rest types)
   "Add ACTION to be performed when doing an exit of type TYPES."
@@ -2005,8 +2085,10 @@ the user from the mailer."
       (let ((message-deletable-headers
             (if news nil message-deletable-headers)))
        (message-generate-headers message-required-mail-headers))
+      (mail-encode-encoded-word-buffer)
       ;; Let the user do all of the above.
       (run-hooks 'message-header-hook))
+    (message-encode-message-body)
     (unwind-protect
        (save-excursion
          (set-buffer tembuf)
@@ -2175,17 +2257,17 @@ to find out how to use this."
       (message-narrow-to-headers)
       ;; Insert some headers.
       (message-generate-headers message-required-news-headers)
+      (mail-encode-encoded-word-buffer)
       ;; Let the user do all of the above.
       (run-hooks 'message-header-hook))
     (message-cleanup-headers)
     (if (not (message-check-news-syntax))
-       (progn
-         ;;(message "Posting not performed")
-         nil)
+       nil
+      (message-encode-message-body)
       (unwind-protect
          (save-excursion
            (set-buffer tembuf)
-           (buffer-disable-undo (current-buffer))
+           (buffer-disable-undo)
            (erase-buffer)
            ;; Avoid copying text props.
            (insert (format
@@ -2229,15 +2311,6 @@ to find out how to use this."
 ;;; Header generation & syntax checking.
 ;;;
 
-(defmacro message-check (type &rest forms)
-  "Eval FORMS if TYPE is to be checked."
-  `(or (message-check-element ,type)
-       (save-excursion
-        ,@forms)))
-
-(put 'message-check 'lisp-indent-function 1)
-(put 'message-check 'edebug-form-spec '(form body))
-
 (defun message-check-element (type)
   "Returns non-nil if this type is not to be checked."
   (if (eq message-syntax-checks 'dont-check-for-anything-just-trust-me)
@@ -2470,7 +2543,7 @@ to find out how to use this."
           (y-or-n-p "Empty article.  Really post? "))))
    ;; Check for control characters.
    (message-check 'control-chars
-     (if (re-search-forward "[\000-\007\013\015-\037\200-\237]" nil t)
+     (if (re-search-forward "[\000-\007\013\015-\032\034-\037\200-\237]" nil t)
         (y-or-n-p
          "The article contains control characters.  Really post? ")
        t))
@@ -2511,7 +2584,7 @@ to find out how to use this."
       (while (not (eobp))
        (when (not (looking-at "[ \t\n]"))
          (setq sum (logxor (ash sum 1) (if (natnump sum) 0 1)
-                           (following-char))))
+                           (char-after))))
        (forward-char 1)))
     sum))
 
@@ -2522,7 +2595,6 @@ to find out how to use this."
        list file)
     (save-excursion
       (set-buffer (get-buffer-create " *message temp*"))
-      (buffer-disable-undo (current-buffer))
       (erase-buffer)
       (insert-buffer-substring buf)
       (save-restriction
@@ -2559,7 +2631,7 @@ to find out how to use this."
   "Append this article to Unix/babyl mail file.."
   (if (and (file-readable-p filename)
           (mail-file-babyl-p filename))
-      (gnus-output-to-rmail filename t)
+      (rmail-output-to-rmail-file filename t)
     (gnus-output-to-mail filename t)))
 
 (defun message-cleanup-headers ()
@@ -2594,11 +2666,24 @@ to find out how to use this."
        (when (re-search-forward ",+$" nil t)
          (replace-match "" t t))))))
 
-(defun message-make-date ()
-  "Make a valid data header."
-  (let ((now (current-time)))
-    (timezone-make-date-arpa-standard
-     (current-time-string now) (current-time-zone now))))
+(defun message-make-date (&optional now)
+  "Make a valid data header.
+If NOW, use that time instead."
+  (let* ((now (or now (current-time)))
+        (zone (nth 8 (decode-time now)))
+        (sign "+"))
+    (when (< zone 0)
+      (setq sign "-")
+      (setq zone (- zone)))
+    (concat
+     (format-time-string "%d" now)
+     ;; The month name of the %b spec is locale-specific.  Pfff.
+     (format " %s "
+            (capitalize (car (rassoc (nth 4 (decode-time now))
+                                     parse-time-months))))
+     (format-time-string "%Y %H:%M:%S " now)
+     ;; We do all of this because XEmacs doesn't have the %z spec.
+     (format "%s%02d%02d" sign (/ zone 3600) (% zone 3600)))))
 
 (defun message-make-message-id ()
   "Make a unique Message-ID."
@@ -2723,9 +2808,7 @@ to find out how to use this."
     ;; Add the future to current.
     (setcar current (+ (car current) (round (/ future (expt 2 16)))))
     (setcar (cdr current) (+ (nth 1 current) (% (round future) (expt 2 16))))
-    ;; Return the date in the future in UT.
-    (timezone-make-date-arpa-standard
-     (current-time-string current) (current-time-zone current) '(0 "UT"))))
+    (message-make-date current)))
 
 (defun message-make-path ()
   "Return uucp path."
@@ -2863,9 +2946,7 @@ Headers already prepared in the buffer are not modified."
           (To nil)
           (Distribution (message-make-distribution))
           (Lines (message-make-lines))
-          (X-Newsreader message-newsreader)
-          (X-Mailer (and (not (message-fetch-field "X-Newsreader"))
-                         message-mailer))
+          (User-Agent message-newsreader)
           (Expires (message-make-expires))
           (case-fold-search t)
           header value elem)
@@ -2904,7 +2985,7 @@ Headers already prepared in the buffer are not modified."
                  (progn
                    ;; The header was found.  We insert a space after the
                    ;; colon, if there is none.
-                   (if (/= (following-char) ? ) (insert " ") (forward-char 1))
+                   (if (/= (char-after) ? ) (insert " ") (forward-char 1))
                    ;; Find out whether the header is empty...
                    (looking-at "[ \t]*$")))
          ;; So we find out what value we should insert.
@@ -3013,7 +3094,7 @@ Headers already prepared in the buffer are not modified."
       (goto-char (point-min))
       (while (not (eobp))
        (skip-chars-forward "^,\"" (point-max))
-       (if (or (= (following-char) ?,)
+       (if (or (eq (char-after) ?,)
                (eobp))
            (when (not quoted)
              (if (and (> (current-column) 78)
@@ -3057,7 +3138,7 @@ Headers already prepared in the buffer are not modified."
   (let ((max 988)
        (cut 4)
        refs)
-    (nnheader-temp-write nil
+    (with-temp-buffer
       (insert references)
       (goto-char (point-min))
       (while (re-search-forward "<[^>]+>" nil t)
@@ -3078,7 +3159,7 @@ Headers already prepared in the buffer are not modified."
     (search-backward ":" )
     (widen)
     (forward-char 1)
-    (if (= (following-char) ? )
+    (if (eq (char-after) ? )
        (forward-char 1)
       (insert " ")))
    (t
@@ -3097,7 +3178,7 @@ Headers already prepared in the buffer are not modified."
    ((message-functionp message-generate-new-buffers)
     (funcall message-generate-new-buffers type to group))
    ;; Generate a new buffer name The Message Way.
-   (message-generate-new-buffers
+   ((eq message-generate-new-buffers 'unique)
     (generate-new-buffer-name
      (concat "*" type
             (if to
@@ -3107,6 +3188,16 @@ Headers already prepared in the buffer are not modified."
               "")
             (if (and group (not (string= group ""))) (concat " on " group) "")
             "*")))
+   ((eq message-generate-new-buffers 'unsent)
+    (generate-new-buffer-name
+     (concat "*unsent " type
+            (if to
+                (concat " to "
+                        (or (car (mail-extract-address-components to))
+                            to) "")
+              "")
+            (if (and group (not (string= group ""))) (concat " on " group) "")
+            "*")))
    ;; Use standard name.
    (t
     (format "*%s message*" type))))
@@ -3142,7 +3233,7 @@ Headers already prepared in the buffer are not modified."
   ;; Rename the buffer.
   (if message-send-rename-function
       (funcall message-send-rename-function)
-    (when (string-match "\\`\\*" (buffer-name))
+    (when (string-match "\\`\\*\\(unsent \\)?" (buffer-name))
       (rename-buffer
        (concat "*sent " (substring (buffer-name) (match-end 0))) t)))
   ;; Push the current buffer onto the list.
@@ -3300,10 +3391,12 @@ OTHER-HEADERS is an alist of header/value pairs."
 
       ;; Handle special values of Mail-Copies-To.
       (when mct
-       (cond ((equal (downcase mct) "never")
+       (cond ((or (equal (downcase mct) "never")
+                  (equal (downcase mct) "nobody"))
               (setq never-mct t)
               (setq mct nil))
-             ((equal (downcase mct) "always")
+             ((or (equal (downcase mct) "always")
+                  (equal (downcase mct) "poster"))
               (setq mct (or reply-to from)))))
 
       (unless follow-to
@@ -3470,8 +3563,10 @@ responses here are directed to other newsgroups."))
             `((References . ,(concat (or references "") (and references " ")
                                      (or message-id "")))))
        ,@(when (and mct
-                   (not (equal (downcase mct) "never")))
-          (list (cons 'Cc (if (equal (downcase mct) "always")
+                   (not (or (equal (downcase mct) "never")
+                            (equal (downcase mct) "nobody"))))
+          (list (cons 'Cc (if (or (equal (downcase mct) "always")
+                                  (equal (downcase mct) "poster"))
                               (or reply-to from "")
                             mct)))))
 
@@ -3510,7 +3605,6 @@ responses here are directed to other newsgroups."))
          (error "This article is not yours"))
        ;; Make control message.
        (setq buf (set-buffer (get-buffer-create " *message cancel*")))
-       (buffer-disable-undo (current-buffer))
        (erase-buffer)
        (insert "Newsgroups: " newsgroups "\n"
                "From: " (message-make-from) "\n"
@@ -3585,7 +3679,7 @@ header line with the old Message-ID."
 
 (defun message-wash-subject (subject)
   "Remove junk like \"Re:\", \"(fwd)\", etc. that was added to the subject by previous forwarders, replyers, etc."
-  (nnheader-temp-write nil
+  (with-temp-buffer
     (insert-string subject)
     (goto-char (point-min))
     ;; strip Re/Fwd stuff off the beginning
@@ -3701,7 +3795,6 @@ Optional NEWS will use news to forward instead of mail."
          beg)
       ;; We first set up a normal mail buffer.
       (set-buffer (get-buffer-create " *message resend*"))
-      (buffer-disable-undo (current-buffer))
       (erase-buffer)
       (message-setup `((To . ,address)))
       ;; Insert our usual headers.
@@ -3734,7 +3827,8 @@ Optional NEWS will use news to forward instead of mail."
       (when (looking-at "From ")
        (replace-match "X-From-Line: "))
       ;; Send it.
-      (message-send-mail)
+      (let (message-required-mail-headers)
+       (message-send-mail))
       (kill-buffer (current-buffer)))
     (message "Resending message to %s...done" address)))
 
@@ -3854,7 +3948,7 @@ which specify the range to operate on."
       (goto-char (min start end))
       (while (< (point) end1)
        (or (looking-at "[_\^@- ]")
-           (insert (following-char) "\b"))
+           (insert (char-after) "\b"))
        (forward-char 1)))))
 
 ;;;###autoload
@@ -3868,7 +3962,7 @@ which specify the range to operate on."
       (move-marker end1 (max start end))
       (goto-char (min start end))
       (while (re-search-forward "\b" end1 t)
-       (if (eq (following-char) (char-after (- (point) 2)))
+       (if (eq (char-after) (char-after (- (point) 2)))
            (delete-char -2))))))
 
 (defalias 'message-exchange-point-and-mark 'exchange-point-and-mark)
@@ -3927,7 +4021,7 @@ Do a `tab-to-tab-stop' if not in those headers."
          (message "No matching groups")
        (save-selected-window
          (pop-to-buffer "*Completions*")
-         (buffer-disable-undo (current-buffer))
+         (buffer-disable-undo)
          (let ((buffer-read-only nil))
            (erase-buffer)
            (let ((standard-output (current-buffer)))
@@ -4004,6 +4098,52 @@ regexp varstr."
       (setq idx (1+ idx)))
     string))
 
+;;;
+;;; MIME functions
+;;;
+
+(defun message-insert-mime-part (file type)
+  "Insert a multipart/alternative part into the buffer."
+  (interactive
+   (let* ((file (read-file-name "Insert file: " nil nil t))
+         (type (mm-default-file-encoding file)))
+     (list file
+          (completing-read
+           (format "MIME type for %s: " file)
+           (delete-duplicates
+            (mapcar (lambda (m) (list (cdr m))) mailcap-mime-extensions))
+           nil nil type))))
+  (insert (format "<#part type=%s filename=\"%s\"><#/part>\n"
+                 type file)))
+
+(defun message-encode-message-body ()
+  (let (lines multipart-p)
+    (message-goto-body)
+    (save-restriction
+      (narrow-to-region (point) (point-max))
+      (let ((new (mml-generate-mime)))
+       (delete-region (point-min) (point-max))
+       (insert new)
+       (goto-char (point-min))
+       (if (eq (aref new 0) ?\n)
+           (delete-char 1)
+         (search-forward "\n\n")
+         (setq lines (buffer-substring (point-min) (1- (point))))
+         (delete-region (point-min)  (point)))))
+    (save-restriction
+      (message-narrow-to-headers-or-head)
+      (message-remove-header "Mime-Version")
+      (goto-char (point-max))
+      (insert "Mime-Version: 1.0\n")
+      (when lines
+       (insert lines))
+      (setq multipart-p 
+           (re-search-backward "^Content-Type: multipart/" nil t)))
+    (when multipart-p
+      (message-goto-body)
+      (insert "This is a MIME multipart message.  If you are reading\n")
+      (insert "this, you shouldn't.\n"))))
+
 (run-hooks 'message-load-hook)
 
 (provide 'message)
index 7e3edd3..52619dd 100644 (file)
@@ -100,8 +100,8 @@ If it is non-nil, it must be a toolbar.  The five legal values are
   "Create a rot table with offset N."
   (let ((i -1)
        (table (make-string 256 0))
-       (a (char-int ?a))
-       (A (char-int ?A)))
+       (a (mm-char-int ?a))
+       (A (mm-char-int ?A)))
     (while (< (incf i) 256)
       (aset table i i))
     (concat
index 3920f9a..01c4773 100644 (file)
 
 ;;; Code:
 
+(require 'mm-util)
+(require 'mm-bodies)
+(require 'mm-encode)
+
 (defvar mml-syntax-table
   (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
     (modify-syntax-entry ?\\ "/" table)
@@ -50,7 +54,7 @@
   "Parse the current buffer as an MML document."
   (let (struct)
     (while (and (not (eobp))
-               (not (looking-at "</#multipart")))
+               (not (looking-at "<#/multipart")))
       (cond
        ((looking-at "<#multipart")
        (push (nconc (mml-read-tag) (mml-parse-1)) struct))
       (buffer-substring beg (goto-char (point-max))))))
 
 (defvar mml-boundary nil)
+(defvar mml-base-boundary "=-=-=")
 (defvar mml-multipart-number 0)
 
 (defun mml-generate-mime ()
   "Generate a MIME message based on the current MML document."
-  (setq mml-boundary "-=-=")
   (let ((cont (mml-parse))
        (mml-multipart-number 0))
     (with-temp-buffer
 
 (defun mml-compute-boundary (cont)
   "Return a unique boundary that does not exist in CONT."
-  (let ((mml-boundary (concat (make-string (incf mml-multipart-number) ?=)
-                             mml-boundary)))
+  (let ((mml-boundary (mml-make-boundary)))
     ;; This function tries again and again until it has found
     ;; a unique boundary.
     (while (not (catch 'not-unique
     mml-boundary))
 
 (defun mml-compute-boundary-1 (cont)
-  (cond
-   ((eq (car cont) 'part)
-    (with-temp-buffer
-      (if (setq filename (cdr (assq 'filename cont)))
-         (insert-file-contents-literally filename)
-       (insert (cdr (assq 'contents cont))))
-      (goto-char (point-min))
-      (when (re-search-forward (concat "^--" mml-boundary) nil t)
-       (setq mml-boundary
-             (concat (make-string (incf mml-multipart-number) ?=)
-                             mml-boundary))
-       (throw 'not-unique nil))))
-   ((eq (car cont) 'multipart)
-    (mapcar 'mml-compute-boundary-1 (cddr cont))))
-  t)
+  (let (filename)
+    (cond
+     ((eq (car cont) 'part)
+      (with-temp-buffer
+       (if (setq filename (cdr (assq 'filename cont)))
+           (insert-file-contents-literally filename)
+         (insert (cdr (assq 'contents cont))))
+       (goto-char (point-min))
+       (when (re-search-forward (concat "^--" mml-boundary) nil t)
+         (setq mml-boundary (mml-make-boundary))
+         (throw 'not-unique nil))))
+     ((eq (car cont) 'multipart)
+      (mapcar 'mml-compute-boundary-1 (cddr cont))))
+    t))
+
+(defun mml-make-boundary ()
+  (concat (mml-make-string (% (incf mml-multipart-number) 60) "=")
+         (if (> mml-multipart-number 17)
+             (format "%x" mml-multipart-number)
+           "")
+         mml-base-boundary))
+
+(defun mml-make-string (num string)
+  (let ((out ""))
+    (while (not (zerop (decf num)))
+      (setq out (concat out string)))
+    out))
 
 (provide 'mml)
 
index 8e89182..15fa72c 100644 (file)
 
 (deffoo nnagent-request-post (&optional server)
   (gnus-agent-insert-meta-information 'news gnus-command-method)
-  (gnus-request-accept-article "nndraft:queue"))
+  (gnus-request-accept-article "nndraft:queue" nil t t))
 
 ;; Use nnml functions for just about everything.
 (nnoo-import nnagent
index def1e0c..8bdae37 100644 (file)
            start end number)
        (set-buffer (setq nnbabyl-mbox-buffer
                          (nnheader-find-file-noselect
-                          nnbabyl-mbox-file nil 'raw)))
+                          nnbabyl-mbox-file nil t)))
        ;; Save previous buffer mode.
        (setq nnbabyl-previous-buffer-mode
              (cons (cons (point-min) (point-max))
                    major-mode))
 
-       (buffer-disable-undo (current-buffer))
+       (buffer-disable-undo)
        (widen)
        (setq buffer-read-only nil)
        (fundamental-mode)
index 0a0f3ef..17f5359 100644 (file)
@@ -70,7 +70,6 @@
   (autoload 'cancel-timer "timer")
   (autoload 'telnet "telnet" nil t)
   (autoload 'telnet-send-input "telnet" nil t)
-  (autoload 'timezone-parse-date "timezone")
   (autoload 'gnus-declare-backend "gnus-start"))
 
 ;; Declare nndb as derived from nntp
@@ -181,8 +180,7 @@ article was posted to nndb")
                   msg))
        (if (nnmail-expired-article-p
             group
-            (gnus-encode-date
-             (substring msg (match-beginning 1) (match-end 1)))
+            (date-to-time (substring msg (match-beginning 1) (match-end 1)))
             force)
            (progn
              (setq delete-list (concat delete-list " " (int-to-string art)))
index 0da245a..be026de 100644 (file)
@@ -143,10 +143,13 @@ from the document.")
 (defvoo nndoc-head-begin-function nil)
 (defvoo nndoc-body-end nil)
 ;; nndoc-dissection-alist is a list of sublists.  Each sublist holds the
-;; following items.  ARTICLE is an ordinal starting at 1.  HEAD-BEGIN,
-;; HEAD-END, BODY-BEGIN and BODY-END are positions in the `nndoc' buffer.
-;; LINE-COUNT is a count of lines in the body.  SUBJECT, MESSAGE-ID and
-;; REFERENCES, only present for MIME dissections, are field values.
+;; following items.  ARTICLE act as the association key and is an ordinal
+;; starting at 1.  HEAD-BEGIN [0], HEAD-END [1], BODY-BEGIN [2] and BODY-END
+;; [3] are positions in the `nndoc' buffer.  LINE-COUNT [4] is a count of
+;; lines in the body.  For MIME dissections only, ARTICLE-INSERT [5] and
+;; SUMMARY-INSERT [6] give headers to insert for full article or summary line
+;; generation, respectively.  Other headers usually follow directly from the
+;; buffer.  Value `nil' means no insert.
 (defvoo nndoc-dissection-alist nil)
 (defvoo nndoc-prepare-body-function nil)
 (defvoo nndoc-generate-head-function nil)
@@ -158,8 +161,6 @@ from the document.")
 (defvoo nndoc-current-buffer nil
   "Current nndoc news buffer.")
 (defvoo nndoc-address nil)
-(defvoo nndoc-mime-header nil)
-(defvoo nndoc-mime-subject nil)
 
 (defconst nndoc-version "nndoc 1.0"
   "nndoc version.")
@@ -187,7 +188,7 @@ from the document.")
                (insert-buffer-substring
                 nndoc-current-buffer (car entry) (nth 1 entry)))
              (goto-char (point-max))
-             (unless (= (char-after (1- (point))) ?\n)
+             (unless (eq (char-after (1- (point))) ?\n)
                (insert "\n"))
              (insert (format "Lines: %d\n" (nth 4 entry)))
              (insert ".\n")))
@@ -289,7 +290,7 @@ from the document.")
       (setq nndoc-dissection-alist nil)
       (save-excursion
        (set-buffer nndoc-current-buffer)
-       (buffer-disable-undo (current-buffer))
+       (mm-enable-multibyte)
        (erase-buffer)
        (if (stringp nndoc-address)
            (nnheader-insert-file-contents nndoc-address)
@@ -454,36 +455,25 @@ from the document.")
     (when (and limit
                (re-search-forward
                 (concat "\
-^Content-Type:[ \t]*multipart/[a-z]+;\\(.*;\\)*"
+^Content-Type:[ \t]*multipart/[a-z]+ *;\\(.*;\\)*"
                         "[ \t\n]*[ \t]boundary=\"?[^\"\n]*[^\" \t\n]")
           limit t))
       t)))
 
 (defun nndoc-transform-mime-parts (article)
-  (unless (= article 1)
-    ;; Ensure some MIME-Version.
+  (let* ((entry (cdr (assq article nndoc-dissection-alist)))
+        (headers (nth 5 entry)))
+    (when headers
     (goto-char (point-min))
-    (search-forward "\n\n")
-    (let ((case-fold-search nil)
-         (limit (point)))
-      (goto-char (point-min))
-      (or (save-excursion (re-search-forward "^MIME-Version:" limit t))
-         (insert "Mime-Version: 1.0\n")))
-    ;; Generate default header before entity fields.
-    (goto-char (point-min))
-    (nndoc-generate-mime-parts-head article t)))
-
-(defun nndoc-generate-mime-parts-head (article &optional body-present)
-  (let ((entry (cdr (assq (if body-present 1 article) nndoc-dissection-alist))))
-    (let ((subject (if body-present
-                      nndoc-mime-subject
-                    (concat "<" (nth 5 entry) ">")))
-         (message-id (nth 6 entry))
-         (references (nth 7 entry)))
-      (insert nndoc-mime-header)
-      (and subject (insert "Subject: " subject "\n"))
-      (and message-id (insert "Message-ID: " message-id "\n"))
-      (and references (insert "References: " references "\n")))))
+      (insert headers))))
+
+(defun nndoc-generate-mime-parts-head (article)
+  (let* ((entry (cdr (assq article nndoc-dissection-alist)))
+        (headers (nth 6 entry)))
+    (when headers
+      (insert headers))
+    (insert-buffer-substring
+     nndoc-current-buffer (car entry) (nth 1 entry))))
 
 (defun nndoc-clari-briefs-type-p ()
   (when (let ((case-fold-search nil))
@@ -669,92 +659,127 @@ the header of this entity, and one article per sub-entity."
        nndoc-mime-split-ordinal 0)
   (save-excursion
     (set-buffer nndoc-current-buffer)
-    (message-narrow-to-head)
-    (let ((case-fold-search t)
-         (message-id (message-fetch-field "Message-ID"))
-         (references (message-fetch-field "References")))
-      (setq nndoc-mime-header (buffer-substring (point-min) (point-max))
-           nndoc-mime-subject (message-fetch-field "Subject"))
-      (while (string-match "\
-^\\(Subject\\|Message-ID\\|References\\|Lines\\|\
-MIME-Version\\|Content-Type\\|Content-Transfer-Encoding\\|\
-\\):.*\n\\([ \t].*\n\\)*"
-                          nndoc-mime-header)
-       (setq nndoc-mime-header (replace-match "" t t nndoc-mime-header)))
-      (widen)
-      (nndoc-dissect-mime-parts-sub (point-min) (point-max)
-                                   nil message-id references))))
-
-(defun nndoc-dissect-mime-parts-sub (begin end position message-id references)
-  "Dissect an entity within a composite MIME message.
-The article, which corresponds to a MIME entity, extends from BEGIN to END.
+    (nndoc-dissect-mime-parts-sub (point-min) (point-max) nil nil nil)))
+
+(defun nndoc-dissect-mime-parts-sub (head-begin body-end article-insert
+                                               position parent)
+  "Dissect an entity, within a composite MIME message.
+The complete message or MIME entity extends from HEAD-BEGIN to BODY-END.
+ARTICLE-INSERT should be added at beginning for generating a full article.
 The string POSITION holds a dotted decimal representation of the article
 position in the hierarchical structure, it is nil for the outer entity.
-The generated article should use MESSAGE-ID and REFERENCES field values."
-  ;; Note: `case-fold-search' is already `t' from the calling function.
-  (let ((head-begin begin)
-       (body-end end)
-       head-end body-begin type subtype composite comment)
-    (save-excursion
+PARENT is the message-ID of the parent summary line, or nil for none."
+  (let ((case-fold-search t)
+       (message-id (nnmail-message-id))
+       head-end body-begin summary-insert message-rfc822 multipart-any
+       subject content-type type subtype boundary-regexp)
       ;; Gracefully handle a missing body.
       (goto-char head-begin)
       (if (search-forward "\n\n" body-end t)
          (setq head-end (1- (point))
                body-begin (point))
-       (setq head-end end
-             body-begin end))
+      (setq head-end body-end
+           body-begin body-end))
+    (narrow-to-region head-begin head-end)
       ;; Save MIME attributes.
       (goto-char head-begin)
-      (if (re-search-forward "\
-^Content-Type: *\\([^ \t\n/;]+\\)/\\([^ \t\n/;]+\\)"
-                            head-end t)
-         (setq type (downcase (match-string 1))
-               subtype (downcase (match-string 2)))
+    (setq content-type (message-fetch-field "Content-Type"))
+    (when content-type
+      (when (string-match "^ *\\([^ \t\n/;]+\\)/\\([^ \t\n/;]+\\)" content-type)
+       (setq type (downcase (match-string 1 content-type))
+             subtype (downcase (match-string 2 content-type))
+             message-rfc822 (and (string= type "message")
+                                 (string= subtype "rfc822"))
+             multipart-any (string= type "multipart")))
+      (when (string-match ";[ \t\n]*name=\\([^ \t\n;]+\\)" content-type)
+       (setq subject (match-string 1 content-type)))
+      (when (string-match "boundary=\"?\\([^\"\n]*[^\" \t\n]\\)" content-type)
+       (setq boundary-regexp (concat "^--"
+                                     (regexp-quote
+                                      (match-string 1 content-type))
+                                     "\\(--\\)?[ \t]*\n"))))
+    (unless subject
+      (when (or multipart-any (not article-insert))
+       (setq subject (message-fetch-field "Subject"))))
+    (unless type
        (setq type "text"
              subtype "plain"))
-      (setq composite (string= type "multipart")
-           comment (concat position
-                           (when (and position composite) ".")
-                           (when composite "*")
-                           (when (or position composite) " ")
+    ;; Prepare the article and summary inserts.
+    (unless article-insert
+      (setq article-insert (buffer-substring (point-min) (point-max))
+           head-end head-begin))
+    (setq summary-insert article-insert)
+    ;; - summary Subject.
+    (setq summary-insert
+         (let ((line (concat "Subject: <" position
+                             (and position multipart-any ".")
+                             (and multipart-any "*")
+                             (and (or position multipart-any) " ")
                            (cond ((string= subtype "plain") type)
                                  ((string= subtype "basic") type)
-                                 (t subtype))))
+                                   (t subtype))
+                             ">"
+                             (and subject " ")
+                             subject
+                             "\n")))
+           (if (string-match "Subject:.*\n\\([ \t].*\n\\)*" summary-insert)
+               (replace-match line t t summary-insert)
+             (concat summary-insert line))))
+    ;; - summary Message-ID.
+    (setq summary-insert
+         (let ((line (concat "Message-ID: " message-id "\n")))
+           (if (string-match "Message-ID:.*\n\\([ \t].*\n\\)*" summary-insert)
+               (replace-match line t t summary-insert)
+             (concat summary-insert line))))
+    ;; - summary References.
+    (when parent
+      (setq summary-insert
+           (let ((line (concat "References: " parent "\n")))
+             (if (string-match "References:.*\n\\([ \t].*\n\\)*"
+                               summary-insert)
+                 (replace-match line t t summary-insert)
+               (concat summary-insert line)))))
       ;; Generate dissection information for this entity.
       (push (list (incf nndoc-mime-split-ordinal)
                  head-begin head-end body-begin body-end
                  (count-lines body-begin body-end)
-                 comment message-id references)
+               article-insert summary-insert)
            nndoc-dissection-alist)
       ;; Recurse for all sub-entities, if any.
-      (goto-char head-begin)
-      (when (re-search-forward
-            (concat "\
-^Content-Type: *multipart/\\([a-z]+\\);\\(.*;\\)*"
-                    "[ \t\n]*[ \t]boundary=\"?\\([^\"\n]*[^\" \t\n]\\)")
-          head-end t)
-       (let ((boundary (concat "\n--" (match-string 3) "\\(--\\)?[ \t]*\n"))
-             (part-counter 0)
-             begin end eof-flag)
-         (goto-char head-end)
-         (setq eof-flag (not (re-search-forward boundary body-end t)))
+    (widen)
+    (cond
+     (message-rfc822
+      (save-excursion
+       (nndoc-dissect-mime-parts-sub body-begin body-end nil
+                                     position message-id)))
+     ((and multipart-any boundary-regexp)
+      (let ((part-counter 0)
+           part-begin part-end eof-flag)
+       (while (string-match "\
+^\\(Lines\\|Content-\\(Type\\|Transfer-Encoding\\)\\):.*\n\\([ \t].*\n\\)*"
+                            article-insert)
+         (setq article-insert (replace-match "" t t article-insert)))
+       (let ((case-fold-search nil))
+         (goto-char body-begin)
+         (setq eof-flag (not (re-search-forward boundary-regexp body-end t)))
          (while (not eof-flag)
-           (setq begin (point))
-           (cond ((re-search-forward boundary body-end t)
+           (setq part-begin (point))
+           (cond ((re-search-forward boundary-regexp body-end t)
                   (or (not (match-string 1))
                       (string= (match-string 1) "")
                       (setq eof-flag t))
                   (forward-line -1)
-                  (setq end (point))
+                  (setq part-end (point))
                   (forward-line 1))
-                 (t (setq end body-end
+                 (t (setq part-end body-end
                           eof-flag t)))
-           (nndoc-dissect-mime-parts-sub begin end
-                                         (concat position (when position ".")
-                                                 (format "%d"
-                                                         (incf part-counter)))
-                                         (nnmail-message-id)
-                                         message-id)))))))
+           (save-excursion
+             (nndoc-dissect-mime-parts-sub
+              part-begin part-end article-insert
+              (concat position
+                      (and position ".")
+                      (format "%d" (incf part-counter)))
+              message-id)))))))))
 
 ;;;###autoload
 (defun nndoc-add-type (definition &optional position)
index c6f23c4..912893e 100644 (file)
   (save-excursion
     (set-buffer nntp-server-buffer)
     (erase-buffer)
-    (let* ((buf (get-buffer-create " *draft headers*"))
-          article)
-      (set-buffer buf)
-      (buffer-disable-undo (current-buffer))
-      (erase-buffer)
+    (let* (article)
       ;; We don't support fetching by Message-ID.
       (if (stringp (car articles))
          'headers
        (while articles
-         (set-buffer buf)
+         (narrow-to-region (point) (point))
          (when (nndraft-request-article
                 (setq article (pop articles)) group server (current-buffer))
            (goto-char (point-min))
                (forward-line -1)
              (goto-char (point-max)))
            (delete-region (point) (point-max))
-           (set-buffer nntp-server-buffer)
-           (goto-char (point-max))
+           (goto-char (point-min))
            (insert (format "221 %d Article retrieved.\n" article))
-           (insert-buffer-substring buf)
+           (widen)
+           (goto-char (point-max))
            (insert ".\n")))
 
        (nnheader-fold-continuation-lines)
   (let ((gnus-verbose-backends nil)
        (buf (current-buffer))
         article file)
-    (nnheader-temp-write nil
+    (with-temp-buffer
       (insert-buffer buf)
       (setq article (nndraft-request-accept-article
-                    group (nnoo-current-server 'nndraft) t 'noinsert))
-      (setq file (nndraft-article-filename article)))
-    (setq buffer-file-name (expand-file-name file))
-    (setq buffer-auto-save-file-name (make-auto-save-file-name))
+                    group (nnoo-current-server 'nndraft) t 'noinsert)
+           file (nndraft-article-filename article)))
+    (setq buffer-file-name (expand-file-name file)
+         buffer-auto-save-file-name (make-auto-save-file-name))
     (clear-visited-file-modtime)
     article))
 
index 7da5466..8048849 100644 (file)
@@ -68,8 +68,6 @@ If this variable is nil, no files will be excluded.")
 
 \f
 
-(autoload 'gnus-encode-coding-string "gnus-ems")
-
 ;;; Interface functions.
 
 (nnoo-define-basics nneething)
@@ -243,7 +241,7 @@ If this variable is nil, no files will be excluded.")
        (setq files (cdr files)))
       (when (and touched
                 (not nneething-read-only))
-       (nnheader-temp-write map-file
+       (with-temp-file map-file
          (insert "(setq nneething-map '")
          (gnus-prin1 nneething-map)
          (insert ")\n(setq nneething-active '")
@@ -316,7 +314,7 @@ If this variable is nil, no files will be excluded.")
   (save-excursion
     (set-buffer (get-buffer-create nneething-work-buffer))
     (setq case-fold-search nil)
-    (buffer-disable-undo (current-buffer))
+    (buffer-disable-undo)
     (erase-buffer)
     (cond
      ((not (file-exists-p file))
@@ -344,10 +342,13 @@ If this variable is nil, no files will be excluded.")
 
 (defun nneething-file-name (article)
   "Return the file name of ARTICLE."
-  (concat (file-name-as-directory nneething-address)
-         (if (numberp article)
-             (cadr (assq article nneething-map))
-           article)))
+  (let ((dir (file-name-as-directory nneething-address))
+        fname)
+    (if (numberp article)
+       (if (setq fname (cadr (assq article nneething-map)))
+           (concat dir fname)
+         (make-temp-name (concat dir "nneething")))
+      (concat dir article))))
 
 (provide 'nneething)
 
index db9666b..5d0d80f 100644 (file)
@@ -328,7 +328,6 @@ time saver for large mailboxes.")
        (nnfolder-request-article article group server)
        (save-excursion
         (set-buffer buf)
-        (buffer-disable-undo (current-buffer))
         (erase-buffer)
         (insert-buffer-substring nntp-server-buffer)
         (goto-char (point-min))
@@ -511,17 +510,20 @@ Returns t if successful, nil otherwise."
   "Delete the message that point is in.
 If optional argument LEAVE-DELIM is t, then mailbox delimiter is not
 deleted.  Point is left where the deleted region was."
-  (delete-region
-   (save-excursion
-     (forward-line 1) ; in case point is at beginning of message already
-     (nnmail-search-unix-mail-delim-backward)
-     (if leave-delim (progn (forward-line 1) (point))
-       (point)))
-   (progn
-     (forward-line 1)
-     (if (nnmail-search-unix-mail-delim)
-        (point)
-       (point-max)))))
+  (save-restriction
+    (narrow-to-region
+     (save-excursion
+       (forward-line 1)                        ; in case point is at beginning of message already
+       (nnmail-search-unix-mail-delim-backward)
+       (if leave-delim (progn (forward-line 1) (point))
+        (point)))
+     (progn
+       (forward-line 1)
+       (if (nnmail-search-unix-mail-delim)
+          (point)
+        (point-max))))
+    (run-hooks 'nnfolder-delete-mail-hook)
+    (delete-region (point-min) (point-max))))
 
 (defun nnfolder-possibly-change-group (group &optional server dont-check)
   ;; Change servers.
@@ -702,7 +704,7 @@ deleted.  Point is left where the deleted region was."
              (minid (lsh -1 -1))
              maxid start end newscantime
              buffer-read-only)
-         (buffer-disable-undo (current-buffer))
+         (buffer-disable-undo)
          (setq maxid (cdr active))
          (goto-char (point-min))
 
@@ -797,7 +799,8 @@ deleted.  Point is left where the deleted region was."
 
 (defun nnfolder-group-pathname (group)
   "Make pathname for GROUP."
-  (setq group (gnus-encode-coding-string group nnmail-pathname-coding-system))
+  (setq group
+       (mm-encode-coding-string group nnmail-pathname-coding-system))
   (let ((dir (file-name-as-directory (expand-file-name nnfolder-directory))))
     ;; If this file exists, we use it directly.
     (if (or nnmail-use-long-file-names
index c580ac5..51e20ad 100644 (file)
@@ -55,7 +55,7 @@ parameter -- the gateway address.")
            (nngateway-open-server server))
     ;; Rewrite the header.
     (let ((buf (current-buffer)))
-      (nnheader-temp-write nil
+      (with-temp-buffer
        (insert-buffer-substring buf)
        (message-narrow-to-head)
        (funcall nngateway-header-transformation nngateway-address)
index bc725b6..5f685a3 100644 (file)
@@ -40,6 +40,7 @@
 (eval-when-compile (require 'cl))
 
 (require 'mail-utils)
+(require 'mm-util)
 
 (defvar nnheader-max-head-length 4096
   "*Max length of the head of articles.")
@@ -61,8 +62,7 @@ on your system, you could say something like:
  (autoload 'cancel-function-timers "timers")
  (autoload 'gnus-point-at-eol "gnus-util")
  (autoload 'gnus-delete-line "gnus-util")
- (autoload 'gnus-buffer-live-p "gnus-util")
- (autoload 'gnus-encode-coding-string "gnus-ems"))
+ (autoload 'gnus-buffer-live-p "gnus-util"))
 
 ;;; Header access macros.
 
@@ -140,14 +140,23 @@ on your system, you could say something like:
   "Set article xref of HEADER to xref."
   `(aset ,header 8 ,xref))
 
+(defmacro mail-header-extra (header)
+  "Return the extra headers in HEADER."
+  `(aref ,header 9))
+
+(defmacro mail-header-set-extra (header extra)
+  "Set the extra headers in HEADER to EXTRA."
+  `(aset ,header 9 ',extra))
+
 (defun make-mail-header (&optional init)
   "Create a new mail header structure initialized with INIT."
-  (make-vector 9 init))
+  (make-vector 10 init))
 
 (defun make-full-mail-header (&optional number subject from date id
-                                       references chars lines xref)
+                                       references chars lines xref
+                                       extra)
   "Create a new mail header structure initialized with the parameters given."
-  (vector number subject from date id references chars lines xref))
+  (vector number subject from date id references chars lines xref extra))
 
 ;; fake message-ids: generation and detection
 
@@ -257,7 +266,20 @@ on your system, you could say something like:
           (progn
             (goto-char p)
             (and (search-forward "\nxref: " nil t)
-                 (nnheader-header-value)))))
+                 (nnheader-header-value)))
+          
+          ;; Extra.
+          (when nnmail-extra-headers
+            (let ((extra nnmail-extra-headers)
+                  out)
+              (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))
+              out))))
       (when naked
        (goto-char (point-min))
        (delete-char 1)))))
@@ -270,13 +292,21 @@ on your system, you could say something like:
 
 (defmacro nnheader-nov-read-integer ()
   '(prog1
-       (if (= (following-char) ?\t)
+       (if (eq (char-after) ?\t)
           0
         (let ((num (ignore-errors (read (current-buffer)))))
           (if (numberp num) num 0)))
      (or (eobp) (forward-char 1))))
 
-;; (defvar nnheader-none-counter 0)
+(defmacro nnheader-nov-parse-extra ()
+  '(let (out string)
+     (while (not (memq (char-after) '(?\n nil)))
+       (setq string (nnheader-nov-field))
+       (when (string-match "^\\([^ :]+\\): " string)
+        (push (cons (intern (match-string 1 string))
+                    (substring string (match-end 0)))
+              out)))
+     out))
 
 (defun nnheader-parse-nov ()
   (let ((eol (gnus-point-at-eol)))
@@ -290,10 +320,10 @@ on your system, you could say something like:
      (nnheader-nov-field)              ; refs
      (nnheader-nov-read-integer)       ; chars
      (nnheader-nov-read-integer)       ; lines
-     (if (= (following-char) ?\n)
+     (if (eq (char-after) ?\n)
         nil
        (nnheader-nov-field))           ; misc
-     )))
+     (nnheader-nov-parse-extra))))     ; extra
 
 (defun nnheader-insert-nov (header)
   (princ (mail-header-number header) (current-buffer))
@@ -311,7 +341,16 @@ on your system, you could say something like:
   (princ (or (mail-header-lines header) 0) (current-buffer))
   (insert "\t")
   (when (mail-header-xref header)
-    (insert "Xref: " (mail-header-xref header) "\t"))
+    (insert "Xref: " (mail-header-xref header)))
+  (when (or (mail-header-xref header)
+           (mail-header-extra header))
+    (insert "\t"))
+  (when (mail-header-extra header)
+    (let ((extra (mail-header-extra header)))
+      (while extra
+       (insert (symbol-name (caar extra))
+               ": " (cdar extra) "\t")
+        (pop extra))))
   (insert "\n"))
 
 (defun nnheader-insert-article-line (article)
@@ -399,6 +438,7 @@ the line could be found."
   (save-excursion
     (unless (gnus-buffer-live-p nntp-server-buffer)
       (setq nntp-server-buffer (get-buffer-create " *nntpd*")))
+    (mm-enable-multibyte)
     (set-buffer nntp-server-buffer)
     (erase-buffer)
     (kill-all-local-variables)
@@ -445,7 +485,7 @@ the line could be found."
       nil
     (narrow-to-region (point-min) (1- (point)))
     (goto-char (point-min))
-    (while (looking-at "[A-Z][^ \t]+:.*\n\\([ \t].*\n\\)*\\|From .*\n")
+    (while (looking-at "[a-zA-Z][^ \t]+:.*\n\\([ \t].*\n\\)*\\|From .*\n")
       (goto-char (match-end 0)))
     (prog1
        (eobp)
@@ -493,57 +533,11 @@ the line could be found."
 (defun nnheader-set-temp-buffer (name &optional noerase)
   "Set-buffer to an empty (possibly new) buffer called NAME with undo disabled."
   (set-buffer (get-buffer-create name))
-  (buffer-disable-undo (current-buffer))
+  (buffer-disable-undo)
   (unless noerase
     (erase-buffer))
   (current-buffer))
 
-(defmacro nnheader-temp-write (file &rest forms)
-  "Create a new buffer, evaluate FORMS there, and write the buffer to FILE.
-Return the value of FORMS.
-If FILE is nil, just evaluate FORMS and don't save anything.
-If FILE is t, return the buffer contents as a string."
-  (let ((temp-file (make-symbol "temp-file"))
-       (temp-buffer (make-symbol "temp-buffer"))
-       (temp-results (make-symbol "temp-results")))
-    `(save-excursion
-       (let* ((,temp-file ,file)
-             (default-major-mode 'fundamental-mode)
-             (,temp-buffer
-              (set-buffer
-               (get-buffer-create
-                (generate-new-buffer-name " *nnheader temp*"))))
-             ,temp-results)
-        (unwind-protect
-            (progn
-              (setq ,temp-results (progn ,@forms))
-              (cond
-               ;; Don't save anything.
-               ((null ,temp-file)
-                ,temp-results)
-               ;; Return the buffer contents.
-               ((eq ,temp-file t)
-                (set-buffer ,temp-buffer)
-                (buffer-string))
-               ;; Save a file.
-               (t
-                (set-buffer ,temp-buffer)
-                ;; Make sure the directory where this file is
-                ;; to be saved exists.
-                (when (not (file-directory-p
-                            (file-name-directory ,temp-file)))
-                  (make-directory (file-name-directory ,temp-file) t))
-                ;; Save the file.
-                (write-region (point-min) (point-max)
-                              ,temp-file nil 'nomesg)
-                ,temp-results)))
-          ;; Kill the buffer.
-          (when (buffer-name ,temp-buffer)
-            (kill-buffer ,temp-buffer)))))))
-
-(put 'nnheader-temp-write 'lisp-indent-function 1)
-(put 'nnheader-temp-write 'edebug-form-spec '(form body))
-
 (defvar jka-compr-compression-info-list)
 (defvar nnheader-numerical-files
   (if (boundp 'jka-compr-compression-info-list)
@@ -688,7 +682,7 @@ without formatting."
   (or (not (numberp gnus-verbose-backends))
       (<= level gnus-verbose-backends)))
 
-(defvar nnheader-pathname-coding-system 'iso-8859-1
+(defvar nnheader-pathname-coding-system 'binary
   "*Coding system for pathname.")
 
 (defun nnheader-group-pathname (group dir &optional file)
@@ -700,7 +694,7 @@ without formatting."
         (concat dir group "/")
        ;; If not, we translate dots into slashes.
        (concat dir
-              (gnus-encode-coding-string
+              (mm-encode-coding-string
                (nnheader-replace-chars-in-string group ?. ?/)
                nnheader-pathname-coding-system)
               "/")))
@@ -760,7 +754,7 @@ If FILE, find the \".../etc/PACKAGE\" file instead."
       (when (string-match (car ange-ftp-path-format) path)
        (ange-ftp-re-read-dir path)))))
 
-(defvar nnheader-file-coding-system 'raw-text
+(defvar nnheader-file-coding-system 'no-conversion
   "Coding system used in file backends of Gnus.")
 
 (defun nnheader-insert-file-contents (filename &optional visit beg end replace)
@@ -822,8 +816,6 @@ find-file-hooks, etc.
   `(let ((new (generate-new-buffer " *nnheader replace*"))
         (cur (current-buffer))
         (start (point-min)))
-     (set-buffer new)
-     (buffer-disable-undo (current-buffer))
      (set-buffer cur)
      (goto-char (point-min))
      (while (,(if regexp 're-search-forward 'search-forward)
index c47a10d..b3e8f7d 100644 (file)
   ;; Remove NOV lines of articles that are marked as read.
   (when (and (file-exists-p (nnkiboze-nov-file-name))
             nnkiboze-remove-read-articles)
-    (nnheader-temp-write (nnkiboze-nov-file-name)
+    (with-temp-file (nnkiboze-nov-file-name)
       (let ((cur (current-buffer)))
        (nnheader-insert-file-contents (nnkiboze-nov-file-name))
        (goto-char (point-min))
@@ -230,7 +230,7 @@ Finds out what articles are to be part of the nnkiboze groups."
     ;; Load the kiboze newsrc file for this group.
     (when (file-exists-p newsrc-file)
       (load newsrc-file))
-    (nnheader-temp-write nov-file
+    (with-temp-file nov-file
       (when (file-exists-p nov-file)
        (insert-file-contents nov-file))
       (setq nov-buffer (current-buffer))
@@ -318,7 +318,7 @@ Finds out what articles are to be part of the nnkiboze groups."
        (gnus-message 3 "nnkiboze: Checking %s...done" (caar newsrc))
        (setq newsrc (cdr newsrc))))
     ;; We save the kiboze newsrc for this group.
-    (nnheader-temp-write newsrc-file
+    (with-temp-file newsrc-file
       (insert "(setq nnkiboze-newsrc '")
       (gnus-prin1 nnkiboze-newsrc)
       (insert ")\n")))
index c557fa2..c852ad8 100644 (file)
 (eval-when-compile (require 'cl))
 
 (require 'nnheader)
-(require 'timezone)
 (require 'message)
 (require 'custom)
 (require 'gnus-util)
 
 (eval-and-compile
   (autoload 'gnus-error "gnus-util")
-  (autoload 'gnus-buffer-live-p "gnus-util")
-  (autoload 'gnus-encode-coding-string "gnus-ems"))
+  (autoload 'gnus-buffer-live-p "gnus-util"))
 
 (defgroup nnmail nil
   "Reading mail with Gnus."
@@ -243,6 +241,13 @@ to be moved to."
   :group 'nnmail-retrieve
   :type 'string)
 
+(defcustom nnmail-movemail-args nil
+  "*Extra arguments to give to `nnmail-movemail-program'  to move mail from the inbox.
+The default is nil"
+  :group 'nnmail-files
+  :group 'nnmail-retrieve
+  :type 'string)
+
 (defcustom nnmail-pop-password-required nil
   "*Non-nil if a password is required when reading mail using POP."
   :group 'nnmail-retrieve
@@ -409,7 +414,7 @@ Example:
   :group 'nnmail-split
   :type '(repeat (cons :format "%v" symbol regexp)))
 
-(defcustom nnmail-delete-incoming t
+(defcustom nnmail-delete-incoming nil
   "*If non-nil, the mail backends will delete incoming files after
 splitting."
   :group 'nnmail-retrieve
@@ -444,6 +449,11 @@ parameter.  It should return nil, `warn' or `delete'."
                 (const warn)
                 (const delete)))
 
+(defcustom nnmail-extra-headers nil
+  "*Extra headers to parse."
+  :group 'nnmail
+  :type '(repeat symbol))
+
 ;;; Internal variables.
 
 (defvar nnmail-split-history nil
@@ -483,18 +493,19 @@ parameter.  It should return nil, `warn' or `delete'."
 (defun nnmail-request-post (&optional server)
   (mail-send-and-exit nil))
 
-(defvar nnmail-file-coding-system 'raw-text
+(defvar nnmail-file-coding-system 'binary
   "Coding system used in nnmail.")
 
 (defun nnmail-find-file (file)
   "Insert FILE in server buffer safely."
   (set-buffer nntp-server-buffer)
-  (erase-buffer)
+  (delete-region (point-min) (point-max))
   (let ((format-alist nil)
         (after-insert-file-functions nil))
     (condition-case ()
        (let ((coding-system-for-read nnmail-file-coding-system)
-             (pathname-coding-system 'binary))
+             (auto-mode-alist (nnheader-auto-mode-alist))
+             (pathname-coding-system nnmail-file-coding-system))
          (insert-file-contents file)
          t)
       (file-error nil))))
@@ -514,55 +525,12 @@ parameter.  It should return nil, `warn' or `delete'."
         (concat dir group "/")
        ;; If not, we translate dots into slashes.
        (concat dir
-              (gnus-encode-coding-string
+              (mm-encode-coding-string
                (nnheader-replace-chars-in-string group ?. ?/)
                nnmail-pathname-coding-system)
               "/")))
    (or file "")))
 
-(defun nnmail-date-to-time (date)
-  "Convert DATE into time."
-  (condition-case ()
-      (let* ((d1 (timezone-parse-date date))
-            (t1 (timezone-parse-time (aref d1 3))))
-       (apply 'encode-time
-              (mapcar (lambda (el)
-                        (and el (string-to-number el)))
-                      (list
-                       (aref t1 2) (aref t1 1) (aref t1 0)
-                       (aref d1 2) (aref d1 1) (aref d1 0)
-                       (number-to-string
-                        (* 60 (timezone-zone-to-minute
-                                (or (aref d1 4) (current-time-zone)))))))))
-    ;; If we get an error, then we just return a 0 time.
-    (error (list 0 0))))
-
-(defun nnmail-time-less (t1 t2)
-  "Say whether time T1 is less than time T2."
-  (or (< (car t1) (car t2))
-      (and (= (car t1) (car t2))
-          (< (nth 1 t1) (nth 1 t2)))))
-
-(defun nnmail-days-to-time (days)
-  "Convert DAYS into time."
-  (let* ((seconds (* 1.0 days 60 60 24))
-        (rest (expt 2 16))
-        (ms (condition-case nil (floor (/ seconds rest))
-              (range-error (expt 2 16)))))
-    (list ms (condition-case nil (round (- seconds (* ms rest)))
-              (range-error (expt 2 16))))))
-
-(defun nnmail-time-since (time)
-  "Return the time since TIME, which is either an internal time or a date."
-  (when (stringp time)
-    ;; Convert date strings to internal time.
-    (setq time (nnmail-date-to-time time)))
-  (let* ((current (current-time))
-        (rest (when (< (nth 1 current) (nth 1 time))
-                (expt 2 16))))
-    (list (- (+ (car current) (if rest -1 0)) (car time))
-         (- (+ (or rest 0) (nth 1 current)) (nth 1 time)))))
-
 ;; Function rewritten from rmail.el.
 (defun nnmail-move-inbox (inbox)
   "Move INBOX to `nnmail-crash-box'."
@@ -641,7 +609,9 @@ parameter.  It should return nil, `warn' or `delete'."
                              nnmail-movemail-program exec-directory)
                             nil errors nil inbox tofile)
                            (when nnmail-internal-password
-                             (list nnmail-internal-password)))))))
+                             (list nnmail-internal-password))
+                           (when nnmail-movemail-args
+                             nnmail-movemail-args))))))
                (push inbox nnmail-moved-inboxes)
                (if (and (not (buffer-modified-p errors))
                         (zerop result))
@@ -706,7 +676,7 @@ nn*-request-list should have been called before calling this function."
   "Save GROUP-ASSOC in ACTIVE-FILE."
   (let ((coding-system-for-write nnmail-active-file-coding-system))
     (when file-name
-      (nnheader-temp-write file-name
+      (with-temp-file file-name
        (nnmail-generate-active group-assoc)))))
 
 (defun nnmail-generate-active (alist)
@@ -838,7 +808,7 @@ is a spool.  If not using procmail, return GROUP."
          (when (and (or (bobp)
                         (save-excursion
                           (forward-line -1)
-                          (= (following-char) ?\n)))
+                          (eq (char-after) ?\n)))
                     (save-excursion
                       (forward-line 1)
                       (while (looking-at ">From \\|From ")
@@ -867,7 +837,7 @@ is a spool.  If not using procmail, return GROUP."
          (when (and (or (bobp)
                         (save-excursion
                           (forward-line -1)
-                          (= (following-char) ?\n)))
+                          (eq (char-after) ?\n)))
                     (save-excursion
                       (forward-line 1)
                       (while (looking-at ">From \\|From ")
@@ -1031,7 +1001,6 @@ FUNC will be called with the buffer narrowed to each mail."
     (save-excursion
       ;; Insert the incoming file.
       (set-buffer (get-buffer-create " *nnmail incoming*"))
-      (buffer-disable-undo (current-buffer))
       (erase-buffer)
       (nnheader-insert-file-contents incoming)
       (unless (zerop (buffer-size))
@@ -1202,8 +1171,9 @@ Return the number of characters in the body."
       (insert (format "Xref: %s" (system-name)))
       (while group-alist
        (insert (format " %s:%d"
-                       (gnus-encode-coding-string (caar group-alist)
-                                             nnmail-pathname-coding-system)
+                       (mm-encode-coding-string
+                        (caar group-alist)
+                        nnmail-pathname-coding-system)
                        (cdar group-alist)))
        (setq group-alist (cdr group-alist)))
       (insert "\n"))))
@@ -1484,7 +1454,6 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
       (set-buffer
        (setq nnmail-cache-buffer
             (get-buffer-create " *nnmail message-id cache*")))
-      (buffer-disable-undo (current-buffer))
       (when (file-exists-p nnmail-message-id-cache-file)
        (nnheader-insert-file-contents nnmail-message-id-cache-file))
       (set-buffer-modified-p nil)
@@ -1552,9 +1521,9 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
     ;; Let the backend save the article (or not).
     (cond
      ((not duplication)
-      (nnmail-cache-insert message-id)
       (funcall func (setq group-art
-                         (nreverse (nnmail-article-group artnum-func)))))
+                         (nreverse (nnmail-article-group artnum-func))))
+      (nnmail-cache-insert message-id))
      ((eq action 'delete)
       (setq group-art nil))
      ((eq action 'warn)
@@ -1671,9 +1640,11 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
             ;; This is an ange-ftp group, and we don't have any dates.
             nil)
            ((numberp days)
-            (setq days (nnmail-days-to-time days))
+            (setq days (days-to-time days))
             ;; Compare the time with the current time.
-            (nnmail-time-less days (nnmail-time-since time)))))))
+            (condition-case ()
+                (time-less-p days (time-since time))
+              (error nil)))))))
 
 (defvar nnmail-read-passwd nil)
 (defun nnmail-read-passwd (prompt &rest args)
@@ -1738,11 +1709,11 @@ If ARGS, PROMPT is used as an argument to `format'."
        (goto-char (point-min))
        (while (re-search-forward "[^ \t=]+" nil t)
          (setq name (match-string 0))
-         (if (not (= (following-char) ?=))
+         (if (not (eq (char-after) ?=))
              ;; Implied "yes".
              (setq value "yes")
            (forward-char 1)
-           (if (not (= (following-char) ?\"))
+           (if (not (eq (char-after) ?\"))
                (if (not (looking-at "[^ \t]"))
                    ;; Implied "no".
                    (setq value "no")
@@ -1805,7 +1776,11 @@ If ARGS, PROMPT is used as an argument to `format'."
 (defun nnmail-pop3-movemail (inbox crashbox)
   "Function to move mail from INBOX on a pop3 server to file CRASHBOX."
   (let ((pop3-maildrop
-         (substring inbox (match-end (string-match "^po:" inbox)))))
+         (substring inbox (match-end (string-match "^po:" inbox))))
+       (pop3-password
+        (or nnmail-pop-password
+            (nnmail-read-passwd
+             (format "Password for %s: " inbox)))))
     (pop3-movemail crashbox)))
 
 (defun nnmail-within-headers-p ()
index 1f05d1d..13fc297 100644 (file)
            (nnmbox-article-group-number)))))))
 
 (deffoo nnmbox-request-group (group &optional server dont-check)
+  (nnmbox-possibly-change-newsgroup nil server)
   (let ((active (cadr (assoc group nnmbox-group-alist))))
     (cond
      ((or (null active)
      (nnmbox-request-article article group server)
      (save-excursion
        (set-buffer buf)
-       (buffer-disable-undo (current-buffer))
        (erase-buffer)
        (insert-buffer-substring nntp-server-buffer)
        (goto-char (point-min))
     (save-excursion
       (set-buffer (setq nnmbox-mbox-buffer
                        (nnheader-find-file-noselect
-                        nnmbox-mbox-file nil 'raw)))
-      (buffer-disable-undo (current-buffer))))
+                        nnmbox-mbox-file nil t)))
+      (mm-enable-multibyte)
+      (buffer-disable-undo)))
   (when (not nnmbox-group-alist)
     (nnmail-activate 'nnmbox))
   (if newsgroup
            start end number)
        (set-buffer (setq nnmbox-mbox-buffer
                          (nnheader-find-file-noselect
-                          nnmbox-mbox-file nil 'raw)))
-       (buffer-disable-undo (current-buffer))
+                          nnmbox-mbox-file nil t)))
+       (mm-enable-multibyte)
+       (buffer-disable-undo)
 
        ;; Go through the group alist and compare against
        ;; the mbox file.
index 8aafd7d..769d865 100644 (file)
                                (expand-file-name nnmh-toplev))))
               dir)
              (nnheader-replace-chars-in-string
-              (gnus-decode-coding-string (substring dir (match-end 0))
-                                         nnmail-pathname-coding-system)
+              (mm-decode-coding-string (substring dir (match-end 0))
+                                       nnmail-pathname-coding-system)
               ?/ ?.))
            (apply 'max files)
            (apply 'min files)))))))
     (setq articles (sort articles (lambda (art1 art2)
                                    (> (car art1) (car art2)))))
     ;; Finally write this list back to the .nnmh-articles file.
-    (nnheader-temp-write nnmh-file
+    (with-temp-file nnmh-file
       (insert ";; Gnus article active file for " group "\n\n")
       (insert "(setq nnmh-newsgroup-articles '")
       (gnus-prin1 articles)
index e7a1df9..4e847bf 100644 (file)
@@ -225,6 +225,7 @@ all.  This may very well take some time.")
   t)
 
 (deffoo nnml-request-create-group (group &optional server args)
+  (nnml-possibly-change-directory nil server)
   (nnmail-activate 'nnml)
   (cond
    ((assoc group nnml-group-alist)
@@ -249,9 +250,8 @@ all.  This may very well take some time.")
 (deffoo nnml-request-list (&optional server)
   (save-excursion
     (let ((nnmail-file-coding-system nnmail-active-file-coding-system)
-         (pathname-coding-system 'binary)) ; for XEmacs/mule
-      (nnmail-find-file nnml-active-file)
-      )
+         (pathname-coding-system 'binary)) 
+      (nnmail-find-file nnml-active-file))
     (setq nnml-group-alist (nnmail-get-active))
     t))
 
@@ -469,7 +469,7 @@ all.  This may very well take some time.")
      ((not (file-exists-p file))
       (nnheader-report 'nnml "File %s does not exist" file))
      (t
-      (nnheader-temp-write file
+      (with-temp-file file
        (nnheader-insert-file-contents file)
        (nnmail-replace-status name value))
       t))))
@@ -503,7 +503,6 @@ all.  This may very well take some time.")
 (defun nnml-find-group-number (id)
   (save-excursion
     (set-buffer (get-buffer-create " *nnml id*"))
-    (buffer-disable-undo (current-buffer))
     (let ((alist nnml-group-alist)
          number)
       ;; We want to look through all .overview files, but we want to
@@ -576,15 +575,10 @@ all.  This may very well take some time.")
       (file-exists-p nnml-current-directory))))
 
 (defun nnml-possibly-create-directory (group)
-  (let (dir dirs)
-    (setq dir (nnmail-group-pathname group nnml-directory))
-    (while (not (file-directory-p dir))
-      (push dir dirs)
-      (setq dir (file-name-directory (directory-file-name dir))))
-    (while dirs
-      (make-directory (directory-file-name (car dirs)))
-      (nnheader-message 5 "Creating mail directory %s" (car dirs))
-      (setq dirs (cdr dirs)))))
+  (let ((dir (nnmail-group-pathname group nnml-directory)))
+    (unless (file-exists-p dir)
+      (make-directory (directory-file-name dir) t)
+      (nnheader-message 5 "Creating mail directory %s" dir))))
 
 (defun nnml-save-mail (group-art)
   "Called narrowed to an article."
@@ -733,7 +727,7 @@ all.  This may very well take some time.")
     (let ((dirs (directory-files dir t nil t))
          dir)
       (while (setq dir (pop dirs))
-       (when (and (not (member (file-name-nondirectory dir) '("." "..")))
+       (when (and (not (string-match "^\\." (file-name-nondirectory dir)))
                   (file-directory-p dir))
          (nnml-generate-nov-databases-1 dir seen))))
     ;; Do this directory.
@@ -773,7 +767,7 @@ all.  This may very well take some time.")
     (save-excursion
       ;; Init the nov buffer.
       (set-buffer nov-buffer)
-      (buffer-disable-undo (current-buffer))
+      (buffer-disable-undo)
       (erase-buffer)
       (set-buffer nntp-server-buffer)
       ;; Delete the old NOV file.
index 9c27786..d676f0c 100644 (file)
                        (cdr (assq pbackend (nnoo-parents backend))))
     (prog1
        (apply function args)
-    ;; Copy the changed variables back into the child.
-    (let ((vars (cdr (assq pbackend (nnoo-parents backend)))))
-      (while vars
-       (set (cadar vars) (symbol-value (caar vars)))
-       (setq vars (cdr vars)))))))
+      ;; Copy the changed variables back into the child.
+      (let ((vars (cdr (assq pbackend (nnoo-parents backend)))))
+       (while vars
+         (set (cadar vars) (symbol-value (caar vars)))
+         (setq vars (cdr vars)))))))
 
 (defun nnoo-execute (backend function &rest args)
   "Execute FUNCTION on behalf of BACKEND."
index e764150..4931808 100644 (file)
@@ -376,7 +376,7 @@ backend for the messages.")
             (or force
                 nnsoup-group-alist-touched))
     (setq nnsoup-group-alist-touched nil)
-    (nnheader-temp-write nnsoup-active-file
+    (with-temp-file nnsoup-active-file
       (gnus-prin1 `(setq nnsoup-group-alist ',nnsoup-group-alist))
       (insert "\n")
       (gnus-prin1 `(setq nnsoup-current-prefix ,nnsoup-current-prefix))
@@ -530,7 +530,7 @@ backend for the messages.")
        (when (file-exists-p (concat nnsoup-directory file))
          (save-excursion               ; Load the file.
            (set-buffer (get-buffer-create buffer-name))
-           (buffer-disable-undo (current-buffer))
+           (buffer-disable-undo)
            (push (cons nnsoup-current-group (current-buffer)) nnsoup-buffers)
            (nnheader-insert-file-contents (concat nnsoup-directory file))
            (current-buffer))))))
@@ -752,7 +752,6 @@ backend for the messages.")
                                 (string-to-int (match-string 1 f2)))))))
        active group lines ident elem min)
     (set-buffer (get-buffer-create " *nnsoup work*"))
-    (buffer-disable-undo (current-buffer))
     (while files
       (nnheader-message 5 "Doing %s..." (car files))
       (erase-buffer)
index 6914f78..dd3d89c 100644 (file)
@@ -28,7 +28,6 @@
 
 (require 'nnheader)
 (require 'nntp)
-(require 'timezone)
 (require 'nnoo)
 (eval-when-compile (require 'cl))
 
@@ -280,7 +279,7 @@ there.")
        (while (and (not (looking-at
                          "\\([^ ]+\\) +\\([0-9]+\\)[0-9][0-9][0-9] "))
                    (zerop (forward-line -1))))
-       (let ((seconds (nnspool-seconds-since-epoch date))
+       (let ((seconds (time-to-seconds (date-to-time date)))
              groups)
          ;; Go through lines and add the latest groups to a list.
          (while (and (looking-at "\\([^ ]+\\) +[0-9]+ ")
@@ -420,7 +419,6 @@ there.")
 (defun nnspool-find-id (id)
   (save-excursion
     (set-buffer (get-buffer-create " *nnspool work*"))
-    (buffer-disable-undo (current-buffer))
     (erase-buffer)
     (ignore-errors
       (call-process "grep" nil t nil (regexp-quote id) nnspool-history-file))
@@ -453,18 +451,6 @@ there.")
   "Find the path for GROUP."
   (nnheader-group-pathname group nnspool-spool-directory article))
 
-(defun nnspool-seconds-since-epoch (date)
-  (let* ((tdate (mapcar (lambda (ti) (and ti (string-to-int ti)))
-                       (timezone-parse-date date)))
-        (ttime (mapcar (lambda (ti) (and ti (string-to-int ti)))
-                       (timezone-parse-time
-                        (aref (timezone-parse-date date) 3))))
-        (unix (encode-time (nth 2 ttime) (nth 1 ttime) (nth 0 ttime)
-                           (nth 2 tdate) (nth 1 tdate) (nth 0 tdate)
-                           (nth 4 tdate))))
-    (+ (* (car unix) 65536.0)
-       (cadr unix))))
-
 (provide 'nnspool)
 
 ;;; nnspool.el ends here
index 9c5523d..3012b25 100644 (file)
@@ -1,5 +1,5 @@
 ;;; nntp.el --- nntp access for Gnus
-;;; Copyright (C) 1987-90,92-97 Free Software Foundation, Inc.
+;;; Copyright (C) 1987-90,92-98 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news
 
 (nnoo-declare nntp)
 
-(eval-and-compile
-  (unless (fboundp 'open-network-stream)
-    (require 'tcp)))
-
 (eval-when-compile (require 'cl))
 
 (defvoo nntp-address nil
@@ -274,9 +270,9 @@ If this variable is nil, which is the default, no timers are set.")
          (nntp-decode-text (not decode))
          (unless discard
            (save-excursion
-             (set-buffer buffer)
-             (goto-char (point-max))
-             (insert-buffer-substring (process-buffer process))
+             (set-buffer buffer)
+             (goto-char (point-max))
+             (insert-buffer-substring (process-buffer process))
              ;; Nix out "nntp reading...." message.
              (when nntp-have-messaged
                (setq nntp-have-messaged nil)
@@ -400,7 +396,7 @@ If this variable is nil, which is the default, no timers are set.")
   (cond
    ;; A result that starts with a 2xx code is terminated by
    ;; a line with only a "." on it.
-   ((eq (following-char) ?2)
+   ((eq (char-after) ?2)
     (if (re-search-forward "\n\\.\r?\n" nil t)
        t
       nil))
@@ -618,9 +614,14 @@ If this variable is nil, which is the default, no timers are set.")
           (setq nntp-server-list-active-group t)))))
 
 (deffoo nntp-list-active-group (group &optional server)
-  "Return the active info on GROUP (which can be a regexp."
+  "Return the active info on GROUP (which can be a regexp)."
+  (nntp-possibly-change-group nil server)
+  (nntp-send-command "^\\.*\r?\n" "LIST ACTIVE" group))
+
+(deffoo nntp-request-group-articles (group &optional server)
+  "Return the list of existing articles in GROUP."
   (nntp-possibly-change-group nil server)
-  (nntp-send-command "^.*\r?\n" "LIST ACTIVE" group))
+  (nntp-send-command "^\\.*\r?\n" "LISTGROUP" group))
 
 (deffoo nntp-request-article (article &optional group server buffer command)
   (nntp-possibly-change-group group server)
@@ -728,7 +729,7 @@ If this variable is nil, which is the default, no timers are set.")
     (prog1
        (nntp-send-command
         "^\\.\r?\n" "NEWGROUPS"
-        (format-time-string "%y%m%d %H%M%S" (nnmail-date-to-time date)))
+        (format-time-string "%y%m%d %H%M%S" (date-to-time date)))
       (nntp-decode-text))))
 
 (deffoo nntp-request-post (&optional server)
@@ -749,7 +750,7 @@ If this variable is nil, which is the default, no timers are set.")
 This function is supposed to be called from `nntp-server-opened-hook'.
 It will make innd servers spawn an nnrpd process to allow actual article
 reading."
-  (nntp-send-command "^.*\r?\n" "MODE READER"))
+  (nntp-send-command "^.*\n" "MODE READER"))
 
 (defun nntp-send-authinfo (&optional send-if-force)
   "Send the AUTHINFO to the nntp server.
@@ -796,7 +797,7 @@ If SEND-IF-FORCE, only send authinfo to the server if the
 The authinfo login name is taken from the user's login name and the
 password contained in '~/.nntp-authinfo'."
   (when (file-exists-p "~/.nntp-authinfo")
-    (nnheader-temp-write nil
+    (with-temp-buffer
       (insert-file-contents "~/.nntp-authinfo")
       (goto-char (point-min))
       (nntp-send-command "^3.*\r?\n" "AUTHINFO USER" (user-login-name))
@@ -825,7 +826,7 @@ password contained in '~/.nntp-authinfo'."
       (format " *server %s %s %s*"
              nntp-address nntp-port-number
              (gnus-buffer-exists-p buffer))))
-    (buffer-disable-undo (current-buffer))
+    (mm-enable-multibyte)
     (set (make-local-variable 'after-change-functions) nil)
     (set (make-local-variable 'nntp-process-wait-for) nil)
     (set (make-local-variable 'nntp-process-callback) nil)
@@ -1117,7 +1118,6 @@ password contained in '~/.nntp-authinfo'."
          (delete-char -1))
        (goto-char (point-min))
        (delete-matching-lines "^\\.$\\|^[1-5][0-9][0-9] ")
-       ;;(copy-to-buffer nntp-server-buffer (point-min) (point-max))
        t))))
 
   nntp-server-xover)
index 4829341..b1d4119 100644 (file)
@@ -385,7 +385,7 @@ to virtual article number.")
     (insert "\t"))
 
   ;; Remove any spaces at the beginning of the Xref field.
-  (while (= (char-after (1- (point))) ? )
+  (while (eq (char-after (1- (point))) ? )
     (forward-char -1)
     (delete-char 1))
 
@@ -417,7 +417,7 @@ to virtual article number.")
 
   ;; Ensure a trailing \t.
   (end-of-line)
-  (or (= (char-after (1- (point))) ?\t)
+  (or (eq (char-after (1- (point))) ?\t)
       (insert ?\t)))
 
 
@@ -436,17 +436,21 @@ If UPDATE-P is not nil, call gnus-group-update-group on the components."
                        (nnvirtual-partition-sequence
                         (gnus-list-of-unread-articles
                          (nnvirtual-current-group)))))
-         (type-marks (mapcar (lambda (ml)
-                               (cons (car ml)
-                                     (nnvirtual-partition-sequence (cdr ml))))
-                             (gnus-info-marks (gnus-get-info
-                                               (nnvirtual-current-group)))))
+         (type-marks
+          (delq nil
+                (mapcar (lambda (ml)
+                          (if (eq (car ml) 'score)
+                              nil
+                            (cons (car ml)
+                                  (nnvirtual-partition-sequence (cdr ml)))))
+                        (gnus-info-marks (gnus-get-info
+                                          (nnvirtual-current-group))))))
          mark type groups carticles info entry)
 
       ;; Ok, atomically move all of the (un)read info, clear any old
       ;; marks, and move all of the current marks.  This way if someone
       ;; hits C-g, you won't leave the component groups in a half-way state.
-      (gnus-atomic-progn
+      (progn
        ;; move (un)read
        (let ((gnus-newsgroup-active nil)) ;workaround guns-update-read-articles
          (while (setq entry (pop unreads))
@@ -457,7 +461,11 @@ If UPDATE-P is not nil, call gnus-group-update-group on the components."
        (while groups
          (when (and (setq info (gnus-get-info (pop groups)))
                     (gnus-info-marks info))
-           (gnus-info-set-marks info nil)))
+           (gnus-info-set-marks
+            info
+            (if (assq 'score (gnus-info-marks info))
+                (list (assq 'score (gnus-info-marks info)))
+              nil))))
 
        ;; Ok, currently type-marks is an assq list with keys of a mark type,
        ;; with data of an assq list with keys of component group names
index 5a673cd..42dc338 100644 (file)
 (require 'message)
 (require 'gnus-util)
 (require 'gnus)
-(require 'w3)
-(require 'url)
 (require 'nnmail)
-(ignore-errors
-  (require 'w3-forms))
+(eval-when-compile
+  (ignore-errors
+    (require 'w3)
+    (require 'url)
+    (require 'w3-forms)))
+;; Report failure to find w3 at load time if appropriate.
+(eval '(progn
+        (require 'w3)
+        (require 'url)
+        (require 'w3-forms)))
 
 (nnoo-declare nnweb)
 
@@ -208,7 +214,8 @@ and `altavista'.")
 
 (deffoo nnweb-request-delete-group (group &optional force server)
   (nnweb-possibly-change-server group server)
-  (gnus-pull group nnweb-group-alist)
+  (gnus-pull group nnweb-group-alist t)
+  (nnweb-write-active)
   (gnus-delete-file (nnweb-overview-file group))
   t)
 
@@ -219,7 +226,7 @@ and `altavista'.")
 (defun nnweb-read-overview (group)
   "Read the overview of GROUP and build the map."
   (when (file-exists-p (nnweb-overview-file group))
-    (nnheader-temp-write nil
+    (with-temp-buffer
       (nnheader-insert-file-contents (nnweb-overview-file group))
       (goto-char (point-min))
       (let (header)
@@ -233,7 +240,7 @@ and `altavista'.")
 
 (defun nnweb-write-overview (group)
   "Write the overview file for GROUP."
-  (nnheader-temp-write (nnweb-overview-file group)
+  (with-temp-file (nnweb-overview-file group)
     (let ((articles nnweb-articles))
       (while articles
        (nnheader-insert-nov (cadr (pop articles)))))))
@@ -254,7 +261,7 @@ and `altavista'.")
 
 (defun nnweb-write-active ()
   "Save the active file."
-  (nnheader-temp-write (nnheader-concat nnweb-directory "active")
+  (with-temp-file (nnheader-concat nnweb-directory "active")
     (prin1 `(setq nnweb-group-alist ',nnweb-group-alist) (current-buffer))))
 
 (defun nnweb-read-active ()
index e25abbb..f076aea 100644 (file)
 
 (eval-when-compile (require 'cl))              ;and ah ain't kiddin' 'bout it
 
-(put 'parse-time-syntax 'char-table-extra-slots 0)
-
-(defvar parse-time-syntax (make-char-table 'parse-time-syntax))
-(defvar parse-time-digits (make-char-table 'parse-time-syntax))
+(defvar parse-time-syntax (make-vector 256 nil))
+(defvar parse-time-digits (make-vector 256 nil))
 
 ;; Byte-compiler warnings
 (defvar elt)
 
 (unless (aref parse-time-digits ?0)
   (loop for i from ?0 to ?9
-       do (set-char-table-range parse-time-digits i (- i ?0))))
+       do (aset parse-time-digits i (- i ?0))))
 
 (unless (aref parse-time-syntax ?0)
   (loop for i from ?0 to ?9
-       do (set-char-table-range parse-time-syntax i ?0))
+       do (aset parse-time-syntax i ?0))
   (loop for i from ?A to ?Z
-       do (set-char-table-range parse-time-syntax i ?A))
+       do (aset parse-time-syntax i ?A))
   (loop for i from ?a to ?z
-       do (set-char-table-range parse-time-syntax i ?a))
-  (set-char-table-range parse-time-syntax ?+ 1)
-  (set-char-table-range parse-time-syntax ?- -1)
-  (set-char-table-range parse-time-syntax ?: ?d)
+       do (aset parse-time-syntax i ?a))
+  (aset parse-time-syntax ?+ 1)
+  (aset parse-time-syntax ?- -1)
+  (aset parse-time-syntax ?: ?d)
   )
 
 (defsubst digit-char-p (char)
@@ -89,7 +87,8 @@
          (setq integer (+ (* integer 10) digit)
                index (1+ index)))
        (if (/= index end)
-           (signal 'parse-error `("not an integer" ,(substring string (or start 0) end)))
+           (signal 'parse-error `("not an integer"
+                                  ,(substring string (or start 0) end)))
          (* sign integer))))))
 
 (defun parse-time-tokenize (string)
                list)))
     (nreverse list)))
 
-(defvar parse-time-months '(("Jan" . 1) ("Feb" . 2) ("Mar" . 3)
-                           ("Apr" . 4) ("May" . 5) ("Jun" . 6)
-                           ("Jul" . 7) ("Aug" . 8) ("Sep" . 9)
-                           ("Oct" . 10) ("Nov" . 11) ("Dec" . 12)))
-(defvar parse-time-weekdays '(("Sun" . 0) ("Mon" . 1) ("Tue" . 2)
-                             ("Wed" . 3) ("Thu" . 4) ("Fri" . 5) ("Sat" . 6)))
-(defvar parse-time-zoneinfo `(("Z" 0) ("UT" 0) ("GMT" 0)
-                             ("PST" ,(* -8 3600)) ("PDT" ,(* -7 3600) t)
-                             ("MST" ,(* -7 3600)) ("MDT" ,(* -6 3600) t)
-                             ("CST" ,(* -6 3600)) ("CDT" ,(* -5 3600) t)
-                             ("EST" ,(* -5 3600)) ("EDT" ,(* -4 3600) t))
+(defvar parse-time-months '(("jan" . 1) ("feb" . 2) ("mar" . 3)
+                           ("apr" . 4) ("may" . 5) ("jun" . 6)
+                           ("jul" . 7) ("aug" . 8) ("sep" . 9)
+                           ("oct" . 10) ("nov" . 11) ("dec" . 12)))
+(defvar parse-time-weekdays '(("sun" . 0) ("mon" . 1) ("tue" . 2)
+                             ("wed" . 3) ("thu" . 4) ("fri" . 5) ("sat" . 6)))
+(defvar parse-time-zoneinfo `(("z" 0) ("ut" 0) ("gmt" 0)
+                             ("pst" ,(* -8 3600)) ("pdt" ,(* -7 3600) t)
+                             ("mst" ,(* -7 3600)) ("mdt" ,(* -6 3600) t)
+                             ("cst" ,(* -6 3600)) ("cdt" ,(* -5 3600) t)
+                             ("est" ,(* -5 3600)) ("edt" ,(* -4 3600) t))
   "(zoneinfo seconds-off daylight-savings-time-p)")
 
 (defvar parse-time-rules
   `(((6) parse-time-weekdays)
     ((3) (1 31))
     ((4) parse-time-months)
-    ((5) (1970 2038))
+    ((5) (100 4038))
     ((2 1 0)
      ,#'(lambda () (and (stringp elt)
                        (= (length elt) 8)
                            (* 60 (parse-integer elt 1 3)))
                      (if (= (aref elt 0) ?-) -1 1))))
     ((5 4 3)
-     ,#'(lambda () (and (stringp elt) (= (length elt) 10) (= (aref elt 4) ?-) (= (aref elt 7) ?-)))
+     ,#'(lambda () (and (stringp elt)
+                       (= (length elt) 10)
+                       (= (aref elt 4) ?-)
+                       (= (aref elt 7) ?-)))
      [0 4] [5 7] [8 10])
-    ((2 1)
+    ((2 1 0)
      ,#'(lambda () (and (stringp elt) (= (length elt) 5) (= (aref elt 2) ?:)))
-     [0 2] [3 5])
-    ((5) (70 99) ,#'(lambda () (+ 1900 elt))))
+     [0 2] [3 5] ,#'(lambda () 0))
+    ((2 1 0)
+     ,#'(lambda () (and (stringp elt)
+                       (= (length elt) 4)
+                       (= (aref elt 1) ?:)))
+     [0 1] [2 4] ,#'(lambda () 0))
+    ((2 1 0)
+     ,#'(lambda () (and (stringp elt)
+                       (= (length elt) 7)
+                       (= (aref elt 1) ?:)))
+     [0 1] [2 4] [5 7])
+    ((5) (50 99) ,#'(lambda () (+ 1900 elt)))
+    ((5) (0 49) ,#'(lambda () (+ 2000 elt))))
   "(slots predicate extractor...)")
 
 (defun parse-time-string (string)
   "Parse the time-string STRING into (SEC MIN HOUR DAY MON YEAR DOW DST TZ).
 The values are identical to those of `decode-time', but any values that are
 unknown are returned as nil."
-  (let ((time (list nil nil nil nil nil nil nil nil nil nil))
-       (temp (parse-time-tokenize string)))
+  (let ((time (list nil nil nil nil nil nil nil nil nil))
+       (temp (parse-time-tokenize (downcase string))))
     (while temp
       (let ((elt (pop temp))
            (rules parse-time-rules)
@@ -173,25 +186,27 @@ unknown are returned as nil."
                 (slots (pop rule))
                 (predicate (pop rule))
                 (val))
-           (if (and (not (nth (car slots) time)) ;not already set
-                    (setq val (cond ((and (consp predicate)
-                                          (not (eq (car predicate) 'lambda)))
-                                     (and (numberp elt)
-                                          (<= (car predicate) elt)
-                                          (<= elt (cadr predicate))
-                                          elt))
-                                    ((symbolp predicate)
-                                     (cdr (assoc elt (symbol-value predicate))))
-                                    ((funcall predicate)))))
-               (progn
-                 (setq exit t)
-                 (while slots
-                   (let ((new-val (and rule
-                                       (let ((this (pop rule)))
-                                         (if (vectorp this)
-                                             (parse-integer elt (aref this 0) (aref this 1))
-                                           (funcall this))))))
-                     (rplaca (nthcdr (pop slots) time) (or new-val val))))))))))
+           (when (and (not (nth (car slots) time)) ;not already set
+                      (setq val (cond ((and (consp predicate)
+                                            (not (eq (car predicate)
+                                                     'lambda)))
+                                       (and (numberp elt)
+                                            (<= (car predicate) elt)
+                                            (<= elt (cadr predicate))
+                                            elt))
+                                      ((symbolp predicate)
+                                       (cdr (assoc elt
+                                                   (symbol-value predicate))))
+                                      ((funcall predicate)))))
+             (setq exit t)
+             (while slots
+               (let ((new-val (and rule
+                                   (let ((this (pop rule)))
+                                     (if (vectorp this)
+                                         (parse-integer
+                                          elt (aref this 0) (aref this 1))
+                                       (funcall this))))))
+                 (rplaca (nthcdr (pop slots) time) (or new-val val)))))))))
     time))
 
 (provide 'parse-time)
index 24c31f6..e2160eb 100644 (file)
@@ -26,7 +26,6 @@
 ;;; Code:
 
 (require 'easymenu)
-(require 'timezone)
 (eval-when-compile (require 'cl))
 
 (defvar gnus-score-mode-hook nil
@@ -40,7 +39,8 @@
 
 (defvar gnus-score-mode-map nil)
 (unless gnus-score-mode-map
-  (setq gnus-score-mode-map (copy-keymap emacs-lisp-mode-map))
+  (setq gnus-score-mode-map (make-sparse-keymap))
+  (set-keymap-parent gnus-score-mode-map emacs-lisp-mode-map)
   (define-key gnus-score-mode-map "\C-c\C-c" 'gnus-score-edit-exit)
   (define-key gnus-score-mode-map "\C-c\C-d" 'gnus-score-edit-insert-date)
   (define-key gnus-score-mode-map "\C-c\C-p" 'gnus-score-pretty-print))
@@ -51,6 +51,8 @@
     table)
   "Syntax table used in score-mode buffers.")
 
+(defvar score-mode-coding-system 'binary)
+
 ;;;###autoload
 (defun gnus-score-mode ()
   "Mode for editing Gnus score files.
@@ -81,7 +83,7 @@ This mode is an extended emacs-lisp mode.
 (defun gnus-score-edit-insert-date ()
   "Insert date in numerical format."
   (interactive)
-  (princ (gnus-score-day-number (current-time)) (current-buffer)))
+  (princ (time-to-days (current-time)) (current-buffer)))
 
 (defun gnus-score-pretty-print ()
   "Format the current score file."
@@ -98,7 +100,8 @@ This mode is an extended emacs-lisp mode.
   (interactive)
   (unless (file-exists-p (file-name-directory (buffer-file-name)))
     (make-directory (file-name-directory (buffer-file-name)) t))
-  (save-buffer)
+  (let ((coding-system-for-write score-mode-coding-system))
+    (save-buffer))
   (bury-buffer (current-buffer))
   (let ((buf (current-buffer)))
     (when gnus-score-edit-exit-function
@@ -106,11 +109,6 @@ This mode is an extended emacs-lisp mode.
     (when (eq buf (current-buffer))
       (switch-to-buffer (other-buffer (current-buffer))))))
 
-(defun gnus-score-day-number (time)
-  (let ((dat (decode-time time)))
-    (timezone-absolute-from-gregorian
-     (nth 4 dat) (nth 3 dat) (nth 5 dat))))
-
 (provide 'score-mode)
 
 ;;; score-mode.el ends here
index e6c13f7..ac1a65f 100644 (file)
@@ -294,10 +294,10 @@ Mouse button3 - menu"))
   (save-excursion
     (goto-char start)
     (when (and (re-search-backward "[()]" nil t)
-              (= (following-char) ?\()
+              (eq (char-after) ?\()
               (goto-char end)
               (or (not (re-search-forward "[()]" nil t))
-                  (= (char-after (1- (point))) ?\()))
+                  (eq (char-after (1- (point))) ?\()))
       t)))
 
 (defvar gnus-article-buffer)
index fd2879c..a16f6bf 100644 (file)
-1998-08-27 07:29:17  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi (Mail Folders): Addition.
-
-1998-08-25 08:06:28  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi (Posting Styles): Document this-is.
-       (Virtual Groups): Addition.
-
-1998-08-18 00:30:05  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi (Article Hiding): Addition.
-
-1998-08-16 14:53:45  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi (NNTP): Reinstated.
-       (Asynchronous Fetching): No header prefetch.
-
-1998-08-15 13:01:41  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi (Summary Score Commands): Change.
-
-1998-08-14 01:31:36  Simon Josefsson  <jas@pdc.kth.se>
-
-       * gnus.texi (Posting Styles): New 'body style.
-
-1998-08-13 21:17:00  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi (Paging the Article): Addition.
-
-1998-08-13 00:13:47  Simon Josefsson  <jas@pdc.kth.se>
-
-       * gnus.texi (Mail Group Commands): Typo.
-
-1998-08-12 21:28:09  Simon Josefsson  <jas@pdc.kth.se>
-
-       * gnus.texi (Article Caching): gnus-cacheable-groups.
-       (Newest Features): remove gnus-cacheable-groups.
-
-1998-08-12 22:01:12  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * message.texi (Forwarding): Addition.
-
-1998-08-11 20:33:53  Justin Zaglio  <justin@caxton.com>
-
-       * gnus.texi (Group Maintenance): Fix.
-
-1998-08-11 11:44:20  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi (Group Maintenance): Fix.
-
-1998-08-10 08:59:25  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi (Article Highlighting): Addition.
-       (Article Fontisizing): Fix.
-       (Article Hiding): Change.
-       (Article Hiding): Fix.
-
-1998-08-09 15:32:24  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi (Hiding Headers): Fix.
-       (Article Hiding): Addition.
-       (Document Groups): Addition.
-
-1998-08-08 06:06:37  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi (Fancy Mail Splitting): Change.
-
-1998-08-06 02:12:04  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi: De-legalize.
-
-       * message.texi: De-legalize.
-
-       * gnus.texi (Summary Maneuvering): Fix.
-
-1998-07-21 17:51  Simon Josefsson  <jas@pdc.kth.se>
-
-       * gnus.texi (Splitting Mail): junk is fancy splitting only
-
-       * gnus.texi (Fancy Mail Splitting): warn about junk
-
-1998-07-27 02:28:33  Lars Magne Ingebrigtsen  <larsi@gnus.org>
-
-       * gnus.texi (Topic Commands): Fix.
-
-1998-07-27 02:23:17  Robert Bihlmeyer  <robbe@orcus.priv.at>
-
-       * gnus.texi (Score Decays): Fix.
-
-Sun Jul 12 04:03:27 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Home Score File): Addition.
-
-Fri Jul 10 04:26:23 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (NNTP): Addition.
-
-Sat Jul  4 14:24:29 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Gnus Utility Functions): Addition.
-
-Thu Jul  2 11:37:51 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Posting Styles): Ununcommented.
-
-Wed Jul  1 17:57:54 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Topic Commands): Addition.
-
-Tue Jun 30 16:11:27 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Topic Commands): Addition.
-
-Mon Jun 29 21:46:13 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Article Keymap): Typo.
-
-Sun Jun 28 17:41:10 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Formatting Fonts): Typo fix.
-
-Sat Jun 27 04:37:14 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Mail-To-News Gateways): Addition.
-       (Mail-To-News Gateways): Typo.
-
-Fri Jun 26 13:33:00 1998  Yoshiki Hayashi  <g740685@komaba.ecc.u-tokyo.ac.jp>
-
-       * gnus.texi (Summary Buffer Lines): Typo fix.
-
-Fri Jun 26 05:53:22 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Score File Format): Addition.
-       (Mode Line Formatting): New.
-       (Summary Buffer Mode Line): Addition.
-
-Thu Jun 25 11:24:14 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Summary Score Commands): Deletia.
-
-Wed Jun 24 00:37:32 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Auto Save): Addition.
-       (Mail-To-News Gateways): Addition.
-       (NNTP): Addition.
-
-Wed Jun  3 03:30:47 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * message.texi (Message Headers): Addition.
-
-       * gnus.texi (Compatibility): Addition.
-
-Tue May 19 02:44:31 1998  Mike Pullen  <mpullen@midwest.net>
-
-       * gnus.texi.orig: Typo fixes.
-
-Wed Apr 29 21:52:28 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Key Index): Untabified.
-       (Group Parameters): Fix.
-
-Sun Apr 26 15:32:45 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Summary Post Commands): Ref to Message.
-
-       * message.texi (Various Message Variables): Deletia.
-
-Fri Apr 24 16:00:40 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Unread Articles): Typo.
-       (Summary Buffer Lines): Fix.
-       (Foreign Groups): Addition.
-       (Posting Server): Addition.
-
-Sat Mar 28 08:57:46 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Example Methods): Addition.
-
-Thu Mar 26 15:47:54 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Limiting): Mention `/ *'.
-
-Thu Mar 19 13:02:20 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (NNTP): Addition.
-       Removed spurious white space.
-
-Fri Mar 13 21:05:47 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Quassia Gnus): Fix.
-       (Agent Expiry): Addition.
-
-Sun Mar  8 13:56:37 1998  James Troup  <J.J.Troup@scm.brad.ac.uk>
-
-       * gnus.texi (Group Highlighting): Removed old example.
-
-Sun Mar  8 00:19:24 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Group Info): Fix ".".
-
-Sat Mar  7 17:09:49 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi: Took direntries out again, since makeinfo doesn't
-       understand them.
-       (Agent Expiry): New.
-       (Quassia Gnus): New.
-
-Sat Mar  7 16:14:10 1998  Dan Christensen  <jdc@chow.mat.jhu.edu>
-
-       * gnus.texi (Group Parameters): Mention add-to-list.
-
-Sat Feb 28 14:21:12 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (NNTP): Addition.
-
-1998-03-01  Kim-Minh Kaplan  <KimMinh.Kaplan@utopia.eunet.fr>
-
-       * gnus.texi (Easy Picons): Removed references to
-       `gnus-group-display-picons'.
-       (Hard Picons): Ditto.
-
-1998-03-01  Kim-Minh Kaplan  <KimMinh.Kaplan@utopia.eunet.fr>
-
-       * gnus.texi (Easy Picons): Removed references to
-       `gnus-group-display-picons'.
-       (Hard Picons): Ditto.
-
-Mon Feb 23 18:05:09 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi: Direntry not handled by Emacs 19.34.
-
-1998-02-21  SL Baur  <steve@altair.xemacs.org>
-
-       * gnus.texi: Add a direntry field.
-       * message.texi: Ditto.  (Data taken from Emacs 20.2 info/dir).
-
-Sun Feb 22 03:24:43 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Score File Format): Addition.
-
-1998-02-18  Jason R Mastaler  <jason@4b.org>
-
-       * gnus.texi: Corrected typo.
-
-Thu Feb 19 02:20:29 1998  Francois Felix Ingrand  <felix@laas.fr>
-
-       * gnus.texi (Sorting): Fix order of args.
-
-Sun Feb 15 23:04:02 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (NNTP): Change.
-
-Sat Feb 14 17:46:33 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Virtual Groups): Fix.
-       (NNTP): Addition.
-       (Really Various Summary Commands): Addition.
-
-Fri Feb 13 18:23:19 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Mail Group Commands): Typo.
-       (NNTP): Addition.
-       (Mail and Procmail): Addition.
-
-Mon Feb  9 16:30:30 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Article Date): Addition.
-
-Sun Feb  8 16:28:35 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Newest Features): Addition.
-
-Mon Feb  2 19:21:43 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Agent Variables): Addition.
-
-Sun Feb  1 18:08:45 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Using MIME): Addition.
-
-Tue Jan  6 07:22:41 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Batching Agents): New.
-
-1998-01-04  Christoph Wedler  <wedler@fmi.uni-passau.de>
-
-       * gnus.texi (Newest Features): Delete spaces after @end example.
-       In XEmacs, `texinfo-format-buffer' would bug out.
-
-Sun Jan  4 12:04:45 1998  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Conformity): Removed GNKSA.
-
-Sun Dec 14 11:06:23 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Adaptive Scoring): Addition.
-
-1997-11-26  SL Baur  <steve@altair.xemacs.org>
-
-       * message.texi (Insertion): Fix typo.
-       (Responses): Ditto.
-       (Reply): Ditto.
-
-Wed Nov 26 12:57:00 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * message.texi (Insertion): Addition.
-
-Wed Nov 26 12:55:15 1997  Hallvard B. Furuseth  <h.b.furuseth@usit.uio.no>
-
-       * message.texi (Insertion): Addition.
-
-Wed Nov 26 12:36:08 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * message.texi (Responses): New.
-       (Appendices): New.
-
-       * gnus.texi (Group Info): Fix.
-
-Tue Nov 25 17:53:55 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Article Date): Addition.
-
-Mon Nov 24 16:01:20 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Faces & Fonts): New.
-
-Mon Oct 13 00:08:06 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Agent Commands): Addition.
-
-Sun Oct 12 16:50:23 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Article Washing): Addition.
-       (Group Highlighting): New.
-       (Canceling and Superseding): Addition.
-
-Wed Oct  1 18:37:55 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Startup Files): Addition.
-
-Sat Sep 27 09:37:17 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * message.texi (Sending Variables): Fix.
-
-       * gnus.texi (Choosing Commands): Addition.
-
-Sat Sep 27 05:56:44 1997  Hallvard B. Furuseth  <h.b.furuseth@usit.uio.no>
-
-       * gnus.texi: Various fixes.
-
-Sat Sep 27 04:24:41 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * message.texi (Various Commands): Addition.
-
-Wed Sep 24 02:38:21 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Example Setup): Wrong info.
-       (SOUP Groups): Addition.
-       (Contributors): Addition.
-
-1997-09-22  SL Baur  <steve@altair.xemacs.org>
-
-       * gnus.texi (Finding the Parent): Fix typo.
-       (NoCeM): Fix typos.
-
-Tue Sep 23 07:05:48 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (NoCeM): Addition.
-       (Finding the Parent): Addition.
-
-Mon Sep 22 06:13:00 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Filling In Threads): Addition.
-       (Finding the Parent): Addition.
-
-Sun Sep 21 04:35:56 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (NNTP): Addition.
-       (Hiding Headers): Addition.
-       (Symbolic Prefixes): New.
-       (Extended Interactive): New.
-       (Summary Score Commands): Addition.
-
-Sat Sep 20 20:53:43 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Startup Variables): Addition.
-
-1997-09-16  SL Baur  <steve@altair.xemacs.org>
-
-       * gnus.texi: Correct typo.
-
-Wed Sep 17 02:32:56 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Customizing Threading): Broken up into five nodes.
-       (Article Washing): Addition.
-
-       * message.texi (Various Commands): Add.
-
-Tue Sep 16 04:04:03 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Example Setup): New.
-
-Mon Sep 15 23:10:05 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Customizing Threading): Addition.
-
-Sun Sep 14 21:59:07 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Outgoing Messages): New.
-       (Score File Format): Note.
-       (Subscription Methods): Fix.
-       (Starting Up): Fix.
-       (Threading): Add.
-
-Sat Jul 19 23:02:03 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Followups To Yourself): \\(_-_\\)?
-
-Sat Jul 12 16:29:35 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Picon Configuration): Moved Picons to under XEmacs.
-       (Smileys): New section.
-
-Fri Jul 11 11:58:20 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (NNTP): Addition.
-
-Tue Jun 17 23:52:17 1997  Justin Sheehy  <dworkin@ccs.neu.edu>
-
-       * gnus.texi (Group Parameters): Addition.
-
-Sun May 25 14:40:17 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Expiring Mail): Addition.
-
-Sat May 24 05:26:17 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Score File Format): Update.
-
-Tue May 20 21:56:03 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Document Server Internals): Typo.
-
-Sun May 18 05:59:24 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-11-19 04:05:15  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.texi (Topic Commands): Addition.
-
-Sun May 11 20:09:24 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Article Hiding): Change.
-
-Thu May  8 23:48:36 1997  James Troup  <J.J.Troup@comp.brad.ac.uk>
-
-       * gnus.texi (Saving Articles): Typo.
-
-Wed May  7 19:00:48 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Saving Articles): Addition.
-
-Wed May  7 19:00:43 1997  Mark Boyns  <boyns@sdsu.edu>
-
-       * gnus.texi (Saving Articles): Addition.
-
-Thu May  1 14:06:57 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Score File Format): Fix.
-
-Sun Apr 27 11:11:43 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (NNTP): Addition.
-
-Sat Apr 12 16:51:32 1997  Robert Bihlmeyer  <robbe@orcus.priv.at>
-
-       * gnus.texi (Thwarting Email Spam): Addition.
-
-Tue Apr 15 16:11:38 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * message.texi (Various Message Variables): Addition.
-
-       * gnus.texi (Thwarting Email Spam): Addition.
-
-Sat Apr 12 00:26:47 1997  Francois Felix Ingrand  <felix@laas.fr>
-
-       * gnus.texi (NoCeM): Addition.
-
-Thu Apr 10 21:25:14 1997  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * gnus.texi (Emacs/XEmacs Code): Addition.
-
-Thu Apr 10 20:45:47 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Group Information): Fix.
-
-Wed Apr  2 11:48:44 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Sorting): Use total score.
-
-Tue Apr  1 11:44:57 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Subscription Methods): Addition.
-       (Group Info): Addition.
-       (Gnus Utility Functions): New.
-       (Thwarting Email Spam): Addition.
-
-Mon Mar 31 16:15:54 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * message.texi (Various Message Variables): Addition.
-
-Sun Mar 23 02:16:19 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Thwarting Email Spam): New.
-       (Unavailable Servers): Fix.
-
-Wed Mar 19 15:45:17 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Various Summary Stuff): Addition.
-       (Mail Backend Variables): Addition.
-
-Tue Mar 18 14:43:32 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Article Washing): Not addition.
-
-Mon Mar 17 16:15:54 1997  Philippe Schnoebelen  <Philippe.Schnoebelen@lsv.ens-cachan.fr>
-
-       * Makefile (install): Install properly.
+       * gnus.texi (Really Various Summary Commands): Addition.
 
-Fri Mar 14 21:00:33 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-11-18 00:52:46  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.texi (Group Parameters): Addition.
+       * gnus.texi (MIME Commands): Addition.
        (Expiring Mail): Addition.
 
-Wed Mar 12 06:57:14 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Various Various): Addition.
-
-Sat Mar  8 03:41:47 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Group Parameters): Added example.
-       (Duplicates): Fix.
-
-Fri Mar  7 10:49:43 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * Makefile: New "install" target.
-
-Thu Mar  6 08:01:37 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Mail and Procmail): Fix.
-
-Sun Mar  2 02:08:40 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Startup Files): Addition.
-       (Score File Format): Fix.
-
-Fri Feb 28 23:23:31 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Archived Messages): Clarify.
-       (Fuzzy Matching): New.
-
-Mon Feb 24 23:41:57 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-11-07 17:18:07  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * message.texi (Compatibility): New.
+       * gnus.texi (Gnus Reference Guide): Renamed.
 
-Thu Feb 20 03:29:17 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-26 22:03:08  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.texi (Foreign Groups): Addition.
+       * gnus.texi (Article Washing): Fix.
+       (MIME Commands): Change.
 
-Wed Feb 19 02:57:51 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-25 01:51:56  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.texi (Server Variables): New.
+       * gnus.texi (Headers): Addition.
 
-Sun Feb 16 15:43:34 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-24 08:37:12  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.texi (Mail Backend Variables): Fix.
+       * gnus.texi (Summary Buffer Lines): Addition.
+       (To): New.
+       (To): Addition.
 
-       * message.texi (Various Message Variables): Addition.
+1998-10-15 18:15:34  Simon Josefsson  <jas@pdc.kth.se>
 
-Mon Feb 10 07:18:16 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * gnus.texi (Group Info): Must be list of ranges.
 
-       * gnus.texi (Article Commands): Addition.
+1998-10-19 01:27:26  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Mon Feb  3 19:59:10 1997  Paul Franklin  <paul@cs.washington.edu>
-
-       * gnus-group.el (gnus-group-edit-group): Allow editing of bad
-       groups.
-
-Wed Feb  5 02:00:46 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * message.texi (Mail Variables): Change.
-
-Tue Feb  4 02:33:31 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * message.texi (Mail Aliases): New.
-
-       * gnus.texi (Splitting Mail): Addition.
-
-Mon Feb  3 07:31:47 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Mode Lines): Addition.
-
-Mon Jan 27 17:51:29 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Highlighting and Menus): Removed
-       `gnus-display-type'.
-
-Sat Jan 25 08:09:30 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (The Active File): Addition.
-
-Fri Jan 24 05:07:28 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Summary Mail Commands): Addition.
-       (Required Backend Functions): Deletia.
-       (Article Washing): Addition.
-       (Summary Mail Commands): Addition.
-
-Mon Jan 20 22:19:40 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Followups To Yourself): Fix.
-
-Fri Jan 17 00:55:51 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (NoCeM): Update.
-
-Wed Jan 15 02:23:03 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Mail Group Commands): Fix.
-
-Tue Jan  7 09:36:36 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Summary Buffer Lines): Correction.
-
-Mon Jan  6 22:49:12 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (NoCeM): Addition.
-
-Fri Jan  3 18:13:02 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * message.texi (Various Commands): Addition.
-
-Thu Jan  2 16:12:27 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Optional Backend Functions): Fix.
-
-Mon Dec 16 13:53:28 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Exiting the Summary Buffer): Update.
-
-Fri Dec 13 01:04:41 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Limiting): Addition.
+       * gnus.texi (Article Washing): Addition.
 
-Sat Dec  7 21:10:23 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-18 00:20:58  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.texi (Example Methods): Addition.
+       * gnus.texi (Changing Servers): Addition.
 
-Fri Dec  6 12:38:14 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-17 21:34:57  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.texi (Group Parameters): Update.
+       * gnus.texi (Windows Configuration): Addition.
 
-1996-11-30  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-10-01 07:55:35  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.texi (Terminology): Addition.
+       * gnus.texi (Splitting Mail): Fix.
+       (Washing Mail): Fix.
 
-Wed Nov 27 03:13:05 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-30 05:54:45  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * gnus.texi (Selecting a Group): Addition.
 
-Tue Nov 26 12:42:47 1996  Martin Buchholz  <mrb@eng.sun.com>
-
-       * message.texi: Typo fixes and stuff.
-
-Thu Nov 21 17:45:57 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Canceling and Superseding): Fix.
-
-Wed Nov 20 15:42:36 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-13 08:58:56  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.texi (New Groups): Addition.
-       (Summary Sorting): Addition.
+       * dir (File): Updated.
 
-Tue Nov 19 20:54:16 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+1998-09-12 08:53:05  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.texi (Scanning New Messages): Addition.
-
-Sat Nov  9 06:04:22 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Group Parameters): Addition.
-
-Fri Nov  8 04:01:06 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Article Fontisizing): New.
-       (Fancy Mail Splitting): Addition.
-       (Summary Post Commands): Addition.
-       (Mail Spool): Addition.
-       (Server Commands): Addition.
-       (Fancy Mail Splitting): Addition.
-
-Wed Nov  6 06:39:44 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+       * emacs-mime.texi: New file.
 
        * gnus.texi (Misc Article): Addition.
-       (Emacsen): Updated.
-
-Wed Nov  6 03:52:05 1996  C. R. Oldham  <cro@nca.asu.edu>
-
-       * Makefile (.texi.dvi): Fix rule.
-
-Tue Nov  5 10:45:39 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Other Decode Variables): Addition.
-       (Mail-like Backends): New.
-
-Tue Nov  5 06:41:46 1996  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * gnus.texi (Score File Format): Added warning.
-
-Mon Oct 28 15:50:08 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
 
-       * gnus.texi (Startup Variables): Addition.
+1998-09-11 08:52:50  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Fri Oct 25 09:04:59 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+       * gnus.texi (Group Score Commands): Fix.
+       (Saving Articles): Fix.
+       (Agent Expiry): Fix.
+       (Using MIME): Change.
 
-       * gnus.texi (Summary Mail Commands): Addition.
+1998-09-10 03:19:14  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Wed Oct 23 08:28:29 1996  Hrvoje Niksic  <hniksic@srce.hr>
+       * gnus.texi (Windows Configuration): Addition.
 
-       * gnus.texi (Fancy Mail Splitting): Removed trailing garbage.
+1998-09-06  Mike McEwan  <mike@lotusland.demon.co.uk>
 
-Tue Oct 22 07:36:02 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+       * gnus.texi (Category Syntax): Added doc about agent categories
+       and download scoring.
 
-       * gnus.texi (Converting Kill Files): New.
+1998-09-05 17:36:14  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Sat Oct 19 07:17:28 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+       * gnus.texi (Sorting Groups): Change.
+       (Various Summary Stuff): Addition.
 
-       * gnus.texi (Saving Articles): Addition.
+1998-09-04 00:40:07  David S. Goldberg  <dsg@mitre.org>
 
-       * message.texi (Various Message Variables): Addition.
+       * gnus.texi (Article Hiding): Verify.
 
-Thu Oct 17 06:53:04 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+1998-08-31 11:46:57  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-       * gnus.texi (Contributors): Added names.
-
-Fri Oct 11 12:38:59 1996  Lars Magne Ingebrigtsen  <larsi@ylfing.ifi.uio.no>
-
-       * gnus.texi (Adaptive Scoring): Addition.
-
-Tue Oct  8 13:16:41 1996  Lars Magne Ingebrigtsen  <larsi@ylfing.ifi.uio.no>
-
-       * Makefile (all): Make custom.
-
-Wed Oct  2 01:32:49 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Group Timestamps): New.
-
-Tue Oct  1 01:34:45 1996  Lars Magne Ingebrigtsen  <larsi@hrym.ifi.uio.no>
-
-       * gnus.texi (Expiring Mail): Addition.
-       (Group Line Specification): Addition.
-
-Sat Sep 28 21:36:40 1996  Lars Magne Ingebrigtsen  <larsi@ylfing.ifi.uio.no>
-
-       * gnus.texi (Foreign Groups): Addition.
-
-Mon Sep 23 22:17:44 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (The Summary Buffer): Addition.
-
-Mon Sep 23 18:25:38 1996  Lars Magne Ingebrigtsen  <larsi@ylfing.ifi.uio.no>
-
-       * gnus.texi (Thread Commands): Correction.
-       (Group Information): Correction.
-
-Sat Sep 21 08:11:43 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (New Groups): Split into three nodes.
-       (Group Parameters): Shortened.
-       (Browse Foreign Server): Corrected.
-
-Thu Sep 19 18:45:15 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Mail and Procmail): Addition.
-
-Wed Sep 18 07:33:11 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Other Marks): Edited.
-       (The Manual): New.
-       (Contributors): Updated.
-       (Asynchronous Fetching): Addition.
-       (New Features): Split.
-       ((ding) Gnus): Renamed.
-       (September Gnus): New.
-       (Red Gnus): New,
-       (Undo): New.
-
-Thu Sep 12 23:55:53 1996  Lars Magne Ingebrigtsen  <larsi@hrym.ifi.uio.no>
-
-       * gnus.texi (Archived Messages): Fix.
-
-Sat Sep  7 12:14:23 1996  Lars Magne Ingebrigtsen  <larsi@hymir.ifi.uio.no>
-
-       * gnus.texi (Various Various): Addition.
-
-Fri Sep  6 07:57:26 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Startup Files): Addition.
-       (Splitting Mail): Addition.
-       (Sorting Groups): Addition.
-       (Topic Sorting): New.
-       (Really Various Summary Commands): Deletia.
-       (Summary Generation Commands): New.
-       (Setting Process Marks): Addition.
-
-Thu Sep  5 07:34:27 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Terminology): Addition.
-       (Web Searches): Fix.
-       (Windows Configuration): Addition.
-
-Sun Sep  1 11:07:09 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (XEmacs Enhancements): New.
-
-Sat Aug 31 02:55:50 1996  Lars Magne Ingebrigtsen  <larsi@ylfing.ifi.uio.no>
-
-       * gnus.texi (Washing Mail): Addition.
-
-Fri Aug 30 09:10:17 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Washing Mail): New.
-       (Fancy Mail Splitting): Change.
-
-Fri Aug 30 00:21:59 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Foreign Groups): Change.
-
-Thu Aug 29 23:51:45 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Daemons): Addition.
-
-Thu Aug 29 02:09:24 1996  François Pinard  <pinard@progiciels-bpi.ca>
-
-       * gnus.texi (Web Searches): Typo.
-
-Wed Aug 28 08:21:36 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Server Commands): Addition.
-       (Really Various Summary Commands): Addition.
-
-Mon Aug 26 18:29:23 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Optional Backend Functions): Deletia.
-       (Asynchronous Fetching): Deletia and addition.
-
-Sun Aug 25 23:39:03 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi: Include the version number.
-
-Sun Aug 25 21:31:33 1996  Lars Magne Ingebrigtsen  <larsi@ylfing.ifi.uio.no>
-
-       * gnus.texi (Really Various Summary Commands): Addition.
-
-Sat Aug 17 22:24:34 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Startup Files): Addition.
-       (Anything Groups): Addition.
-
-Thu Aug 22 17:27:31 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Adaptive Scoring): Addition.
-       (Adaptive Scoring): Addition.
-
-Mon Aug 19 00:30:07 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Fancy Mail Splitting): Addition.
-       (Splitting Mail): Addition.
-       (Group Parameters): Addition.
-       (Topic Variables): Addition.
-       (Mail Group Commands): Addition.
-       (Group Information): Addition.
-       (Article Washing): Addition.
-
-Sun Aug 18 18:06:49 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Web Searches): Change and addition.
-
-Sat Aug 17 22:24:34 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Startup Files): Addition.
-       (Anything Groups): Addition.
-
-Thu Aug 15 17:59:12 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Followups To Yourself): Addition.
-       (Setting Process Marks): Addition.
-       (Process/Prefix): Addition.
-       (Startup Files): Addition.
-       (Mail-To-News Gateways): New.
-
-Wed Aug 14 15:02:14 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Home Score File): Fix.
-       (Various Various): New.
-
-Tue Aug 13 10:38:47 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Error Messaging): New.
-       (Mail Backend Variables): Fix.
-       (Foreign Groups): Added references.
-       (Sorting Groups): Addition.
-
-Sun Aug 11 02:52:37 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (User-Defined Specs): Correction.
-       (Unavailable Servers): Addition.
-       (Moderation): New.
-       (Summary Mail Commands): Addition.
-       (Crosspost Handling): Addition.
-
-Sat Aug 10 00:13:39 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Summary Buffer Lines): Correction.
-       (Top): Name fix.
-       (Compilation ): Addition.
+       * gnus.texi (Mail Folders): Addition.
        (Group Parameters): Addition.
-       (Troubleshooting): Addition.
-
-Fri Aug  9 07:17:59 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Selecting a Group): Addition.
-       (Score Decays): New.
-       (Score File Format): Addition.
-       (Changing Servers): Addition.
-       (Selecting a Group): Addition.
-       (Really Various Summary Commands): Addition.
-
-Thu Aug  8 05:39:31 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+       (MIME Commands): New.
 
-       * gnus.texi (Read Articles): Addition.
-       (Foreign Groups): Addition.
-       (User-Defined Specs): Separated.
-       (Formatting Fonts): Ditto.
-       (Advanced Formatting): New.
-       (Formatting Basics): Addition.
-       (Formatting Variables): Split.
-
-Wed Aug  7 22:00:56 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
-
-       * gnus.texi (Hooking New Backends Into Gnus): New node.
-
-Wed Aug  7 01:02:08 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Setting Marks): Addition.
-       (Formatting Variables): Addition.
-
-Mon Aug  5 20:20:42 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Formatting Variables): Addition.
-
-Sun Aug  4 07:15:28 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Score File Format): Addition.
-       (Adaptive Scoring): Addition.
-
-Sat Aug  3 17:35:36 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Group Parameters): Addition.
-       (Home Score File): New.
-       (Topic Parameters): New.
-
-Wed Jul 31 15:34:12 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (are): Fix.
-
-Wed Jul 31 15:32:57 1996  David S. Goldberg  <dsg@linus.mitre.org>
-
-       * gnus.texi (buffer-name): Addition.
-
-Fri Aug  2 00:32:39 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi (Pick and Read): Addition.
-       (Article Hiding): Addition.
-       (Article Signature): Made into own node.
-
-Thu Aug  1 00:25:41 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * message.texi (Wide Reply): Addition.
-       (Bouncing): Addition.
-
-       * gnus.texi (Crosspost Handling): Made into own node.
-       (Duplicate Suppression): New.
-       (Document Server Internals): New.
-       (Changing Servers): New.
-
-Wed Jul 31 15:37:44 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
-
-       * gnus.texi: Fix
+1998-08-27 07:29:17  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
-Mon Jul 29 10:12:24 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+       * gnus.texi (Mail Folders): Addition.
 
-       * gnus.texi (Misc Article): Addition.
-       (Advanced Scoring Tips): New.
-       (Advanced Scoring Example): New.
-       (Advanced Scoring Syntax): New.
-       (Advanced Scoring): New.
index eb05e11..c74b8b2 100644 (file)
@@ -18,7 +18,7 @@ INSTALL_DATA = @INSTALL_DATA@
 SHELL = /bin/sh
 PAPERTYPE=a4
 
-all: gnus message
+all: gnus message emacs-mime
 
 most: texi2latex.elc latex latexps
 
@@ -31,7 +31,7 @@ most: texi2latex.elc latex latexps
          makeinfo -o $* $<; \
        fi
 
-dvi: gnus.dvi message.dvi refcard.dvi
+dvi: gnus.dvi message.dvi refcard.dvi emacs-mime.dvi
 
 .texi.dvi :
        $(PERL) -n -e 'print unless (/\@iflatex/ .. /\@end iflatex/)' $< > gnustmp.texi
@@ -112,10 +112,11 @@ distclean:
        make clean
        rm -f *.orig *.rej *.elc *~ gnus gnus-[0-9] gnus-[0-9][0-9] Makefile
        rm -f message message-[0-9]
+       rm -f emacs-mime
 
 install:
        $(SHELL) $(top_srcdir)/mkinstalldirs $(infodir)
-       @for file in gnus message; do \
+       @for file in gnus message emacs-info; do \
          for ifile in `echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \
            if test -f $$ifile; then \
              echo " $(INSTALL_DATA) $$ifile $(infodir)/$$ifile"; \
index a169da0..08eb94d 100644 (file)
--- a/texi/dir
+++ b/texi/dir
@@ -5,5 +5,6 @@ File: dir       Node: Top       This is the Gnus Info tree
 
 * Menu: 
 
-* Gnus: (gnus).                The news reader Gnus.
-* Message: (message).  The Message sending thingamabob.
+* Gnus: (gnus).                        The news reader Gnus.
+* Message: (message).          The Message sending thingamabob.
+* Emacs MIME: (emacs-mime).    Libraries for handling MIME.
index 998270d..2b91688 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename gnus
-@settitle Gnus 5.6.45 Manual
+@settitle Pterodactyl Gnus 0.51 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
 
 \thispagestyle{empty}
 
-Copyright \copyright{} 1995,96,97 Free Software Foundation, Inc.
+Copyright \copyright{} 1995,96,97,98 Free Software Foundation, Inc.
 
 Permission is granted to make and distribute verbatim copies of
 this manual provided the copyright notice and this permission notice
@@ -318,7 +318,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Gnus 5.6.45 Manual
+@title Pterodactyl Gnus 0.51 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -354,7 +354,7 @@ can be gotten by any nefarious means you can think of---@sc{nntp}, local
 spool or your mbox file.  All at the same time, if you want to push your
 luck.
 
-This manual corresponds to Gnus 5.6.45.
+This manual corresponds to Pterodactyl Gnus 0.51.
 
 @end ifinfo
 
@@ -823,6 +823,10 @@ and read ranges have become worthless.  You can use the @kbd{M-x
 gnus-group-clear-data-on-native-groups} command to clear out all data
 that you have on your native groups.  Use with caution.
 
+After changing servers, you @strong{must} move the cache hierarchy away,
+since the cached articles will have wrong article numbers, which will
+affect which articles Gnus thinks are read.
+
 
 @node Startup Files
 @section Startup Files
@@ -1495,8 +1499,26 @@ Select the first unread article when entering the group.
 @item best
 Select the highest scored article in the group when entering the
 group.
+
+@end table
+
+This variable can also be a function.  In that case, that function will
+be called to place point on a subject line, and/or select some article.
+Useful functions include:
+
+@table @code
+@item gnus-summary-first-unread-subject
+Place point on the subject line of the first unread article, but
+don't select the article.
+
+@item gnus-summary-first-unread-article
+Select the first unread article.
+
+@item gnus-summary-best-unread-article
+Select the highest-scored unread article.
 @end table
 
+
 If you want to prevent automatic selection in some group (say, in a
 binary group with Huge articles) you can set this variable to @code{nil}
 in @code{gnus-select-group-hook}, which is called when a group is
@@ -2120,6 +2142,11 @@ are arbitrary comments on the group.  They are currently ignored by
 Gnus, but provide a place for you to store information on particular
 groups.
 
+@item charset
+Elements that look like @code{(charset . iso-8859-1)} will make
+@code{iso-8859-1} the default charset; that is, the charset that will be 
+used for all articles that do not specify a charset.
+
 @item @var{(variable form)}
 You can use the group parameters to set variables local to the group you
 are entering.  If you want to turn threading off in @samp{news.answers},
@@ -2335,7 +2362,11 @@ Sort the group buffer alphabetically by backend name
 
 @end table
 
-When given a prefix, all these commands will sort in reverse order.
+All the commands below obeys the process/prefix convention
+(@pxref{Process/Prefix}).
+
+When given a symbolic prefix (@pxref{Symbolic Prefixes}), all these
+commands will sort in reverse order.  
 
 You can also sort a subset of the groups:
 
@@ -2343,38 +2374,38 @@ You can also sort a subset of the groups:
 @item G P a
 @kindex G P a (Group)
 @findex gnus-group-sort-selected-groups-by-alphabet
-Sort the process/prefixed groups in the group buffer alphabetically by
-group name (@code{gnus-group-sort-selected-groups-by-alphabet}).
+Sort the groups alphabetically by group name
+(@code{gnus-group-sort-selected-groups-by-alphabet}).
 
 @item G P u
 @kindex G P u (Group)
 @findex gnus-group-sort-selected-groups-by-unread
-Sort the process/prefixed groups in the group buffer by the number of
-unread articles (@code{gnus-group-sort-selected-groups-by-unread}).
+Sort the groups by the number of unread articles
+(@code{gnus-group-sort-selected-groups-by-unread}).
 
 @item G P l
 @kindex G P l (Group)
 @findex gnus-group-sort-selected-groups-by-level
-Sort the process/prefixed groups in the group buffer by group level
+Sort the groups by group level
 (@code{gnus-group-sort-selected-groups-by-level}).
 
 @item G P v
 @kindex G P v (Group)
 @findex gnus-group-sort-selected-groups-by-score
-Sort the process/prefixed groups in the group buffer by group score
+Sort the groups by group score
 (@code{gnus-group-sort-selected-groups-by-score}).  @xref{Group Score}.
 
 @item G P r
 @kindex G P r (Group)
 @findex gnus-group-sort-selected-groups-by-rank
-Sort the process/prefixed groups in the group buffer by group rank
+Sort the groups by group rank
 (@code{gnus-group-sort-selected-groups-by-rank}).  @xref{Group Score}.
 
 @item G P m
 @kindex G P m (Group)
 @findex gnus-group-sort-selected-groups-by-method
-Sort the process/prefixed groups in the group buffer alphabetically by
-backend name (@code{gnus-group-sort-selected-groups-by-method}).
+Sort the groups alphabetically by backend name
+(@code{gnus-group-sort-selected-groups-by-method}).
 
 @end table
 
@@ -2707,17 +2738,6 @@ Mark all groups in the current topic with the process mark
 Remove the process mark from all groups in the current topic
 (@code{gnus-topic-unmark-topic}).
 
-@item RET
-@kindex RET (Topic)
-@findex gnus-topic-select-group
-@itemx SPACE
-Either select a group or fold a topic (@code{gnus-topic-select-group}).
-When you perform this command on a group, you'll enter the group, as
-usual.  When done on a topic line, the topic will be folded (if it was
-visible) or unfolded (if it was folded already).  So it's basically a
-toggling command on topics.  In addition, if you give a numerical
-prefix, group on that level (and lower) will be displayed.
-
 @item T TAB
 @itemx TAB
 @kindex T TAB (Topic)
@@ -2733,6 +2753,23 @@ previous topic (@code{gnus-topic-indent}).  If given a prefix,
 ``Un-indent'' the current topic so that it becomes a sub-topic of the
 parent of its current parent (@code{gnus-topic-unindent}).  
 
+@item RET
+@kindex RET (Topic)
+@findex gnus-topic-select-group
+@itemx SPACE
+Either select a group or fold a topic (@code{gnus-topic-select-group}).
+When you perform this command on a group, you'll enter the group, as
+usual.  When done on a topic line, the topic will be folded (if it was
+visible) or unfolded (if it was folded already).  So it's basically a
+toggling command on topics.  In addition, if you give a numerical
+prefix, group on that level (and lower) will be displayed.
+
+@item C-c C-x
+@kindex C-c C-x (Topic)
+@findex gnus-topic-expire-articles
+Run all expirable articles in the current group or topic through the expiry
+process (if any) (@code{gnus-topic-expire-articles}).
+
 @item C-k
 @kindex C-k (Topic)
 @findex gnus-topic-kill-group
@@ -3193,6 +3230,7 @@ You can have as many summary buffers open as you wish.
 * Saving Articles::             Ways of customizing article saving.
 * Decoding Articles::           Gnus can treat series of (uu)encoded articles.
 * Article Treatment::           The article buffer can be mangled at will.
+* MIME Commands::               Doing MIMEy things with the articles.
 * Article Commands::            Doing various things with the article buffer.
 * Summary Sorting::             Sorting the summary buffer in various ways.
 * Finding the Parent::          No child support? Get the parent.
@@ -3221,6 +3259,7 @@ You can have as many summary buffers open as you wish.
 
 @menu
 * Summary Buffer Lines::     You can specify how summary lines should look.
+* To From Newsgroups::       How to not display your own name.
 * Summary Buffer Mode Line:: You can say how the mode line should look.
 * Summary Highlighting::     Making the summary buffer all pretty and nice.
 @end menu
@@ -3235,7 +3274,12 @@ variable as a function for getting the name and address parts of a
 fast, and too simplistic solution; and
 @code{mail-extract-address-components}, which works very nicely, but is
 slower.  The default function will return the wrong answer in 5% of the
-cases.  If this is unacceptable to you, use the other function instead.
+cases.  If this is unacceptable to you, use the other function instead:
+
+@lisp
+(setq gnus-extract-address-components
+      'mail-extract-address-components)
+@end lisp
 
 @vindex gnus-summary-same-subject
 @code{gnus-summary-same-subject} is a string indicating that the current
@@ -3269,6 +3313,9 @@ had a different subject, @code{gnus-summary-same-subject} otherwise.
 Full @code{From} header.
 @item n
 The name (from the @code{From} header).
+@item f
+The name, code @code{To} header or the @code{Newsgroups} header
+(@pxref{To From Newsgroups}).
 @item a
 The name (from the @code{From} header).  This differs from the @code{n}
 spec in that it uses the function designated by the
@@ -3358,6 +3405,69 @@ The smart choice is to have these specs as far to the left as possible.
 This restriction may disappear in later versions of Gnus.
 
 
+@node To From Newsgroups
+@subsection To From Newsgroups
+@cindex To
+@cindex Newsgroups
+
+In some groups (particularly in archive groups), the @code{From} header
+isn't very interesting, since all the articles there are written by
+you.  To display the information in the @code{To} or @code{Newsgroups}
+headers instead, you need to decide three things: What information to
+gather; where to display it; and when to display it.
+
+@enumerate
+@item
+@vindex gnus-extra-headers
+The reading of extra header information is controlled by the
+@code{gnus-extra-headers}.  This is a list of header symbols.  For
+instance:
+
+@lisp
+(setq gnus-extra-headers
+      '(To Newsgroups X-Newsreader))
+@end lisp
+
+This will result in Gnus trying to obtain these three headers, and
+storing it in header structures for later easy retrieval.
+
+@item
+@findex gnus-extra-header
+The value of these extra headers can be accessed via the
+@code{gnus-extra-header} function.  Here's a format line spec that will
+access the @code{X-Newsreader} header:
+
+@example
+"%~(form (gnus-extra-header 'X-Newsreader))@@"
+@end example
+
+@item
+@vindex gnus-ignored-from-addresses
+The @code{gnus-ignored-from-addresses} variable says when the @samp{%f}
+summary line spec returns the @code{To}, @code{Newsreader} or
+@code{From} header.  If this regexp matches the contents of the
+@code{From} header, the value of the @code{To} or @code{Newsreader}
+headers are used instead.
+
+@end enumerate
+
+@vindex nnmail-extra-headers
+A related variable is @code{nnmail-extra-headers}, which controls when
+to include extra headers when generating overview (@sc{nov}) files.
+
+In summary, you'd typically do something like the following:
+
+@lisp
+(setq gnus-extra-headers
+      '(To Newsgroups))
+(setq nnmail-extra-headers gnus-extra-headers)
+(setq gnus-summary-line-format
+      "%U%R%z%I%(%[%4L: %-20,20f%]%) %s\n")
+(setq gnus-ignored-from-addresses
+      "Your Name Here")
+@end lisp
+
+
 @node Summary Buffer Mode Line
 @subsection Summary Buffer Mode Line
 
@@ -3536,6 +3646,9 @@ action.  This will also inhibit horizontal re-centering of the summary
 buffer, which might make it more inconvenient to read extremely long
 threads.
 
+This variable can also be a number.  In that case, center the window at
+the given number of lines from the top.
+
 @end table
 
 
@@ -3797,7 +3910,7 @@ goes out to all people listed in the @code{To}, @code{From} (or
 @kindex S W (Summary)
 @findex gnus-summary-wide-reply-with-original
 Mail a wide reply to the current article and include the original
-message (@code{gnus-summary-reply-with-original}).  This command uses
+message (@code{gnus-summary-wide-reply-with-original}).  This command uses
 the process/prefix convention.
 
 @item S o m
@@ -4165,7 +4278,7 @@ You can set a bookmark in the current article.  Say you are reading a
 long thesis on cats' urinary tracts, and have to go home for dinner
 before you've finished reading the thesis.  You can then set a bookmark
 in the article, and Gnus will jump to this bookmark the next time it
-encounters the article.  @xref{Setting Marks}
+encounters the article.  @xref{Setting Marks}.
 
 @item
 @vindex gnus-replied-mark
@@ -4176,7 +4289,7 @@ answered) will be marked with an @samp{A} in the second column
 @item
 @vindex gnus-cached-mark
 Articles stored in the article cache will be marked with an @samp{*} in
-the second column (@code{gnus-cached-mark}).  @xref{Article Caching}
+the second column (@code{gnus-cached-mark}).  @xref{Article Caching}.
 
 @item
 @vindex gnus-saved-mark
@@ -4233,7 +4346,7 @@ article as unread.
 @kindex M t (Summary)
 @findex gnus-summary-tick-article-forward
 Tick the current article (@code{gnus-summary-tick-article-forward}).
-@xref{Article Caching}
+@xref{Article Caching}.
 
 @item M ?
 @itemx ?
@@ -4241,7 +4354,7 @@ Tick the current article (@code{gnus-summary-tick-article-forward}).
 @kindex M ? (Summary)
 @findex gnus-summary-mark-as-dormant
 Mark the current article as dormant
-(@code{gnus-summary-mark-as-dormant}).  @xref{Article Caching}
+(@code{gnus-summary-mark-as-dormant}).  @xref{Article Caching}.
 
 @item M d
 @itemx d
@@ -4914,10 +5027,7 @@ The default is 4.
 
 @item gnus-parse-headers-hook
 @vindex gnus-parse-headers-hook
-Hook run before parsing any headers.  The default value is
-@code{(gnus-decode-rfc1522)}, which means that QPized headers will be
-slightly decoded in a hackish way.  This is likely to change in the
-future when Gnus becomes @sc{MIME}ified.
+Hook run before parsing any headers.
 
 @item gnus-alter-header-function
 @vindex gnus-alter-header-function
@@ -5084,7 +5194,10 @@ Matching}).
 @findex gnus-thread-sort-by-number
 @vindex gnus-thread-sort-functions
 If you are using a threaded summary display, you can sort the threads by
-setting @code{gnus-thread-sort-functions}, which is a list of functions.
+setting @code{gnus-thread-sort-functions}, which can be either a single
+function, a list of functions, or a list containing functions and
+@code{(not some-function)} elements.
+
 By default, sorting is done on article numbers.  Ready-made sorting
 predicate functions include @code{gnus-thread-sort-by-number},
 @code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject},
@@ -5093,22 +5206,23 @@ predicate functions include @code{gnus-thread-sort-by-number},
 
 Each function takes two threads and returns non-@code{nil} if the first
 thread should be sorted before the other.  Note that sorting really is
-normally done by looking only at the roots of each thread.  If you use
-more than one function, the primary sort key should be the last function
-in the list.  You should probably always include
+normally done by looking only at the roots of each thread.
+
+If you use more than one function, the primary sort key should be the
+last function in the list.  You should probably always include
 @code{gnus-thread-sort-by-number} in the list of sorting
 functions---preferably first.  This will ensure that threads that are
 equal with respect to the other sort criteria will be displayed in
 ascending article order.
 
-If you would like to sort by score, then by subject, and finally by
-number, you could do something like:
+If you would like to sort by reverse score, then by subject, and finally
+by number, you could do something like:
 
 @lisp
 (setq gnus-thread-sort-functions
       '(gnus-thread-sort-by-number
         gnus-thread-sort-by-subject
-        gnus-thread-sort-by-total-score))
+        (reverse gnus-thread-sort-by-total-score)))
 @end lisp
 
 The threads that have highest score will be displayed first in the
@@ -5494,7 +5608,7 @@ files.
 
 @vindex gnus-default-article-saver
 You can customize the @code{gnus-default-article-saver} variable to make
-Gnus do what you want it to.  You can use any of the four ready-made
+Gnus do what you want it to.  You can use any of the six ready-made
 functions below, or you can create your own.
 
 @table @code
@@ -6289,7 +6403,22 @@ Signature}.
 @vindex gnus-article-hide-pgp-hook
 Hide @sc{pgp} signatures (@code{gnus-article-hide-pgp}).  The
 @code{gnus-article-hide-pgp-hook} hook will be run after a @sc{pgp}
-signature has been hidden.
+signature has been hidden.  For example, to automatically verify
+articles that have signatures in them do:
+@lisp
+;;; Hide pgp cruft if any.
+
+(add-hook 'gnus-article-display-hook 'gnus-article-hide-pgp)
+
+;;; After hiding pgp, verify the message;
+;;; only happens if pgp signature is found.
+
+(add-hook 'gnus-article-hide-pgp-hook
+          (lambda ()
+            (save-excursion
+              (set-buffer gnus-original-article-buffer)
+              (mc-verify))))
+@end lisp
 
 @item W W P
 @kindex W W P (Summary)
@@ -6432,7 +6561,13 @@ Treat overstrike (@code{gnus-article-treat-overstrike}).
 @item W d
 @kindex W d (Summary)
 @findex gnus-article-treat-dumbquotes
-Treat M******** sm*rtq**t*s (@code{gnus-article-treat-dumbquotes}).
+@vindex gnus-article-dumbquotes-map
+@cindex Smartquotes
+@cindex M******** sm*rtq**t*s
+@cindex Latin 1
+Treat M******** sm*rtq**t*s according to
+@code{gnus-article-dumbquotes-map}
+(@code{gnus-article-treat-dumbquotes}).
 
 @item W w
 @kindex W w (Summary)
@@ -6447,7 +6582,9 @@ when filling.
 @item W c
 @kindex W c (Summary)
 @findex gnus-article-remove-cr
-Remove CR (i. e., @samp{^M}s on the end of the lines)
+Translate CRLF pairs (i. e., @samp{^M}s on the end of the lines) into LF
+(this takes care of DOS line endings), and then translate any remaining
+CRs into LF (this takes care of Mac line endings)
 (@code{gnus-article-remove-cr}).
 
 @item W q
@@ -6491,7 +6628,7 @@ last.
 @kindex W b (Summary)
 @findex gnus-article-add-buttons
 Add clickable buttons to the article (@code{gnus-article-add-buttons}).
-@xref{Article Buttons}
+@xref{Article Buttons}.
 
 @item W B
 @kindex W B (Summary)
@@ -6759,6 +6896,75 @@ the regular expression @samp{^---*Forwarded article}, then it isn't a
 signature after all.
 
 
+@node MIME Commands
+@section MIME Commands
+@cindex MIME decoding
+
+@table @kbd
+@item W M w
+@kindex W M w (Summary)
+Decode RFC2047-encoded words in the article headers
+(@code{gnus-article-decode-mime-words}).
+
+@item W M c
+@kindex W M c (Summary)
+Decode encoded article bodies as well as charsets
+(@code{gnus-article-decode-charset}).
+
+This command looks in the @code{Content-Type} header to determine the
+charset.  If there is no such header in the article, you can give it a
+prefix, which will prompt for the charset to decode as.  In regional
+groups where people post using some common encoding (but do not include
+MIME headers), you can set the @code{charset} group/topic parameter to
+the required charset (@pxref{Group Parameters}).
+
+@item W M v
+@kindex W M v (Summary)
+View all the @sc{mime} parts in the current article
+(@code{gnus-mime-view-all-parts}). 
+
+@end table
+
+Relevant variables:
+
+@table @code
+@item gnus-ignored-mime-types
+@vindex gnus-ignored-mime-types
+This is a list of regexps.  @sc{mime} types that match a regexp from
+this list will be completely ignored by Gnus.  The default value is
+@code{nil}.
+
+To have all Vcards be ignored, you'd say something like this:
+
+@lisp
+(setq gnus-ignored-mime-types
+      '("text/x-vcard"))
+@end lisp
+
+@item gnus-article-mime-part-function
+@vindex gnus-article-mime-part-function
+For each @sc{mime} part, this function will be called with the @sc{mime} 
+handle as the parameter.  The function is meant to be used to allow
+users to gather information from the article (e. g., add Vcard info to
+the bbdb database) or to do actions based on parts (e. g., automatically 
+save all jpegs into some directory).
+
+Here's an example function the does the latter:
+
+@lisp
+(defun my-save-all-jpeg-parts (handle)
+  (when (equal (car (mm-handle-type handle)) "image/jpeg")
+    (with-temp-buffer
+      (insert (mm-get-part handle))
+      (write-region (point-min) (point-max)
+                    (read-file-name "Save jpeg to: ")))))
+(setq gnus-article-mime-part-function
+      'my-save-all-jpeg-parts)
+@end lisp
+
+@end table
+
+
 @node Article Commands
 @section Article Commands
 
@@ -7322,6 +7528,11 @@ It is called after the summary buffer has been generated.  You might use
 it to, for instance, highlight lines or modify the look of the buffer in
 some other ungodly manner.  I don't care.
 
+@vindex gnus-summary-prepared-hook
+@item gnus-summary-prepared-hook
+A hook called as the very last thing after the summary buffer has been
+generated.
+
 @vindex gnus-summary-ignore-duplicates
 @item gnus-summary-ignore-duplicates
 When Gnus discovers two articles that have the same @code{Message-ID},
@@ -7472,6 +7683,12 @@ If given a prefix, force an @code{article} window configuration.
 Edit the group parameters (@pxref{Group Parameters}) of the current
 group (@code{gnus-summary-edit-parameters}).
 
+@item M-C-g
+@kindex M-C-g (Summary)
+@findex gnus-summary-customize-parameters
+Customize the group parameters (@pxref{Group Parameters}) of the current
+group (@code{gnus-summary-customize-parameters}).
+
 @end table
 
 
@@ -7877,40 +8094,57 @@ while all newsreaders die of fear.
 of the characters, and it also makes it possible to embed pictures and
 other naughty stuff in innocent-looking articles.
 
-@vindex gnus-show-mime
-@vindex gnus-show-mime-method
-@vindex gnus-strict-mime
-@findex metamail-buffer
-Gnus handles @sc{mime} by pushing the articles through
-@code{gnus-show-mime-method}, which is @code{metamail-buffer} by
-default.  This function calls the external @code{metamail} program to
-actually do the work.  One common problem with this program is that is
-thinks that it can't display 8-bit things in the Emacs buffer.  To tell
-it the truth, put something like the following in your
-@file{.bash_profile} file.  (You do use @code{bash}, don't you?)
+@vindex gnus-display-mime-function
+@findex gnus-display-mime
+Gnus pushes @sc{mime} articles through @code{gnus-display-mime-function} 
+to display the @sc{mime} parts.  This is @code{gnus-display-mime} by
+default, which creates a bundle of clickable buttons that can be used to 
+display, save and manipulate the @sc{mime} objects.  
 
-@example
-export MM_CHARSET="iso-8859-1"
-@end example
+The following commands are available when you have placed point over a
+@sc{mime} button:
 
-For more information on @code{metamail}, see its manual page.
+@table @kbd
+@findex gnus-article-press-button
+@item RET (Article)
+@itemx BUTTON-2 (Article)
+Toggle displaying of the @sc{mime} object
+(@code{gnus-article-press-button}).
+
+@findex gnus-mime-view-part
+@item M-RET (Article)
+@itemx v (Article)
+Prompt for a method, and then view the @sc{mime} object using this
+method (@code{gnus-mime-view-part}).
+
+@findex gnus-mime-save-part
+@item o (Article)
+Prompt for a file name, and then save the @sc{mime} object
+(@code{gnus-mime-save-part}).
+
+@findex gnus-mime-copy-part
+@item c (Article)
+Copy the @sc{mime} object to a fresh buffer and display this buffer
+(@code{gnus-mime-copy-part}).
+
+@findex gnus-mime-pipe-part
+@item | (Article)
+Output the @sc{mime} object to a process (@code{gnus-mime-pipe-part}).
+@end table
 
-Set @code{gnus-show-mime} to @code{t} if you want to use
-@sc{mime} all the time.  However, if @code{gnus-strict-mime} is
-non-@code{nil}, the @sc{mime} method will only be used if there are
-@sc{mime} headers in the article.  If you have @code{gnus-show-mime}
-set, then you'll see some unfortunate display glitches in the article
-buffer.  These can't be avoided.
+Gnus will display some @sc{mime} objects automatically.  The way Gnus
+determines which parts to do this with is described in the Emacs MIME
+manual.  
 
-It might be best to just use the toggling functions from the summary
-buffer to avoid getting nasty surprises. (For instance, you enter the
+It might be best to just use the toggling functions from the article
+buffer to avoid getting nasty surprises.  (For instance, you enter the
 group @samp{alt.sing-a-long} and, before you know it, @sc{mime} has
 decoded the sound file in the article and some horrible sing-a-long song
-comes screaming out your speakers, and you can't find the volume
-button, because there isn't one, and people are starting to look at you,
-and you try to stop the program, but you can't, and you can't find the
-program to control the volume, and everybody else in the room suddenly
-decides to look at you disdainfully, and you'll feel rather stupid.)
+comes screaming out your speakers, and you can't find the volume button,
+because there isn't one, and people are starting to look at you, and you
+try to stop the program, but you can't, and you can't find the program
+to control the volume, and everybody else in the room suddenly decides
+to look at you disdainfully, and you'll feel rather stupid.)
 
 Any similarity to real events and people is purely coincidental.  Ahem.
 
@@ -8017,6 +8251,12 @@ If non-@code{nil}, use the same article buffer for all the groups.
 (This is the default.)  If @code{nil}, each group will have its own
 article buffer.
 
+@vindex gnus-article-decode-hook
+@item gnus-article-decode-hook
+@cindex MIME
+Hook used to decode @sc{mime} articles.  The default value is
+@code{(article-decode-charset article-decode-encoded-words)}
+
 @vindex gnus-article-prepare-hook
 @item gnus-article-prepare-hook
 This hook is called right after the article has been inserted into the
@@ -9446,7 +9686,7 @@ contain @samp{\\1} forms, like the ones used by @code{replace-match} to
 insert sub-expressions from the matched text.  For instance:
 
 @lisp
-("list.\\1" "From:.*\\(.*\\)-list@@majordomo.com")
+("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com")
 @end lisp
 
 The second element can also be a function.  In that case, it will be
@@ -9565,21 +9805,18 @@ file, which is @file{~/.gnus-crash-box} by default.  If this file
 already exists, it will always be read (and incorporated) before any
 other spool files.
 
-@vindex nnmail-prepare-incoming-hook
-@item nnmail-prepare-incoming-hook
-This is run in a buffer that holds all the new incoming mail, and can be
-used for, well, anything, really.
-
 @vindex nnmail-split-hook
 @item nnmail-split-hook
-@findex article-decode-rfc1522
+@findex article-decode-encoded-words
 @findex RFC1522 decoding
+@findex RFC2047 decoding
 Hook run in the buffer where the mail headers of each message is kept
 just before the splitting based on these headers is done.  The hook is
 free to modify the buffer contents in any way it sees fit---the buffer
 is discarded after the splitting has been done, and no changes performed
-in the buffer will show up in any files.  @code{gnus-article-decode-rfc1522}
-is one likely function to add to this hook.
+in the buffer will show up in any files.
+@code{gnus-article-decode-encoded-words} is one likely function to add
+to this hook.
 
 @vindex nnmail-pre-get-new-mail-hook
 @vindex nnmail-post-get-new-mail-hook
@@ -10024,6 +10261,11 @@ with!  So there!
 
 Most people make most of their mail groups total-expirable, though.
 
+@vindex gnus-inhibit-user-auto-expire
+If @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user marking
+commands will not mark an article as expirable, even if the group has
+auto-expire turned on.
+
 
 @node Washing Mail
 @subsection Washing Mail
@@ -10052,7 +10294,8 @@ various functions that can be put in these hooks.
 @item nnmail-prepare-incoming-hook
 @vindex nnmail-prepare-incoming-hook
 This hook is called before doing anything with the mail and is meant for
-grand, sweeping gestures.  Functions to be used include:
+grand, sweeping gestures.  It is called in a buffer that contains all
+the new, incoming mail.  Functions to be used include:
 
 @table @code
 @item nnheader-ms-strip-cr
@@ -10419,6 +10662,12 @@ your @file{.emacs} file:
 (add-hook 'nnfolder-save-buffer-hook 'turn-off-backup)
 @end lisp
 
+@item nnfolder-delete-mail-hook
+@vindex nnfolder-delete-mail-hook
+Hook run in a buffer narrowed to the message that is to be deleted.
+This function can be used to copy the message to somewhere else, or to
+extract some information from it before removing it.  
+
 @end table
 
 
@@ -11402,6 +11651,7 @@ Of course, to use it as such, you have to learn a few new commands.
 * Agent Variables::        Customizing is fun.
 * Example Setup::          An example @file{.gnus.el} file for offline people.
 * Batching Agents::        How to fetch news from a @code{cron} job.
+* Agent Caveats::          What you think it'll do and what it does.
 @end menu
 
 
@@ -11464,7 +11714,7 @@ Agent (@pxref{Server Agent Commands}).  This will typically be only the
 primary select method, which is listed on the bottom in the buffer.
 
 @item
-Decide on download policy.  @xref{Agent Categories}
+Decide on download policy.  @xref{Agent Categories}.
 
 @item
 Uhm... that's it.
@@ -11506,11 +11756,21 @@ are eligible for downloading; and
 @item
 a score rule which (generally) gives you a finer granularity when
 deciding what articles to download.  (Note that this @dfn{download
-score} is wholly unrelated to normal scores.)
+score} is not necessarily related to normal scores.)
 @end enumerate
 
-A predicate consists of predicates with logical operators sprinkled in
-between.
+A predicate in its simplest form can be a single predicate such as
+@code{true} or @code{false}. These two will download every available
+article or nothing respectively. In the case of these two special
+predicates an additional score rule is superfluous.
+
+Predicates of @code{high} or @code{low} download articles in respect of
+their scores in relationship to @code{gnus-agent-high-score} and
+@code{gnus-agent-low-score} as descibed below.
+
+To gain even finer control of what is to be regarded eligible for
+download a predicate can consist of a number of predicates with logical
+operators sprinkled in between.
 
 Perhaps some examples are in order.
 
@@ -11578,14 +11838,184 @@ to know:  The functions are called with no parameters, but the
 @code{gnus-headers} and @code{gnus-score} dynamic variables are bound to
 useful values.
 
+For example, you could decide that you don't want to download articles
+that were posted more than a certain number of days ago (e.g. posted
+more than @code{gnus-agent-expire-days} ago) you might write a function
+something along the lines of the following:
+
+@lisp
+(defun my-article-old-p ()
+  "Say whether an article is old."
+  (< (time-to-day (date-to-time (mail-header-date gnus-headers)))
+     (- (time-to-day (current-time)) gnus-agent-expire-days)))
+@end lisp
+
+with the predicate then defined as:
+
+@lisp
+(not my-article-old-p)
+@end lisp
+
+or you could append your predicate to the predefined
+@code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or
+wherever.  (Note: this would have to be at a point *after*
+@code{gnus-agent} has been loaded via @code{(gnus-agentize)})   
+
+@lisp
+(defvar  gnus-category-predicate-alist
+  (append gnus-category-predicate-alist
+        '((old . my-article-old-p))))
+@end lisp
+
+and simply specify your predicate as:
+
+@lisp
+(not old)
+@end lisp
+
+If/when using something like the above, be aware that there are many
+misconfigured systems/mailers out there and so an article's date is not
+always a reliable indication of when it was posted. Hell, some people
+just don't give a damm.
+
+
+The above predicates apply to *all* the groups which belong to the
+category. However, if you wish to have a specific predicate for an
+individual group within a category, or you're just too lazy to set up a
+new category, you can enter a group's individual predicate in it's group 
+parameters like so:
+
+@lisp
+(agent-predicate . short)
+@end lisp
+
+This is the group parameter equivalent of the agent category
+default. Note that when specifying a single word predicate like this,
+the @code{agent-predicate} specification must be in dotted pair
+notation.
+
+The equivalent of the longer example from above would be:
+
+@lisp
+(agent-predicate or high (and (not low) (not long)))
+@end lisp
+
+The outer parenthesis required in the category specification are not
+entered here as, not being in dotted pair notation, the value of the
+predicate is assumed to be a list. 
+
 Now, the syntax of the download score is the same as the syntax of
 normal score files, except that all elements that require actually
 seeing the article itself are verboten.  This means that only the
-following headers can be scored on: @code{From}, @code{Subject},
-@code{Date}, @code{Xref}, @code{Lines}, @code{Chars}, @code{Message-ID},
-and @code{References}.
+following headers can be scored on: @code{Subject}, @code{From},
+@code{Date}, @code{Message-ID}, @code{References}, @code{Chars},
+@code{Lines}, and @code{Xref}.
+
+As with predicates, the specification of the @code{download score rule}
+to use in respect of a group can be in either the category definition if
+it's to be applicable to all groups in therein, or a group's parameters
+if it's to be specific to that group.
+
+In both of these places the @code{download score rule} can take one of
+three forms:
+
+@enumerate
+@item 
+Score rule
+
+This has the same syntax as a normal gnus score file except only a
+subset of scoring keywords are available as mentioned above.
+
+example:
+
+@itemize @bullet
+@item 
+Category specification
+
+@lisp
+(("from"        
+       ("Lars Ingebrigtsen" 1000000 nil s))
+("lines"
+       (500 -100 nil <)))
+@end lisp
+
+@item 
+Group Parameter specification
+
+@lisp
+(agent-score ("from"        
+                   ("Lars Ingebrigtsen" 1000000 nil s))
+             ("lines"
+                   (500 -100 nil <)))
+@end lisp
+
+Again, note the omission of the outermost parenthesis here.
+@end itemize
+
+@item 
+Agent score file
+
+These score files must *only* contain the permitted scoring keywords
+stated above.
+
+example:
+
+@itemize @bullet
+@item 
+Category specification
+
+@lisp
+("~/News/agent.SCORE")
+@end lisp
+
+or perhaps
+
+@lisp
+("~/News/agent.SCORE" "~/News/agent.group.SCORE")
+@end lisp
+
+@item 
+Group Parameter specification
+
+@lisp
+(agent-score "~/News/agent.SCORE")
+@end lisp
+
+Additional score files can be specified as above. Need I say anything
+about parenthesis.
+@end itemize
+
+@item 
+Use @code{normal} score files
+
+If you dont want to maintain two sets of scoring rules for a group, and
+your desired @code{downloading} criteria for a group are the same as your
+@code{reading} criteria then you can tell the agent to refer to your
+@code{normal} score files when deciding what to download.
+
+These directives in either the category definition or a group's
+parameters will cause the agent to read in all the applicable score
+files for a group, *filtering out* those those sections that do not
+relate to one of the permitted subset of scoring keywords.
+
+@itemize @bullet
+@item 
+Category Specification
+
+@lisp
+file
+@end lisp
 
+@item 
+Group Parameter specification
 
+@lisp
+(agent-score . file)
+@end lisp
+@end itemize
+@end enumerate
 @node The Category Buffer
 @subsubsection The Category Buffer
 
@@ -11736,7 +12166,7 @@ Fetch all eligible articles in all groups
 @kindex J S (Agent Group)
 @findex gnus-group-send-drafts
 Send all sendable messages in the draft group
-(@code{gnus-agent-fetch-session}).  @xref{Drafts}
+(@code{gnus-agent-fetch-session}).  @xref{Drafts}.
 
 @item J a
 @kindex J a (Agent Group)
@@ -11800,8 +12230,8 @@ Agent (@code{gnus-agent-remove-server}).
 @vindex gnus-agent-expire-days
 @findex gnus-agent-expire
 @kindex M-x gnus-agent-expire
-@cindex Agent expire
-@cindex Gnus Agent expire
+@cindex Agent expiry
+@cindex Gnus Agent expiry
 @cindex expiry
 
 @code{nnagent} doesn't handle expiry.  Instead, there's a special
@@ -11918,6 +12348,29 @@ emacs -batch -l ~/.emacs -f gnus-agent-batch >/dev/null
 @end example
 
 
+@node Agent Caveats
+@subsection Agent Caveats
+
+The Gnus Agent doesn't seem to work like most other offline
+newsreaders.  Here are some common questions that some imaginary people
+may ask:
+
+@table @dfn
+@item If I read an article while plugged, do they get entered into the
+Agent?
+
+@strong{No.}
+
+@item If I read an article while plugged, and the article already exists
+in the Agent, will it get downloaded once more?
+
+@strong{Yes.}
+
+@end table
+
+In short, when Gnus is unplugged, it only looks into the locally stored
+articles; when it's plugged, it only talks to your ISP.
+
 
 @node Scoring
 @chapter Scoring
@@ -12224,7 +12677,7 @@ You can do scoring from the command line by saying something like:
 @findex gnus-batch-score
 @cindex batch scoring
 @example
-$ emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score
+$ emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score
 @end example
 
 
@@ -12835,6 +13288,12 @@ If @code{gnus-adaptive-word-minimum} is set to a number, the adaptive
 word scoring process will never bring down the score of an article to
 below this number.  The default is @code{nil}.
 
+@vindex gnus-adaptive-word-no-group-words
+If @code{gnus-adaptive-word-no-group-words} is set to @code{t}, gnus
+won't adaptively word score any of the words in the group name.  Useful
+for groups like @samp{comp.editors.emacs}, where most of the subject
+lines contain the word @samp{emacs}.
+
 After using this scheme for a while, it might be nice to write a
 @code{gnus-psychoanalyze-user} command to go through the rules and see
 what words you like and what words you don't like.  Or perhaps not.
@@ -13996,6 +14455,15 @@ and so on.  Create as many faces as you wish.  The same goes for the
 @code{mouse-face} specs---you can say @samp{%3(hello%)} to have
 @samp{hello} mouse-highlighted with @code{gnus-mouse-face-3}.
 
+Text inside the @samp{%<} and @samp{%>} specifiers will get the special
+@code{balloon-help} property set to @code{gnus-balloon-face-0}. If you say
+@samp{%1<}, you'll get @code{gnus-balloon-face-1} and so on. The
+@code{gnus-balloon-face-*} variables should be either strings or
+symbols naming functions that return a string. Under @code{balloon-help-mode},
+when the mouse passes over text with this property set, a balloon window 
+will appear and display the string. Please refer to the doc string of
+@code{balloon-help-mode} for more information on this.
+
 Here's an alternative recipe for the group buffer:
 
 @lisp
@@ -14034,6 +14502,9 @@ If @code{gnus-use-full-window} non-@code{nil}, Gnus will delete all
 other windows and occupy the entire Emacs screen by itself.  It is
 @code{t} by default.
 
+Setting this variable to @code{nil} kinda works, but there are
+glitches.  Use at your own peril.
+
 @vindex gnus-buffer-configuration
 @code{gnus-buffer-configuration} describes how much space each Gnus
 buffer should be given.  Here's an excerpt of this variable:
@@ -14252,6 +14723,11 @@ won't change the window configuration.  If you always want to force the
 ``right'' window configuration, you can set
 @code{gnus-always-force-window-configuration} to non-@code{nil}.
 
+If you're using tree displays (@pxref{Tree Display}), and the tree
+window is displayed vertically next to another window, you may also want
+to fiddle with @code{gnus-tree-minimize-window} to avoid having the
+windows resized.
+
 
 @node Faces and Fonts
 @section Faces and Fonts
@@ -14352,7 +14828,8 @@ Do highlights in the group buffer.
 @item summary-highlight
 Do highlights in the summary buffer.
 @item article-highlight
-Do highlights in the article buffer.
+Do highlights according to @code{gnus-article-display-hook} in the
+article buffer.
 @item highlight
 Turn on highlighting in all buffers.
 @item group-menu
@@ -15468,7 +15945,7 @@ but at the common table.@*
 * Terminology::                    We use really difficult, like, words here.
 * Customization::                  Tailoring Gnus to your needs.
 * Troubleshooting::                What you might try if things do not work.
-* A Programmers Guide to Gnus::    Rilly, rilly technical stuff.
+* Gnus Reference Guide::           Rilly, rilly technical stuff.
 * Emacs for Heathens::             A short introduction to Emacsian terms.
 * Frequently Asked Questions::     A question-and-answer session.
 @end menu
@@ -15654,8 +16131,8 @@ We do have some breaches to this one.
 @table @emph
 
 @item MIME
-Gnus does no MIME handling, and this standard-to-be seems to think that
-MIME is the bees' knees, so we have major breakage here.
+Gnus does not yet fully handle MIME, and this standard-to-be seems to
+think that MIME is the bees' knees, so we have major breakage here.
 
 @item X-Newsreader
 This is considered to be a ``vanity header'', while I consider it to be
@@ -15665,6 +16142,13 @@ those for posting articles.  I would not have known that if it wasn't
 for the @code{X-Newsreader} header.
 @end table
 
+@item USEFOR
+@cindex USEFOR
+USEFOR is an IETF working group writing a successor to RFC 1036, based
+on Son-of-RFC 1036.  They have produced a number of drafts proposing
+various changes to the format of news articles.  The Gnus towers will
+look into implementing the changes when the draft is accepted as an RFC.
+
 @end table
 
 If you ever notice Gnus acting non-compliant with regards to the texts
@@ -15684,13 +16168,10 @@ Gnus should work on :
 @itemize @bullet
 
 @item
-Emacs 19.32 and up.
-
-@item
-XEmacs 19.14 and up.
+Emacs 20.2 and up.
 
 @item
-Mule versions based on Emacs 19.32 and up.
+XEmacs 20.4 and up.
 
 @end itemize
 
@@ -15737,6 +16218,10 @@ Luis Fernandes---design and graphics.
 Erik Naggum---help, ideas, support, code and stuff.
 
 @item
+Shenghuo Zhu---uudecode.el, mm-uu.el, rfc1843.el and many other things
+connected with @sc{mime} and other types of en/decoding.
+
+@item
 Wes Hardaker---@file{gnus-picon.el} and the manual section on
 @dfn{picons} (@pxref{Picons}).
 
@@ -15852,6 +16337,7 @@ Luc Van Eycken,
 Sam Falkner,
 Nelson Jose dos Santos Ferreira,
 Sigbjorn Finne,
+Paul Fisher,
 Decklin Foster,
 Gary D. Foster,
 Paul Franklin,
@@ -15936,6 +16422,7 @@ Jason Rumney,
 Wolfgang Rupprecht,
 Jay Sachs,
 Dewey M. Sasser,
+Conrad Sauerwald,
 Loren Schall,
 Dan Schmidt,
 Ralph Schleicher,
@@ -15969,10 +16456,9 @@ Stefan Waldherr,
 Pete Ware,
 Barry A. Warsaw,
 Christoph Wedler,
-Joe Wells,
-Katsumi Yamaoka, @c Yamaoka
+Joe Wells
 and
-Shenghuo Zhu. @c Zhu
+Katsumi Yamaoka, @c Yamaoka.
 
 For a full overview of what each person has done, the ChangeLogs
 included in the Gnus alpha distributions should give ample reading
@@ -17249,7 +17735,7 @@ mail-copies-to: never.
  new group parameter -- `post-to-server' that says to post
 using the current server.  Also a variable to do the same.
 @item
- the slave dribble files should autosave to the slave file names.
+ the slave dribble files should auto-save to the slave file names.
 @item
  a group parameter that says what articles to display on group entry, based
 on article marks.
@@ -17723,7 +18209,7 @@ home-brewed stuff for better reliability.
  add a way to select which NoCeM type to apply -- spam, troll, etc.
 
 @item
- nndraft-request-group should tally autosave files.
+ nndraft-request-group should tally auto-save files.
 
 @item
  implement nntp-retry-on-break and nntp-command-timeout.
@@ -17859,6 +18345,32 @@ gnus-fetch-group and friends should exit Gnus when the user
 exits the group.
 
 @item
+The jingle is only played on the second invocation of Gnus.
+
+@item
+Bouncing articles should do MIME.
+
+@item
+Crossposted articles should "inherit" the % or @ mark from the other
+groups it has been crossposted to, or something.  (Agent.)
+
+@item
+`S D r' should allow expansion of aliases.
+
+@item
+If point is on a group that appears multiple times in topics, and
+you press `l', point will move to the first instance of the group.
+
+@item
+The documentation should mention pop3.el, fetchmail, smtpmail and why
+po:username often fails.
+
+@item
+Fetch by Message-ID from dejanews.
+
+<URL:http://search.dejanews.com/msgid.xp?MID=%3C62h9l9$hm4@@basement.replay.com%3E&fmt=raw>
+
+@item
 Solve the halting problem.
 
 @c TODO
@@ -18325,8 +18837,8 @@ Write to @samp{ding-request@@gnus.org} to subscribe.
 
 
 @page
-@node A Programmers Guide to Gnus
-@section A Programmer@'s Guide to Gnus
+@node Gnus Reference Guide
+@section Gnus Reference Guide
 
 It is my hope that other people will figure out smart stuff that Gnus
 can do, and that other people will write those smart things as well.  To
@@ -18464,7 +18976,7 @@ Takes two parameters, @var{function} and @var{group}.  If the backend
 
 @lisp
 (gnus-check-backend-function "request-scan" "nnml:misc")
-=> t
+@result{} t
 @end lisp
 
 @item gnus-read-method
@@ -18806,6 +19318,48 @@ and @var{article} may be @code{nil}.
 There should be no result data from this function.
 
 
+@item (nnchoke-request-set-mark GROUP ACTION &optional SERVER)
+
+Set/remove/add marks on articles. Normally Gnus handles the article
+marks (such as read, ticked, expired etc) internally, and store them in
+@code{~/.newsrc.eld}. Some backends (such as IMAP) however carry all
+information about the articles on the server, so Gnus need to propagate
+the mark information to the server.
+
+ACTION is a list of mark setting requests, having this format:
+
+@example
+(RANGE ACTION MARK)
+@end example
+
+Range is a range of articles you wish to update marks on. Action is
+@code{set}, @code{add} or @code{del}, respectively used for removing all
+existing marks and setting them as specified, adding (preserving the
+marks not mentioned) mark and removing (preserving the marks not
+mentioned) marks. Mark is a list of marks; where each mark is a
+symbol. Currently used marks are @code{read}, @code{tick}, @code{reply},
+@code{expire}, @code{killed}, @code{dormant}, @code{save},
+@code{download} and @code{unsend}, but your backend should, if possible,
+not limit itself to theese.
+
+Given contradictory actions, the last action in the list should be the
+effective one. That is, if your action contains a request to add the
+@code{tick} mark on article 1 and, later in the list, a request to
+remove the mark on the same article, the mark should in fact be removed.
+
+An example action list:
+
+@example
+(((5 12 30) 'del '(tick))
+ ((10 . 90) 'add '(read expire))
+ ((92 94) 'del '(read)))
+@end example
+
+The function should return a range of articles it wasn't able to set the
+mark on (currently not used for anything).
+
+There should be no result data from this function.
+
 @item (nnchoke-request-update-mark GROUP ARTICLE MARK)
 
 If the user tries to set a mark that the backend doesn't like, this
@@ -19332,12 +19886,12 @@ basically, with each header (ouch) having one slot.
 
 These slots are, in order: @code{number}, @code{subject}, @code{from},
 @code{date}, @code{id}, @code{references}, @code{chars}, @code{lines},
-@code{xref}.  There are macros for accessing and setting these
-slots---they all have predictable names beginning with
+@code{xref}, and @code{extra}.  There are macros for accessing and
+setting these slots---they all have predictable names beginning with
 @code{mail-header-} and @code{mail-header-set-}, respectively.
 
-The @code{xref} slot is really a @code{misc} slot.  Any extra info will
-be put in there.
+All these slots contain strings, except the @code{extra} slot, which
+contains an alist of header/value pairs (@pxref{To From Newsgroups}).
 
 
 @node Ranges
@@ -19431,7 +19985,7 @@ Here are two example group infos; one is a very simple group while the
 second is a more complex one:
 
 @example
-("no.group" 5 (1 . 54324))
+("no.group" 5 ((1 . 54324)))
 
 ("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55))
                 ((tick (15 . 19)) (replied 3 6 (19 . 3)))
index 1518738..cc8e4e6 100644 (file)
@@ -1,7 +1,7 @@
 \input texinfo                  @c -*-texinfo-*-
 
 @setfilename message
-@settitle Message 5.6.45 Manual
+@settitle Pterodactyl Message 0.51 Manual
 @synindex fn cp
 @synindex vr cp
 @synindex pg cp
@@ -17,7 +17,7 @@
 
 This file documents Message, the Emacs message composition mode.
 
-Copyright (C) 1996 Free Software Foundation, Inc.
+Copyright (C) 1996,97,98 Free Software Foundation, Inc.
 
 Permission is granted to make and distribute verbatim copies of
 this manual provided the copyright notice and this permission notice
@@ -42,7 +42,7 @@ into another language, under the above conditions for modified versions.
 @tex
 
 @titlepage
-@title Message 5.6.45 Manual
+@title Pterodactyl Message 0.51 Manual
 
 @author by Lars Magne Ingebrigtsen
 @page
@@ -83,9 +83,9 @@ Message mode buffers.
 * Key Index::         List of Message mode keys.
 @end menu
 
-This manual corresponds to Message 5.6.45.  Message is distributed with
-the Gnus distribution bearing the same version number as this manual
-has. 
+This manual corresponds to Pterodactyl Message 0.51.  Message is
+distributed with the Gnus distribution bearing the same version number
+as this manual.
 
 
 @node Interface
@@ -956,6 +956,8 @@ Check whether the article has an @code{Approved} header, which is
 something only moderators should include.
 @item empty
 Check whether the article is empty.
+@item invisible-text
+Check whether there is any invisible text in the buffer.
 @item empty-headers
 Check whether any of the headers are empty.
 @item existing-newsgroups