*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 18:52:34 +0000 (18:52 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 18:52:34 +0000 (18:52 +0000)
21 files changed:
GNUS-NEWS [new file with mode: 0644]
lisp/ChangeLog
lisp/custom.el
lisp/gnus-cite.el
lisp/gnus-ems.el
lisp/gnus-msg.el
lisp/gnus-nocem.el
lisp/gnus-salt.el
lisp/gnus-score.el
lisp/gnus-xmas.el
lisp/gnus.el
lisp/message.el
lisp/nnatp.el [deleted file]
lisp/nnfolder.el
lisp/nnspool.el
lisp/nntp.el
lisp/nnvirtual.el
lisp/x-easymenu.el [deleted file]
texi/ChangeLog
texi/gnus.texi
texi/message.texi

diff --git a/GNUS-NEWS b/GNUS-NEWS
new file mode 100644 (file)
index 0000000..245f98c
--- /dev/null
+++ b/GNUS-NEWS
@@ -0,0 +1,162 @@
+** Gnus changes.
+
+Gnus, the Emacs newsreader, has undergone further rewriting.  Many new
+commands and variables have been added.  There should be no
+significant imcompatabilities between this Gnus version and the
+previosly released version, except in the message composition area.
+
+Below is a list of the more user-visible changes.  Coding changes
+between Gnus 5.1 and 5.2 are more extensive.
+
+*** A new message composition mode is used.  All old customization 
+variables for mail-mode, rnews-reply-mode and gnus-msg are now
+absolete.
+
+*** Gnus is now able to generate "sparse" threads -- threads where
+missing articles are represented by empty nodes.
+
+    (setq gnus-build-sparse-threads 'some)
+
+*** Outgoing articles are stored on a special archive server.
+
+    To disable this:  (setq gnus-message-archive-group nil)
+
+*** Partial thread regeneration now happens when articles are
+referred. 
+
+*** Gnus can make use of GroupLens predictions:
+
+    (setq gnus-use-grouplens t)
+
+*** Picons (personal icons) can be displayed under XEmacs.
+
+    (setq gnus-use-picons t)
+
+*** A trn-line tree buffer can be displayed.
+
+    (setq gnus-use-trees t)
+
+*** An nn-like pick-and-read minor mode is available for the summary
+buffers. 
+
+    (add-hook 'gnus-summary-mode-hook 'gnus-pick-mode)
+
+*** In binary groups you can use a special binary minor mode:
+
+    `M-x gnus-binary-mode'
+
+*** Groups can be grouped in a folding topic hierarchy.
+
+    (add-hook 'gnus-group-mode-hook 'gnus-topic-mode)
+
+*** Gnus can resend and bounce mail.
+
+    Use the `S D r' and `S D b'.
+
+*** Groups can now have a score, and bubbling based on entry frequency
+is possible.
+
+    (add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group)
+
+*** Groups can be process-marked, and commands can be performed on
+groups of groups.
+
+*** Caching is possible in virtual groups.
+
+*** nndoc now understands all kinds of digests, mail boxes, rnews news
+batches, ClariNet briefs collections, and just about everything else. 
+
+*** Gnus has a new backend (nnsoup) to create/read SOUP packets.
+
+*** The Gnus cache is much faster.
+
+*** Groups can be sorted according to many criteria.
+
+    For instance: (setq gnus-group-sort-function 'gnus-group-sort-by-rank)
+
+*** New group parameters have been introduced to set list-address and
+expiry times.
+
+*** All formatting specs allow specifying faces to be used.
+
+*** There are several more commands for setting/removing/acting on
+process marked articles on the `M P' submap.
+
+*** The summary buffer can be limited to show parts of the available
+articles based on a wide range of criteria.  These commands have been
+bound to keys on the `/' submap.
+
+*** Articles can be made persistent -- as an alternative to saving
+articles with the `*' command.
+
+*** All functions for hiding article elements are now toggles.
+
+*** Article headers can be buttonized.
+
+    (add-hook 'gnus-article-display-hook 'gnus-article-add-buttons-to-head)
+
+*** All mail backends support fetching articles by Message-ID.
+
+*** Duplicate mail can now be treated properly.  See the 
+`nnmail-treat-duplicates' variable.
+
+*** All summary mode commands are available directly from the article
+buffer. 
+
+*** Frames can be part of `gnus-buffer-configuration'.
+
+*** Mail can be re-scanned by a daemonic process.
+
+*** Gnus can make use of NoCeM files to filter spam.
+
+    (setq gnus-use-nocem t)
+
+*** Groups can be made permanently visible. 
+
+    (setq gnus-permanently-visible-groups "^nnml:")
+
+*** Many new hooks have been introduced to make customizing easier. 
+
+*** Gnus respects the Mail-Copies-To header.
+
+*** Threads can be gathered by looking at the References header. 
+
+    (setq gnus-summary-thread-gathering-function 
+          'gnus-gather-threads-by-references)
+
+*** Read articles can be stored in a special backlog buffer to avoid
+refetching.  
+
+    (setq gnus-keep-backlog 50)
+
+*** A clean copy of the current article is always stored in a separate
+buffer to allow easier treatment.
+
+*** Gnus can suggest where to save articles.  See `gnus-split-methods'.
+
+*** Gnus doesn't have to do as much prompting when saving.
+
+    (setq gnus-prompt-before-saving t)
+
+*** gnus-uu can view decoded files asynchronously while fetching
+articles. 
+
+    (setq gnus-uu-grabbed-file-functions '`gnus-uu-grab-view)
+
+*** Filling in the article buffer now works properly on cited text. 
+
+*** Hiding cited text adds buttons to toggle hiding, and how much
+cited text to hide is now customizable.
+
+    (setq gnus-cited-lines-visible 2)
+
+*** Boring headers can be hidden.
+
+    (add-hook 'gnus-article-display-hook 'gnus-article-hide-boring-headers)
+
+*** Default scoring values can now be set from the menu bar.
+
+*** Further syntax checking of outgoing articles have been added.
+
+The Gnus manual has been expanded.  It explains all these new features
+in greater detail.
index 1767154..daa7e9a 100644 (file)
@@ -1,3 +1,72 @@
+Wed May 29 05:08:04 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
+
+       * custom.el (custom-xmas-add-text-properties,
+       custom-xmas-put-text-property): New functions used throughout.
+       May now work under XEmacs.
+
+Wed May 29 00:07:13 1996  Lars Magne Ingebrigtsen  <larsi@aegir.ifi.uio.no>
+
+       * gnus-cite.el (gnus-cite-article): New variable.
+       (gnus-cite-parse-maybe): Use it.
+
+       * nnspool.el (nnspool-open-server): Refuse opening if the active
+       file doesn't exist.
+
+       * gnus.el (gnus-read-active-file): Message more.
+
+       * nntp.el (nntp-request-article): Wouldn't wait until the entire
+       article had arrived.
+
+       * nnvirtual.el (nnvirtual-request-group): Make sure that things
+       don't recurse endlessly.
+
+       * message.el (message-expand-group): Make buffer not read-only. 
+
+       * gnus-nocem.el (gnus-nocem-verifyer): New variable.
+       (gnus-nocem-verify-issuer): Use it.
+
+       * gnus-xmas.el (gnus-xmas-logo-color-alist): New variable.
+       (gnus-xmas-logo-color-style): New variable.
+       (gnus-xmas-logo-colors): Use them.
+
+Tue May 28 00:28:38 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus-score.el (gnus-score-followup): Would infloop on exact
+       matches. 
+
+       * message.el (message-forward): Insert separator at the start of
+       the line. 
+
+       * nnfolder.el (nnfolder-save-buffer): New function.
+       (nnfolder-save-buffer-hook): New variable.
+
+       * message.el (message-mode-hook): Defined variable.
+
+       * nntp.el (nntp-request-close): Remove the sentinel before closing
+       connection.
+
+       * gnus.el (gnus-group-mode): Add to local hook.
+       (gnus-continuum-version): Would return wrong answer for non-alpha
+       releases. 
+       (gnus-version-number): New variable.
+       (gnus-version): Use it.
+
+       * gnus-msg.el (gnus-inews-add-send-actions): Add to local hook.
+
+       * gnus-xmas.el (gnus-xmas-add-hook): New function.
+
+       * gnus-ems.el (gnus-add-hook): New alias.
+
+Tue May 28 00:23:17 1996  Joao Cachopo  <jcachopo@gia.ist.utl.pt>
+
+       * gnus-salt.el (gnus-binary-mode): Would put wrong minor mode
+       keymap into alist.
+
+Tue May 28 00:18:19 1996  Thor Kristoffersen  <thor@unik.no>
+
+       * nntp.el (nntp-close-server): Supply parameter to
+       `nntp-server-opened'. 
+
 Sun May 26 20:29:02 1996  Lars Magne Ingebrigtsen  <larsi@eistla.ifi.uio.no>
 
        * gnus.el (gnus-article-sort-by-date): Inline.
 Sun May 26 20:29:02 1996  Lars Magne Ingebrigtsen  <larsi@eistla.ifi.uio.no>
 
        * gnus.el (gnus-article-sort-by-date): Inline.
@@ -18,6 +87,10 @@ Sun May 26 20:29:02 1996  Lars Magne Ingebrigtsen  <larsi@eistla.ifi.uio.no>
 
 Sun May 26 03:51:38 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
 
 
 Sun May 26 03:51:38 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
 
+       * gnus.el: Gnus v5.2.1 is released.
+
+       * gnus.el: Gnus v5.2.0 is released.
+
        * gnus.el: September Gnus v0.96 is released.
 
        * nnheader-ems.el: Raw-file confusion.
        * gnus.el: September Gnus v0.96 is released.
 
        * nnheader-ems.el: Raw-file confusion.
index b1421ac..e1e5a0f 100644 (file)
@@ -1,12 +1,30 @@
 ;;; custom.el --- User friendly customization support.
 ;;; custom.el --- User friendly customization support.
-;; Copyright (C) 1995 Free Software Foundation, Inc.
-;;
+
+;; Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+
 ;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
 ;; Keywords: help
 ;; Version: 0.5
 
 ;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
 ;; Keywords: help
 ;; Version: 0.5
 
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
 ;;; Commentary:
 ;;; Commentary:
-;;
+
 ;; WARNING: This package is still under construction and not all of
 ;; the features below are implemented.
 ;;
 ;; WARNING: This package is still under construction and not all of
 ;; the features below are implemented.
 ;;
@@ -15,7 +33,7 @@
 ;; editing a text file in some arcane syntax is user hostile in the
 ;; extreme, and to most users emacs lisp definitely count as arcane.
 ;;
 ;; editing a text file in some arcane syntax is user hostile in the
 ;; extreme, and to most users emacs lisp definitely count as arcane.
 ;;
-;; The intension is that authors of emacs lisp packages declare the
+;; The intent is that authors of emacs lisp packages declare the
 ;; variables intended for user customization with `custom-declare'.
 ;; Custom can then automatically generate a customization buffer with
 ;; `custom-buffer-create' where the user can edit the package
 ;; variables intended for user customization with `custom-declare'.
 ;; Custom can then automatically generate a customization buffer with
 ;; `custom-buffer-create' where the user can edit the package
 ;; - Make it possible to declare default value and type for a single
 ;;   variable, storing the data in a symbol property.
 ;; - Syntactic sugar for CUSTOM declarations.
 ;; - Make it possible to declare default value and type for a single
 ;;   variable, storing the data in a symbol property.
 ;; - Syntactic sugar for CUSTOM declarations.
-;; - Use W3 for variable documenation.
+;; - Use W3 for variable documentation.
 
 ;;; Code:
 
 ;;; Compatibility:
 
 
 ;;; Code:
 
 ;;; Compatibility:
 
+(defun custom-xmas-add-text-properties (start end props &optional object)
+  (add-text-properties start end props object)
+  (put-text-property start end 'start-open t object)
+  (put-text-property start end 'end-open t object))
+
+(defun custom-xmas-put-text-property (start end prop value &optional object)
+  (put-text-property start end prop value object)
+  (put-text-property start end 'start-open t object)
+  (put-text-property start end 'end-open t object))
+
+(defun custom-xmas-extent-start-open ()
+  (map-extents (lambda (extent arg)
+                (set-extent-property extent 'start-open t))
+              nil (point) (min (1+ (point)) (point-max))))
+                 
+(if (string-match "XEmacs\\|Lucid" emacs-version)
+    (progn
+      (fset 'custom-add-text-properties 'custom-xmas-add-text-properties)
+      (fset 'custom-put-text-property 'custom-xmas-put-text-property)
+      (fset 'custom-extent-start-open 'custom-xmas-extent-start-open))
+  (fset 'custom-add-text-properties 'add-text-properties)
+  (fset 'custom-put-text-property 'put-text-property)
+  (fset 'custom-extent-start-open 'ignore))
+
 (or (fboundp 'buffer-substring-no-properties)
     ;; Introduced in Emacs 19.29.
     (defun buffer-substring-no-properties (beg end)
       "Return the text from BEG to END, without text properties, as a string."
       (let ((string (buffer-substring beg end)))
 (or (fboundp 'buffer-substring-no-properties)
     ;; Introduced in Emacs 19.29.
     (defun buffer-substring-no-properties (beg end)
       "Return the text from BEG to END, without text properties, as a string."
       (let ((string (buffer-substring beg end)))
-       (custom-set-text-properties 0 (length string) nil string)
+       (set-text-properties 0 (length string) nil string)
        string)))
 
 (or (fboundp 'add-to-list)
        string)))
 
 (or (fboundp 'add-to-list)
@@ -153,24 +195,18 @@ STRING should be given if the last search was by `string-match' on STRING."
       (and (fboundp 'set-face-underline-p)
           (funcall 'set-face-underline-p 'underline t))))
 
       (and (fboundp 'set-face-underline-p)
           (funcall 'set-face-underline-p 'underline t))))
 
-(defun custom-xmas-set-text-properties (start end props &optional buffer)
-  "You should NEVER use this function.  It is ideologically blasphemous.
-It is provided only to ease porting of broken FSF Emacs programs."
-  (if (stringp buffer) 
-      nil
-    (map-extents (lambda (extent ignored)
-                  (remove-text-properties 
-                   start end
-                   (list (extent-property extent 'text-prop) nil)
-                   buffer))
-                buffer start end nil nil 'text-prop)
-    (add-text-properties start end props buffer)))
-
-(if (string-match "XEmacs" emacs-version)
-    (fset 'custom-set-text-properties 'gnus-xmas-set-text-properties)
-  (fset 'custom-set-text-properties 'set-text-properties))
-
-(or (fboundp 'event-point)
+(or (fboundp 'set-text-properties)
+    ;; Missing in XEmacs 19.12.
+    (defun set-text-properties (start end props &optional buffer)
+      (if (or (null buffer) (bufferp buffer))
+         (if props
+             (while props
+               (custom-put-text-property 
+                start end (car props) (nth 1 props) buffer)
+               (setq props (nthcdr 2 props)))
+           (remove-text-properties start end ())))))
+
+(or (fboundp 'event-closest-point)
     ;; Missing in Emacs 19.29.
     (defun event-point (event)
       "Return the character position of the given mouse-motion, button-press,
     ;; Missing in Emacs 19.29.
     (defun event-point (event)
       "Return the character position of the given mouse-motion, button-press,
@@ -250,12 +286,12 @@ If called interactively, prompts for a face and face attributes."
                                       (> emacs-minor-version 28))))
                         (setq intangible 'intangible)
                       (setq intangible 'intangible-if-it-had-been-working))
                                       (> emacs-minor-version 28))))
                         (setq intangible 'intangible)
                       (setq intangible 'intangible-if-it-had-been-working))
-  "The symbol making text intangible")
+  "The symbol making text intangible.")
 
 (defconst rear-nonsticky (if (string-match "XEmacs" emacs-version)
                             'end-open
                           'rear-nonsticky)
 
 (defconst rear-nonsticky (if (string-match "XEmacs" emacs-version)
                             'end-open
                           'rear-nonsticky)
-  "The symbol making text proeprties non-sticky in the rear end.")
+  "The symbol making text properties non-sticky in the rear end.")
 
 (defconst front-sticky (if (string-match "XEmacs" emacs-version)
                           'front-closed
 
 (defconst front-sticky (if (string-match "XEmacs" emacs-version)
                           'front-closed
@@ -347,7 +383,7 @@ If called interactively, prompts for a face and face attributes."
 
   (defun custom-category-set (from to category)
     "Make text between FROM and TWO have category CATEGORY."
 
   (defun custom-category-set (from to category)
     "Make text between FROM and TWO have category CATEGORY."
-    (put-text-property from to 'category category)))
+    (custom-put-text-property from to 'category category)))
 
 ;;; External Data:
 ;; 
 
 ;;; External Data:
 ;; 
@@ -400,10 +436,10 @@ If called interactively, prompts for a face and face attributes."
 ;; The following functions are part of the public interface to the
 ;; CUSTOM datastructure.  Each CUSTOM describes a group of variables,
 ;; a single variable, or a component of a structured variable.  The
 ;; The following functions are part of the public interface to the
 ;; CUSTOM datastructure.  Each CUSTOM describes a group of variables,
 ;; a single variable, or a component of a structured variable.  The
-;; CUSTOM instances are part of two hiearachies, the first is the
+;; CUSTOM instances are part of two hierarchies, the first is the
 ;; `part-of' hierarchy in which each CUSTOM is a component of another
 ;; CUSTOM, except for the top level CUSTOM which is contained in
 ;; `part-of' hierarchy in which each CUSTOM is a component of another
 ;; CUSTOM, except for the top level CUSTOM which is contained in
-;; `custom-data'.  The second hiearachy is a `is-a' type hierarchy
+;; `custom-data'.  The second hierarchy is a `is-a' type hierarchy
 ;; where each CUSTOM is a leaf in the hierarchy defined by the `type'
 ;; property and `custom-type-properties'.
 
 ;; where each CUSTOM is a leaf in the hierarchy defined by the `type'
 ;; property and `custom-type-properties'.
 
@@ -502,6 +538,17 @@ hierarchy the new entry should be added.  CUSTOM is the entry to add."
                  ((type . const)
                   (tag . "Off")
                   (default . nil))))
                  ((type . const)
                   (tag . "Off")
                   (default . nil))))
+    (triggle (type . choice)
+            ;; On/Off/Default.
+            (data ((type . const)
+                   (tag . "On ")
+                   (default . t))
+                  ((type . const)
+                   (tag . "Off")
+                   (default . nil))
+                  ((type . const)
+                   (tag . "Def")
+                   (default . custom:asis))))
     (choice (type . default)
            ;; See `custom-match'.
            (query . custom-choice-query)
     (choice (type . default)
            ;; See `custom-match'.
            (query . custom-choice-query)
@@ -609,17 +656,17 @@ Select the properties you want this face to have.")
                        (type . string))
                       "\n"
                       ((tag . "Bold")
                        (type . string))
                       "\n"
                       ((tag . "Bold")
-                       (default . nil)
-                       (type . toggle))
+                       (default . custom:asis)
+                       (type . triggle))
                       "              "
                       ((tag . "Italic")
                       "              "
                       ((tag . "Italic")
-                       (default . nil)
-                       (type . toggle))
+                       (default . custom:asis)
+                       (type . triggle))
                       "             "
                       ((tag . "Underline")
                        (hidden . t)
                       "             "
                       ((tag . "Underline")
                        (hidden . t)
-                       (default . nil)
-                       (type . toggle)))
+                       (default . custom:asis)
+                       (type . triggle)))
                 (default . (custom-face-lookup "default" "default" "default"
                                                nil nil nil))
                 (type . list))
                 (default . (custom-face-lookup "default" "default" "default"
                                                nil nil nil))
                 (type . list))
@@ -710,6 +757,9 @@ Entries in this list take precedence over `custom-type-properties'.")
 (defconst custom-invalid '__invalid__
   "Special value representing an invalid field.")
 
 (defconst custom-invalid '__invalid__
   "Special value representing an invalid field.")
 
+(defconst custom:asis 'custom:asis)
+;; Bad, ugly, and horrible kludge.
+
 (defun custom-property (custom property)
   "Extract from CUSTOM property PROPERTY."
   (let ((entry (assq property custom)))
 (defun custom-property (custom property)
   "Extract from CUSTOM property PROPERTY."
   (let ((entry (assq property custom)))
@@ -735,7 +785,7 @@ Entries in this list take precedence over `custom-type-properties'.")
     (cdr entry)))
 
 (defun custom-property-set (custom property value)
     (cdr entry)))
 
 (defun custom-property-set (custom property value)
-  "Set CUSTOM PROPERY to VALUE by side effect.
+  "Set CUSTOM PROPERTY to VALUE by side effect.
 CUSTOM must have at least one property already."
   (let ((entry (assq property custom)))
     (if entry
 CUSTOM must have at least one property already."
   (let ((entry (assq property custom)))
     (if entry
@@ -884,7 +934,7 @@ position of the error, and the cdr is a text describing the error."
 ;; FIELD datatype.  The FIELD instance hold information about a
 ;; specific editing field in the customization buffer.
 ;;
 ;; FIELD datatype.  The FIELD instance hold information about a
 ;; specific editing field in the customization buffer.
 ;;
-;; Each FIELD can be seen as an instanciation of a CUSTOM.
+;; Each FIELD can be seen as an instantiation of a CUSTOM.
 
 (defvar custom-field-last nil)
 ;; Last field containing point.
 
 (defvar custom-field-last nil)
 ;; Last field containing point.
@@ -943,7 +993,7 @@ START and END are markers to the start and end of the field."
 
 (defun custom-field-accept (field value &optional original)
   "Store a new value into field FIELD, taking it from VALUE.
 
 (defun custom-field-accept (field value &optional original)
   "Store a new value into field FIELD, taking it from VALUE.
-If optional ORIGINAL is non-nil, concider VALUE for the original value."
+If optional ORIGINAL is non-nil, consider VALUE for the original value."
   (let ((inhibit-point-motion-hooks t))
     (funcall (custom-property (custom-field-custom field) 'accept) 
             field value original)))
   (let ((inhibit-point-motion-hooks t))
     (funcall (custom-property (custom-field-custom field) 'accept) 
             field value original)))
@@ -1054,6 +1104,7 @@ If optional ORIGINAL is non-nil, concider VALUE for the original value."
         (end (make-marker))
         (data (vector repeat nil start end))
         field)
         (end (make-marker))
         (data (vector repeat nil start end))
         field)
+    (custom-extent-start-open)
     (insert-before-markers "\n")
     (backward-char 1)
     (set-marker start (point))
     (insert-before-markers "\n")
     (backward-char 1)
     (set-marker start (point))
@@ -1106,7 +1157,7 @@ If optional ORIGINAL is non-nil, concider VALUE for the original value."
     (cons (nreverse matches) values)))
 
 (defun custom-repeat-extract (custom field)
     (cons (nreverse matches) values)))
 
 (defun custom-repeat-extract (custom field)
-  "Extract list of childrens values."
+  "Extract list of children's values."
   (let ((values (custom-field-value field))
        (data (custom-data custom))
        result)
   (let ((values (custom-field-value field))
        (data (custom-data custom))
        result)
@@ -1153,7 +1204,7 @@ If optional ORIGINAL is non-nil, concider VALUE for the original value."
     (custom-default-quote custom value)))
 
 (defun custom-pair-extract (custom field)
     (custom-default-quote custom value)))
 
 (defun custom-pair-extract (custom field)
-  "Extract cons of childrens values."
+  "Extract cons of children's values."
   (let ((values (custom-field-value field))
        (data (custom-data custom))
        result)
   (let ((values (custom-field-value field))
        (data (custom-data custom))
        result)
@@ -1174,7 +1225,7 @@ If optional ORIGINAL is non-nil, concider VALUE for the original value."
     (custom-default-quote custom value)))
 
 (defun custom-list-extract (custom field)
     (custom-default-quote custom value)))
 
 (defun custom-list-extract (custom field)
-  "Extract list of childrens values."
+  "Extract list of children's values."
   (let ((values (custom-field-value field))
        (data (custom-data custom))
        result)
   (let ((values (custom-field-value field))
        (data (custom-data custom))
        result)
@@ -1283,7 +1334,7 @@ If optional ORIGINAL is non-nil, concider VALUE for the original value."
         (face-tag (custom-face-tag custom))
         current)
     (if face-tag 
         (face-tag (custom-face-tag custom))
         current)
     (if face-tag 
-       (put-text-property from (+ from (length (custom-tag custom)))
+       (custom-put-text-property from (+ from (length (custom-tag custom)))
                           'face (funcall face-tag field value)))
     (if original 
        (custom-field-original-set field value))
                           'face (funcall face-tag field value)))
     (if original 
        (custom-field-original-set field value))
@@ -1369,9 +1420,10 @@ If optional ORIGINAL is non-nil, concider VALUE for the original value."
          ()
        (setq begin (point)
              found (custom-insert (custom-property custom 'none) nil))
          ()
        (setq begin (point)
              found (custom-insert (custom-property custom 'none) nil))
-       (add-text-properties begin (point)
-                            (list rear-nonsticky t
-                                  'face custom-field-uninitialized-face)))
+       (custom-add-text-properties 
+        begin (point)
+        (list rear-nonsticky t
+              'face custom-field-uninitialized-face)))
       (or original
          (custom-field-original-set found (custom-field-original field)))
       (custom-field-accept found value original)
       (or original
          (custom-field-original-set found (custom-field-original field)))
       (custom-field-accept found value original)
@@ -1379,12 +1431,12 @@ If optional ORIGINAL is non-nil, concider VALUE for the original value."
       (custom-field-move field from end))))
 
 (defun custom-choice-extract (custom field)
       (custom-field-move field from end))))
 
 (defun custom-choice-extract (custom field)
-  "Extract childs value."
+  "Extract child's value."
   (let ((value (custom-field-value field)))
     (custom-field-extract (custom-field-custom value) value)))
 
 (defun custom-choice-validate (custom field)
   (let ((value (custom-field-value field)))
     (custom-field-extract (custom-field-custom value) value)))
 
 (defun custom-choice-validate (custom field)
-  "Validate childs value."
+  "Validate child's value."
   (let ((value (custom-field-value field))
        (custom (custom-field-custom field)))
     (if (or (eq value custom-nil)
   (let ((value (custom-field-value field))
        (custom (custom-field-custom field)))
     (if (or (eq value custom-nil)
@@ -1492,8 +1544,8 @@ FG BG STIPPLE BOLD ITALIC UNDERLINE"
 (defun custom-face-hack (field value)
   "Face that should be used for highlighting FIELD containing VALUE."
   (let* ((custom (custom-field-custom field))
 (defun custom-face-hack (field value)
   "Face that should be used for highlighting FIELD containing VALUE."
   (let* ((custom (custom-field-custom field))
-        (face (eval (funcall (custom-property custom 'export) 
-                             custom value))))
+        (form (funcall (custom-property custom 'export) custom value))
+        (face (apply (car form) (cdr form))))
     (if (custom-facep face) face nil)))
 
 (defun custom-const-insert (custom level)
     (if (custom-facep face) face nil)))
 
 (defun custom-const-insert (custom level)
@@ -1502,7 +1554,7 @@ FG BG STIPPLE BOLD ITALIC UNDERLINE"
         (face (custom-field-face field))
         (from (point)))
     (custom-text-insert (custom-tag custom))
         (face (custom-field-face field))
         (from (point)))
     (custom-text-insert (custom-tag custom))
-    (add-text-properties from (point) 
+    (custom-add-text-properties from (point) 
                         (list 'face face
                               rear-nonsticky t))
     (custom-documentation-insert custom)
                         (list 'face face
                               rear-nonsticky t))
     (custom-documentation-insert custom)
@@ -1513,7 +1565,7 @@ FG BG STIPPLE BOLD ITALIC UNDERLINE"
   "Update face of FIELD."
   (let ((from (custom-field-start field))
        (custom (custom-field-custom field)))
   "Update face of FIELD."
   (let ((from (custom-field-start field))
        (custom (custom-field-custom field)))
-    (put-text-property from (+ from (length (custom-tag custom)))
+    (custom-put-text-property from (+ from (length (custom-tag custom)))
                       'face (custom-field-face field))))
 
 (defun custom-const-valid (custom value)
                       'face (custom-field-face field))))
 
 (defun custom-const-valid (custom value)
@@ -1672,7 +1724,7 @@ FG BG STIPPLE BOLD ITALIC UNDERLINE"
     (cond ((eq value custom-nil)
           (cons start "Uninitialized field"))
          ((and (consp value) (eq (car value) custom-invalid))
     (cond ((eq value custom-nil)
           (cons start "Uninitialized field"))
          ((and (consp value) (eq (car value) custom-invalid))
-          (cons start "Unparseable field content"))
+          (cons start "Unparsable field content"))
          ((custom-valid custom value)
           nil)
          (t
          ((custom-valid custom value)
           nil)
          (t
@@ -1802,9 +1854,9 @@ If the optional argument SAVE is non-nil, use that for saving changes."
   (let ((from (point)))
     (insert tag)
     (custom-category-set from (point) 'custom-button-properties)
   (let ((from (point)))
     (insert tag)
     (custom-category-set from (point) 'custom-button-properties)
-    (put-text-property from (point) 'custom-tag field)
+    (custom-put-text-property from (point) 'custom-tag field)
     (if data
     (if data
-       (add-text-properties from (point) (list 'custom-data data)))))
+       (custom-add-text-properties from (point) (list 'custom-data data)))))
 
 (defun custom-documentation-insert (custom &rest ignore)
   "Insert documentation from CUSTOM in current buffer."
 
 (defun custom-documentation-insert (custom &rest ignore)
   "Insert documentation from CUSTOM in current buffer."
@@ -1823,11 +1875,13 @@ If the optional argument SAVE is non-nil, use that for saving changes."
   "Describe how to execute COMMAND."
   (let ((from (point)))
     (insert "`" (key-description (where-is-internal command nil t)) "'")
   "Describe how to execute COMMAND."
   (let ((from (point)))
     (insert "`" (key-description (where-is-internal command nil t)) "'")
-    (custom-set-text-properties from (point)
+    (set-text-properties from (point)
                         (list 'face custom-button-face
                               mouse-face custom-mouse-face
                               'custom-jump t ;Make TAB jump over it.
                         (list 'face custom-button-face
                               mouse-face custom-mouse-face
                               'custom-jump t ;Make TAB jump over it.
-                              'custom-tag command))
+                              'custom-tag command
+                              'start-open t
+                              'end-open t))
     (custom-category-set from (point) 'custom-documentation-properties))
   (custom-help-insert ": " (custom-first-line (documentation command)) "\n"))
 
     (custom-category-set from (point) 'custom-documentation-properties))
   (custom-help-insert ": " (custom-first-line (documentation command)) "\n"))
 
@@ -1836,7 +1890,7 @@ If the optional argument SAVE is non-nil, use that for saving changes."
 ;; The Customization major mode and interactive commands. 
 
 (defvar custom-mode-map nil
 ;; The Customization major mode and interactive commands. 
 
 (defvar custom-mode-map nil
-  "Keymap for Custum Mode.")
+  "Keymap for Custom Mode.")
 (if custom-mode-map
     nil
   (setq custom-mode-map (make-sparse-keymap))
 (if custom-mode-map
     nil
   (setq custom-mode-map (make-sparse-keymap))
@@ -2149,12 +2203,13 @@ If the optional argument is non-nil, show text iff the argument is positive."
     (insert-char (custom-padding custom)
                 (- (custom-width custom) (- (point) from)))
     (custom-field-move field from (point))
     (insert-char (custom-padding custom)
                 (- (custom-width custom) (- (point) from)))
     (custom-field-move field from (point))
-    (custom-set-text-properties 
+    (set-text-properties 
      from (point)
      (list 'custom-field field
           'custom-tag field
           'face (custom-field-face field)
      from (point)
      (list 'custom-field field
           'custom-tag field
           'face (custom-field-face field)
-          front-sticky t))))
+          'start-open t
+          'end-open t))))
 
 (defun custom-field-read (field)
   ;; Read the screen content of FIELD.
 
 (defun custom-field-read (field)
   ;; Read the screen content of FIELD.
@@ -2170,7 +2225,7 @@ If the optional argument is non-nil, show text iff the argument is positive."
   ;; Deactivate FIELD.
   (let ((before-change-functions nil)
        (after-change-functions nil))
   ;; Deactivate FIELD.
   (let ((before-change-functions nil)
        (after-change-functions nil))
-    (put-text-property (custom-field-start field) (custom-field-end field)
+    (custom-put-text-property (custom-field-start field) (custom-field-end field)
                       'face (custom-field-face field))))
 
 (defun custom-field-enter (field)
                       'face (custom-field-face field))))
 
 (defun custom-field-enter (field)
@@ -2188,7 +2243,7 @@ If the optional argument is non-nil, show text iff the argument is positive."
            (setq pos (1- pos)))
          (if (< pos (point))
              (goto-char pos))))
            (setq pos (1- pos)))
          (if (< pos (point))
              (goto-char pos))))
-    (put-text-property start end 'face custom-field-active-face)))
+    (custom-put-text-property start end 'face custom-field-active-face)))
 
 (defun custom-field-resize (field)
   ;; Resize FIELD after change.
 
 (defun custom-field-resize (field)
   ;; Resize FIELD after change.
@@ -2270,7 +2325,7 @@ If the optional argument is non-nil, show text iff the argument is positive."
     (let ((field custom-field-was))
       (custom-assert '(prog1 field (setq custom-field-was nil)))
       ;; Prevent mixing fields properties.
     (let ((field custom-field-was))
       (custom-assert '(prog1 field (setq custom-field-was nil)))
       ;; Prevent mixing fields properties.
-      (put-text-property begin end 'custom-field field)
+      (custom-put-text-property begin end 'custom-field field)
       ;; Update the field after modification.
       (if (eq (custom-field-property begin) field)
          (let ((field-end (custom-field-end field)))
       ;; Update the field after modification.
       (if (eq (custom-field-property begin) field)
          (let ((field-end (custom-field-end field)))
index e9b610a..e726fc4 100644 (file)
@@ -117,9 +117,7 @@ The text matching the first grouping will be used as a button.")
 
 ;;; Internal Variables:
 
 
 ;;; Internal Variables:
 
-(defvar gnus-article-length nil)
-;; Length of article last time we parsed it.
-;; BUG! KLUDGE! UGLY! FIX ME!
+(defvar gnus-cite-article nil)
 
 (defvar gnus-cite-prefix-alist nil)
 ;; Alist of citation prefixes.  
 
 (defvar gnus-cite-prefix-alist nil)
 ;; Alist of citation prefixes.  
@@ -416,7 +414,7 @@ See also the documentation for `gnus-article-highlight-citation'."
 
 (defun gnus-cite-parse-maybe (&optional force)
   ;; Parse if the buffer has changes since last time.
 
 (defun gnus-cite-parse-maybe (&optional force)
   ;; Parse if the buffer has changes since last time.
-  (if (eq gnus-article-length (- (point-max) (point-min)))
+  (if (equal gnus-cite-article gnus-article-current)
       ()
     ;;Reset parser information.
     (setq gnus-cite-prefix-alist nil
       ()
     ;;Reset parser information.
     (setq gnus-cite-prefix-alist nil
@@ -428,7 +426,8 @@ See also the documentation for `gnus-article-highlight-citation'."
             gnus-cite-parse-max-size
             (> (buffer-size) gnus-cite-parse-max-size))
        ()
             gnus-cite-parse-max-size
             (> (buffer-size) gnus-cite-parse-max-size))
        ()
-      (setq gnus-article-length (- (point-max) (point-min)))
+      (setq gnus-cite-article (cons (car gnus-article-current)
+                                   (cdr gnus-article-current)))
       (gnus-cite-parse))))
 
 (defun gnus-cite-parse ()
       (gnus-cite-parse))))
 
 (defun gnus-cite-parse ()
index 5d551e9..d3ef619 100644 (file)
@@ -41,6 +41,7 @@
 (defalias 'gnus-appt-select-lowest-window 'appt-select-lowest-window)
 (defalias 'gnus-mail-strip-quoted-names 'mail-strip-quoted-names)
 (defalias 'gnus-make-local-hook 'make-local-hook)
 (defalias 'gnus-appt-select-lowest-window 'appt-select-lowest-window)
 (defalias 'gnus-mail-strip-quoted-names 'mail-strip-quoted-names)
 (defalias 'gnus-make-local-hook 'make-local-hook)
+(defalias 'gnus-add-hook 'add-hook)
 (defalias 'gnus-character-to-event 'identity)
 (defalias 'gnus-add-text-properties 'add-text-properties)
 (defalias 'gnus-put-text-property 'put-text-property)
 (defalias 'gnus-character-to-event 'identity)
 (defalias 'gnus-add-text-properties 'add-text-properties)
 (defalias 'gnus-put-text-property 'put-text-property)
index 43b1d70..5583bd7 100644 (file)
@@ -138,7 +138,7 @@ the group.")
     
 (defun gnus-inews-add-send-actions (winconf buffer article)
   (gnus-make-local-hook 'message-sent-hook)
     
 (defun gnus-inews-add-send-actions (winconf buffer article)
   (gnus-make-local-hook 'message-sent-hook)
-  (add-hook 'message-sent-hook 'gnus-inews-do-gcc)
+  (add-hook 'message-sent-hook 'gnus-inews-do-gcc nil t)
   (setq message-post-method
        `(lambda (arg)
           (gnus-post-method arg ,gnus-newsgroup-name)))
   (setq message-post-method
        `(lambda (arg)
           (gnus-post-method arg ,gnus-newsgroup-name)))
index 2015889..65eb6d2 100644 (file)
 (defvar gnus-nocem-expiry-wait 15
   "*Number of days to keep NoCeM headers in the cache.")
 
 (defvar gnus-nocem-expiry-wait 15
   "*Number of days to keep NoCeM headers in the cache.")
 
+(defvar gnus-nocem-verifyer 'mc-verify
+  "*Function called to verify that the NoCeM message is valid.
+If the function in this variable isn't bound, the message will
+be used unconditionally.")
+
 ;;; Internal variables
 
 (defvar gnus-nocem-active nil)
 ;;; Internal variables
 
 (defvar gnus-nocem-active nil)
   
 (defun gnus-nocem-verify-issuer (person)
   "Verify using PGP that the canceler is who she says she is."
   
 (defun gnus-nocem-verify-issuer (person)
   "Verify using PGP that the canceler is who she says she is."
-  t)
+  (if (fboundp gnus-nocem-verifyer)
+      (funcall gnus-nocem-verifyer)
+    ;; If we don't have MailCrypt, then we use the message anyway.
+    t))
 
 (defun gnus-nocem-enter-article ()
   "Enter the current article into the NoCeM cache."
 
 (defun gnus-nocem-enter-article ()
   "Enter the current article into the NoCeM cache."
index 12cdc6b..d9075aa 100644 (file)
@@ -167,8 +167,8 @@ If given a prefix, mark all unpicked articles as read."
        (gnus-binary-make-menu-bar))
       (unless (assq 'gnus-binary-mode minor-mode-alist)
        (push '(gnus-binary-mode " Binary") minor-mode-alist))
        (gnus-binary-make-menu-bar))
       (unless (assq 'gnus-binary-mode minor-mode-alist)
        (push '(gnus-binary-mode " Binary") minor-mode-alist))
-      (unless (assq 'gnus-topic-mode minor-mode-map-alist)
-       (push (cons 'gnus-topic-mode gnus-binary-mode-map)
+      (unless (assq 'gnus-binary-mode minor-mode-map-alist)
+       (push (cons 'gnus-binary-mode gnus-binary-mode-map)
              minor-mode-map-alist))
       (run-hooks 'gnus-binary-mode-hook))))
 
              minor-mode-map-alist))
       (run-hooks 'gnus-binary-mode-hook))))
 
index d22c20e..565b5dd 100644 (file)
@@ -1528,7 +1528,8 @@ SCORE is the score to add."
                         (setq art (car arts)
                               arts (cdr arts))
                         (gnus-score-add-followups 
                         (setq art (car arts)
                               arts (cdr arts))
                         (gnus-score-add-followups 
-                         (car art) score all-scores thread)))))
+                         (car art) score all-scores thread))))
+               (end-of-line))
            (while (funcall search-func match nil t)
              (end-of-line)
              (setq found (setq arts (get-text-property (point) 'articles)))
            (while (funcall search-func match nil t)
              (end-of-line)
              (setq found (setq arts (get-text-property (point) 'articles)))
index 2db3a08..e04cd25 100644 (file)
 If this variable is nil, Gnus will try to locate the directory
 automatically.")
 
 If this variable is nil, Gnus will try to locate the directory
 automatically.")
 
-(defvar gnus-xmas-logo-colors '("#bf9900" "#ffcc00")
-  "Colors user for the Gnus logo.")
+(defvar gnus-xmas-logo-color-alist
+  '((flame "##cc3300" "##ff2200") 
+    (pine "##c0cc93" "##f8ffb8") 
+    (moss "##a1cc93" "##d2ffb8")
+    (irish "##04cc90" "##05ff97")
+    (sky "##049acc" "##05deff")
+    (tin "##6886cc" "##82b6ff")
+    (velvet "##7c68cc" "##8c82ff")
+    (grape "##b264cc" "##cf7df")
+    (labia "##cc64c2" "##fd7dff")
+    (berry "##cc6485" "##ff7db5")
+    (neutral "##b4b4b4" "##878787")
+    (september "#bf9900" "#ffcc00"))
+  "Color alist used for the Gnus logo.")
+
+(defvar gnus-xmas-logo-color-style 'september
+  "Color styles used for the Gnus logo.")
+
+(defvar gnus-xmas-logo-colors (cdr (assq gnus-xmas-logo-color-style 
+                                        gnus-xmas-logo-color-alist))
+  "Colors used for the Gnus logo.")
 
 ;;; Internal variables.
 
 
 ;;; Internal variables.
 
@@ -145,6 +164,9 @@ displayed, no centering will be performed."
          (gnus-horizontal-recenter)
          (select-window selected))))))
 
          (gnus-horizontal-recenter)
          (select-window selected))))))
 
+(defun gnus-xmas-add-hook (hook function &optional append local)
+  (add-hook hook function))
+
 (defun gnus-xmas-add-text-properties (start end props &optional object)
   (add-text-properties start end props object)
   (put-text-property start end 'start-closed nil object))
 (defun gnus-xmas-add-text-properties (start end props &optional object)
   (add-text-properties start end props object)
   (put-text-property start end 'start-closed nil object))
@@ -453,6 +475,7 @@ pounce directly on the real variables themselves.")
        'gnus-xmas-appt-select-lowest-window)
   (fset 'gnus-mail-strip-quoted-names 'gnus-xmas-mail-strip-quoted-names)
   (fset 'gnus-make-local-hook 'make-local-variable)
        'gnus-xmas-appt-select-lowest-window)
   (fset 'gnus-mail-strip-quoted-names 'gnus-xmas-mail-strip-quoted-names)
   (fset 'gnus-make-local-hook 'make-local-variable)
+  (fset 'gnus-add-hook 'gnus-xmas-add-hook)
   (fset 'gnus-character-to-event 'character-to-event)
 
   (add-hook 'gnus-group-mode-hook 'gnus-xmas-group-menu-add)
   (fset 'gnus-character-to-event 'character-to-event)
 
   (add-hook 'gnus-group-mode-hook 'gnus-xmas-group-menu-add)
index 1e8a47e..02113fb 100644 (file)
@@ -1723,9 +1723,12 @@ variable (string, integer, character, etc).")
   "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)"
   "The mail address of the Gnus maintainers.")
 
   "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)"
   "The mail address of the Gnus maintainers.")
 
-(defconst gnus-version "Gnus v5.2.1"
+(defconst gnus-version-number "5.2.2"
   "Version number for this version of Gnus.")
 
   "Version number for this version of Gnus.")
 
+(defconst gnus-version (format "Gnus v%s" gnus-version-number)
+  "Version string for this version of Gnus.")
+
 (defvar gnus-info-nodes
   '((gnus-group-mode "(gnus)The Group Buffer")
     (gnus-summary-mode "(gnus)The Summary Buffer")
 (defvar gnus-info-nodes
   '((gnus-group-mode "(gnus)The Group Buffer")
     (gnus-summary-mode "(gnus)The Summary Buffer")
@@ -4266,7 +4269,7 @@ The following commands are available:
   (setq truncate-lines t)
   (setq buffer-read-only t)
   (gnus-make-local-hook 'post-command-hook)
   (setq truncate-lines t)
   (setq buffer-read-only t)
   (gnus-make-local-hook 'post-command-hook)
-  (add-hook 'post-command-hook 'gnus-clear-inboxes-moved)
+  (gnus-add-hook 'post-command-hook 'gnus-clear-inboxes-moved nil t)
   (run-hooks 'gnus-group-mode-hook))
 
 (defun gnus-clear-inboxes-moved ()
   (run-hooks 'gnus-group-mode-hook))
 
 (defun gnus-clear-inboxes-moved ()
@@ -16068,6 +16071,7 @@ Returns whether the updating was successful."
                  (unless (equal method gnus-message-archive-method)
                    (gnus-error 1 "Cannot read active file from %s server."
                                (car method)))
                  (unless (equal method gnus-message-archive-method)
                    (gnus-error 1 "Cannot read active file from %s server."
                                (car method)))
+               (gnus-message 5 mesg)
                (gnus-active-to-gnus-format method gnus-active-hashtb)
                ;; We mark this active file as read.
                (push method gnus-have-read-active-file)
                (gnus-active-to-gnus-format method gnus-active-hashtb)
                ;; We mark this active file as read.
                (push method gnus-have-read-active-file)
@@ -16290,7 +16294,7 @@ If FORCE is non-nil, the .newsrc file is read."
                    ((string= alpha "September") "5.01")
                    ((string= alpha "Red") "5.03"))
                   minor least)
                    ((string= alpha "September") "5.01")
                    ((string= alpha "Red") "5.03"))
                   minor least)
-        (format "%d.%02d%20d" major minor least))))))
+        (format "%d.%02d%02d" major minor least))))))
 
 (defun gnus-convert-old-newsrc ()
   "Convert old newsrc into the new format, if needed."
 
 (defun gnus-convert-old-newsrc ()
   "Convert old newsrc into the new format, if needed."
index 9888bac..2d40bac 100644 (file)
@@ -252,6 +252,9 @@ always use the value.")
   "Normal hook, run each time a new outgoing message is initialized.
 The function `message-setup' runs this hook.")
 
   "Normal hook, run each time a new outgoing message is initialized.
 The function `message-setup' runs this hook.")
 
+(defvar message-mode-hook nil
+  "Hook run in message mode buffers.")
+
 (defvar message-header-setup-hook nil
   "Hook called narrowed to the headers when setting up a message buffer.")
 
 (defvar message-header-setup-hook nil
   "Hook called narrowed to the headers when setting up a message buffer.")
 
@@ -708,6 +711,8 @@ Return the number of headers removed."
     "----"
     ["To" message-goto-to t]
     ["Subject" message-goto-subject t]
     "----"
     ["To" message-goto-to t]
     ["Subject" message-goto-subject t]
+    ["Cc" message-goto-cc t]
+    ["Reply-to" message-goto-reply-to t]
     ["Summary" message-goto-summary t]
     ["Keywords" message-goto-keywords t]
     ["Newsgroups" message-goto-newsgroups t]
     ["Summary" message-goto-summary t]
     ["Keywords" message-goto-keywords t]
     ["Newsgroups" message-goto-newsgroups t]
@@ -2557,6 +2562,9 @@ Optional NEWS will use news to forward instead of mail."
     (if message-signature-before-forwarded-message
        (goto-char (point-max))
       (message-goto-body))
     (if message-signature-before-forwarded-message
        (goto-char (point-max))
       (message-goto-body))
+    ;; Make sure we're at the start of the line.
+    (unless (eolp)
+      (insert "\n"))
     ;; Narrow to the area we are to insert.
     (narrow-to-region (point) (point))
     ;; Insert the separators and the forwarded buffer.
     ;; Narrow to the area we are to insert.
     (narrow-to-region (point) (point))
     ;; Insert the separators and the forwarded buffer.
@@ -2792,11 +2800,12 @@ Do a `tab-to-tab-stop' if not in those headers."
          (message "No matching groups")
        (pop-to-buffer "*Completions*")
        (buffer-disable-undo (current-buffer))
          (message "No matching groups")
        (pop-to-buffer "*Completions*")
        (buffer-disable-undo (current-buffer))
-       (erase-buffer)
-       (let ((standard-output (current-buffer)))
-         (display-completion-list (sort completions 'string<)))
-       (goto-char (point-min))
-       (pop-to-buffer cur))))))
+       (let ((buffer-read-only nil))
+         (erase-buffer)
+         (let ((standard-output (current-buffer)))
+           (display-completion-list (sort completions 'string<)))
+         (goto-char (point-min))
+         (pop-to-buffer cur)))))))
 
 ;;; Help stuff.
 
 
 ;;; Help stuff.
 
diff --git a/lisp/nnatp.el b/lisp/nnatp.el
deleted file mode 100644 (file)
index 2c5997a..0000000
+++ /dev/null
@@ -1,667 +0,0 @@
-;;; nntp.el --- nntp access for Gnus
-;; Copyright (C) 1987,88,89,90,92,93,94,95,96 Free Software Foundation, Inc.
-
-;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
-;; Keywords: news
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-
-;;; Commentary:
-
-;;; Code:
-
-(require 'rnews)
-(require 'sendmail)
-(require 'nnheader)
-
-(eval-and-compile
-  (unless (fboundp 'open-network-stream)
-    (require 'tcp)))
-
-(eval-when-compile (require 'cl))
-
-(defvar nntp-address nil
-  "Address of the physical nntp server.")
-
-(defvar nntp-port-number "nntp"
-  "Port number on the physical nntp server.")
-
-(defvar nntp-server-hook nil
-  "*Hooks for the NNTP server.
-If the kanji code of the NNTP server is different from the local kanji
-code, the correct kanji code of the buffer associated with the NNTP
-server must be specified as follows:
-
-\(setq nntp-server-hook
-       (lambda ()
-        ;; Server's Kanji code is EUC (NEmacs hack).
-        (make-local-variable 'kanji-fileio-code)
-        (setq kanji-fileio-code 0)))
-
-If you'd like to change something depending on the server in this
-hook, use the variable `nntp-address'.")
-
-(defvar nntp-server-opened-hook nil
-  "*Hook used for sending commands to the server at startup.  
-The default value is `nntp-send-mode-reader', which makes an innd
-server spawn an nnrpd server.  Another useful function to put in this
-hook might be `nntp-send-authinfo', which will prompt for a password
-to allow posting from the server.  Note that this is only necessary to
-do on servers that use strict access control.")  
-(add-hook 'nntp-server-opened-hook 'nntp-send-mode-reader)
-
-(defvar nntp-server-action-alist 
-  '(("nntpd 1\\.5\\.11t" 
-     (remove-hook 'nntp-server-opened-hook 'nntp-send-mode-reader)))
-  "Alist of regexps to match on server types and actions to be taken.
-For instance, if you want Gnus to beep every time you connect
-to innd, you could say something like:
-
-\(setq nntp-server-action-alist
-       '((\"innd\" (ding))))
-
-You probably don't want to do that, though.")
-
-(defvar nntp-open-connection-function 'nntp-open-network-stream
-  "*Function used for connecting to a remote system.
-It will be called with the address of the remote system.
-
-Two pre-made functions are `nntp-open-network-stream', which is the
-default, and simply connects to some port or other on the remote
-system (see nntp-port-number).  The other is `nntp-open-rlogin', which
-does an rlogin on the remote system, and then does a telnet to the
-NNTP server available there (see nntp-rlogin-parameters).")
-
-(defvar nntp-rlogin-parameters '("telnet" "${NNTPSERVER:=localhost}" "nntp")
-  "*Parameters to `nntp-open-login'.
-That function may be used as `nntp-open-server-function'.  In that
-case, this list will be used as the parameter list given to rsh.")
-
-(defvar nntp-rlogin-user-name nil
-  "*User name on remote system when using the rlogin connect method.")
-
-(defvar nntp-large-newsgroup 50
-  "*The number of the articles which indicates a large newsgroup.
-If the number of the articles is greater than the value, verbose
-messages will be shown to indicate the current status.")
-
-(defvar nntp-maximum-request 400
-  "*The maximum number of the requests sent to the NNTP server at one time.
-If Emacs hangs up while retrieving headers, set the variable to a
-lower value.")
-
-(defvar nntp-nov-is-evil nil
-  "*If non-nil, nntp will never attempt to use XOVER when talking to the server.")
-
-(defvar nntp-xover-commands '("XOVER" "XOVERVIEW")
-  "*List of strings that are used as commands to fetch NOV lines from a server.
-The strings are tried in turn until a positive response is gotten. If
-none of the commands are successful, nntp will just grab headers one
-by one.")
-
-(defvar nntp-nov-gap 20
-  "*Maximum allowed gap between two articles.
-If the gap between two consecutive articles is bigger than this
-variable, split the XOVER request into two requests.")
-
-(defvar nntp-connection-timeout nil
-  "*Number of seconds to wait before an nntp connection times out.
-If this variable is nil, which is the default, no timers are set.")
-
-(defvar nntp-news-default-headers nil
-  "*If non-nil, override `mail-default-headers' when posting news.")
-
-(defvar nntp-prepare-server-hook nil
-  "*Hook run before a server is opened.
-If can be used to set up a server remotely, for instance.  Say you
-have an account at the machine \"other.machine\".  This machine has
-access to an NNTP server that you can't access locally.  You could
-then use this hook to rsh to the remote machine and start a proxy NNTP
-server there that you can connect to.")
-
-(defvar nntp-warn-about-losing-connection t
-  "*If non-nil, beep when a server closes connection.")
-
-\f
-
-;;; Internal variables.
-
-(defvar nntp-connection-alist nil)
-(defvar nntp-status-string "")
-(defconst nntp-version "nntp 5.0")
-(defvar nntp-inhibit-erase nil)
-
-(defvar nntp-server-xover 'try)
-(defvar nntp-server-list-active-group 'try)
-
-;; Virtual server defs.
-(defvar nntp-current-server nil)
-(defvar nntp-server-alist nil)
-(defvar nntp-server-variables 
-  `((nntp-address ,nntp-address)
-    (nntp-open-connection-function ,nntp-open-connection-function)
-    (nntp-port-number ,nntp-port-number)
-    (nntp-status-string ,nntp-status-string)
-    (nntp-connection-alist nil)))
-
-\f
-
-;;; Interface functions.
-
-(defun nntp-retrieve-headers (articles &optional group server fetch-old)
-  "Retrieve the headers of ARTICLES."
-  (nntp-possibly-change-group group server)
-  (save-excursion
-    (set-buffer nntp-server-buffer)
-    (erase-buffer)
-    (if (and (not gnus-nov-is-evil) 
-            (not nntp-nov-is-evil)
-            (nntp-retrieve-headers-with-xover articles fetch-old))
-       ;; We successfully retrieved the headers via XOVER.
-        'nov
-      ;; XOVER didn't work, so we do it the hard, slow and inefficient
-      ;; way.  
-      (let ((number (length articles))
-           (count 0)
-           (received 0)
-           (last-point (point-min)))
-       ;; Send HEAD command.
-       (while articles
-         (nntp-send-command 
-          nil
-          "HEAD" (if (numberp (car articles)) 
-                     (int-to-string (car articles))
-                   ;; `articles' is either a list of article numbers
-                   ;; or a list of article IDs.
-                   (car articles)))
-         (setq articles (cdr articles)
-               count (1+ count))
-         ;; Every 400 header requests we have to read the stream in
-         ;; order to avoid deadlocks.
-         (when (or (null articles)     ;All requests have been sent.
-                   (zerop (% count nntp-maximum-request)))
-           (nntp-accept-response)
-           (while (progn
-                    (goto-char last-point)
-                    ;; Count replies.
-                    (while (re-search-forward "^[0-9]" nil t)
-                      (setq received (1+ received)))
-                    (setq last-point (point))
-                    (< received count))
-             ;; If number of headers is greater than 100, give
-             ;;  informative messages.
-             (and (numberp nntp-large-newsgroup)
-                  (> number nntp-large-newsgroup)
-                  (zerop (% received 20))
-                  (message "NNTP: Receiving headers... %d%%"
-                           (/ (* received 100) number)))
-             (nntp-accept-response))))
-       ;; Wait for text of last command.
-       (goto-char (point-max))
-       (re-search-backward "^[0-9]" nil t)
-       (when (looking-at "^[23]")
-         (while (progn
-                  (goto-char (- (point-max) 3))
-                  (not (looking-at "^\\.\r?\n")))
-           (nntp-accept-response)))
-       (and (numberp nntp-large-newsgroup)
-            (> number nntp-large-newsgroup)
-            (message "NNTP: Receiving headers...done"))
-
-       ;; Now all of replies are received.  Fold continuation lines.
-       (nnheader-fold-continuation-lines)
-       ;; Remove all "\r"'s.
-       (goto-char (point-min))
-       (while (search-forward "\r" nil t)
-         (replace-match "" t t))
-       'headers))))
-
-(defun nntp-request-article (article &optional group server buffer)
-  (let ((nntp-server-buffer (or buffer nntp-server-buffer)))
-    (nntp-possibly-change-group group server)
-    (nntp-send-command-and-decode
-     "\r\n\\.\r\n" "ARTICLE"
-     (if (numberp article) (int-to-string article) article))))
-
-(defun nntp-request-body (article &optional group server)
-  (nntp-possibly-change-group group server)
-  (nntp-send-command
-   "\r\n\\.\r\n" "BODY"
-   (if (numberp article) (int-to-string article) article)))
-
-(defun nntp-request-group (group &optional server dont-check)
-  (nntp-possibly-change-group nil server)
-  (when (nntp-send-command "^2.*\r\n" "GROUP" group)
-    (let ((entry (nntp-find-connection-entry nntp-server-buffer)))
-      (setcar (cddr entry) group))))
-
-(defun nntp-close-group (group &optional server)
-  t)
-
-(defun nntp-server-opened (server)
-  (and (equal server nntp-current-server)
-       nntp-server-buffer
-       (buffer-name nntp-server-buffer)))
-
-(defun nntp-open-server (server &optional defs connectionless)
-  (nnheader-init-server-buffer)
-  (if (nntp-server-opened server)
-      t
-    (when (or (stringp (car defs))
-             (numberp (car defs)))
-      (setq defs (cons (list 'nntp-port-number (car defs)) (cdr defs))))
-    (unless (assq 'nntp-address defs)
-      (setq defs (append defs (list (list 'nntp-address server)))))
-    (nnheader-change-server 'nntp server defs)
-    (or (nntp-find-connection nntp-server-buffer)
-       (nntp-open-connection nntp-server-buffer))))
-
-(defun nntp-close-server (&optional server)
-  (nntp-possibly-change-group nil server t)
-  (let (process)
-    (while (setq process (car (pop nntp-connection-alist)))
-      (when (memq (process-status process) '(open run))
-       (set-process-sentinel process nil)
-       (set-process-filter process nil)
-       (nntp-send-string process "QUIT"))
-      (when (buffer-name (process-buffer process))
-       (kill-buffer (process-buffer process))))))
-
-(defun nntp-request-list (&optional server)
-  (nntp-possibly-change-group nil server)
-  (nntp-send-command "\r\n\\.\r\n" "LIST"))
-
-(defun nntp-request-list-newsgroups (&optional server)
-  (nntp-possibly-change-group nil server)
-  (nntp-send-command "\r\n\\.\r\n" "LIST NEWSGROUPS"))
-
-(defun nntp-asynchronous-p ()
-  t)
-  
-
-;;; Hooky functions.
-
-(defun nntp-send-mode-reader ()
-  "Send the MODE READER command to the nntp server.
-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"))
-
-(defun nntp-send-nosy-authinfo ()
-  "Send the AUTHINFO to the nntp server.
-This function is supposed to be called from `nntp-server-opened-hook'.
-It will prompt for a password."
-  (nntp-send-command "^.*\r\n" "AUTHINFO USER"
-                    (read-string "NNTP user name: "))
-  (nntp-send-command "^.*\r\n" "AUTHINFO PASS" 
-                    (read-string "NNTP password: ")))
-
-(defun nntp-send-authinfo ()
-  "Send the AUTHINFO to the nntp server.
-This function is supposed to be called from `nntp-server-opened-hook'.
-It will prompt for a password."
-  (nntp-send-command "^.*\r\n" "AUTHINFO USER" (user-login-name))
-  (nntp-send-command "^.*\r\n" "AUTHINFO PASS" 
-                    (read-string "NNTP password: ")))
-
-(defun nntp-send-authinfo-from-file ()
-  "Send the AUTHINFO to the nntp server.
-This function is supposed to be called from `nntp-server-opened-hook'.
-It will prompt for a password."
-  (when (file-exists-p "~/.nntp-authinfo")
-    (save-excursion
-      (set-buffer (get-buffer-create " *authinfo*"))
-      (buffer-disable-undo (current-buffer))
-      (erase-buffer)
-      (insert-file-contents "~/.nntp-authinfo")
-      (goto-char (point-min))
-      (nntp-send-command "^.*\r\n" "AUTHINFO USER" (user-login-name))
-      (nntp-send-command 
-       "^.*\r\n" "AUTHINFO PASS" 
-       (buffer-substring (point) (progn (end-of-line) (point))))
-      (kill-buffer (current-buffer)))))
-
-;;; Internal functions.
-
-(defun nntp-send-command (wait-for &rest strings)
-  "Send STRINGS to server and wait until WAIT-FOR returns."
-  (nntp-retrieve-data
-   (mapconcat 'identity strings " ") 
-   nntp-address nntp-port-number nntp-server-buffer
-   wait-for nnheader-callback-function))
-
-(defun nntp-send-command-and-decode (wait-for &rest strings)
-  "Send STRINGS to server and wait until WAIT-FOR returns."
-  (nntp-retrieve-data
-   (mapconcat 'identity strings " ") 
-   nntp-address nntp-port-number nntp-server-buffer
-   wait-for nnheader-callback-function t))
-
-(defun nntp-find-connection (buffer)
-  "Find the connection delivering to BUFFER."
-  (let ((alist nntp-connection-alist)
-       process entry)
-    (while (setq entry (pop alist))
-      (when (eq buffer (cadr entry))
-       (setq process (car entry)
-             alist nil)))
-    (when process
-      (if (memq (process-status process) '(open run))
-         process
-       (when (buffer-name (process-buffer process))
-         (kill-buffer (process-buffer process)))
-       (setq nntp-connection-alist (delq entry nntp-connection-alist))
-       nil))))
-
-(defun nntp-find-connection-entry (buffer)
-  "Return the entry for the connection to BUFFER."
-  (assq (nntp-find-connection buffer) nntp-connection-alist))
-
-(defun nntp-open-connection (buffer)
-  "Open a connection to PORT on ADDRESS delivering output to BUFFER."
-  (let* ((pbuffer (save-excursion
-                   (set-buffer 
-                    (generate-new-buffer
-                     (format " *nntpd %s %s %s*"
-                             nntp-address nntp-port-number
-                             (buffer-name (get-buffer buffer)))))
-                   (buffer-disable-undo (current-buffer))
-                   (current-buffer)))
-        (process (funcall nntp-open-connection-function pbuffer)))
-    (when process
-      (process-kill-without-query process)
-      (nntp-wait-for process "^.*\r\n" buffer)
-      (if (memq (process-status process) '(open run))
-         (caar (push (list process buffer nil) 
-                     nntp-connection-alist))
-       (when (buffer-name (process-buffer process))
-         (kill-buffer (process-buffer process)))
-       nil))))
-
-(defun nntp-open-network-stream (buffer)
-  (open-network-stream "nntpd" buffer nntp-address nntp-port-number))
-
-(defvar nntp-tmp-first)
-(defvar nntp-tmp-wait-for)
-(defvar nntp-tmp-callback)
-(defvar nntp-tmp-buffer)
-
-(defun nntp-make-process-filter (wait-for callback buffer decode)
-  `(lambda (proc string)
-     (let ((nntp-tmp-wait-for ,wait-for)
-          (nntp-tmp-callback ,callback)
-          (nntp-tmp-buffer ,buffer))
-       (nntp-process-filter proc string))))
-
-(defun nntp-process-filter (proc string)
-  (let ((old-buffer (current-buffer)))
-    (unwind-protect
-       (let (point)
-         (set-buffer (process-buffer proc))
-         ;; Insert the text, moving the process-marker.
-         (setq point (goto-char (process-mark proc)))
-         (insert string)
-         (set-marker (process-mark proc) (point))
-         (if (and (= point (point-min))
-                  (string-match "^45" string))
-             (progn
-               (nntp-snarf-error-message)
-               (funcall nntp-tmp-callback nil)
-               (set-process-filter proc nil))
-           (setq nntp-tmp-first nil)
-           (if (re-search-backward nntp-tmp-wait-for nil t)
-               (progn
-                 (if (buffer-name (get-buffer nntp-tmp-buffer))
-                     (save-excursion
-                       (set-buffer (get-buffer nntp-tmp-buffer))
-                       (insert-buffer-substring (process-buffer proc))))
-                 (funcall nntp-tmp-callback t)
-                 (set-process-filter proc nil)
-                 (erase-buffer)))))
-      (set-buffer old-buffer))))
-
-(defun nntp-retrieve-data (command address port buffer
-                                  &optional wait-for callback decode)
-  "Use COMMAND to retrieve data into BUFFER from PORT on ADDRESS."
-  (let ((process (or (nntp-find-connection buffer)
-                    (nntp-open-connection buffer))))
-    (if (not process)
-       (nnheader-report 'nntp "Couldn't open connection to %a" address)
-      (unless nntp-inhibit-erase
-       (save-excursion
-         (set-buffer (process-buffer process))
-         (erase-buffer)))
-      (nntp-send-string process command)
-      (cond 
-       ((eq callback 'ignore)
-       t)
-       ((and callback wait-for)
-       (set-process-filter
-        process (nntp-make-process-filter wait-for callback buffer decode))
-       t)
-       (wait-for 
-       (nntp-wait-for process wait-for buffer decode))
-       (t t)))))
-
-(defun nntp-send-string (process string)
-  "Send STRING to PROCESS."
-  (process-send-string process (concat string "\r\n")))
-
-(defun nntp-wait-for (process wait-for buffer &optional decode)
-  "Wait for WAIT-FOR to arrive from PROCESS."
-  (save-excursion
-    (set-buffer (process-buffer process))
-    (goto-char (point-min))
-    (while (not (looking-at "[2345]"))
-      (nntp-accept-process-output process)
-      (goto-char (point-min)))
-    (prog1
-       (if (looking-at "[345]")
-           (progn
-             (nntp-snarf-error-message)
-             nil)
-         (goto-char (point-max))
-         (while (not (re-search-backward wait-for nil t))
-           (nntp-accept-process-output process))
-         (nntp-decode-text (not decode))
-         (save-excursion
-           (set-buffer buffer)
-           (insert-buffer-substring (process-buffer process))
-           t))
-      (erase-buffer))))
-
-(defun nntp-snarf-error-message ()
-  "Save the error message in the current buffer."
-  (setq nntp-status-string (buffer-string)))
-
-(defun nntp-accept-process-output (process)
-  "Wait for output from PROCESS and message some dots."
-  (message "Reading%s" (make-string (/ (point-max) 1000) ?.))
-  (accept-process-output process))
-
-(defun nntp-accept-response ()
-  "Wait for output from the process that outputs to BUFFER."
-  (nntp-accept-process-output (nntp-find-connection nntp-server-buffer)))
-
-(defun nntp-possibly-change-group (group server &optional connectionless)
-  (when server
-    (or (nntp-server-opened server)
-       (nntp-open-server server nil connectionless)))
-  
-  (or (nntp-find-connection nntp-server-buffer)
-      (nntp-open-connection nntp-server-buffer))
-
-  (when group
-    (let ((entry (nntp-find-connection-entry nntp-server-buffer)))
-      (when (not (equal group (caddr entry)))
-       (nntp-request-group group)))))
-
-(defun nntp-decode-text (&optional cr-only)
-  "Decode the text in the current buffer."
-  (goto-char (point-min))
-  (while (search-forward "\r" nil t)
-    (delete-char -1))
-  (unless cr-only
-    (goto-char (point-max))
-    (forward-line -1)
-    (when (looking-at ".\n")
-      (delete-char 2))
-    (goto-char (point-min))
-    (delete-region (point) (progn (forward-line 1) (point)))
-    (while (search-forward "\n.." nil t)
-      (delete-char -1))))
-
-(defun nntp-retrieve-headers-with-xover (articles &optional fetch-old)
-  (erase-buffer)
-  (cond 
-
-   ;; This server does not talk NOV.
-   ((not nntp-server-xover)
-    nil)
-
-   ;; We don't care about gaps.
-   ((or (not nntp-nov-gap)
-       fetch-old)
-    (nntp-send-xover-command 
-     (if fetch-old
-        (if (numberp fetch-old) 
-            (max 1 (- (car articles) fetch-old)) 
-          1)
-       (car articles))
-     (last articles) 'wait)
-
-    (goto-char (point-min))
-    (when (looking-at "[1-5][0-9][0-9] ")
-      (delete-region (point) (progn (forward-line 1) (point))))
-    (while (search-forward "\r" nil t)
-      (replace-match "" t t))
-    (goto-char (point-max))
-    (forward-line -1)
-    (when (looking-at "\\.")
-      (delete-region (point) (progn (forward-line 1) (point)))))
-
-   ;; We do it the hard way.  For each gap, an XOVER command is sent
-   ;; to the server.  We do not wait for a reply from the server, we
-   ;; just send them off as fast as we can.  That means that we have
-   ;; to count the number of responses we get back to find out when we
-   ;; have gotten all we asked for.
-   ((numberp nntp-nov-gap)
-    (let ((count 0)
-         (received 0)
-         (last-point (point-min))
-         (buf nntp-server-buffer) ;(process-buffer (nntp-find-connection (current-buffer))))
-         first)
-      ;; We have to check `nntp-server-xover'.  If it gets set to nil,
-      ;; that means that the server does not understand XOVER, but we
-      ;; won't know that until we try.
-      (while (and nntp-server-xover articles)
-       (setq first (car articles))
-       ;; Search forward until we find a gap, or until we run out of
-       ;; articles. 
-       (while (and (cdr articles) 
-                   (< (- (nth 1 articles) (car articles)) nntp-nov-gap))
-         (setq articles (cdr articles)))
-
-       (when (nntp-send-xover-command first (car articles))
-         (setq articles (cdr articles)
-               count (1+ count))
-
-         ;; Every 400 requests we have to read the stream in
-         ;; order to avoid deadlocks.
-         (when (or (null articles)     ;All requests have been sent.
-                   (zerop (% count nntp-maximum-request)))
-           (accept-process-output)
-           ;; On some Emacs versions the preceding function has
-           ;; a tendency to change the buffer. Perhaps. It's
-           ;; quite difficult to reproduce, because it only
-           ;; seems to happen once in a blue moon. 
-           (set-buffer buf) 
-           (while (progn
-                    (goto-char last-point)
-                    ;; Count replies.
-                    (while (re-search-forward "^[0-9][0-9][0-9] " nil t)
-                      (setq received (1+ received)))
-                    (setq last-point (point))
-                    (< received count))
-             (accept-process-output)
-             (set-buffer buf)))))
-
-      (when nntp-server-xover
-       ;; Wait for the reply from the final command.
-       (goto-char (point-max))
-       (re-search-backward "^[0-9][0-9][0-9] " nil t)
-       (when (looking-at "^[23]")
-         (while (progn
-                  (goto-char (point-max))
-                  (forward-line -1)
-                  (not (looking-at "^\\.\r?\n")))
-           (nntp-accept-response)))
-       
-       ;; We remove any "." lines and status lines.
-       (goto-char (point-min))
-       (while (search-forward "\r" nil t)
-         (delete-char -1))
-       (goto-char (point-min))
-       (delete-matching-lines "^\\.$\\|^[1-5][0-9][0-9] ")
-       ;(save-excursion
-       ;  (set-buffer nntp-server-buffer)
-       ;  (insert-buffer-substring buf))
-       ;(erase-buffer)
-       ))))
-
-  nntp-server-xover)
-
-(defun nntp-send-xover-command (beg end &optional wait-for-reply)
-  "Send the XOVER command to the server."
-  (let ((range (format "%d-%d" beg end))
-       (nntp-inhibit-erase t))
-    (if (stringp nntp-server-xover)
-       ;; If `nntp-server-xover' is a string, then we just send this
-       ;; command.
-       (if wait-for-reply
-           (nntp-send-command "\r\n\\.\r\n" nntp-server-xover range)
-         ;; We do not wait for the reply.
-         (nntp-send-command "\r\n\\.\r\n" nntp-server-xover range))
-      (let ((commands nntp-xover-commands))
-       ;; `nntp-xover-commands' is a list of possible XOVER commands.
-       ;; We try them all until we get at positive response. 
-       (while (and commands (eq nntp-server-xover 'try))
-         (nntp-send-command "\r\n\\.\r\n" (car commands) range)
-         (save-excursion
-           (set-buffer nntp-server-buffer)
-           (goto-char (point-min))
-           (and (looking-at "[23]") ; No error message.
-                ;; We also have to look at the lines.  Some buggy
-                ;; servers give back simple lines with just the
-                ;; article number.  How... helpful.
-                (progn
-                  (forward-line 1)
-                  (looking-at "[0-9]+\t...")) ; More text after number.
-                (setq nntp-server-xover (car commands))))
-         (setq commands (cdr commands)))
-       ;; If none of the commands worked, we disable XOVER.
-       (when (eq nntp-server-xover 'try)
-         (save-excursion
-           (set-buffer nntp-server-buffer)
-           (erase-buffer)
-           (setq nntp-server-xover nil)))
-       nntp-server-xover))))
-
-(provide 'nntp)
-
-;;; nntp.el ends here
index e37417b..4928be4 100644 (file)
@@ -66,6 +66,9 @@ it.")
 (defvoo nnfolder-prepare-save-mail-hook nil
   "Hook run narrowed to an article before saving.")
 
 (defvoo nnfolder-prepare-save-mail-hook nil
   "Hook run narrowed to an article before saving.")
 
+(defvoo nnfolder-save-buffer-hook nil
+  "Hook run before saving the nnfolder mbox buffer.")
+
 (defvoo nnfolder-inhibit-expiry nil
   "If non-nil, inhibit expiry.")
 
 (defvoo nnfolder-inhibit-expiry nil
   "If non-nil, inhibit expiry.")
 
@@ -222,7 +225,7 @@ it.")
               (setq nnfolder-buffer-alist 
                     (delq (car bufs) nnfolder-buffer-alist))
             (set-buffer (nth 1 (car bufs)))
               (setq nnfolder-buffer-alist 
                     (delq (car bufs) nnfolder-buffer-alist))
             (set-buffer (nth 1 (car bufs)))
-            (and (buffer-modified-p) (save-buffer))
+            (nnfolder-save-buffer)
             (kill-buffer (current-buffer)))
           (setq bufs (cdr bufs))))))
    nnfolder-directory
             (kill-buffer (current-buffer)))
           (setq bufs (cdr bufs))))))
    nnfolder-directory
@@ -251,7 +254,7 @@ it.")
       (save-excursion
        (set-buffer nnfolder-current-buffer)
        ;; If the buffer was modified, write the file out now.
       (save-excursion
        (set-buffer nnfolder-current-buffer)
        ;; If the buffer was modified, write the file out now.
-       (and (buffer-modified-p) (save-buffer))
+       (nnfolder-save-buffer)
        ;; If we're shutting the server down, we need to kill the
        ;; buffer and remove it from the open buffer list.  Or, of
        ;; course, if we're trying to minimize our space impact.
        ;; If we're shutting the server down, we need to kill the
        ;; buffer and remove it from the open buffer list.  Or, of
        ;; course, if we're trying to minimize our space impact.
@@ -310,7 +313,7 @@ it.")
                  (nnfolder-delete-mail))
              (setq rest (cons (car articles) rest))))
        (setq articles (cdr articles)))
                  (nnfolder-delete-mail))
              (setq rest (cons (car articles) rest))))
        (setq articles (cdr articles)))
-      (and (buffer-modified-p) (save-buffer))
+      (nnfolder-save-buffer)
       ;; Find the lowest active article in this group.
       (let* ((active (cadr (assoc newsgroup nnfolder-group-alist)))
             (marker (concat "\n" nnfolder-article-marker))
       ;; Find the lowest active article in this group.
       (let* ((active (cadr (assoc newsgroup nnfolder-group-alist)))
             (marker (concat "\n" nnfolder-article-marker))
@@ -354,9 +357,7 @@ it.")
        (goto-char (point-min))
        (if (search-forward (nnfolder-article-string article) nil t)
           (nnfolder-delete-mail))
        (goto-char (point-min))
        (if (search-forward (nnfolder-article-string article) nil t)
           (nnfolder-delete-mail))
-       (and last 
-           (buffer-modified-p)
-           (save-buffer))))
+       (and last (nnfolder-save-buffer))))
     result))
 
 (deffoo nnfolder-request-accept-article (group &optional server last)
     result))
 
 (deffoo nnfolder-request-accept-article (group &optional server last)
@@ -379,7 +380,7 @@ it.")
        (setq result (car (nnfolder-save-mail (and (stringp group) group)))))
      (save-excursion
        (set-buffer nnfolder-current-buffer)
        (setq result (car (nnfolder-save-mail (and (stringp group) group)))))
      (save-excursion
        (set-buffer nnfolder-current-buffer)
-       (and last (buffer-modified-p) (save-buffer))))
+       (and last (nnfolder-save-buffer))))
     (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
     (unless result
       (nnheader-report 'nnfolder "Couldn't store article"))
     (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
     (unless result
       (nnheader-report 'nnfolder "Couldn't store article"))
@@ -394,7 +395,7 @@ it.")
        nil
       (nnfolder-delete-mail t t)
       (insert-buffer-substring buffer)
        nil
       (nnfolder-delete-mail t t)
       (insert-buffer-substring buffer)
-      (and (buffer-modified-p) (save-buffer))
+      (nnfolder-save-buffer)
       t)))
 
 (deffoo nnfolder-request-delete-group (group &optional force server)
       t)))
 
 (deffoo nnfolder-request-delete-group (group &optional force server)
@@ -720,6 +721,12 @@ it.")
       ;; If not, we translate dots into slashes.
       (concat dir (nnheader-replace-chars-in-string group ?. ?/)))))
 
       ;; If not, we translate dots into slashes.
       (concat dir (nnheader-replace-chars-in-string group ?. ?/)))))
 
+(defun nnfolder-save-buffer ()
+  "Save the buffer."
+  (when (buffer-modified-p)
+    (run-hooks 'nnfolder-save-buffer-hook)
+    (save-buffer)))
+
 (provide 'nnfolder)
 
 ;;; nnfolder.el ends here
 (provide 'nnfolder)
 
 ;;; nnfolder.el ends here
index 9574b5a..dbb56e0 100644 (file)
@@ -162,6 +162,9 @@ there.")
           (file-truename nnspool-spool-directory))))
     (nnspool-close-server)
     (nnheader-report 'nnspool "Not a directory: %s" nnspool-spool-directory))
           (file-truename nnspool-spool-directory))))
     (nnspool-close-server)
     (nnheader-report 'nnspool "Not a directory: %s" nnspool-spool-directory))
+   ((not (file-exists-p nnspool-active-file))
+    (nnheader-report 'nnspool "The active file doesn't exist: %s" 
+                    nnspool-active-file))
    (t
     (nnheader-report 'nnspool "Opened server %s using directory %s"
                     server nnspool-spool-directory)
    (t
     (nnheader-report 'nnspool "Opened server %s using directory %s"
                     server nnspool-spool-directory)
index 45ae489..139382c 100644 (file)
@@ -257,8 +257,8 @@ instead use `nntp-server-buffer'.")
              (and (numberp nntp-large-newsgroup)
                   (> number nntp-large-newsgroup)
                   (zerop (% received 20))
              (and (numberp nntp-large-newsgroup)
                   (> number nntp-large-newsgroup)
                   (zerop (% received 20))
-                  (message "NNTP: Receiving headers... %d%%"
-                           (/ (* received 100) number)))
+                  (nnheader-message 7 "NNTP: Receiving headers... %d%%"
+                                    (/ (* received 100) number)))
              (nntp-accept-response))))
        ;; Wait for text of last command.
        (goto-char (point-max))
              (nntp-accept-response))))
        ;; Wait for text of last command.
        (goto-char (point-max))
@@ -270,7 +270,7 @@ instead use `nntp-server-buffer'.")
            (nntp-accept-response)))
        (and (numberp nntp-large-newsgroup)
             (> number nntp-large-newsgroup)
            (nntp-accept-response)))
        (and (numberp nntp-large-newsgroup)
             (> number nntp-large-newsgroup)
-            (message "NNTP: Receiving headers...done"))
+            (nnheader-message 7 "NNTP: Receiving headers...done"))
 
        ;; Now all of replies are received.  Fold continuation lines.
        (nnheader-fold-continuation-lines)
 
        ;; Now all of replies are received.  Fold continuation lines.
        (nnheader-fold-continuation-lines)
@@ -370,7 +370,7 @@ servers."
                 (process-sentinel nntp-server-process))
             (set-process-sentinel nntp-server-process nil))
        ;; We cannot send QUIT command unless the process is running.
                 (process-sentinel nntp-server-process))
             (set-process-sentinel nntp-server-process nil))
        ;; We cannot send QUIT command unless the process is running.
-       (when (nntp-server-opened)
+       (when (nntp-server-opened server)
          (nntp-send-command nil "QUIT")
          ;; Give the QUIT time to arrive.
          (sleep-for 1)))
          (nntp-send-command nil "QUIT")
          ;; Give the QUIT time to arrive.
          (sleep-for 1)))
@@ -378,9 +378,12 @@ servers."
 
 (deffoo nntp-request-close ()
   "Close all server connections."
 
 (deffoo nntp-request-close ()
   "Close all server connections."
-  (let (proc entry)
+  (let (proc)
     (while nntp-opened-connections
       (when (setq proc (pop nntp-opened-connections))
     (while nntp-opened-connections
       (when (setq proc (pop nntp-opened-connections))
+       ;; Un-set default sentinel function before closing connection.
+       (when (eq 'nntp-default-sentinel (process-sentinel proc))
+         (set-process-sentinel proc nil))
        (condition-case ()
            (process-send-string proc (concat "QUIT" nntp-end-of-line))
          (error nil))
        (condition-case ()
            (process-send-string proc (concat "QUIT" nntp-end-of-line))
          (error nil))
@@ -391,7 +394,8 @@ servers."
     (and nntp-async-buffer
         (buffer-name nntp-async-buffer)
         (kill-buffer nntp-async-buffer))
     (and nntp-async-buffer
         (buffer-name nntp-async-buffer)
         (kill-buffer nntp-async-buffer))
-    (let ((alist (cddr (assq 'nntp nnoo-state-alist))))
+    (let ((alist (cddr (assq 'nntp nnoo-state-alist)))
+         entry)
       (while (setq entry (pop alist))
        (and (setq proc (cdr (assq 'nntp-async-buffer entry)))
             (buffer-name proc)
       (while (setq entry (pop alist))
        (and (setq proc (cdr (assq 'nntp-async-buffer entry)))
             (buffer-name proc)
@@ -462,7 +466,7 @@ servers."
              (prog1
                  (and (nntp-send-command 
                        ;; A bit odd regexp to ensure working over rlogin.
              (prog1
                  (and (nntp-send-command 
                        ;; A bit odd regexp to ensure working over rlogin.
-                       "^\\.\\(\r?\n\\|\r$\\)" "ARTICLE" art)
+                       "^\\.\r?\n" "ARTICLE" art)
                       (if (numberp id) 
                           (cons nntp-current-group id)
                         ;; We find out what the article number was.
                       (if (numberp id) 
                           (cons nntp-current-group id)
                         ;; We find out what the article number was.
@@ -664,7 +668,7 @@ It will prompt for a password."
       (setq server (caar servers)))
     (when (and server
               nntp-warn-about-losing-connection)
       (setq server (caar servers)))
     (when (and server
               nntp-warn-about-losing-connection)
-      (message "nntp: Connection closed to server %s" server)
+      (nnheader-message 3 "nntp: Connection closed to server %s" server)
       (setq nntp-current-group "")
       (ding))))
 
       (setq nntp-current-group "")
       (ding))))
 
@@ -845,8 +849,8 @@ It will prompt for a password."
                    (message-log-max nil))
                (unless (= dotnum newnum)
                  (setq dotnum newnum)
                    (message-log-max nil))
                (unless (= dotnum newnum)
                  (setq dotnum newnum)
-                 (message "NNTP: Reading %s"
-                          (make-string dotnum ?.)))))
+                 (nnheader-message 7 "NNTP: Reading %s"
+                                   (make-string dotnum ?.)))))
            (nntp-accept-response)))
        ;; Remove "...".
        (when (and nntp-debug-read (> dotnum 0))
            (nntp-accept-response)))
        ;; Remove "...".
        (when (and nntp-debug-read (> dotnum 0))
@@ -1076,7 +1080,7 @@ If SERVICE, this this as the port number."
     (save-excursion
       (set-buffer nntp-server-buffer)
       (setq nntp-status-string "")
     (save-excursion
       (set-buffer nntp-server-buffer)
       (setq nntp-status-string "")
-      (message "nntp: Connecting to server on %s..." nntp-address)
+      (nnheader-message 5 "nntp: Connecting to server on %s..." nntp-address)
       (cond ((and server (nntp-open-server-internal server service))
             (setq nntp-address server)
             (setq status
       (cond ((and server (nntp-open-server-internal server service))
             (setq nntp-address server)
             (setq status
@@ -1222,9 +1226,9 @@ defining this function as macro."
                ;; We cannot use `accept-process-output'.
                ;; Fujitsu UTS requires messages during sleep-for.
                ;; I don't know why.
                ;; We cannot use `accept-process-output'.
                ;; Fujitsu UTS requires messages during sleep-for.
                ;; I don't know why.
-               (message "NNTP: Reading...")
+               (nnheader-message 5 "NNTP: Reading...")
                (sleep-for 1)
                (sleep-for 1)
-               (message ""))
+               (nnheader-message 5 ""))
            (condition-case errorcode
                (accept-process-output nntp-server-process 1)
              (error
            (condition-case errorcode
                (accept-process-output nntp-server-process 1)
              (error
index 899a3bd..470e341 100644 (file)
@@ -203,14 +203,14 @@ virtual group.")
 
 (deffoo nnvirtual-request-group (group &optional server dont-check)
   (nnvirtual-possibly-change-server server)
 
 (deffoo nnvirtual-request-group (group &optional server dont-check)
   (nnvirtual-possibly-change-server server)
+  (setq nnvirtual-component-groups
+       (delete (nnvirtual-current-group) nnvirtual-component-groups))
   (cond
    ((null nnvirtual-component-groups)
     (setq nnvirtual-current-group nil)
     (nnheader-report 'nnvirtual "No component groups in %s" group))
    (t
     (unless dont-check
   (cond
    ((null nnvirtual-component-groups)
     (setq nnvirtual-current-group nil)
     (nnheader-report 'nnvirtual "No component groups in %s" group))
    (t
     (unless dont-check
-      (setq nnvirtual-component-groups
-           (delete (nnvirtual-current-group) nnvirtual-component-groups))
       (nnvirtual-create-mapping))
     (setq nnvirtual-current-group group)
     (let ((len (length nnvirtual-mapping)))
       (nnvirtual-create-mapping))
     (setq nnvirtual-current-group group)
     (let ((len (length nnvirtual-mapping)))
diff --git a/lisp/x-easymenu.el b/lisp/x-easymenu.el
deleted file mode 100644 (file)
index 84002ee..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-;;; easymenu.el - Easy menu support for Emacs 19 and XEmacs.
-;; 
-;; $Id: x-easymenu.el,v 1.1 1996/05/29 05:36:45 steve Exp $
-;;
-;; LCD Archive Entry:
-;; easymenu|Per Abrahamsen|abraham@iesd.auc.dk|
-;; Easy menu support for XEmacs|
-;; $Date: 1996/05/29 05:36:45 $|$Revision: 1.1 $|~/misc/easymenu.el.gz|
-
-;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
-;;
-;; This program is free software; you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
-;; 
-;; This program is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-;; 
-;; You should have received a copy of the GNU General Public License
-;; along with this program; if not, write to the Free Software
-;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-;; Commentary:
-;;
-;; Easymenu allows you to define menus for both Emacs 19 and XEmacs.
-;;
-;; This file 
-;; The advantages of using easymenu are:
-;;
-;; - Easier to use than either the Emacs 19 and XEmacs menu syntax.
-;;
-;; - Common interface for Emacs 18, Emacs 19, and XEmacs.  
-;;   (The code does nothing when run under Emacs 18).
-;;
-;; The public functions are:
-;; 
-;; - Function: easy-menu-define SYMBOL MAPS DOC MENU
-;;     SYMBOL is both the name of the variable that holds the menu and
-;;            the name of a function that will present a the menu.
-;;     MAPS is a list of keymaps where the menu should appear in the menubar.
-;;     DOC is the documentation string for the variable.
-;;     MENU is an XEmacs style menu description.  
-;;
-;;     See the documentation for easy-menu-define for details.
-;;
-;; - Function: easy-menu-change PATH NAME ITEMS
-;;     Change an existing menu.
-;;     The menu must already exist an be visible on the menu bar.
-;;     PATH is a list of strings used for locating the menu on the menu bar. 
-;;     NAME is the name of the menu.  
-;;     ITEMS is a list of menu items, as defined in `easy-menu-define'.
-;;
-;; - Function: easy-menu-add MENU [ MAP ]
-;;     Add MENU to the current menubar in MAP.
-;;
-;; - Function: easy-menu-remove MENU
-;;     Remove MENU from the current menubar.
-;;
-;; Emacs 19 never uses `easy-menu-add' or `easy-menu-remove', menus
-;; automatically appear and disappear when the keymaps specified by
-;; the MAPS argument to `easy-menu-define' are activated.
-;;
-;; XEmacs will bind the map to button3 in each MAPS, but you must
-;; explicitly call `easy-menu-add' and `easy-menu-remove' to add and
-;; remove menus from the menu bar.
-
-;;; Code:
-
-;;;###autoload
-(defmacro easy-menu-define (symbol maps doc menu)
-  "Define a menu bar submenu in maps MAPS, according to MENU.
-The arguments SYMBOL and DOC are ignored; they are present for
-compatibility only.  SYMBOL is not evaluated.  In other Emacs versions
-these arguments may be used as a variable to hold the menu data, and a
-doc string for that variable.
-
-The first element of MENU must be a string.  It is the menu bar item name.
-The rest of the elements are menu items.
-
-A menu item is usually a vector of three elements:  [NAME CALLBACK ENABLE]
-
-NAME is a string--the menu item name.
-
-CALLBACK is a command to run when the item is chosen,
-or a list to evaluate when the item is chosen.
-
-ENABLE is an expression; the item is enabled for selection
-whenever this expression's value is non-nil.
-
-Alternatively, a menu item may have the form: 
-
-   [ NAME CALLBACK [ KEYWORD ARG ] ... ]
-
-Where KEYWORD is one of the symbol defined below.
-
-   :keys KEYS
-
-KEYS is a string; a complex keyboard equivalent to this menu item.
-
-   :active ENABLE
-
-ENABLE is an expression; the item is enabled for selection
-whenever this expression's value is non-nil.
-
-   :suffix NAME
-
-NAME is a string; the name of an argument to CALLBACK.
-
-   :style STYLE
-   
-STYLE is a symbol describing the type of menu item.  The following are
-defined:  
-
-toggle: A checkbox.  
-        Currently just prepend the name with the string \"Toggle \".
-radio: A radio button. 
-nil: An ordinary menu item.
-
-   :selected SELECTED
-
-SELECTED is an expression; the checkbox or radio button is selected
-whenever this expression's value is non-nil.
-Currently just disable radio buttons, no effect on checkboxes.
-
-A menu item can be a string.  Then that string appears in the menu as
-unselectable text.  A string consisting solely of hyphens is displayed
-as a solid horizontal line.
-
-A menu item can be a list.  It is treated as a submenu.
-The first element should be the submenu name.  That's used as the
-menu item in the top-level menu.  The cdr of the submenu list
-is a list of menu items, as above."
-  (` (progn
-       (defvar (, symbol) nil (, doc))
-       (easy-menu-do-define (quote (, symbol)) (, maps) (, doc) (, menu)))))
-
-(defun easy-menu-do-define (symbol maps doc menu)
-  (set symbol menu)
-  (fset symbol (list 'lambda '(e)
-                    doc
-                    '(interactive "@e")
-                    '(run-hooks 'activate-menubar-hook)
-                    '(setq zmacs-region-stays 't)
-                    (list 'popup-menu symbol)))
-  (mapcar (function (lambda (map) (define-key map 'button3 symbol)))
-         (if (keymapp maps) (list maps) maps)))
-
-(fset 'easy-menu-change (symbol-function 'add-menu))
-
-(defun easy-menu-add (menu &optional map)
-  "Add MENU to the current menu bar."
-  (cond ((null current-menubar)
-        ;; Don't add it to a non-existing menubar.
-        nil)
-       ((assoc (car menu) current-menubar)
-        ;; Already present.
-        nil)
-       ((equal current-menubar '(nil))
-        ;; Set at left if only contains right marker.
-        (set-buffer-menubar (list menu nil)))
-       (t
-        ;; Add at right.
-        (set-buffer-menubar (copy-sequence current-menubar))
-        (add-menu nil (car menu) (cdr menu)))))
-
-(defun easy-menu-remove (menu)
-  "Remove MENU from the current menu bar."
-  (and current-menubar
-       (assoc (car menu) current-menubar)
-       (delete-menu-item (list (car menu)))))
-
-(provide 'easymenu)
-
-;;; easymenu.el ends here
index a057135..2946a67 100644 (file)
@@ -1,3 +1,8 @@
+Tue May 28 21:19:29 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus.texi (Composing Messages): Deletia.
+       (Emacs/XEmacs code): New.
+
 Sun May 26 18:28:19 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
 
        * gnus.texi (Paging the Article): Moved.
 Sun May 26 18:28:19 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
 
        * gnus.texi (Paging the Article): Moved.
index 48c9efc..c2edc03 100644 (file)
@@ -5421,7 +5421,7 @@ Commands}).
 @findex gnus-summary-refer-parent-article
 @kindex ^ (Summary)
 If you'd like to read the parent of the current article, and it is not
 @findex gnus-summary-refer-parent-article
 @kindex ^ (Summary)
 If you'd like to read the parent of the current article, and it is not
-displayed in the article buffer, you might still be able to.  That is,
+displayed in the summary buffer, you might still be able to.  That is,
 if the current group is fetched by @sc{nntp}, the parent hasn't expired
 and the @code{References} in the current article are not mangled, you
 can just press @kbd{^} or @kbd{A r}
 if the current group is fetched by @sc{nntp}, the parent hasn't expired
 and the @code{References} in the current article are not mangled, you
 can just press @kbd{^} or @kbd{A r}
@@ -6414,9 +6414,9 @@ to @kbd{C-c C-c} to make Gnus try to post using the foreign server.
 * Posting Server::       What server should you post via?
 * Mail and Post::        Mailing and posting at the same time.
 * Archived Messages::    Where Gnus stores the messages you've sent.
 * Posting Server::       What server should you post via?
 * Mail and Post::        Mailing and posting at the same time.
 * Archived Messages::    Where Gnus stores the messages you've sent.
-* Posting Styles::       An easier way to configure some key elements.
+@c * Posting Styles::       An easier way to configure some key elements.
 @c * Drafts::               Postponing messages and rejected messages.
 @c * Drafts::               Postponing messages and rejected messages.
-* Rejected Articles::    What happens if the server doesn't like your article?
+@c * Rejected Articles::    What happens if the server doesn't like your article?
 @end menu
 
 Also see @pxref{Canceling and Superseding} for information on how to
 @end menu
 
 Also see @pxref{Canceling and Superseding} for information on how to
@@ -6671,84 +6671,83 @@ of names).
 @end table
 
 
 @end table
 
 
-@node Posting Styles
-@section Posting Styles
-@cindex posting styles
-@cindex styles
-
-All them variables, they make my head swim.  
-
-So what if you want a different @code{Organization} and signature based
-on what groups you post to?  And you post both from your home machine
-and your work machine, and you want different @code{From} lines, and so
-on? 
-
-@vindex gnus-posting-styles
-One way to do stuff like that is to write clever hooks that change the
-variables you need to have changed.  That's a bit boring, so somebody
-came up with the bright idea of letting the user specify these things in
-a handy alist.  Here's an example of a @code{gnus-posting-styles}
-variable: 
-
-@lisp
-((".*" 
-  (signature . "Peace and happiness")
-  (organization . "What me?"))
- ("^comp" 
-  (signature . "Death to everybody"))
- ("comp.emacs.i-love-it" 
-  (organization . "Emacs is it")))
-@end lisp
-
-As you might surmise from this example, this alist consists of several
-@dfn{styles}.  Each style will be applicable if the first element
-``matches'', in some form or other.  The entire alist will be iterated
-over, from the beginning towards the end, and each match will be
-applied, which means that attributes in later styles that match override
-the same attributes in earlier matching styles.  So
-@samp{comp.programming.literate} will have the @samp{Death to everybody}
-signature and the @samp{What me?} @code{Organization} header.
-
-The first element in each style is called the @code{match}.  If it's a
-string, then Gnus will try to regexp match it against the group name.
-If it's a function symbol, that function will be called with no
-arguments.  If it's a variable symbol, then the variable will be
-referenced.  If it's a list, then that list will be @code{eval}ed.  In
-any case, if this returns a non-@code{nil} value, then the style is said
-to @dfn{match}.
-
-Each style may contain a arbitrary amount of @dfn{attributes}.  Each
-attribute consists of a @var{(name . value)} pair.  The attribute name
-can be one of @code{signature}, @code{organization} or @code{from}.  The
-attribute name can also be a string.  In that case, this will be used as
-a header name, and the value will be inserted in the headers of the
-article.
-
-The attribute value can be a string (used verbatim), a function (the
-return value will be used), a variable (its value will be used) or a
-list (it will be @code{eval}ed and the return value will be used).
-
-So here's a new example:
-
-@lisp
-(setq gnus-posting-styles
-      '((".*" 
-          (signature . "~/.signature") 
-          (from . "user@@foo (user)")
-          ("X-Home-Page" . (getenv "WWW_HOME"))
-          (organization . "People's Front Against MWM"))
-        ("^rec.humor" 
-          (signature . my-funny-signature-randomizer))
-        ((equal (system-name) "gnarly")
-          (signature . my-quote-randomizer))
-        (posting-from-work-p
-          (signature . "~/.work-signature")
-          (from . "user@@bar.foo (user)")
-          (organization . "Important Work, Inc"))
-        ("^nn.+:" 
-          (signature . "~/.mail-signature"))))
-@end lisp
-
+@c @node Posting Styles
+@c @section Posting Styles
+@c @cindex posting styles
+@c @cindex styles
+@c 
+@c All them variables, they make my head swim.  
+@c 
+@c So what if you want a different @code{Organization} and signature based
+@c on what groups you post to?  And you post both from your home machine
+@c and your work machine, and you want different @code{From} lines, and so
+@c on? 
+@c 
+@c @vindex gnus-posting-styles
+@c One way to do stuff like that is to write clever hooks that change the
+@c variables you need to have changed.  That's a bit boring, so somebody
+@c came up with the bright idea of letting the user specify these things in
+@c a handy alist.  Here's an example of a @code{gnus-posting-styles}
+@c variable: 
+@c 
+@c @lisp
+@c ((".*" 
+@c   (signature . "Peace and happiness")
+@c   (organization . "What me?"))
+@c  ("^comp" 
+@c   (signature . "Death to everybody"))
+@c  ("comp.emacs.i-love-it" 
+@c   (organization . "Emacs is it")))
+@c @end lisp
+@c 
+@c As you might surmise from this example, this alist consists of several
+@c @dfn{styles}.  Each style will be applicable if the first element
+@c ``matches'', in some form or other.  The entire alist will be iterated
+@c over, from the beginning towards the end, and each match will be
+@c applied, which means that attributes in later styles that match override
+@c the same attributes in earlier matching styles.  So
+@c @samp{comp.programming.literate} will have the @samp{Death to everybody}
+@c signature and the @samp{What me?} @code{Organization} header.
+@c 
+@c The first element in each style is called the @code{match}.  If it's a
+@c string, then Gnus will try to regexp match it against the group name.
+@c If it's a function symbol, that function will be called with no
+@c arguments.  If it's a variable symbol, then the variable will be
+@c referenced.  If it's a list, then that list will be @code{eval}ed.  In
+@c any case, if this returns a non-@code{nil} value, then the style is said
+@c to @dfn{match}.
+@c 
+@c Each style may contain a arbitrary amount of @dfn{attributes}.  Each
+@c attribute consists of a @var{(name . value)} pair.  The attribute name
+@c can be one of @code{signature}, @code{organization} or @code{from}.  The
+@c attribute name can also be a string.  In that case, this will be used as
+@c a header name, and the value will be inserted in the headers of the
+@c article.
+@c 
+@c The attribute value can be a string (used verbatim), a function (the
+@c return value will be used), a variable (its value will be used) or a
+@c list (it will be @code{eval}ed and the return value will be used).
+@c 
+@c So here's a new example:
+@c 
+@c @lisp
+@c (setq gnus-posting-styles
+@c       '((".*" 
+@c           (signature . "~/.signature") 
+@c           (from . "user@@foo (user)")
+@c           ("X-Home-Page" . (getenv "WWW_HOME"))
+@c           (organization . "People's Front Against MWM"))
+@c         ("^rec.humor" 
+@c           (signature . my-funny-signature-randomizer))
+@c         ((equal (system-name) "gnarly")
+@c           (signature . my-quote-randomizer))
+@c         (posting-from-work-p
+@c           (signature . "~/.work-signature")
+@c           (from . "user@@bar.foo (user)")
+@c           (organization . "Important Work, Inc"))
+@c         ("^nn.+:" 
+@c           (signature . "~/.mail-signature"))))
+@c @end lisp
 
 @c @node Drafts
 @c @section Drafts
 
 @c @node Drafts
 @c @section Drafts
@@ -11965,6 +11964,7 @@ and general method of operations.
 * Headers::                  How Gnus stores headers internally.
 * Ranges::                   A handy format for storing mucho numbers.
 * Group Info::               The group info format.
 * Headers::                  How Gnus stores headers internally.
 * Ranges::                   A handy format for storing mucho numbers.
 * Group Info::               The group info format.
+* Emacs/XEmacs Code::        Gnus can be run under all modern Emacsen.
 * Various File Formats::     Formats of files that Gnus use.
 @end menu
 
 * Various File Formats::     Formats of files that Gnus use.
 @end menu
 
@@ -12851,6 +12851,48 @@ Actually that @samp{marks} rule is a fib.  A @samp{marks} is a
 in pseudo-BNF.
 
 
 in pseudo-BNF.
 
 
+@node Emacs/XEmacs Code
+@subsection Emacs/XEmacs Code
+@cindex XEmacs
+@cindex Emacsen
+
+While Gnus runs under Emacs, XEmacs and Mule, I decided that one of the
+platforms must be the primary one.  I chose Emacs.  Not because I don't
+like XEmacs or Mule, but because it comes first alphabetically.
+
+This means that Gnus will byte-compile under Emacs with nary a warning,
+while XEmacs will pump out gigabytes of warnings while byte-compiling.
+As I use byte-compilation warnings to help me root out trivial errors in
+Gnus, that's very useful.  
+
+I've also consistently used Emacs function interfaces, but have used
+Gnusey aliases for the functions.  To take an example:  Emacs defines a
+@code{run-at-time} function while XEmacs defines a @code{start-itimer}
+function.  I then define a function called @code{gnus-run-at-time} that
+takes the same parameters as the Emacs @code{run-at-time}.  When running
+Gnus under Emacs, the former function is just an alias for the latter.
+However, when running under XEmacs, the former is an alias for the
+following function:
+
+@lisp
+(defun gnus-xmas-run-at-time (time repeat function &rest args)
+  (start-itimer
+   "gnus-run-at-time"
+   `(lambda ()
+      (,function ,@@args))
+   time repeat))
+@end lisp
+
+This sort of thing has been done for bunches of functions.  Gnus does
+not redefine any native Emacs functions while running under XEmacs -- it
+does this @code{defalias} thing with Gnus equivalents instead.  Cleaner
+all over.
+
+Of course, I could have chosen XEmacs as my native platform and done
+mapping functions the other way around.  But I didn't.  The performance
+hit these indirections impose on Gnus under XEmacs should be slight.
+
+
 @node Various File Formats
 @subsection Various File Formats
 
 @node Various File Formats
 @subsection Various File Formats
 
index ed522a4..6b51f63 100644 (file)
@@ -434,8 +434,12 @@ Number of spaces to indent yanked messages.
 
 @item message-cite-function
 @vindex message-cite-function
 
 @item message-cite-function
 @vindex message-cite-function
+@findex message-cite-original
+@findex sc-cite-original
+@cindex SuperCite
 Function for citing an original message.  The default is
 Function for citing an original message.  The default is
-@code{message-cite-original}. 
+@code{message-cite-original}.  You can also set it to
+@code{sc-cite-original} to use SuperCite.
 
 @item message-indent-citation-function
 @vindex message-indent-citation-function
 
 @item message-indent-citation-function
 @vindex message-indent-citation-function