T-gnus 6.14.4. t-gnus-6_14_4-00
authoryamaoka <yamaoka>
Mon, 8 May 2000 00:21:25 +0000 (00:21 +0000)
committeryamaoka <yamaoka>
Mon, 8 May 2000 00:21:25 +0000 (00:21 +0000)
Sync with `t-gnus-6_14-quimby'.

33 files changed:
ChangeLog
README.T-gnus
lisp/ChangeLog
lisp/gnus-art.el
lisp/gnus-draft.el
lisp/gnus-ems.el
lisp/gnus-mailcap.el
lisp/gnus-msg.el
lisp/gnus-score.el
lisp/gnus-start.el
lisp/gnus-util.el
lisp/gnus-vers.el
lisp/gnus.el
lisp/lpath.el
lisp/message.el
lisp/mm-bodies.el
lisp/mm-decode.el
lisp/mm-partial.el [new file with mode: 0644]
lisp/mm-view.el
lisp/mml.el
lisp/nndoc.el
lisp/nnmbox.el
lisp/rfc2047.el
lisp/webmail.el
texi/ChangeLog
texi/Makefile.in
texi/emacs-mime.texi
texi/gnus-ja.texi
texi/gnus.texi
texi/gnusref.tex
texi/message-ja.texi
texi/message.texi
texi/postamble.tex

index 0e857f2..d27f4f1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2000-05-08  Katsumi Yamaoka <yamaoka@jpl.org>
+
+       * lisp/gnus-vers.el (T-gnus): Update to 6.14.4.
+
+       * README.T-gnus: Update.
+
+       * lisp/{webmail.el,rfc2047.el,nnmbox.el,nndoc.el,mml.el,mm-view.el,
+       mm-partial.el,mm-decode.el,mm-bodies.el,message.el,lpath.el,
+       gnus.el,gnus-vers.el,gnus-util.el,gnus-start.el,gnus-score.el,
+       gnus-msg.el,gnus-mailcap.el,gnus-ems.el,gnus-draft.el,gnus-art.el,
+       ChangeLog}: Sync up with Gnus v5.8.6.
+       * texi/{postamble.tex,message.texi,message-ja.texi,gnusref.tex,
+       gnus.texi,gnus-ja.texi,emacs-mime.texi,Makefile.in,ChangeLog}: Sync
+       up with Gnus v5.8.6.
+
 2000-04-28  Katsumi Yamaoka <yamaoka@jpl.org>
 
        * texi/gnus.texi, texi/gnus-ja.texi, texi/gnus-faq-ja.texi, README:
index bb0f24d..d3f17c9 100644 (file)
@@ -33,6 +33,6 @@ NEWS:
 
 * T-gnus 6.14 - this is based on Pterodactyl Gnus.
 
-  The latest T-gnus is T-gnus 6.14.3 (Based on Gnus 5.8.5).  It requires
+  The latest T-gnus is T-gnus 6.14.4 (Based on Gnus 5.8.6).  It requires
   SEMI/WEMI (1.13.5 or later), FLIM (1.13.1 or later), and APEL (10.0 or
   later).
index dcd5c94..43754b3 100644 (file)
@@ -1,3 +1,210 @@
+Mon May  1 15:09:46 2000  Lars Magne Ingebrigtsen  <lmi@quimbies.gnus.org>
+
+       * gnus.el: Gnus v5.8.6 is released.
+
+2000-04-28 21:14:21  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * rfc2047.el (rfc2047-q-encoding-alist): Encode HTAB.
+
+2000-04-28 16:37:09  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.el (message-send-mail-partially): Use forward-line.
+
+2000-04-28 16:01:09  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-art.el (gnus-mime-button-menu): Use call-interactively.
+
+2000-04-28 15:30:17  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * mml.el (mml-generate-mime-1): Ignore 0x1b.
+       (mml-insert-mime): No markup only for text/plain.
+       (mime-to-mml): Remove MIME headers.
+
+2000-04-28 14:23:14  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * mml.el (mml-preview): Set gnus-newsgroup-charset.
+       * rfc2047.el (rfc2047-encode-message-header): Encode non-ascii 
+       as 8-bit.
+       * lpath.el: Fbind image functions.
+
+2000-04-28  Dave Love  <fx@gnu.org>
+
+       * gnus.el (gnus-group-startup-message): Maybe use image in Emacs
+       21.
+
+       * mailcap.el (mailcap-parse-mailcaps): Revert last change to
+       search order.  Use parse-colon-path and remove some redundancy.
+       Doc fix.
+       (mailcap-parse-mimetypes): Code consistently with
+       mailcap-parse-mailcaps.  Doc fix.
+
+       * gnus-start.el (gnus-unload): Iterate over `features', not
+       `load-history'.
+
+2000-04-28 09:52:21  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * mml.el (mml-parse-1): Don't create blank parts.
+       (mml-read-part): Fix mml tag.
+       (mml-insert-mime): Convert message/rfc822.
+       (mml-insert-mml-markup): Add mmlp parameter.
+
+2000-04-28 01:16:10  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.el (message-send-mail-partially): Remove CTE.
+
+2000-04-28 00:31:53  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * lpath.el: Fbind put-image for XEmacs.
+       * mm-view.el (mm-inline-image): Fset it.
+
+2000-04-27 23:23:37  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * nndoc.el (nndoc-type-alist): Change forward regexp. 
+
+2000-04-27 21:57:10  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.el (message-send-mail-partially-limit): Change the
+       default value.
+
+2000-04-27 21:53:32  Erik Toubro Nielsen <erik@ifad.dk>
+
+       * gnus-util.el (gnus-extract-address-components): Name might be
+       "".
+
+2000-04-27 20:32:06  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-msg.el (gnus-summary-mail-forward): Use ARG.
+       (gnus-summary-post-forward): Ditto.
+       * message.el (message-forward-show-mml): New variable.
+       (message-forward): Use it.
+       * mml.el (mml-parse-1): Add tag mml.
+       (mml-read-part): Ditto.
+       (mml-generate-mime): Support reentance.
+       (mml-generate-mime-1): Support mml tag.
+
+2000-04-27  Dave Love  <fx@gnu.org>
+
+       * gnus-art.el: Don't bother to require custom, browse-url.
+       (gnus-article-x-face-command): Include gnus-article-display-xface.
+
+       * gnus-ems.el: Assume only (X)Emacs 20+.  Simplify XEmacs checks.
+       Use defalias, not fset.
+       (gnus-article-display-xface): New function.
+
+       * mm-view.el (mm-inline-image-emacs): Use put-image, remove-images.
+
+       * mm-decode.el: Small doc fixes.  Require cl when compiling.
+       (mm-xemacs-p): Deleted.
+       (mm-get-image-emacs, mm-get-image-xemacs): Deleted.
+       (mm-get-image): Amalgamate Emacs and XEmacs code here; for Emacs,
+       use create-image and don't special-case xbm.
+       (mm-valid-image-format-p): Use display-graphic-p.
+
+2000-04-27 15:27:54  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * message.el (message-send-mail-partially-limit): New variable.
+       (message-send-mail-partially): New function.
+       (message-send-mail): Use it.
+       * mm-bodies.el (mm-decode-content-transfer-encoding): Remove 
+       all blank lines inside of base64.
+       * mm-partial.el (mm-inline-partial): Add an option. Remove tail
+       blank lines.
+
+2000-04-27 10:03:36  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * mml.el (mml-insert-tag): Match more special characters.
+
+2000-04-27 09:06:29  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-msg.el (gnus-bug): Avoid attaching the external buffer.
+
+2000-04-27 00:58:43  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * mm-decode.el (mm-inline-media-tests): Add message/partial.
+       (mm-inlined-types): Ditto.
+       * mm-partial.el: New file.
+
+2000-04-27  Dave Love  <fx@gnu.org>
+
+       * mailcap.el (mailcap-mime-data): Fix octet-stream syntax -- might
+       matter in Emacs 21.
+
+2000-04-26  Florian Weimer  <fw@deneb.cygnus.argh.org>
+
+       * mm-bodies.el (mm-encode-body): Remove reference to
+       mm-default-charset in comment.
+
+2000-04-24 00:56:00  Björn Torkelsson  <torkel@hpc2n.umu.se>
+
+       * rfc2047.el (rfc2047-encode-message-header): Fixing typo.
+       
+2000-04-26 12:27:41  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-draft.el (gnus-draft-send): Move gnus-draft-setup inside of
+       let.
+
+2000-04-26 12:26:10  Pavel Janik ml. <Pavel.Janik@inet.cz>
+
+       * gnus-draft.el (gnus-draft-setup): Fix comments.
+
+2000-04-26 10:06:12  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * nnmbox.el (nnmbox-create-mbox): Use nnmbox-file-coding-system,
+       if nnmbox-file-coding-system-for-write is nil.
+
+2000-04-26 02:17:44  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-msg.el (gnus-configure-posting-styles): Just remove the
+       header if nil.
+
+2000-04-26 00:23:46  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * mm-view.el (mm-inline-text): Insert directly if decoded.
+       * mml.el (autoload): Typo.
+
+2000-04-25 22:46:36  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * mml.el (mml-preview): Set up posting-charset.
+       * gnus-msg.el (gnus-group-posting-charset-alist): Add koi8-r.
+
+2000-04-25 21:23:54  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * webmail.el: Fix yahoo mail.
+
+2000-04-25 20:12:17  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * rfc2047.el (rfc2047-dissect-region): Don't include LWS ahead of
+       word if not necessary.
+       (rfc2047-encode-region): Put space between encoded words.
+
+2000-04-24 21:11:48  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-util.el (gnus-netrc-machine): Another default to nntp.
+
+2000-04-24 18:14:12  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-draft.el (gnus-draft-setup): Restore mml only when
+       required.
+       (gnus-draft-edit-message): Require restoration.
+
+2000-04-24 16:51:04  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-score.el (gnus-score-headers): Copy gnus-newsgrou-scored
+       back.
+
+2000-04-24 16:01:15  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-art.el (gnus-treat-article): Make sure that the summary
+       buffer is live.
+
+2000-04-24 15:42:53  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * mailcap.el (mailcap-parse-mailcaps): Reorder.
+       (mailcap-parse-mailcap): Backwards parsing.
+       (mailcap-possible-viewers): Remove nreverse.
+       (mailcap-mime-info): Ditto.
+       (mailcap-add-mailcap-entry): Keep alternative viewer.
+
 Mon Apr 24 21:12:06 2000  Lars Magne Ingebrigtsen  <lmi@quimbies.gnus.org>
 
        * gnus.el: Gnus v5.8.5 is released.
index d5cf865..02ccf53 100644 (file)
 (eval-when-compile (require 'static))
 
 (require 'path-util)
-(require 'custom)
 (require 'gnus)
 (require 'gnus-sum)
 (require 'gnus-spec)
 (require 'gnus-int)
-(require 'browse-url)
 (require 'alist)
 (require 'mime-view)
 
@@ -211,16 +209,24 @@ regexp.  If it matches, the text in question is not a signature."
   :group 'gnus-article-hiding)
 
 (defcustom gnus-article-x-face-command
-  (if (and (not gnus-xemacs)
-          window-system
-          (module-installed-p 'x-face-mule))
-      'x-face-mule-gnus-article-display-x-face
-    "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | display -"
-    )
+  (cond
+   ((and (fboundp 'image-type-available-p)
+        (or (image-type-available-p 'xpm)
+            (image-type-available-p 'xbm)))
+    'gnus-article-display-xface)
+   ((and (not gnus-xemacs)
+        window-system
+        (module-installed-p 'x-face-mule))
+    'x-face-mule-gnus-article-display-x-face)
+   (t
+    "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | display -"))
   "*String or function to be executed to display an X-Face header.
 If it is a string, the command will be executed in a sub-shell
 asynchronously.         The compressed face will be piped to this command."
-  :type 'string                                ;Leave function case to Lisp.
+  :type '(choice string
+                (function-item gnus-article-display-xface)
+                (function-item x-face-mule-gnus-article-display-x-face)
+                function)
   :group 'gnus-article-washing)
 
 (defcustom gnus-article-x-face-too-ugly nil
@@ -3193,7 +3199,7 @@ value of the variable `gnus-show-mime' is non-nil."
                                           (cons (caddr c) (car c)))
                                         gnus-mime-button-commands))))))
        (if response
-           (funcall response))))))
+           (call-interactively response))))))
 
 (defun gnus-mime-view-all-parts (&optional handles)
   "View all the MIME parts."
@@ -5121,8 +5127,11 @@ For example:
     (gnus-run-hooks 'gnus-part-display-hook)
     (unless gnus-inhibit-treatment
       (while (setq elem (pop alist))
-       (with-current-buffer gnus-summary-buffer
-         (setq val (symbol-value (car elem))))
+       (setq val
+             (save-excursion
+               (if (gnus-buffer-live-p gnus-summary-buffer)
+                   (set-buffer gnus-summary-buffer))
+               (symbol-value (car elem))))
        (when (and (or (consp val)
                       treated-type)
                   (gnus-treat-predicate val)
index 7a12263..7dba250 100644 (file)
 
 (defun gnus-draft-send (article &optional group interactive)
   "Send message ARTICLE."
-  (gnus-draft-setup-for-sending article (or group "nndraft:queue"))
   (let ((message-syntax-checks (if interactive nil
                                 'dont-check-for-anything-just-trust-me))
        (message-inhibit-body-encoding (or (not group) 
                                           message-inhibit-body-encoding))
        (message-send-hook (and group (not (equal group "nndraft:queue"))
                                message-send-hook))
-       (message-setup-hook nil)
+       (message-setup-hook (and group (not (equal group "nndraft:queue"))
+                                message-setup-hook))
        type method)
+    (gnus-draft-setup-for-sending article (or group "nndraft:queue"))
     ;; We read the meta-information that says how and where
     ;; this message is to be sent.
     (save-restriction
       (erase-buffer)
       (if (not (gnus-request-restore-buffer article group))
          (error "Couldn't restore the article")
-       ;; Insert the separator.
        (funcall gnus-draft-decoding-function)
+       ;; Insert the separator.
        (goto-char (point-min))
        (search-forward "\n\n")
        (forward-char -1)
index 59d382d..c3b6dd3 100644 (file)
@@ -31,8 +31,9 @@
 
 ;;; Function aliases later to be redefined for XEmacs usage.
 
-(defvar gnus-xemacs (string-match "XEmacs\\|Lucid" emacs-version)
-  "Non-nil if running under XEmacs.")
+(eval-and-compile
+  (defvar gnus-xemacs (string-match "XEmacs" emacs-version)
+    "Non-nil if running under XEmacs."))
 
 (defvar gnus-mouse-2 [mouse-2])
 (defvar gnus-down-mouse-3 [down-mouse-3])
 ;;; Mule functions.
 
 (eval-and-compile
-  (if (string-match "XEmacs\\|Lucid" emacs-version)
-      nil
-
+  (if gnus-xemacs
+      (gnus-xmas-define)
     (defvar gnus-mouse-face-prop 'mouse-face
-      "Property used for highlighting mouse regions."))
-
-  (cond
-   ((string-match "XEmacs\\|Lucid" emacs-version)
-    (gnus-xmas-define))
-
-   ((or (not (boundp 'emacs-minor-version))
-       (and (< emacs-major-version 20)
-            (< emacs-minor-version 30)))
-    ;; Remove the `intangible' prop.
-    (let ((props (and (boundp 'gnus-hidden-properties)
-                     gnus-hidden-properties)))
-      (while (and props (not (eq (car (cdr props)) 'intangible)))
-       (setq props (cdr props)))
-      (when props
-       (setcdr props (cdr (cdr (cdr props))))))
-    (unless (fboundp 'buffer-substring-no-properties)
-      (defun buffer-substring-no-properties (beg end)
-       (format "%s" (buffer-substring beg end)))))
-
-   ((boundp 'MULE)
-    (provide 'gnusutil))))
+      "Property used for highlighting mouse regions.")))
 
 (eval-and-compile
   (cond
@@ -90,7 +69,7 @@
                                   set-face-background x-popup-menu)))
       (while funcs
        (unless (fboundp (car funcs))
-         (fset (car funcs) 'gnus-dummy-func))
+         (defalias (car funcs) 'gnus-dummy-func))
        (setq funcs (cdr funcs)))))))
 
 (eval-and-compile
 
 (defun gnus-ems-redefine ()
   (cond
-   ((string-match "XEmacs\\|Lucid" emacs-version)
+   (gnus-xemacs
     (gnus-xmas-redefine))
 
    ((featurep 'mule)
     ;; Mule and new Emacs definitions
 
     ;; [Note] Now there are three kinds of mule implementations,
-    ;; original MULE, XEmacs/mule and beta version of Emacs including
-    ;; some mule features.  Unfortunately these API are different.  In
+    ;; original MULE, XEmacs/mule and Emacs 20+ including
+    ;; MULE features.  Unfortunately these API are different.  In
     ;; particular, Emacs (including original MULE) and XEmacs are
-    ;; quite different.
+    ;; quite different.  However, this version of Gnus doesn't support
+    ;; anything other than XEmacs 20+ and Emacs 20.3+.
+
     ;; Predicates to check are following:
     ;; (boundp 'MULE) is t only if MULE (original; anything older than
     ;;                     Mule 2.3) is running.
     ;; (featurep 'mule) is t when every mule variants are running.
 
-    ;; These implementations may be able to share between original
-    ;; MULE and beta version of new Emacs.  In addition, it is able to
-    ;; detect XEmacs/mule by (featurep 'mule) and to check variable
-    ;; `emacs-version'.  In this case, implementation for XEmacs/mule
-    ;; may be able to share between XEmacs and XEmacs/mule.
+    ;; It is possible to detect XEmacs/mule by (featurep 'mule) and
+    ;; checking `emacs-version'.  In this case, the implementation for
+    ;; XEmacs/mule may be shareable between XEmacs and XEmacs/mule.
 
     (defvar gnus-summary-display-table nil
       "Display table used in summary mode buffers.")
-    (fset 'gnus-summary-set-display-table (lambda ()))
+    (defalias 'gnus-summary-set-display-table (lambda ()))
 
     (if (fboundp 'truncate-string-to-width)
        (fset 'gnus-truncate-string 'truncate-string-to-width)
          (goto-char (point-min))
          (sit-for 0))))))
 
+(defun gnus-article-display-xface (beg end)
+  "Display an XFace header from between BEG and END in the current article.
+This requires support for XPM or XBM images in your Emacs and the
+external programs `uncompface', `icontopbm' and either `ppmtoxpm' (for
+XPM support) or `ppmtoxbm' (for XBM support).  On a GNU/Linux system
+these might be in packages with names like `compface' or `faces-xface'
+and `netpbm' or `libgr-progs', for instance.
+
+This function is for Emacs 21+.  See `gnus-xmas-article-display-xface'
+for XEmacs."
+  (save-excursion
+    (let ((cur (current-buffer))
+         image type)
+      (when (and (fboundp 'image-type-available-p)
+                (cond ((image-type-available-p 'xpm) (setq type 'xpm))
+                      ((image-type-available-p 'xbm) (setq type 'xbm))))
+       (with-temp-buffer
+         (insert-buffer-substring cur beg end)
+         (call-process-region (point-min) (point-max) "uncompface"
+                              'delete '(t nil))
+         (goto-char (point-min))
+         (insert "/* Width=48, Height=48 */\n")
+         (and (eq 0 (call-process-region (point-min) (point-max) "icontopbm"
+                                         'delete '(t nil)))
+              (eq 0 (call-process-region (point-min) (point-max)
+                                         (if (eq type 'xpm)
+                                             "ppmtoxpm"
+                                           "pbmtoxbm")
+                                         'delete '(t nil)))
+              (setq image (create-image (buffer-string) type t))))
+       (when image
+         (goto-char (point-min))
+         (re-search-forward "^From:" nil 'move)
+           (insert-image image " "))))))
+
 (defun-maybe assoc-ignore-case (key alist)
   "Like `assoc', but assumes KEY is a string and ignores case when comparing."
   (setq key (downcase key))
index 2542c58..39eb7dc 100644 (file)
@@ -52,7 +52,7 @@
      ("octet-stream"
       (viewer . mailcap-save-binary-file)
       (non-viewer . t)
-      (type ."application/octet-stream"))
+      (type . "application/octet-stream"))
      ("dvi"
       (viewer . "open %s")
       (type   . "application/dvi")
@@ -305,8 +305,12 @@ not.")
 (defvar mailcap-parsed-p nil)
 
 (defun mailcap-parse-mailcaps (&optional path force)
-  "Parse out all the mailcaps specified in a unix-style path string PATH.
-If FORCE, re-parse even if already parsed."
+  "Parse out all the mailcaps specified in a path string PATH.
+Components of PATH are separated by the `path-separator' character
+appropriate for this system.  If FORCE, re-parse even if already
+parsed.  If PATH is omitted, use the value of environment variable
+MAILCAPS if set; otherwise (on Unix) use the path from RFC 1524, plus
+/usr/local/etc/mailcap."
   (interactive (list nil t))
   (when (or (not mailcap-parsed-p)
            force)
@@ -314,27 +318,24 @@ If FORCE, re-parse even if already parsed."
      (path nil)
      ((getenv "MAILCAPS") (setq path (getenv "MAILCAPS")))
      ((memq system-type '(ms-dos ms-windows windows-nt))
-      (setq path (mapconcat 'expand-file-name
-                           '("~/mail.cap" "~/etc/mail.cap" "~/.mailcap")
-                           ";")))
-     (t (setq path (mapconcat 'expand-file-name
-                             '("~/.mailcap"
-                               "/etc/mailcap:/usr/etc/mailcap"
-                               "/usr/local/etc/mailcap") ":"))))
+      (setq path '("~/.mailcap" "~/mail.cap" "~/etc/mail.cap")))
+     (t (setq path
+             ;; This is per RFC 1524, specifically
+             ;; with /usr before /usr/local.
+             '("~/.mailcap" "/etc/mailcap" "/usr/etc/mailcap"
+               "/usr/local/etc/mailcap"))))
     (let ((fnames (reverse
-                  (split-string
-                   path (if (memq system-type
-                                  '(ms-dos ms-windows windows-nt))
-                            ";"
-                          ":"))))
+                  (if (stringp path)
+                      (parse-colon-path path)
+                    path)))
          fname)
       (while fnames
        (setq fname (car fnames))
-       (if (and (file-exists-p fname) (file-readable-p fname)
+       (if (and (file-readable-p fname)
                 (file-regular-p fname))
-           (mailcap-parse-mailcap (car fnames)))
+           (mailcap-parse-mailcap fname))
        (setq fnames (cdr fnames))))
-    (setq mailcap-parsed-p t)))
+      (setq mailcap-parsed-p t)))
 
 (defun mailcap-parse-mailcap (fname)
   ;; Parse out the mailcap file specified by FNAME
@@ -348,25 +349,24 @@ If FORCE, re-parse even if already parsed."
       (insert-file-contents fname)
       (set-syntax-table mailcap-parse-args-syntax-table)
       (mailcap-replace-regexp "#.*" "")        ; Remove all comments
+      (mailcap-replace-regexp "\\\\[ \t]*\n" " ") ; And collapse spaces
       (mailcap-replace-regexp "\n+" "\n") ; And blank lines
-      (mailcap-replace-regexp "\\\\[ \t\n]+" " ") ; And collapse spaces
-      (mailcap-replace-regexp (concat (regexp-quote "\\") "[ \t]*\n") "")
       (goto-char (point-max))
       (skip-chars-backward " \t\n")
       (delete-region (point) (point-max))
-      (goto-char (point-min))
-      (while (not (eobp))
-       (skip-chars-forward " \t\n")
+      (while (not (bobp))
+       (skip-chars-backward " \t\n")
+       (beginning-of-line)
        (setq save-pos (point)
              info nil)
        (skip-chars-forward "^/; \t\n")
        (downcase-region save-pos (point))
        (setq major (buffer-substring save-pos (point)))
-       (skip-chars-forward " \t\n")
+       (skip-chars-forward " \t")
        (setq minor "")
        (when (eq (char-after) ?/)
          (forward-char)
-         (skip-chars-forward " \t\n")
+         (skip-chars-forward " \t")
          (setq save-pos (point))
          (skip-chars-forward "^; \t\n")
          (downcase-region save-pos (point))
@@ -375,14 +375,14 @@ If FORCE, re-parse even if already parsed."
                 ((eq ?* (or (char-after save-pos) 0)) ".*")
                 ((= (point) save-pos) ".*")
                 (t (regexp-quote (buffer-substring save-pos (point)))))))
-       (skip-chars-forward " \t\n")
+       (skip-chars-forward " \t")
        ;;; Got the major/minor chunks, now for the viewers/etc
        ;;; The first item _must_ be a viewer, according to the
        ;;; RFC for mailcap files (#1343)
        (setq viewer "")
        (when (eq (char-after) ?\;) 
          (forward-char)
-         (skip-chars-forward " \t\n")
+         (skip-chars-forward " \t")
          (setq save-pos (point))
          (skip-chars-forward "^;\n")
          ;; skip \;
@@ -408,7 +408,8 @@ If FORCE, re-parse even if already parsed."
                                                          "*" minor))))
                            (mailcap-parse-mailcap-extras save-pos (point))))
          (mailcap-mailcap-entry-passes-test info)
-         (mailcap-add-mailcap-entry major minor info))))))
+         (mailcap-add-mailcap-entry major minor info))
+       (beginning-of-line)))))
 
 (defun mailcap-parse-mailcap-extras (st nd)
   ;; Grab all the extra stuff from a mailcap entry
@@ -497,7 +498,7 @@ If FORCE, re-parse even if already parsed."
        ((and minor (string-match (car (car major)) minor))
        (setq wildcard (cons (cdr (car major)) wildcard))))
       (setq major (cdr major)))
-    (nconc (nreverse exact) (nreverse wildcard))))
+    (nconc exact wildcard)))
 
 (defun mailcap-unescape-mime-test (test type-info)
   (let (save-pos save-chr subst)
@@ -590,16 +591,19 @@ If FORCE, re-parse even if already parsed."
        (setq mailcap-mime-data
              (cons (cons major (list (cons minor info)))
                    mailcap-mime-data))
-      (let ((cur-minor (assoc minor old-major)))
-       (cond
-        ((or (null cur-minor)          ; New minor area, or
-             (assq 'test info))        ; Has a test, insert at beginning
-         (setcdr old-major (cons (cons minor info) (cdr old-major))))
-        ((and (not (assq 'test info))  ; No test info, replace completely
-              (not (assq 'test cur-minor)))
-         (setcdr cur-minor info))
-        (t
-         (setcdr old-major (cons (cons minor info) (cdr old-major)))))))))
+       (let ((cur-minor (assoc minor old-major)))
+       (cond
+        ((or (null cur-minor)          ; New minor area, or
+             (assq 'test info))        ; Has a test, insert at beginning
+         (setcdr old-major (cons (cons minor info) (cdr old-major))))
+        ((and (not (assq 'test info))  ; No test info, replace completely
+              (not (assq 'test cur-minor))
+              (equal (assq 'viewer info)  ; Keep alternative viewer
+                     (assq 'viewer cur-minor)))
+         (setcdr cur-minor info))
+        (t
+         (setcdr old-major (cons (cons minor info) (cdr old-major))))))
+      )))
 
 (defun mailcap-add (type viewer &optional test)
   "Add VIEWER as a handler for TYPE.
@@ -670,9 +674,8 @@ this type is returned."
            (if (mailcap-viewer-passes-test (car viewers) info)
                (setq passed (cons (car viewers) passed)))
            (setq viewers (cdr viewers)))
-         (setq passed (sort (nreverse passed) 'mailcap-viewer-lessp))
+         (setq passed (sort passed 'mailcap-viewer-lessp))
          (setq viewer (car passed))))
-      (setq passed (nreverse passed))
       (when (and (stringp (cdr (assq 'viewer viewer)))
                 passed)
        (setq viewer (car passed)))
@@ -796,38 +799,37 @@ this type is returned."
   "An assoc list of file extensions and corresponding MIME content-types.")
 
 (defun mailcap-parse-mimetypes (&optional path)
-  ;; Parse out all the mimetypes specified in a unix-style path string PATH
+  "Parse out all the mimetypes specified in a unix-style path string PATH.
+Components of PATH are separated by the `path-separator' character
+appropriate for this system.  If PATH is omitted, use the value of
+environment variable MIMETYPES if set; otherwise use a default path."
   (cond
    (path nil)
    ((getenv "MIMETYPES") (setq path (getenv "MIMETYPES")))
    ((memq system-type '(ms-dos ms-windows windows-nt))
-    (setq path (mapconcat 'expand-file-name
-                         '("~/mime.typ" "~/etc/mime.typ") ";")))
-   (t (setq path (mapconcat
-                 'expand-file-name
-                 ;; mime.types seems to be the normal name,
-                 ;; definitely so on current GNUish systems.  The
-                 ;; ordering follows that for mailcap.
-                 '("~/.mime.types"
-                   "/etc/mime.types"
-                   "/usr/etc/mime.types"
-                   "/usr/local/etc/mime.types"
-                   "/usr/local/www/conf/mime.types"
-                   "~/.mime-types"
-                   "/etc/mime-types"
-                   "/usr/etc/mime-types"
-                   "/usr/local/etc/mime-types"
-                   "/usr/local/www/conf/mime-types") ":"))))
-  (let ((fnames (reverse
-                (split-string path
-                              (if (memq system-type
-                                        '(ms-dos ms-windows windows-nt))
-                                  ";" ":"))))
+    (setq path '("~/mime.typ" "~/etc/mime.typ")))
+   (t (setq path
+           ;; mime.types seems to be the normal name, definitely so
+           ;; on current GNUish systems.  The search order follows
+           ;; that for mailcap.
+           '("~/.mime.types"
+             "/etc/mime.types"
+             "/usr/etc/mime.types"
+             "/usr/local/etc/mime.types"
+             "/usr/local/www/conf/mime.types"
+             "~/.mime-types"
+             "/etc/mime-types"
+             "/usr/etc/mime-types"
+             "/usr/local/etc/mime-types"
+             "/usr/local/www/conf/mime-types"))))
+  (let ((fnames (reverse (if (stringp path)
+                            (parse-colon-path path)
+                          path)))
        fname)
     (while fnames
       (setq fname (car fnames))
-      (if (and (file-exists-p fname) (file-readable-p fname))
-         (mailcap-parse-mimetype-file (car fnames)))
+      (if (and (file-readable-p fname))
+         (mailcap-parse-mimetype-file fname))
       (setq fnames (cdr fnames)))))
 
 (defun mailcap-parse-mimetype-file (fname)
index 2b86993..2cb63f5 100644 (file)
@@ -108,6 +108,7 @@ the second with the current group name.")
 
 (defcustom gnus-group-posting-charset-alist
   '(("^\\(no\\|fr\\|dk\\)\\.[^,]*\\(,[ \t\n]*\\(no\\|fr\\|dk\\)\\.[^,]*\\)*$" iso-8859-1 (iso-8859-1))
+    ("^\\(fido7\\|relcom\\)\\.[^,]*\\(,[ \t\n]*\\(fido7\\|relcom\\)\\.[^,]*\\)*$" koi8-r (koi8-r))
     (message-this-is-mail nil nil)
     (message-this-is-news nil t))
   "Alist of regexps and permitted unencoded charsets for posting.
@@ -1355,8 +1356,10 @@ this is a reply."
                      `(lambda ()
                         (save-excursion
                           (message-remove-header ,header)
-                          (message-goto-eoh)
-                          (insert ,header ": " ,(cdr result) "\n"))))))))
+                          (let ((value ,(cdr result)))
+                            (when value
+                              (message-goto-eoh)
+                              (insert ,header ": " value "\n"))))))))))
       (when (or name address)
        (add-hook 'message-setup-hook
                  `(lambda ()
index 3c60ca6..74f6aa4 100644 (file)
@@ -1496,6 +1496,10 @@ EXTRA is the possible non-standard header."
                (when (setq new (funcall (nth 2 entry) scores header
                                         now expire trace))
                  (push new news))))
+           (when (gnus-buffer-live-p gnus-summary-buffer)
+             (let ((scored gnus-newsgroup-scored))
+               (with-current-buffer gnus-summary-buffer
+                 (setq gnus-newsgroup-scored scored))))
            ;; Remove the buffer.
            (kill-buffer (current-buffer)))
 
index c797b3d..e590e42 100644 (file)
@@ -754,17 +754,14 @@ prompt the user for the name of an NNTP server to use."
 
 ;;;###autoload
 (defun gnus-unload ()
-  "Unload all Gnus features."
+  "Unload all Gnus features.
+\(For some value of `all' or `Gnus'.)  Currently, features whose names
+have prefixes `gnus-', `nn', `mm-' or `rfc' are unloaded.  Use
+cautiously -- unloading may cause trouble."
   (interactive)
-  (unless (boundp 'load-history)
-    (error "Sorry, `gnus-unload' is not implemented in this Emacs version"))
-  (let ((history load-history)
-       feature)
-    (while history
-      (and (string-match "^\\(gnus\\|nn\\)" (caar history))
-          (setq feature (cdr (assq 'provide (car history))))
-          (unload-feature feature 'force))
-      (setq history (cdr history)))))
+  (dolist (feature features)
+    (if (string-match "^\\(gnus-\\|nn\\|mm-\\|rfc\\)" (symbol-name feature))
+       (unload-feature feature 'force))))
 
 \f
 ;;;
index d3d4309..366e76c 100644 (file)
        (and (string-match "(.*" from)
             (setq name (substring from (1+ (match-beginning 0))
                                   (match-end 0)))))
-    ;; Fix by Hallvard B Furuseth <h.b.furuseth@usit.uio.no>.
-    (list (or name from) (or address from))))
+    (list (if (string= name "") nil name) (or address from))))
+
 
 (defun gnus-fetch-field (field)
   "Return the value of the header FIELD of current article."
@@ -920,7 +920,8 @@ ARG is passed to the first function."
       (setq result (nreverse result))
       (while (and result
                  (not (equal (or port "nntp")
-                             (gnus-netrc-get (car result) "port"))))
+                             (or (gnus-netrc-get (car result) "port")
+                                 "nntp"))))
        (pop result))
       (car result))))
 
index 8a743aa..15a44c6 100644 (file)
 ;; Product information of this gnus.
 (product-provide 'gnus-vers
   (product-define "T-gnus" nil
-                 (list 6 14 3
+                 (list 6 14 4
                        (string-to-number gnus-revision-number))))
 
-(defconst gnus-original-version-number "5.8.5"
+(defconst gnus-original-version-number "5.8.6"
   "Version number for this version of Gnus.")
 
 (provide 'running-pterodactyl-gnus-0_73-or-later)
index 33111fd..32df498 100644 (file)
@@ -1,7 +1,6 @@
 ;;; gnus.el --- a newsreader for GNU Emacs
 ;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996,
-;;        1997, 1998, 2000
-;;        Free Software Foundation, Inc.
+;;        1997, 1998, 2000 Free Software Foundation, Inc.
 
 ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
 ;;     Lars Magne Ingebrigtsen <larsi@gnus.org>
@@ -750,7 +749,22 @@ be set in `.emacs' instead."
   "Insert startup message in current buffer."
   ;; Insert the message.
   (erase-buffer)
-  (insert "
+  (cond
+   ((and (fboundp 'find-image)
+        (display-graphic-p)
+        (let ((image (find-image '((:type xpm :file "gnus.xpm")
+                                   (:type xbm :file "gnus.xbm")))))
+          (when image
+            (insert-image image " ")
+            (goto-char (point-min))
+            (while (not (eobp))
+              (insert (make-string (/ (max (- (window-width) (or x 35)) 0) 2)
+                                   ?\ ))
+              (forward-line 1))
+            (setq gnus-simple-splash nil)
+            t))))
+   (t
+    (insert "
           _    ___ _             _
           _ ___ __ ___  __    _ ___
           __   _     ___    __  ___
@@ -770,32 +784,32 @@ be set in `.emacs' instead."
           __
 
 "
-         )
-  (goto-char (point-min))
-  (insert gnus-product-name " " gnus-version-number
-         (if (zerop (string-to-number gnus-revision-number))
-             ""
-           (concat " (r" gnus-revision-number ")"))
-         " based on " gnus-original-product-name " v"
-         gnus-original-version-number)
-  (goto-char (point-min))
-  (insert-char ?\ ; space
-              (max 0 (/ (- (window-width) (gnus-point-at-eol)) 2)))
-  (forward-line 1)
-  ;; And then hack it.
-  (gnus-indent-rigidly (point) (point-max)
-                      (/ (max (- (window-width) (or x 46)) 0) 2))
-  (goto-char (point-min))
-  (forward-line 1)
-  (let* ((pheight (count-lines (point-min) (point-max)))
-        (wheight (window-height))
-        (rest (- wheight pheight)))
-    (insert (make-string (max 0 (* 2 (/ rest 3))) ?\n)))
-  ;; Fontify some.
-  (put-text-property (point-min) (point-max) 'face 'gnus-splash-face)
+           )
+    (goto-char (point-min))
+    (insert gnus-product-name " " gnus-version-number
+           (if (zerop (string-to-number gnus-revision-number))
+               ""
+             (concat " (r" gnus-revision-number ")"))
+           " based on " gnus-original-product-name " v"
+           gnus-original-version-number)
+    (goto-char (point-min))
+    (insert-char ?\ ; space
+                (max 0 (/ (- (window-width) (gnus-point-at-eol)) 2)))
+    (forward-line 1)
+    ;; And then hack it.
+    (gnus-indent-rigidly (point) (point-max)
+                        (/ (max (- (window-width) (or x 46)) 0) 2))
+    (goto-char (point-min))
+    (forward-line 1)
+    (let* ((pheight (count-lines (point-min) (point-max)))
+          (wheight (window-height))
+          (rest (- wheight pheight)))
+      (insert (make-string (max 0 (* 2 (/ rest 3))) ?\n)))
+    ;; Fontify some.
+    (put-text-property (point-min) (point-max) 'face 'gnus-splash-face)
+    (setq gnus-simple-splash t)))
   (goto-char (point-min))
   (setq mode-line-buffer-identification (concat " " gnus-version))
-  (setq gnus-simple-splash t)
   (set-buffer-modified-p t))
 
 (eval-when (load)
@@ -921,7 +935,7 @@ see the manual for details."
   "*Method used for archiving messages you've sent.
 This should be a mail method.
 
-It's probably not a very effective to change this variable once you've
+It's probably not very effective to change this variable once you've
 run Gnus once.  After doing that, you must edit this server from the
 server buffer."
   :group 'gnus-server
index cf6c777..5287845 100644 (file)
@@ -48,6 +48,8 @@
                     temp-directory babel-fetch babel-wash
                     find-coding-systems-for-charsets sc-cite-regexp
                     vcard-pretty-print image-type-available-p
+                    put-image create-image  display-graphic-p
+                    find-image insert-image
                     make-overlay overlay-put make-symbolic-link))
       (maybe-bind '(global-face-data
                    mark-active transient-mark-mode mouse-selection-click-count
                 rmail-summary-exists rmail-select-summary rmail-update-summary
                 url-generic-parse-url valid-image-instantiator-format-p
                 babel-fetch babel-wash sc-cite-regexp
+                put-image create-image display-graphic-p
+                find-image insert-image
                 vcard-pretty-print image-type-available-p
                 coding-system-get find-coding-system
                 find-coding-systems-for-charsets find-coding-systems-region
index 10f6e80..2c5dc91 100644 (file)
@@ -406,6 +406,11 @@ The provided functions are:
   :group 'message-forwarding
   :type 'boolean)
 
+(defcustom message-forward-show-mml t
+  "*If non-nil, forward messages are shown as mml.  Otherwise, forward messages are unchanged."
+  :group 'message-forwarding
+  :type 'boolean)
+
 (defcustom message-forward-before-signature t
   "*If non-nil, put forwarded message before signature, else after."
   :group 'message-forwarding
@@ -1241,6 +1246,14 @@ The cdr of ech entry is a function for applying the face to a region.")
    (t nil))
   "Coding system to compose mail.")
 
+(defcustom message-send-mail-partially-limit 1000000
+  "The limitation of messages sent as message/partial.
+The lower bound of message size in characters, beyond which the message 
+should be sent in several parts. If it is nil, the size is unlimited."
+  :group 'message-buffers
+  :type '(choice (const :tag "unlimited" nil)
+                (integer 1000000)))
+
 ;;; Internal variables.
 
 (defvar message-buffer-list nil)
@@ -2751,6 +2764,71 @@ This sub function is for exclusive use of `message-send-mail'."
          (cadr failure)
        (prin1-to-string failure)))))
 
+(defun message-send-mail-partially ()
+  "Sendmail as message/partial."
+  (let ((p (goto-char (point-min)))
+       (tembuf (message-generate-new-buffer-clone-locals " message temp"))
+       (curbuf (current-buffer))
+       (id (message-make-message-id)) (n 1)
+       plist total  header required-mail-headers)
+    (while (not (eobp))
+      (if (< (point-max) (+ p message-send-mail-partially-limit))
+         (goto-char (point-max))
+       (goto-char (+ p message-send-mail-partially-limit))
+       (beginning-of-line)
+       (if (<= (point) p) (forward-line 1))) ;; In case of bad message.
+      (push p plist)
+      (setq p (point)))
+    (setq total (length plist))
+    (push (point-max) plist)
+    (setq plist (nreverse plist))
+    (unwind-protect
+       (save-excursion
+         (setq p (pop plist))
+         (while plist
+           (set-buffer curbuf)
+           (copy-to-buffer tembuf p (car plist))
+           (set-buffer tembuf)
+           (goto-char (point-min))
+           (if header
+               (progn
+                 (goto-char (point-min))
+                 (narrow-to-region (point) (point))
+                 (insert header))
+             (message-goto-eoh)
+             (setq header (buffer-substring (point-min) (point)))
+             (goto-char (point-min))
+             (narrow-to-region (point) (point))
+             (insert header)
+             (message-remove-header "Mime-Version")
+             (message-remove-header "Content-Type")
+             (message-remove-header "Content-Transfer-Encoding")
+             (message-remove-header "Message-ID")
+             (message-remove-header "Lines")
+             (goto-char (point-max))
+             (insert "Mime-Version: 1.0\n")
+             (setq header (buffer-substring (point-min) (point-max))))
+           (goto-char (point-max))
+           (insert (format "Content-Type: message/partial; id=\"%s\"; number=%d; total=%d\n"
+                           id n total))
+           (let ((mail-header-separator ""))
+             (when (memq 'Message-ID message-required-mail-headers)
+               (insert "Message-ID: " (message-make-message-id) "\n"))
+             (when (memq 'Lines message-required-mail-headers)
+               (let ((mail-header-separator ""))
+                 (insert "Lines: " (message-make-lines) "\n")))
+             (message-goto-subject)
+             (end-of-line)
+             (insert (format " (%d/%d)" n total))
+             (goto-char (point-max))
+             (insert "\n")
+             (widen)
+             (funcall message-send-mail-function))
+           (setq n (+ n 1))
+           (setq p (pop plist))
+           (erase-buffer)))
+      (kill-buffer tembuf))))
+
 (defun message-send-mail (&optional arg)
   (require 'mail-utils)
   (let* ((tembuf (message-generate-new-buffer-clone-locals " message temp"))
index 3a545d3..8c42436 100644 (file)
@@ -60,7 +60,7 @@ If successful, the MIME charset is returned.
 If no encoding was done, nil is returned."
   (if (not (featurep 'mule))
       ;; In the non-Mule case, we search for non-ASCII chars and
-      ;; return the value of `mm-default-charset' if any are found.
+      ;; return the value of `mail-parse-charset' if any are found.
       (save-excursion
        (goto-char (point-min))
        (if (re-search-forward "[^\x0-\x7f]" nil t)
@@ -168,12 +168,9 @@ If no encoding was done, nil is returned."
             ;; have been added by mailing list software.
             (save-excursion
               (goto-char (point-min))
-              (if (re-search-forward "^[\t ]*$" nil t)
-                  (delete-region (point) (point-max))
-                (goto-char (point-max)))
-              (skip-chars-backward "\n\t ")
-              (delete-region (point) (point-max))
-              (point))))
+              (while (re-search-forward "^[\t ]*\r?\n" nil t)
+                (delete-region (match-beginning 0) (match-end 0)))
+              (point-max))))
           ((memq encoding '(7bit 8bit binary))
            ;; Do nothing.
            )
index e4acf89..7b23003 100644 (file)
 (require 'mail-parse)
 (require 'gnus-mailcap)
 (require 'mm-bodies)
+(eval-when-compile (require 'cl))
 
-(defvar mm-xemacs-p (string-match "XEmacs" (emacs-version)))
+(eval-and-compile
+  (autoload 'mm-inline-partial "mm-partial"))
 
 (defgroup mime-display ()
   "Display of MIME in mail and news articles."
           (locate-library "vcard"))))
     ("message/delivery-status" mm-inline-text identity)
     ("message/rfc822" mm-inline-message identity)
+    ("message/partial" mm-inline-partial identity)
     ("text/.*" mm-inline-text identity)
     ("audio/wav" mm-inline-audio
      (lambda (handle)
 
 (defcustom mm-inlined-types
   '("image/.*" "text/.*" "message/delivery-status" "message/rfc822"
+    "message/partial"
     "application/pgp-signature")
   "List of media types that are to be displayed inline."
   :type '(repeat string)
 Viewing agents are supposed to view the last possible part of a message,
 as that is supposed to be the richest.  However, users may prefer other
 types instead, and this list says what types are most unwanted.  If,
-for instance, text/html parts are very unwanted, and text/richtech are
+for instance, text/html parts are very unwanted, and text/richtext are
 somewhat unwanted, then the value of this variable should be set
 to:
 
@@ -227,7 +231,7 @@ to:
       (if (or (not ctl)
              (not (string-match "/" (car ctl))))
          (mm-dissect-singlepart
-          '("text/plain") 
+          '("text/plain")
           (and cte (intern (downcase (mail-header-remove-whitespace
                                       (mail-header-remove-comments
                                        cte)))))
@@ -392,7 +396,7 @@ external if displayed external."
                 (unwind-protect
                     (start-process "*display*" nil
                                    "xterm"
-                                   "-e" shell-file-name 
+                                   "-e" shell-file-name
                                    shell-command-switch
                                    (mm-mailcap-command
                                     method file (mm-handle-type handle)))
@@ -407,7 +411,7 @@ external if displayed external."
                    (unwind-protect
                        (progn
                          (call-process shell-file-name nil
-                                       (setq buffer 
+                                       (setq buffer
                                              (generate-new-buffer "*mm*"))
                                        nil
                                        shell-command-switch
@@ -464,7 +468,7 @@ external if displayed external."
     (mapconcat 'identity (nreverse out) "")))
     
 (defun mm-remove-parts (handles)
-  "Remove the displayed MIME parts represented by HANDLE."
+  "Remove the displayed MIME parts represented by HANDLES."
   (if (and (listp handles)
           (bufferp (car handles)))
       (mm-remove-part handles)
@@ -481,7 +485,7 @@ external if displayed external."
          (mm-remove-part handle)))))))
 
 (defun mm-destroy-parts (handles)
-  "Remove the displayed MIME parts represented by HANDLE."
+  "Remove the displayed MIME parts represented by HANDLES."
   (if (and (listp handles)
           (bufferp (car handles)))
       (mm-destroy-part handles)
@@ -720,9 +724,8 @@ external if displayed external."
     result))
 
 (defun mm-preferred-alternative-precedence (handles)
-  "Return the precedence based on HANDLES and mm-discouraged-alternatives."
-  (let ((seq (nreverse (mapcar (lambda (h)
-                                (mm-handle-media-type h))
+  "Return the precedence based on HANDLES and `mm-discouraged-alternatives'."
+  (let ((seq (nreverse (mapcar #'mm-handle-media-type
                               handles))))
     (dolist (disc (reverse mm-discouraged-alternatives))
       (dolist (elem (copy-sequence seq))
@@ -734,37 +737,7 @@ external if displayed external."
   "Return the handle(s) referred to by ID."
   (cdr (assoc id mm-content-id-alist)))
 
-(defun mm-get-image-emacs (handle)
-  "Return an image instance based on HANDLE."
-  (let ((type (mm-handle-media-subtype handle))
-       spec)
-    ;; Allow some common translations.
-    (setq type
-         (cond
-          ((equal type "x-pixmap")
-           "xpm")
-          ((equal type "x-xbitmap")
-           "xbm")
-          (t type)))
-    (or (mm-handle-cache handle)
-       (mm-with-unibyte-buffer
-         (mm-insert-part handle)
-         (prog1
-             (setq spec
-                   (ignore-errors
-                     (cond
-                      ((equal type "xbm")
-                       ;; xbm images require special handling, since
-                       ;; the only way to create glyphs from these
-                       ;; (without a ton of work) is to write them
-                       ;; out to a file, and then create a file
-                       ;; specifier.
-                       (error "Don't know what to do for XBMs right now."))
-                      (t
-                       (list 'image :type (intern type) :data (buffer-string))))))
-           (mm-handle-set-cache handle spec))))))
-
-(defun mm-get-image-xemacs (handle)
+(defun mm-get-image (handle)
   "Return an image instance based on HANDLE."
   (let ((type (mm-handle-media-subtype handle))
        spec)
@@ -782,32 +755,29 @@ external if displayed external."
          (prog1
              (setq spec
                    (ignore-errors
-                     (cond
-                      ((equal type "xbm")
-                       ;; xbm images require special handling, since
-                       ;; the only way to create glyphs from these
-                       ;; (without a ton of work) is to write them
-                       ;; out to a file, and then create a file
-                       ;; specifier.
-                       (let ((file (make-temp-name
-                                    (expand-file-name "emm.xbm"
-                                                      mm-tmp-directory))))
-                         (unwind-protect
-                             (progn
-                               (write-region (point-min) (point-max) file)
-                               (make-glyph (list (cons 'x file))))
-                           (ignore-errors
-                             (delete-file file)))))
-                      (t
-                       (make-glyph
-                        (vector (intern type) :data (buffer-string)))))))
+                     (if (fboundp 'make-glyph)
+                         (cond
+                          ((equal type "xbm")
+                           ;; xbm images require special handling, since
+                           ;; the only way to create glyphs from these
+                           ;; (without a ton of work) is to write them
+                           ;; out to a file, and then create a file
+                           ;; specifier.
+                           (let ((file (make-temp-name
+                                        (expand-file-name "emm.xbm"
+                                                          mm-tmp-directory))))
+                             (unwind-protect
+                                 (progn
+                                   (write-region (point-min) (point-max) file)
+                                   (make-glyph (list (cons 'x file))))
+                               (ignore-errors
+                                 (delete-file file)))))
+                          (t
+                           (make-glyph
+                            (vector (intern type) :data (buffer-string)))))
+                       (create-image (buffer-string) (intern type) 'data-p))))
            (mm-handle-set-cache handle spec))))))
 
-(defun mm-get-image (handle)
-  (if mm-xemacs-p
-      (mm-get-image-xemacs handle)
-    (mm-get-image-emacs handle)))
-
 (defun mm-image-fit-p (handle)
   "Say whether the image in HANDLE will fit the current window."
   (let ((image (mm-get-image handle)))
@@ -830,7 +800,8 @@ external if displayed external."
     (valid-image-instantiator-format-p format))
    ;; Handle Emacs 21
    ((fboundp 'image-type-available-p)
-    (image-type-available-p format))
+    (and (display-graphic-p)
+        (image-type-available-p format)))
    ;; Nobody else can do images yet.
    (t
     nil)))
@@ -843,4 +814,4 @@ external if displayed external."
 
 (provide 'mm-decode)
 
-;; mm-decode.el ends here
+;;; mm-decode.el ends here
diff --git a/lisp/mm-partial.el b/lisp/mm-partial.el
new file mode 100644 (file)
index 0000000..4d60a85
--- /dev/null
@@ -0,0 +1,153 @@
+;;; mm-partial.el --- showing message/partial
+;; Copyright (C) 2000 Free Software Foundation, Inc.
+
+;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
+;; Keywords: message partial
+
+;; 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:
+
+;;; Code:
+
+(eval-when-compile 
+  (require 'cl))
+
+(require 'gnus-sum)
+(require 'mm-util)
+(require 'mm-decode)
+
+(defun mm-partial-find-parts (id &optional art)
+  (let ((headers (save-excursion
+                  (set-buffer gnus-summary-buffer)
+                  gnus-newsgroup-headers))
+       phandles handles  header)
+    (while (setq header (pop headers))
+      (unless (eq (aref header 0) art)
+       (mm-with-unibyte-buffer
+         (gnus-request-article-this-buffer (aref header 0) 
+                                           gnus-newsgroup-name)
+         (when (search-forward id nil t)
+           (let ((nhandles (mm-dissect-buffer)) nid)
+             (setq handles gnus-article-mime-handles)
+             (if (consp (car nhandles))
+                 (mm-destroy-parts nhandles)
+               (setq nid (cdr (assq 'id 
+                                    (cdr (mm-handle-type nhandles)))))
+               (if (not (equal id nid))
+                   (mm-destroy-parts nhandles)
+                 (push nhandles phandles))))))))
+    phandles))
+
+;;;###autoload
+(defun mm-inline-partial (handle &optional no-display)
+  "Show the partial part of HANDLE.
+This function replaces the buffer of HANDLE with a buffer contains 
+the entire message.
+If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing."
+  (let ((id (cdr (assq 'id (cdr (mm-handle-type handle))))) 
+       phandles
+       (b (point)) (n 1) total
+       phandle nn ntotal
+       gnus-displaying-mime handles buffer)
+    (unless (mm-handle-cache handle)
+      (unless id
+       (error "Can not find message/partial id."))
+      (setq phandles
+           (sort (cons handle 
+                       (mm-partial-find-parts
+                        id 
+                        (save-excursion
+                          (set-buffer gnus-summary-buffer)
+                          (gnus-summary-article-number))))
+                 #'(lambda (a b)
+                     (let ((anumber (string-to-number 
+                                     (cdr (assq 'number 
+                                                (cdr (mm-handle-type a))))))
+                           (bnumber (string-to-number 
+                                     (cdr (assq 'number 
+                                                (cdr (mm-handle-type b)))))))
+                       (< anumber bnumber)))))
+      (setq gnus-article-mime-handles
+           (append (if (listp (car gnus-article-mime-handles))
+                       gnus-article-mime-handles
+                     (list gnus-article-mime-handles))
+                   phandles))
+      (save-excursion
+       (set-buffer (generate-new-buffer "*mm*"))
+       (while (setq phandle (pop phandles))
+         (setq nn (string-to-number 
+                   (cdr (assq 'number 
+                              (cdr (mm-handle-type phandle))))))
+         (setq ntotal (string-to-number 
+                       (cdr (assq 'total 
+                                  (cdr (mm-handle-type phandle))))))
+         (if ntotal
+             (if total
+                 (unless (eq total ntotal) 
+                 (error "The numbers of total are different."))
+               (setq total ntotal)))
+         (unless (< nn n)
+           (unless (eq nn n)
+             (error "Missing part %d" n))
+           (mm-insert-part phandle)
+           (goto-char (point-max))
+           (when (not (eq 0 (skip-chars-backward "\r\n")))
+             ;; remove tail blank spaces except one
+             (if (looking-at "\r?\n")
+                 (goto-char (match-end 0)))
+             (delete-region (point) (point-max)))
+           (setq n (+ n 1))))
+       (unless total
+         (error "Don't known the total number of"))
+       (if (<= n total)
+           (error "Missing part %d" n))
+       (kill-buffer (mm-handle-buffer handle))
+       (setcar handle (current-buffer))
+       (mm-handle-set-cache handle t)))
+    (unless no-display
+      (save-excursion
+       (save-restriction
+         (narrow-to-region b b)
+         (mm-insert-part handle)
+         (let (gnus-article-mime-handles)
+           (run-hooks 'gnus-article-decode-hook)
+           (gnus-article-prepare-display)
+           (setq handles gnus-article-mime-handles))
+         (when handles
+           ;; It is in article buffer.
+           (setq gnus-article-mime-handles
+                 (nconc (if (listp (car gnus-article-mime-handles))
+                          gnus-article-mime-handles
+                          (list gnus-article-mime-handles))
+                        (if (listp (car handles)) 
+                            handles (list handles)))))
+         (mm-handle-set-undisplayer
+          handle
+          `(lambda ()
+             (let (buffer-read-only)
+               (condition-case nil
+                   ;; This is only valid on XEmacs.
+                   (mapcar (lambda (prop)
+                           (remove-specifier
+                            (face-property 'default prop) (current-buffer)))
+                           '(background background-pixmap foreground))
+                 (error nil))
+               (delete-region ,(point-min-marker) ,(point-max-marker))))))))))
+
+;; mm-partial.el ends here
index b63de67..fe36cf6 100644 (file)
 ;;; Functions for displaying various formats inline
 ;;;
 (defun mm-inline-image-emacs (handle)
-  (let ((b (point))
-       (overlay nil)
-       (string (copy-sequence "[MM-INLINED-IMAGE]"))
+  (let ((b (point-marker))
        buffer-read-only)
     (insert "\n")
-    (buffer-name)
-    (setq overlay (make-overlay (point) (point) (current-buffer)))
-    (put-text-property 0 (length string) 'display (mm-get-image handle) string)
-    (overlay-put overlay 'before-string string)
-
+    (put-image (mm-get-image handle) b "x")
     (mm-handle-set-undisplayer
      handle
-     `(lambda ()
-       (let (buffer-read-only)
-         (delete-overlay ,overlay)
-         (delete-region ,(set-marker (make-marker) b)
-                        ,(set-marker (make-marker) (point))))))))
+     `(lambda () (remove-images ,b (1+ ,b))))))
 
 (defun mm-inline-image-xemacs (handle)
   (let ((b (point))
     (set-extent-property annot 'mm t)
     (set-extent-property annot 'duplicable t)))
 
-(defun mm-inline-image (handle)
-  (if mm-xemacs-p
-      (mm-inline-image-xemacs handle)
-    (mm-inline-image-emacs handle)))
+(eval-and-compile
+  (if (string-match "XEmacs" (emacs-version))
+      (fset 'mm-inline-image 'mm-inline-image-xemacs)
+    (fset 'mm-inline-image 'mm-inline-image-emacs)))
 
 (defvar mm-w3-setup nil)
 (defun mm-setup-w3 ()
                  (vcard-parse-string (mm-get-part handle)
                                      'vcard-standard-filter))))))
      (t
-      (setq text (mm-get-part handle))
       (let ((b (point))
            (charset (mail-content-type-get
                      (mm-handle-type handle) 'charset)))
-       (insert (mm-decode-string text charset))
+       (if (eq charset 'gnus-decoded)
+           (mm-insert-part handle)
+         (insert (mm-decode-string (mm-get-part handle) charset)))
        (when (and (equal type "plain")
                   (equal (cdr (assoc 'format (mm-handle-type handle)))
                          "flowed"))
index 334cb8d..b966a17 100644 (file)
 (require 'mm-bodies)
 (require 'mm-encode)
 (require 'mm-decode)
+(eval-when-compile 'cl)
 
 (eval-and-compile
-  (autoload 'message-make-message-id "message"))
+  (autoload 'message-make-message-id "message")
+  (autoload 'gnus-setup-posting-charset "gnus-msg")
+  (autoload 'message-fetch-field "message")
+  (autoload 'message-posting-charset "message"))
 
 (defvar mml-generate-multipart-alist nil
   "*Alist of multipart generation functions.
@@ -80,7 +84,7 @@ one charsets.")
 
 (defun mml-parse-1 ()
   "Parse the current buffer as an MML document."
-  (let (struct tag point contents charsets warn use-ascii)
+  (let (struct tag point contents charsets warn use-ascii no-markup-p)
     (while (and (not (eobp))
                (not (looking-at "<#/multipart")))
       (cond
@@ -90,12 +94,13 @@ one charsets.")
        (push (nconc (mml-read-tag) (list (cons 'contents (mml-read-part))))
              struct))
        (t
-       (if (looking-at "<#part")
+       (if (or (looking-at "<#part") (looking-at "<#mml"))
            (setq tag (mml-read-tag))
          (setq tag (list 'part '(type . "text/plain"))
+               no-markup-p t
                warn t))
        (setq point (point)
-             contents (mml-read-part)
+             contents (mml-read-part (eq 'mml (car tag)))
              charsets (mm-find-mime-charset-region point (point)))
        (when (memq nil charsets)
          (if (or (memq 'unknown-encoding mml-confirmation-set)
@@ -108,8 +113,11 @@ one charsets.")
                (setq warn nil))
            (error "Edit your message to remove those characters")))
        (if (< (length charsets) 2)
-           (push (nconc tag (list (cons 'contents contents)))
-                 struct)
+           (if (or (not no-markup-p)
+                   (string-match "[^ \t\r\n]" contents))
+               ;; Don't create blank parts.
+               (push (nconc tag (list (cons 'contents contents)))
+                     struct))
          (let ((nstruct (mml-parse-singlepart-with-multiple-charsets
                          tag point (point) use-ascii)))
            (when (and warn
@@ -200,22 +208,32 @@ one charsets.")
     (skip-chars-forward " \t\n")
     (cons (intern name) (nreverse contents))))
 
-(defun mml-read-part ()
-  "Return the buffer up till the next part, multipart or closing part or multipart."
-  (let ((beg (point)))
+(defun mml-read-part (&optional mml)
+  "Return the buffer up till the next part, multipart or closing part or multipart.
+If MML is non-nil, return the buffer up till the correspondent mml tag."
+  (let ((beg (point)) (count 1))
     ;; If the tag ended at the end of the line, we go to the next line.
     (when (looking-at "[ \t]*\n")
       (forward-line 1))
-    (if (re-search-forward
-        "<#\\(/\\)?\\(multipart\\|part\\|external\\)." nil t)
-       (prog1
-           (buffer-substring-no-properties beg (match-beginning 0))
-         (if (or (not (match-beginning 1))
-                 (equal (match-string 2) "multipart"))
-             (goto-char (match-beginning 0))
-           (when (looking-at "[ \t]*\n")
-             (forward-line 1))))
-      (buffer-substring-no-properties beg (goto-char (point-max))))))
+    (if mml
+       (progn
+         (while (and (> count 0) (not (eobp)))
+           (if (re-search-forward "<#\\(/\\)?mml." nil t)
+               (setq count (+ count (if (match-beginning 1) -1 1)))
+             (goto-char (point-max))))
+         (buffer-substring-no-properties beg (if (> count 0) 
+                                                 (point)
+                                               (match-beginning 0))))
+      (if (re-search-forward
+          "<#\\(/\\)?\\(multipart\\|part\\|external\\|mml\\)." nil t)
+         (prog1
+             (buffer-substring-no-properties beg (match-beginning 0))
+           (if (or (not (match-beginning 1))
+                   (equal (match-string 2) "multipart"))
+               (goto-char (match-beginning 0))
+             (when (looking-at "[ \t]*\n")
+               (forward-line 1))))
+       (buffer-substring-no-properties beg (goto-char (point-max)))))))
 
 (defvar mml-boundary nil)
 (defvar mml-base-boundary "-=-=")
@@ -224,7 +242,7 @@ one charsets.")
 (defun mml-generate-mime ()
   "Generate a MIME message based on the current MML document."
   (let ((cont (mml-parse))
-       (mml-multipart-number 0))
+       (mml-multipart-number mml-multipart-number))
     (if (not cont)
        nil
       (with-temp-buffer
@@ -237,7 +255,7 @@ one charsets.")
 
 (defun mml-generate-mime-1 (cont)
   (cond
-   ((eq (car cont) 'part)
+   ((or (eq (car cont) 'part) (eq (car cont) 'mml))
     (let (coded encoding charset filename type)
       (setq type (or (cdr (assq 'type cont)) "text/plain"))
       (if (member (car (split-string type "/")) '("text" "message"))
@@ -248,6 +266,8 @@ one charsets.")
             ((and (setq filename (cdr (assq 'filename cont)))
                   (not (equal (cdr (assq 'nofile cont)) "yes")))
              (mm-insert-file-contents filename))
+            ((eq 'mml (car cont))
+             (insert (cdr (assq 'contents cont))))
             (t
              (save-restriction
                (narrow-to-region (point) (point))
@@ -255,22 +275,25 @@ one charsets.")
                ;; Remove quotes from quoted tags.
                (goto-char (point-min))
                (while (re-search-forward
-                       "<#!+/?\\(part\\|multipart\\|external\\)" nil t)
+                       "<#!+/?\\(part\\|multipart\\|external\\|mml\\)" nil t)
                  (delete-region (+ (match-beginning 0) 2)
                                 (+ (match-beginning 0) 3))))))
-           (when (string= (car (split-string type "/")) "message")
-             ;; message/rfc822 parts have to have their heads encoded.
-             (save-restriction
-               (message-narrow-to-head)
-               (let ((rfc2047-header-encoding-alist nil))
-                 (mail-encode-encoded-word-buffer))))
-           (setq charset (mm-encode-body))
-           (setq encoding (mm-body-encoding
-                           charset
-                           (if (string= (car (split-string type "/"))
-                                        "message")
-                               '8bit
-                             (cdr (assq 'encoding cont)))))
+           (cond 
+            ((eq (car cont) 'mml)
+             (let ((mml-boundary (funcall mml-boundary-function
+                                          (incf mml-multipart-number))))
+               (mml-to-mime))
+             (let ((mm-7bit-chars (concat mm-7bit-chars "\x1b")))
+               ;; ignore 0x1b, it is part of iso-2022-jp
+               (setq encoding (mm-body-7-or-8))))
+            ((string= (car (split-string type "/")) "message")
+             (let ((mm-7bit-chars (concat mm-7bit-chars "\x1b")))
+               ;; ignore 0x1b, it is part of iso-2022-jp
+               (setq encoding (mm-body-7-or-8))))
+            (t 
+             (setq charset (mm-encode-body))
+             (setq encoding (mm-body-encoding
+                             charset (cdr (assq 'encoding cont))))))
            (setq coded (buffer-string)))
        (mm-with-unibyte-buffer
          (cond
@@ -479,7 +502,13 @@ one charsets.")
     (if (stringp (car handles))
        (mml-insert-mime handles)
       (mml-insert-mime handles t))
-    (mm-destroy-parts handles)))
+    (mm-destroy-parts handles))
+  (save-restriction
+    (message-narrow-to-head)
+    ;; Remove them, they are confusing.
+    (message-remove-header "Content-Type")
+    (message-remove-header "MIME-Version")
+    (message-remove-header "Content-Transfer-Encoding")))
 
 (defun mml-to-mime ()
   "Translate the current buffer from MML to MIME."
@@ -489,17 +518,26 @@ one charsets.")
     (mail-encode-encoded-word-buffer)))
 
 (defun mml-insert-mime (handle &optional no-markup)
-  (let (textp buffer)
+  (let (textp buffer mmlp)
     ;; Determine type and stuff.
     (unless (stringp (car handle))
-      (unless (setq textp (equal (mm-handle-media-supertype handle)
-                                "text"))
+      (unless (setq textp (equal (mm-handle-media-supertype handle) "text"))
        (save-excursion
          (set-buffer (setq buffer (generate-new-buffer " *mml*")))
-         (mm-insert-part handle))))
-    (unless no-markup
-      (mml-insert-mml-markup handle buffer textp))
+         (mm-insert-part handle)
+         (if (setq mmlp (equal (mm-handle-media-type handle) 
+                               "message/rfc822"))
+             (mime-to-mml)))))
+    (if mmlp
+       (mml-insert-mml-markup handle nil t t)
+      (unless (and no-markup
+                  (equal (mm-handle-media-type handle) "text/plain"))
+       (mml-insert-mml-markup handle buffer textp)))
     (cond
+     (mmlp 
+      (insert-buffer buffer)
+      (goto-char (point-max))
+      (insert "<#/mml>\n"))
      ((stringp (car handle))
       (mapcar 'mml-insert-mime (cdr handle))
       (insert "<#/multipart>\n"))
@@ -512,12 +550,14 @@ one charsets.")
      (t
       (insert "<#/part>\n")))))
 
-(defun mml-insert-mml-markup (handle &optional buffer nofile)
+(defun mml-insert-mml-markup (handle &optional buffer nofile mmlp)
   "Take a MIME handle and insert an MML tag."
   (if (stringp (car handle))
       (insert "<#multipart type=" (mm-handle-media-subtype handle)
              ">\n")
-    (insert "<#part type=" (mm-handle-media-type handle))
+    (if mmlp
+       (insert "<#mml type=" (mm-handle-media-type handle))
+      (insert "<#part type=" (mm-handle-media-type handle)))
     (dolist (elem (append (cdr (mm-handle-type handle))
                          (cdr (mm-handle-disposition handle))))
       (insert " " (symbol-name (car elem)) "=\"" (cdr elem) "\""))
@@ -626,8 +666,7 @@ one charsets.")
                   'list
                   (mm-delete-duplicates
                    (nconc
-                    (mapcar (lambda (m) (cdr m))
-                            mailcap-mime-extensions)
+                    (mapcar 'cdr mailcap-mime-extensions)
                     (apply
                      'nconc
                      (mapcar
@@ -663,7 +702,7 @@ one charsets.")
       (goto-char (point-min))
       ;; Quote parts.
       (while (re-search-forward
-             "<#/?!*\\(multipart\\|part\\|external\\)" nil t)
+             "<#/?!*\\(multipart\\|part\\|external\\|mml\\)" nil t)
        ;; Insert ! after the #.
        (goto-char (+ (match-beginning 0) 2))
        (insert "!")))))
@@ -678,7 +717,7 @@ one charsets.")
          (value (pop plist)))
       (when value
        ;; Quote VALUE if it contains suspicious characters.
-       (when (string-match "[\"\\~/* \t\n]" value)
+       (when (string-match "[\"'\\~/*;() \t\n]" value)
          (setq value (prin1-to-string value)))
        (insert (format " %s=%s" key value)))))
   (insert ">\n"))
@@ -751,7 +790,10 @@ TYPE is the MIME type to use."
   "Display current buffer with Gnus, in a new buffer.
 If RAW, don't highlight the article."
   (interactive "P")
-  (let ((buf (current-buffer)))
+  (let ((buf (current-buffer))
+       (message-posting-charset (or (gnus-setup-posting-charset 
+                                     (message-fetch-field "Newsgroups"))
+                                    message-posting-charset)))
     (switch-to-buffer (get-buffer-create 
                       (concat (if raw "*Raw MIME preview of "
                                 "*MIME preview of ") (buffer-name))))
@@ -762,9 +804,10 @@ If RAW, don't highlight the article."
        (replace-match "\n"))
     (mml-to-mime)
     (unless raw
-      (run-hooks 'gnus-article-decode-hook)
-      (let ((gnus-newsgroup-name "dummy"))
-       (gnus-article-prepare-display)))
+      (let ((gnus-newsgroup-charset (car message-posting-charset)))
+       (run-hooks 'gnus-article-decode-hook)
+       (let ((gnus-newsgroup-name "dummy"))
+         (gnus-article-prepare-display))))
     (fundamental-mode)
     (setq buffer-read-only t)
     (goto-char (point-min))))
index 876cee7..363ff3c 100644 (file)
@@ -71,8 +71,8 @@ from the document.")
      (body-begin-function . nndoc-babyl-body-begin)
      (head-begin-function . nndoc-babyl-head-begin))
     (forward
-     (article-begin . "^-+ Start of forwarded message -+\n+")
-     (body-end . "^-+ End of forwarded message -+$")
+     (article-begin . "^-+ \\(Start of \\)?forwarded message -+\n+")
+     (body-end . "^-+ End \\(of \\)?forwarded message -+$")
      (prepare-body-function . nndoc-unquote-dashes))
     (rfc934
      (article-begin . "^--.*\n+")
index 4eae3b8..3deac05 100644 (file)
 (defun nnmbox-create-mbox ()
   (when (not (file-exists-p nnmbox-mbox-file))
     (let ((nnmail-file-coding-system
-          nnmbox-file-coding-system-for-write))
+          (or nnmbox-file-coding-system-for-write
+              nnmbox-file-coding-system)))
       (nnmail-write-region 1 1 nnmbox-mbox-file t 'nomesg))))
 
 (defun nnmbox-read-mbox ()
index 8875891..d404285 100644 (file)
@@ -80,7 +80,7 @@ Valid encodings are nil, `Q' and `B'.")
 
 (defvar rfc2047-q-encoding-alist
   '(("\\(From\\|Cc\\|To\\|Bcc\||Reply-To\\):" . "-A-Za-z0-9!*+/=_")
-    ("." . "^\000-\007\013\015-\037\200-\377=_?"))
+    ("." . "^\000-\007\011\013\015-\037\200-\377=_?"))
   "Alist of header regexps and valid Q characters.")
 
 ;;;
@@ -112,7 +112,13 @@ Should be called narrowed to the head of the message."
       (while (not (eobp))
        (save-restriction
          (rfc2047-narrow-to-field)
-         (when (rfc2047-encodable-p)
+         (if (not (rfc2047-encodable-p))
+             (if (mm-body-7-or-8)
+                 ;; 8 bit must be decoded.
+                 (if (car message-posting-charset)
+                     ;; Is message-posting-charset a coding system?
+                     (mm-encode-coding-region (point-min) (point-max)
+                                              (car message-posting-charset))))
            ;; We found something that may perhaps be encoded.
            (while (setq elem (pop alist))
              (when (or (and (stringp (car elem))
@@ -128,7 +134,7 @@ Should be called narrowed to the head of the message."
             (t)))
          (goto-char (point-max)))))
     (when mail-parse-charset
-      (encode-coding-region
+      (mm-encode-coding-region
        (point-min) (point-max) mail-parse-charset))))
 
 (defun rfc2047-encodable-p (&optional header)
@@ -158,11 +164,9 @@ Should be called narrowed to the head of the message."
       (while (not (eobp))
        (cond
         ((not state)
-         (if (memq (char-after) blank-list)
-             (setq state 'blank)
-           (setq state 'word)
-           (if (not (eq (setq cs (mm-charset-after)) 'ascii))
-               (setq current cs)))
+         (setq state 'word)
+         (if (not (eq (setq cs (mm-charset-after)) 'ascii))
+             (setq current cs))
          (setq b (point)))
         ((eq state 'blank)
          (cond 
@@ -171,6 +175,8 @@ Should be called narrowed to the head of the message."
           ((memq (char-after) blank-list))
           (t
            (setq state 'word)
+           (unless b
+               (setq b (point)))
            (if (not (eq (setq cs (mm-charset-after)) 'ascii))
                (setq current cs)))))
         ((eq state 'word)
@@ -181,9 +187,11 @@ Should be called narrowed to the head of the message."
            (setq current nil))
           ((memq (char-after) blank-list)
            (setq state 'blank)
-           (push (list b (point) current) words)
-           (setq current nil)
-           (setq b (point)))
+           (if (not current)
+               (setq b nil)
+             (push (list b (point) current) words)
+             (setq b (point))
+             (setq current nil)))
           ((or (eq (setq cs (mm-charset-after)) 'ascii)
                (if current
                    (eq current cs)
@@ -207,7 +215,10 @@ Should be called narrowed to the head of the message."
       (if (equal (nth 2 word) current)
          (setq beg (nth 0 word))
        (when current
-         (rfc2047-encode beg end current))
+         (when (prog1 (and (eq beg (nth 1 word)) (nth 2 word))
+                 (rfc2047-encode beg end current))
+           (goto-char beg)
+           (insert " ")))
        (setq current (nth 2 word)
              beg (nth 0 word)
              end (nth 1 word))))
index 78b518c..bc33f3a 100644 (file)
@@ -23,6 +23,9 @@
 
 ;;; Commentary:
 
+;; Note: Now mail.yahoo.com provides POP3 service, the webmail
+;; fetching is not going to be supported.
+
 ;; Note: You need to have `url' and `w3' installed for this backend to
 ;; work. `w3' must be 4.0pre46+one-line-cookie patch or standalone
 ;; `url'.
       "%s&login=%s&f=33792&curmbox=ACTIVE&_lang=&foo=inbox&js=&page=&%s=on&_HMaction=MoveTo&tobox=trAsH&nullbox=" 
       webmail-aux user id))
     (yahoo
-     (paranoid cookie post)
+     (paranoid agent cookie post)
      (address . "mail.yahoo.com")
      (open-url "http://mail.yahoo.com/")
      (open-snarf . webmail-yahoo-open)
      (login-url;; yahoo will not accept GET
       content 
       ("%s" webmail-aux)
-      ".tries=1&.src=ym&.last=&promo=&lg=us&.intl=us&.bypass=&.chkP=Y&.done=http%%253a%%2F%%2Fedit.yahoo.com%%2Fconfig%%2Fmail%%253f.intl%%3D&login=%s&passwd=%s" 
+      ".tries=&.src=ym&.last=&promo=&.intl=&.bypass=&.partner=&.chkP=Y&.done=&login=%s&passwd=%s"
       user password)
      (login-snarf . webmail-yahoo-login)
      (list-url "%s&rb=Inbox&YN=1" webmail-aux)
      (list-snarf . webmail-yahoo-list)
      (article-snarf . webmail-yahoo-article)
      (trash-url 
-      "%s/ym/us/ShowFolder?YY=52107&inc=50&order=down&sort=date&pos=0&box=Inbox&DEL=Delete&destBox=&Mid=%s&destBox2="
+      "%s/ym/ShowFolder?YY=52107&inc=50&order=down&sort=date&pos=0&box=Inbox&DEL=Delete&destBox=&Mid=%s&destBox2="
       webmail-aux id))
     (netaddress
      (paranoid cookie post)
 
 (defun webmail-yahoo-login ()
   (goto-char (point-min))
-  (if (re-search-forward "http://[a-zA-Z][0-9]\\.mail\\.yahoo\\.com/" nil t)
+  (if (re-search-forward "http://[^/]+[0-9]\\.mail\\.yahoo\\.com/" nil t)
       (setq webmail-aux (match-string 0))
     (webmail-error "login@1"))
   (if (re-search-forward "YY=[0-9]+" nil t)
-      (setq webmail-aux (concat webmail-aux "ym/us/ShowFolder?"
+      (setq webmail-aux (concat webmail-aux "ym/ShowFolder?"
                                (match-string 0)))
     (webmail-error "login@2")))
 
       (webmail-error "list@1"))
     (goto-char (point-min))
     (while (re-search-forward 
-           "bgcolor=\"#eeeeee\"\\|href=\"\\(/ym/us/ShowLetter\\?MsgId=\\([^&]+\\)&[^\"]*\\)\""
+           "bgcolor=\"#eeeeee\"\\|href=\"\\(/ym/ShowLetter\\?MsgId=\\([^&]+\\)&[^\"]*\\)\""
            nil t)
       (if (setq url (match-string 1))
          (progn
index cd81980..1c05270 100644 (file)
@@ -1,3 +1,18 @@
+2000-04-27  Dave Love  <fx@gnu.org>
+
+       * gnus.texi (Article Washing): Update x-face bit.
+
+2000-04-26  Florian Weimer  <fw@deneb.cygnus.argh.org>
+
+       * message.texi (Various Message Variables): Document
+       message-default-charset.
+
+       * emacs-mime.texi (Charset Translation): New section.
+
+2000-04-26 02:30:06  Shenghuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.texi (Posting Styles): Addition. 
+
 2000-04-24 17:09:17  Felix Natter  <f.natter@ndh.net>
 
        * gnusref.tex: New version.
index 5e63940..9f9633e 100644 (file)
@@ -96,10 +96,10 @@ makeinfo:
        makeinfo -o message message.texi
 
 texi2latex.elc: texi2latex.el
-       $(EMACS) -batch -l bytecomp --eval '(byte-compile-file "texi2latex.el")'
+       $(EMACSINFO) -batch -l bytecomp --eval '(byte-compile-file "texi2latex.el")'
 
 latex: gnus.texi texi2latex.elc
-       $(EMACS) -batch -q -no-site-file gnus.texi -l ./texi2latex.elc -f latexi-translate
+       $(EMACSINFO) -batch -q -no-site-file gnus.texi -l ./texi2latex.elc -f latexi-translate
 
 latexps:
        $(MAKE) texi2latex.elc
index 82afa01..efda9aa 100644 (file)
@@ -960,6 +960,7 @@ string containing the @sc{mime} message.
 * Simple MML Example::             An example MML document.
 * MML Definition::                 All valid MML elements.
 * Advanced MML Example::           Another example MML document.
+* Charset Translation::            How charsets are mapped from @sc{mule} to MIME.
 * Conversion::                     Going from @sc{mime} to MML and vice versa.
 @end menu
 
@@ -1181,6 +1182,43 @@ This plain text part is an attachment.
 --=-=-=--
 @end example
 
+@node Charset Translation
+@section Charset Translation
+@cindex charsets
+
+During translation from MML to @sc{mime}, for each @sc{mime} part which
+has been composed inside Emacs, an appropriate charset has to be chosen.
+
+@vindex mail-parse-charset
+If you are running a non-@sc{mule} Emacs, this process is simple: If the
+part contains any non-ASCII (8-bit) characters, the @sc{mime} charset
+given by @code{mail-parse-charset} (a symbol) is used.  (Never set this
+variable directly, though.  If you want to change the default charset,
+please consult the documentation of the package which you use to process
+@sc{mime} messages.
+@xref{Various Message Variables, , Various Message Variables, message, 
+      Message Manual}, for example.)
+If there are only ASCII characters, the @sc{mime} charset US-ASCII is
+used, of course.
+
+@cindex MULE
+@cindex UTF-8
+@cindex Unicode
+@vindex mm-mime-mule-charset-alist
+Things are slightly more complicated when running Emacs with @sc{mule}
+support.  In this case, a list of the @sc{mule} charsets used in the
+part is obtained, and the @sc{mule} charsets are translated to @sc{mime}
+charsets by consulting the variable @code{mm-mime-mule-charset-alist}.
+If this results in a single @sc{mime} charset, this is used to encode
+the part.  But if the resulting list of @sc{mime} charsets contains more
+than one element, two things can happen: If it is possible to encode the
+part via UTF-8, this charset is used.  (For this, Emacs must support
+the @code{utf-8} coding system, and the part must consist entirely of
+characters which have Unicode counterparts.)  If UTF-8 is not available
+for some reason, the part is split into several ones, so that each one
+can be encoded with a single @sc{mime} charset.  The part can only be
+split at line boundaries, though---if more than one @sc{mime} charset is
+required to encode a single line, it is not possible to encode the part.
 
 @node Conversion
 @section Conversion
index f0d5ff5..9f87afb 100644 (file)
@@ -7264,14 +7264,18 @@ DOS \e$(B$N9TKv$N@$OC$r$7$^$9\e(B)\e$(B!"$=$7$F$=$l$+$i;D$j$N\e(B CR \e$(B$r\e(B LF \e$
 \e$(B$3$NL?Na$OJQ?t\e(B @code{gnus-article-x-face-command} \e$(B$K$h$C$FM?$($i$l$?4X?t$K\e(B
 \e$(B$h$C$F<B9T$5$l$^$9!#$3$NJQ?t$,J8;zNs$J$i$P!"$3$NJ8;zNs$,%5%V%7%'%k$G<B9T$5\e(B
 \e$(B$l$^$9!#4X?t$J$i$P!"$3$N4X?t$,4i$r0z?t$H$7$F8F$P$l$^$9!#$b$7\e(B
-@code{gnus-article-x-face-too-ugly}\e$(B!J$3$l$O@55,I=8=$G$9!K$,\e(B @code{From} \e$(BMs\e(B
-\e$(B$K9gCW$9$l$P!"4i$OI=<($5$l$^$;$s!#\e(BEmacs \e$(B$G$N%G%#%U%)%k%H$NF0:n$O\e(B
-@code{xv} \e$(B$r%U%)!<%/$7$F8+$h$&$H$7$^$9!#\e(BXEmacs \e$(B$G$N%G%#%U%)%k%H$NF0:n$O\e(B
-@code{From} \e$(BMs$NA0$K4i$rI=<($7$^$9!#!J\e(BXEmacs \e$(B$,\e(B X-Face \e$(B5!G=IU$-$G%3%s%Q%$\e(B
-\e$(B%k$5$l$F$$$k$HNI$$$G$7$g$&!=!=$=$l$OI=<($r>/$7Aa$/$7$^$9!#$b$7:,K\E*\e(B
-X-Face \e$(B5!G=$,$J$$$N$G$"$l$P!"\e(Bgnus \e$(B$O\e(B @code{pbmplus} \e$(B$d$=$NCg4V$N30It%W%m%0\e(B
-\e$(B%i%`$r;H$C$F\e(B @code{X-Face} \e$(BMs$rJQ49$7$h$&$H;n$_$^$9!#!K$3$N4X?t$rI=<(%U%C\e(B
-\e$(B%/$KF~$l$?$$$N$G$"$l$P!"$*$=$i$/$=$l$":G8e$K$J$k$Y$-$G$7$g$&!#\e(B
+ @code{gnus-article-x-face-too-ugly}\e$(B!J$3$l$O@55,I=8=$G$9!K$,\e(B @code{From}
\e$(BMs$K9gCW$9$l$P!"4i$OI=<($5$l$^$;$s!#\e(BEmacs \e$(B$G$N%G%#%U%)%k%H$NF0:n$O\e(B
+ @code{display} \e$(B%W%m%0%i%`\e(B @footnote{@code{display} \e$(B$O\e(B ImageMagick \e$(B%Q%C\e(B
+\e$(B%1!<%8$K4^$^$l$F$$$^$9!#\e(B@code{uncompface} \e$(B$H\e(B @code{icontopbm} \e$(B$NN>%W%m%0\e(B
+\e$(B%i%`$K$D$$$F$O!"\e(B`compface' \e$(B$d\e(B GNU/Linux \e$(B%7%9%F%`$K$*$1$k\e(B `faces-xface'
\e$(B$N$h$&$J%Q%C%1!<%8$rC5$7$F2<$5$$!#\e(B} \e$(B$r%U%)!<%/$7$F8+$h$&$H$7$^$9!#\e(B
+XEmacs \e$(B$G$N%G%#%U%)%k%H$NF0:n$O\e(B @code{From} \e$(BMs$NA0$K4i$rI=<($7$^$9!#\e(B
+\e$(B!J\e(BXEmacs \e$(B$,\e(B X-Face \e$(B5!G=IU$-$G%3%s%Q%$%k$5$l$F$$$k$HNI$$$G$7$g$&!=!=$=$l\e(B
+\e$(B$OI=<($r>/$7Aa$/$7$^$9!#$b$7:,K\E*\e(B X-Face \e$(B5!G=$,$J$$$N$G$"$l$P!"\e(Bgnus \e$(B$O\e(B
+ @code{pbmplus} \e$(B$d$=$NCg4V$N30It%W%m%0%i%`$r;H$C$F\e(B @code{X-Face} \e$(BMs$rJQ\e(B
+\e$(B49$7$h$&$H;n$_$^$9!#!K$3$N4X?t$rI=<(%U%C%/$KF~$l$?$$$N$G$"$l$P!"$*$=$i$/\e(B
+\e$(B$=$l$O:G8e$K$J$k$Y$-$G$7$g$&!#\e(B
 
 @item W b
 @kindex W b \e$(B!J35N,!K\e(B
@@ -9322,8 +9326,9 @@ Gnus \e$(B$O30$X=P$F9T$/A4$F$N%a%C%;!<%8$K!"0l$D$+$=$l0J>e$N$=$N%5!<%P!<$N%0%k!<\e
 \e$(B$O!"\e(B@code{signature}, @code{signature-file}, @code{organization},
 @code{address}, @code{name}, @code{body} \e$(B$N$I$l$+$G$"$k;v$,$G$-$^$9!#B0\e(B
 \e$(B@-L>$OJ8;zNs$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"$3$l$O%X%C%@!<L>$H$7$F;H$o$l!"\e(B
-\e$(B$=$NCM$,5-;v$N%X%C%@!<$KA^F~$5$l$^$9!#$b$7B0@-L>$,\e(B @code{eval} \e$(B$@$C$?$i\e(B
-\e$(B$=$NMM<0$,I>2A$5$l!"7k2L$O<N$F$i$l$^$9!#\e(B
+\e$(B$=$NCM$,5-;v$N%X%C%@!<$KA^F~$5$l$^$9!#$b$7B0@-L>$,\e(B @code{nil} \e$(B$@$C$?$i$=\e(B
+\e$(B$N%X%C%@!<L>$O:o=|$5$l$^$9!#$b$7B0@-L>$,\e(B @code{eval} \e$(B$@$C$?$i$=$NMM<0$,\e(B
+\e$(BI>2A$5$l!"7k2L$O<N$F$i$l$^$9!#\e(B
 
 \e$(BB0@-CM$OJ8;zNs\e(B (\e$(B$=$N$^$^;H$o$l$^$9\e(B)\e$(B!"0z?t$NL5$$4X?t\e(B (\e$(BJV$jCM$,;H$o$l$^$9\e(B)\e$(B!"\e(B
 \e$(BJQ?t\e(B (\e$(B$=$NCM$,;H$o$l$^$9\e(B) \e$(B$^$?$O%j%9%H\e(B (\e$(B$=$l$O\e(B @code{\e$(BI>2A\e(B} \e$(B$5$l$F!"JV$j\e(B
@@ -10759,12 +10764,14 @@ IMAP \e$(B%a!<%k%=!<%9$NNc\e(B:
 @end lisp
 
 @item webmail
-www.hotmail.com, mail.yahoo.com, www.netaddress.com, www.my-deja.com
-\e$(B$J$I$N%&%'%V%a!<%k%5!<%P!<$+$i%a!<%k$r<hF@$7$^$9!#\e(B
+www.hotmail.com, webmail.netscape.com, www.netaddress.com,
+www.my-deja.com \e$(B$J$I$N%&%'%V%a!<%k%5!<%P!<$+$i%a!<%k$r<hF@$7$^$9!#\e(B
 
-\e$(BCm\e(B: \e$(B%&%'%V%a!<%k$O\e(B w3 (url) \e$(B%Q%C%1!<%8$N%P!<%8%g%s\e(B "WWW 4.0pre.46
-1999/10/01" \e$(B$KBg$-$/0MB8$7$^$9!#$=$l0JA0$N$b$N$O$*$=$i$/F0:n$7$J$$$G$7$g\e(B
-\e$(B$&!#\e(B
+\e$(BCm\e(B: \e$(B8=:_\e(B mail.yahoo.com \e$(B$O\e(B POP3 \e$(B%5!<%S%9$rDs6!$7$F$$$^$9$N$G!"\e(B@sc{pop}
+\e$(B%a!<%k%=!<%9$r;H$&$N$,NI$$$N$G$O$J$$$G$7$g$&$+!#\e(B
+
+\e$(BCm\e(B: \e$(B%&%'%V%a!<%k$O%/%C%-!<$KBg$-$/0MB8$7$^$9!#\e(Burl "4.0pre.46" \e$(B$r;H$&>l9g\e(B
+\e$(B$O\e(B "one-line-cookie" \e$(B%Q%C%A$rEv$F$kI,MW$,$"$j$^$9!#\e(B
 
 \e$(B7Y9p\e(B: \e$(B%a!<%k$,<:$o$l$k$+$b$7$l$^$;$s!#L5J]>Z$G$9!#\e(B
 
@@ -10773,7 +10780,7 @@ www.hotmail.com, mail.yahoo.com, www.netaddress.com, www.my-deja.com
 @table @code
 @item :subtype
 \e$(B%&%'%V%a!<%k%5!<%P!<$N7?$G$9!#=i4|CM$O\e(B @code{hotmail} \e$(B$G$9!#B>$N8uJd$O\e(B
-@code{yahoo}, @code{netaddress}, @code{my-deja} \e$(B$G$9!#\e(B
+@code{netscape}, @code{netaddress}, @code{my-deja} \e$(B$G$9!#\e(B
 
 @item :user
 \e$(B%&%'%V%a!<%k%5!<%P!<$NMxMQ<TL>$G$9!#=i4|CM$O%m%0%$%sL>$G$9!#\e(B
@@ -10791,7 +10798,7 @@ www.hotmail.com, mail.yahoo.com, www.netaddress.com, www.my-deja.com
 \e$(B%&%'%V%a!<%k$N%=!<%9$NNc$G$9\e(B:
 
 @lisp
-(webmail :subtype 'yahoo :user "user-name" :password "secret")
+(webmail :subtype 'hotmail :user "user-name" :password "secret")
 @end lisp
 @end table
 
index 6b1643b..d95afbd 100644 (file)
@@ -7339,12 +7339,18 @@ If this variable is a string, this string will be executed in a
 sub-shell.  If it is a function, this function will be called with the
 face as the argument.  If the @code{gnus-article-x-face-too-ugly} (which
 is a regexp) matches the @code{From} header, the face will not be shown.
-The default action under Emacs is to fork off an @code{xv} to view the
-face; under XEmacs the default action is to display the face before the
+The default action under Emacs is to fork off the @code{display}
+program@footnote{@code{display} is from the ImageMagick package.  For the
+@code{uncompface} and @code{icontopbm} programs look for a package
+like `compface' or `faces-xface' on a GNU/Linux system.}
+to view the face.  Under XEmacs or Emacs 21+ with suitable image
+support, the default action is to display the face before the
 @code{From} header.  (It's nicer if XEmacs has been compiled with X-Face
 support---that will make display somewhat faster.  If there's no native
 X-Face support, Gnus will try to convert the @code{X-Face} header using
-external programs from the @code{pbmplus} package and friends.)  If you
+external programs from the @code{pbmplus} package and
+friends.@footnote{On a GNU/Linux system look for packages with names
+like @code{netpbm} or @code{libgr-progs}.})  If you
 want to have this function in the display hook, it should probably come
 last.
 
@@ -9683,8 +9689,9 @@ attribute name can be one of @code{signature}, @code{signature-file},
 @code{organization}, @code{address}, @code{name} or @code{body}.  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.  If the attribute name is @code{eval}, the form is evaluated,
-and the result is thrown away.
+article; if the value is @code{nil}, the header name will be removed.
+If the attribute name is @code{eval}, the form is evaluated, and the
+result is thrown away.
 
 The attribute value can be a string (used verbatim), a function with
 zero arguments (the return value will be used), a variable (its value
@@ -11176,11 +11183,14 @@ An example @sc{imap} mail source:
 @end lisp
 
 @item webmail
-Get mail from a webmail server, such as www.hotmail.com, 
-mail.yahoo.com, www.netaddress.com and www.my-deja.com. 
+Get mail from a webmail server, such as www.hotmail.com,
+webmail.netscape.com, www.netaddress.com, www.my-deja.com.
 
-NOTE: Webmail largely depends on w3 (url) package, whose version of "WWW
-4.0pre.46 1999/10/01" or previous ones may not work.
+NOTE: Now mail.yahoo.com provides POP3 service, so @sc{pop} mail source
+is suggested.
+
+NOTE: Webmail largely depends cookies. A "one-line-cookie" patch is
+required for url "4.0pre.46".
 
 WARNING: Mails may lost.  NO WARRANTY.
 
@@ -11189,7 +11199,7 @@ Keywords:
 @table @code
 @item :subtype
 The type of the webmail server.  The default is @code{hotmail}.  The
-alternatives are @code{yahoo}, @code{netaddress}, @code{my-deja}.
+alternatives are @code{netscape}, @code{netaddress}, @code{my-deja}.
 
 @item :user
 The user name to give to the webmail server.  The default is the login
@@ -11208,7 +11218,7 @@ folder after finishing the fetch.
 An example webmail source:
 
 @lisp
-(webmail :subtype 'yahoo :user "user-name" :password "secret")
+(webmail :subtype 'hotmail :user "user-name" :password "secret")
 @end lisp
 @end table
 
index 0ee9168..da186fe 100644 (file)
@@ -1,4 +1,10 @@
 % include file for the Gnus refcard and booklet
+\def\progver{5.0}\def\refver{5.0} % program and refcard versions
+\def\date{16 September 1995}
+\def\author{Vladimir Alexiev $<$vladimir@cs.ualberta.ca$>$}
+\raggedbottom\raggedright
+\newlength{\logowidth}\setlength{\logowidth}{6.861in}
+\newlength{\logoheight}\setlength{\logoheight}{7.013in}
 \newlength{\keycolwidth}
 \newenvironment{keys}[1]% #1 is the widest key
   {\nopagebreak%\noindent%
    \addtolength{\keycolwidth}{-\columnwidth}%
    \begin{tabular}{@{}l@{\hspace{\tabcolsep}}p{-\keycolwidth}@{}}}%
   {\end{tabular}\\}
+\catcode`\^=12 % allow ^ to be typed literally
+\newcommand{\B}[1]{{\bf#1})}    % bold l)etter
 
-% uncomment the first definition if you do not want pagebreaks in maps
-%\newcommand{\esamepage}{\samepage}
-\newcommand{\esamepage}{}
-
-\newcommand*{\B}[1]{{\bf#1})}    % bold l)etter
-
-\newcommand{\Title}{%
+\def\Title{
 \begin{center}
 {\bf\LARGE Gnus \progver\ Reference \Guide\\}
 %{\normalsize \Guide\ version \refver}
 \end{center}
 }
 
-\newcommand*{\Logo}[1]{\centerline{%
+\newcommand\Logo[1]{\centerline{
 \makebox[\logoscale\logowidth][l]{\vbox to \logoscale\logoheight
 {\vfill\special{psfile=gnuslogo.#1}}\vspace{-\baselineskip}}}}
 
-\newcommand{\Copyright}{%
+\def\CopyRight{
 \begin{center}
 Copyright \copyright\ 1995 Free Software Foundation, Inc.\\*
 Copyright \copyright\ 1995 \author.\\*
-Copyright \copyright\ 2000 Felix Natter $<$fnatter@gmx.net$>$.\\*
 Created from the Gnus manual Copyright \copyright\ 1994 Lars Magne
 Ingebrigtsen.\\*
 and the Emacs Help Bindings feature (C-h b).\\*
@@ -39,12 +40,12 @@ Gnus logo copyright \copyright\ 1995 Luis Fernandes.\\*
 Permission is granted to make and distribute copies of this reference
 \guide{} provided the copyright notice and this permission are preserved on
 all copies.  Please send corrections, additions and suggestions to the
-current maintainer's email address. \Guide{} last edited on \date.
+above email address. \Guide{} last edited on \date.
 }
 
-\newcommand{\Notes}{%
-\subsection*{Notes}
-{\esamepage
+\def\Notes{
+\subsec{Notes}
+{\samepage
 Gnus is complex. Currently it has some 346 interactive (user-callable)
 functions. Of these 279 are in the two major modes (Group and
 Summary/Article). Many of these functions have more than one binding, some
@@ -75,40 +76,44 @@ equal level will be affected by the operation. If no prefix is given,
 commands will also set the default level.
 
 \quad [score] An article score. If no prefix is given,
-`gnus-summary-default-score' is used. \\*[\baselineskip]
-% some keys
+`gnus-summary-default-score' is used.
+%Some functions were not yet documented at the time of creating this
+%\guide and are clearly indicated as such.
+\\*[\baselineskip]
 \begin{keys}{C-c C-i}
-M-x gnus           & start Gnus. \\
-M-x gnus-no-server & start Gnus without trying to contact server. \\
 C-c C-i & Go to the Gnus online {\bf info}.\\
 C-c C-b & Send a Gnus {\bf bug} report.\\
 \end{keys}
 }}
 
-\newcommand{\GroupLevels}{%
+\def\GroupLevels{
+\subsec{Group Subscribedness Levels}
 The table below assumes that you use the default Gnus levels.
 Fill your user-specific levels in the blank cells.\\[1\baselineskip]
+
 \begin{tabular}{|c|l|l|}
 \hline
 Level & Groups & Status \\
 \hline
-1 & draft/mail groups   &              \\
-2 & mail groups         &              \\
-3 &                     & subscribed   \\
-4 &                     &              \\
-5 & default list level  &              \\
+1 & mail groups   &              \\
+2 & mail groups   &              \\
+3 &               & subscribed   \\
+4 &               &              \\
+5 & default list level &         \\
 \hline
-6 &                     & unsubscribed \\
-7 &                     &              \\
+6 &               & unsubscribed \\
+7 &               &              \\
 \hline
-8 &                     & zombies      \\
+8 &               & zombies      \\
 \hline
-9 &                     & killed       \\
+9 &               & killed       \\
 \hline
-\end{tabular}}
+\end{tabular}
+}
 
-\newcommand{\MarkCharacters}{%
-{\esamepage If a command directly sets a mark, it is shown in parentheses.\\*
+\def\Marks{
+\subsec{Mark Indication Characters}
+{\samepage If a command directly sets a mark, it is shown in parentheses.\\*
 \newlength{\markcolwidth}
 \settowidth{\markcolwidth}{` '}% widest character
 \addtolength{\markcolwidth}{4\tabcolsep}
@@ -125,8 +130,8 @@ Level & Groups & Status \\
 ` ' & (M-u, M SPC, M c) Not read.\\
 !   & (!, M !, M t) Ticked (interesting).\\
 ?   & (?, M ?) Dormant (only followups are interesting).\\
+C   & (C, S c) {\bf Canceled} (only for your own articles).\\
 E   & (E, M e, M x) {\bf Expirable}. Only has effect in mail groups.\\
-G   & (C, B DEL) Canceled article (or deleted in mailgroups).\\
 \hline\hline
 \multicolumn{2}{|p{\markdblcolwidth}|}{The marks below mean that the article
   is read (killed, uninteresting), and have more or less the same effect.
@@ -135,61 +140,49 @@ G   & (C, B DEL) Canceled article (or deleted in mailgroups).\\
 \hline
 r   & (d, M d, M r) Deleted (marked as {\bf read}).\\
 C   & (M C; M C-c; M H; c, Z c; Z n; Z C) Killed by {\bf catch-up}.\\
-F   & SOUPed article. See the manual.\\
-O   & {\bf Old} (read in a previous session).\\
+O   & {\bf Old} (marked read in a previous session).\\
 K   & (k, M k; C-k, M K) {\bf Killed}.\\
-M   & Article marked as read by duplicate suppression.\\
-Q   & Article is part of a sparse thread (see ``Threading'' in the manual).\\
 R   & {\bf Read} (viewed in actuality).\\
 X   & Killed by a kill file.\\
 Y   & Killed due to low score.\\
 \hline\multicolumn{2}{c}{\vspace{1ex}}\\\hline
-\multicolumn{2}{|p{\markdblcolwidth}|}{{\bf Marks not affecting visibility}}\\
+\multicolumn{2}{|p{\markdblcolwidth}|}{{\bf Other marks}}\\
 \hline
-\#  & (\#, M \#, M P p) Processable (will be affected by the next operation).
-[2]\\
-A   & {\bf Answered} (followed-up or replied). [2]\\
-*   & Cached. [2]\\
-S   & Saved. [2]\\
-+   & Over default score. [3]\\
-$-$ & Under default score. [3]\\
-$=$ & Has children (thread underneath it). Add `\%e' to
-`gnus-summary-line-format'. [3]\\
+\#  & (\#, M \#, M P p) Processable (will be affected by the next operation).\\
+A   & {\bf Answered} (followed-up or replied).\\
++   & Over default score.\\
+$-$ & Under default score.\\
+=   & Has children (thread underneath it). Add `\%e' to
+      `gnus-summary-line-format'.\\
 \hline
 \end{tabular}
 }}
 
-\newcommand{\GroupModeGeneral}{%
+\def\GroupMode{
+\sec{Group Mode}
 \begin{keys}{C-c M-C-x}
-RET     & (=) Enter this group. [Prefix: how many (read) articles to fetch.
-Positive: newest articles, negative: oldest ones; non-numerical: fetch all articles, not just unread]\\
-M-RET   & Enter group quickly.\\
-M-SPC   & Same as RET but does not expunge and hide dormants.\\
-M-C-RET & Enter group without any processing, changes will not be permanent.\\
-SPC     & Select this group and display the first (unread) article. [Same
-prefix as above.]\\
+RET     & (=) Select this group. [Prefix: how many (read) articles to fetch.
+Positive: newest articles, negative: oldest ones.]\\
+SPC     & Select this group and display the first unread article. [Same
+prefix as above.]\\ 
 ?       & Give a very short help message.\\
 $<$     & Go to the beginning of the Group buffer.\\
 $>$     & Go to the end of the Group buffer.\\
 ,       & Jump to the lowest-level group with unread articles.\\
 .       & Jump to the first group with unread articles.\\
-xx & Enter the Server buffer mode.\\
+^       & Enter the Server buffer mode.\\
 a       & Post an {\bf article} to a group.\\
 b       & Find {\bf bogus} groups and delete them.\\
 c       & Mark all unticked articles in this group as read ({\bf catch-up}).
 [p/p]\\ 
 g       & Check the server for new articles ({\bf get}). [level]\\
-M-g     & Check the server for new articles in this group ({\bf get}). [p/p]\\
 j       & {\bf Jump} to a group.\\
 m       & {\bf Mail} a message to someone.\\
 n       & Go to the {\bf next} group with unread articles. [distance]\\
-M-n     & Go to the {\bf next} group on the same or lower level.
-[distance]\\ 
 p       & (DEL) Go to the {\bf previous} group with unread articles.
 [distance]\\ 
-M-p     & Go to the {\bf previous} group on the same or lower level. [distance]\\ 
 q       & {\bf Quit} Gnus.\\
-r       & Re-read the init file ({\bf reset}).\\
+r       & Read the init file ({\bf reset}).\\
 s       & {\bf Save} the `.newsrc.eld' file (and `.newsrc' if
 `gnus-save-newsrc-file').\\ 
 z       & Suspend (kill all buffers of) Gnus.\\
@@ -200,140 +193,89 @@ N       & Go to the {\bf next} group. [distance]\\
 P       & Go to the {\bf previous} group. [distance]\\
 Q       & {\bf Quit} Gnus without saving any startup (.newsrc) files.\\
 R       & {\bf Restart} Gnus.\\
+V       & Display the Gnus {\bf version} number.\\
 Z       & Clear the dribble buffer.\\
-M-c     & Clear data from group (marks and list of read articles). \\
+C-c C-d & Show the {\bf description} of this group. [Prefix: re-read it
+from the server.]\\ 
 C-c C-s & {\bf Sort} the groups by name, number of unread articles, or level
 (depending on `gnus-group-sort-function').\\
 C-c C-x & Run all expirable articles in this group through the {\bf expiry} 
 process.\\
 C-c M-C-x & Run all articles in all groups through the {\bf expiry} process.\\
-C-c M-g & Activate all {\bf groups}.\\
-C-c C-i & Gnus online-manual ({\bf info}).\\
 C-x C-t & {\bf Transpose} two groups.\\
-H f     & Fetch this group's {\bf FAQ} (using ange-ftp).\\
-H v     & (V) Display the Gnus {\bf version} number.\\
-H d     & (C-c C-d) Show the {\bf description} of this group
-[Prefix: re-read from server].\\ 
-M-d     & {\bf Describe} all groups. [Prefix: re-read from server]\\
+M-d     & {\bf Describe} ALL groups. [Prefix: re-read the description from the
+server.]\\
+M-f     & Fetch this group's {\bf FAQ} (using ange-ftp).\\
+M-g     & Check the server for new articles in this group ({\bf get}). [p/p]\\
+M-n     & Go to the {\bf previous} unread group on the same or lower level.
+[distance]\\ 
+M-p     & Go to the {\bf next} unread group on the same or lower level.
+[distance]\\ 
 \end{keys}
 }
 
-\newcommand{\ListGroups}{%
-{\esamepage
-\begin{keys}{A M}
+\def\GroupCommands{
+\subsec{List Groups}
+{\samepage
+\begin{keys}{A m}
+A a     & (C-c C-a) List all groups whose names match a regexp ({\bf
+apropos}).\\ 
 A d     & List all groups whose names or {\bf descriptions} match a regexp.\\ 
-A k     & (C-c C-l) List all {\bf killed} groups.
-[Prefix: look at active-file from server]\\
-A l     & List all groups on a specific level.
-[Prefix: also list groups with no unread articles]\\
-A d     & List all groups that have names or {\bf descriptions} matching
-a regexp.\\
-A a     & (C-c C-a) List all groups whose names match a regexp
-({\bf apropos}).\\ 
-A A     & List the server's active-file.\\
-A M     & List groups that {\bf match} a regexp.\\
-A m     & List groups that {\bf match} a regexp and have unread articles. 
+A k     & (C-c C-l) List all {\bf killed} groups.\\
+A m     & List groups that {\bf match} a regexp and have unread articles.
 [level]\\ 
-A s     & (l) List all {\bf subscribed} groups with unread articles.
-[level, 5 and lower is the default]\\
-A u     & (L) List all groups (including read and {\bf unsubscribed}).
-[level, 7 and lower is the default]\\
-A z     & List all {\bf zombie} groups.\\
+A s     & (l) List {\bf subscribed} groups with unread articles. [level]\\
+A u     & (L) List all groups (including {\bf unsubscribed}). [If no prefix
+is given, level 7 is the default]\\ 
+A z     & List the {\bf zombie} groups.\\
+A M     & List groups that {\bf match} a regexp.\\
 \end{keys}
 }
 
-\newcommand{\CreateEditGroups}{%
-{\esamepage
+\subsec{Create/Edit Foreign Groups}
+{\samepage
 The select methods are indicated in parentheses.\\*
-\begin{keys}{G DEL}
+\begin{keys}{G m}
 G a     & Make the Gnus list {\bf archive} group. (nndir over ange-ftp)\\
-G c     & {\bf Customize} this group's parameters.\\
 G d     & Make a {\bf directory} group (every file must be a posting and files
 must have numeric names). (nndir)\\
-G D     & Enter a {\bf directory} as a (temporary) group.
-(nneething without recording articles read)\\
 G e     & (M-e) {\bf Edit} this group's select method.\\
-G E     & {\bf Edit} this group's info (select method, articles read, etc).\\
 G f     & Make a group based on a {\bf file}. (nndoc)\\
 G h     & Make the Gnus {\bf help} (documentation) group. (nndoc)\\
 G k     & Make a {\bf kiboze} group. (nnkiboze)\\
 G m     & {\bf Make} a new group.\\
 G p     & Edit this group's {\bf parameters}.\\
-G r     & Rename this group (does not work with read-only groups!).\\
-G u     & Create one of the groups mentioned in gnus-{\bf useful}-groups.\\
 G v     & Add this group to a {\bf virtual} group. [p/p]\\
+G D     & Enter a {\bf directory} as a (temporary) group. (nneething without
+recording articles read.)\\
+G E     & {\bf Edit} this group's info (select method, articles read, etc).\\
 G V     & Make a new empty {\bf virtual} group. (nnvirtual)\\
-G w     & Create ephemeral group based on web-search. [Prefix: make solid group
-instead]\\
-G DEL   & {\bf Delete} group [Prefix: delete all articles as well].\\
 \end{keys}
 You can also create mail-groups and read your mail with Gnus (very useful
-if you are subscribed to mailing lists), using one of the methods
+if you are subscribed to any mailing lists), using one of the methods
 nnmbox, nnbabyl, nnml, nnmh, or nnfolder. Read about it in the online info
 (C-c C-i g Reading Mail RET).
-}}
+}
 
-% TODO:
-\newcommand{\SoupCommands}{%
-\begin{keys}{G s w}
-G s b   & gnus-group-brew-soup: not documented.\\
-G s p   & gnus-soup-pack-packet: not documented.\\
-G s r   & nnsoup-pack-replies: not documented.\\
-G s s   & gnus-soup-send-replies: not documented.\\
-G s w   & gnus-soup-save-areas: not documented.\\
-\end{keys}}
-
-\newcommand{\MarkGroups}{%
+%\subsubsec{Soup Commands}
+%\begin{keys}{G s w}
+%G s b   & gnus-group-brew-soup: not documented.\\
+%G s p   & gnus-soup-pack-packet: not documented.\\
+%G s r   & nnsoup-pack-replies: not documented.\\
+%G s s   & gnus-soup-send-replies: not documented.\\
+%G s w   & gnus-soup-save-areas: not documented.\\
+%\end{keys}
+
+\subsec{Mark Groups}
 \begin{keys}{M m}
 M m     & (\#) Set the process {\bf mark} on this group. [scope]\\
-M r     & Mark all groups matching regular expression.\\
 M u     & (M-\#) Remove the process mark from this group ({\bf unmark}).
 [scope]\\ 
-M U     & Remove the process mark from all groups (\textbf{umark all}).\\
 M w     & Mark all groups in the current region.\\
-\end{keys}}
-
-\newcommand{\GroupTopicsGeneral}{%
-{\esamepage
-Topics are ``categories'' for groups. Press t in the group-buffer to
-toggle gnus-topic-mode (C-c C-i g Group Topics RET).
-\begin{keys}{C-c C-x}
-T n     & Prompt for topic {\bf name} and create it.\\
-T m     & {\bf Move} the current group to some other topic [p/p].\\
-T j     & {\bf Jump} to a topic.\\
-T c     & {\bf Copy} the current group to some other topic [p/p].\\
-T D     & Remove (not delete) the current group [p/p].\\
-T M     & {\bf Move} all groups matching a regexp to a topic.\\
-T C     & {\bf Copy} all groups matching a regexp to a topic.\\
-T H     & Toggle {\bf hiding} of empty topics.\\
-T r     & {\bf Rename} a topic.\\
-T DEL   & Delete an empty topic.\\
-T \#    & Mark all groups in the current topic with the process-mark.\\
-T M-\#  & Remove the process-mark from all groups in the current topic.\\
-T TAB   & (TAB) Indent current topic [Prefix: unindent].\\ 
-M-TAB   & Unindent the current topic.\\
-RET     & (SPC) Either unfold topic or enter group [level].\\
-C-c C-x & Expire all articles in current group or topic.\\
-C-k     & {\bf Kill} a group or topic.\\
-C-y     & {\bf Yank} a group or topic.\\
-A T     & List active-file using {\bf topics}.\\
-G p     & Edit topic-{\bf parameters}.\\
-\end{keys}}}
-
-\newcommand{\TopicSorting}{%
-{\esamepage
-\begin{keys}{T S m}
-T S a  & Sort {\bf alphabetically}.\\
-T S u  & Sort by number of {\bf unread} articles.\\
-T S l  & Sort by group {\bf level}.\\
-T S v  & Sort by group score ({\bf value}).\\
-T S r  & Sort by group {\bf rank}.\\
-T S m  & Sort by {\bf method}.\\
-\end{keys}}}
-
-\newcommand{\SubscribeKillYankGroups}{%
-{\esamepage
-\begin{keys}{S C-k}
+\end{keys}
+
+\subsec{Unsubscribe, Kill and Yank Groups}
+\begin{keys}{S w}
 S k     & (C-k) {\bf Kill} this group.\\
 S l     & Set the {\bf level} of this group. [p/p]\\
 S s     & (U) Prompt for a group and toggle its {\bf subscription}.\\
@@ -341,436 +283,236 @@ S t     & (u) {\bf Toggle} subscription to this group. [p/p]\\
 S w     & (C-w) Kill all groups in the region.\\
 S y     & (C-y) {\bf Yank} the last killed group.\\
 S z     & Kill all {\bf zombie} groups.\\
-S C-k   & Kill all groups on a certain level.\\
-\end{keys}}}
+\end{keys}
+}
 
-\newcommand{\SummaryModeGeneral}{%
-{\esamepage
-\begin{keys}{M-RET}
+\def\SummaryMode{
+\sec{Summary Mode}  %{Summary and Article Modes}
+\begin{keys}{SPC}
 SPC     & (A SPC, A n) Select an article, scroll it one page, move to the
 next one.\\ 
 DEL     & (A DEL, A p, b) Scroll this article one page back. [distance]\\
 RET     & Scroll this article one line forward. [distance]\\
-M-RET   & Scroll this article one line backward. [distance]\\
-=       & Expand the Summary window (fullsize).
-[Prefix: shrink to display article window]\\
-%
-\&      & Execute a command on all articles whose header matches a regexp.
-[Prefix: move backwards]\\
+=       & Expand the Summary window. [Prefix: shrink it to display the
+Article window]\\
+$<$     & (A $<$, A b) Scroll to the beginning of this article.\\
+$>$     & (A $>$, A e) Scroll to the end of this article.\\
+\&      & Execute a command on all articles matching a regexp.
+[Prefix: move backwards.]\\
+j       & (G g) Ask for an article number and then {\bf jump} to that summary
+line.\\ 
+C-t     & Toggle {\bf truncation} of summary lines.\\
 M-\&    & Execute a command on all articles having the process mark.\\
-%
+M-k     & Edit this group's {\bf kill} file.\\
 M-n     & (G M-n) Go to the {\bf next} summary line of an unread article.
 [distance]\\ 
 M-p     & (G M-p) Go to the {\bf previous} summary line of an unread article. 
 [distance]\\ 
-M-s     & {\bf Search} through all subsequent articles for a regexp.\\
 M-r     & Search through all previous articles for a regexp.\\
-%
-A P     & {\bf Postscript}-print current buffer.\\
-%
-M-k     & Edit this group's {\bf kill} file.\\
+M-s     & {\bf Search} through all subsequent articles for a regexp.\\
 M-K     & Edit the general {\bf kill} file.\\
-%
-C-t     & Toggle {\bf truncation} of summary lines.\\
-Y g     & Regenerate the summary-buffer.\\
-Y c     & Insert all cached articles into the summary-buffer.\\
-%
-M-C-e   & {\bf Edit} the group-parameters.\\
-M-C-g   & Customize the group-parameters.\\
-%
-% article handling
-%
-A $<$   & ($<$, A b) Scroll to the beginning of this article.\\
-A $>$   & ($>$, A e) Scroll to the end of this article.\\
-A s     & (s) Perform an i{\bf search} in the article buffer.\\
-%
-A D     & (C-d) Un{\bf digestify} this article into a separate group.
-[Prefix: force digest]\\
-M-C-d   & Like C-d, but open several documents in nndoc-groups, wrapped
-in an nnvirtual group [p/p]\\
-%
-A g     & (g) (Re)fetch this article ({\bf get}). [Prefix: get raw version]\\ 
-A r     & (\^{}, A \^{}) Fetch the parent(s) of this article.
-[Prefix: if positive fetch \textit{n} ancestors;
-negative: fetch only the \textit{n}th ancestor]\\
-A t     & {\bf Translate} this article.\\
-A R     & Fetch all articles mentioned in the {\bf References}-header.\\
-A T     & Fetch full \textbf{thread} in which the current article appears.\\
-M-\^{}   & Fetch the article with a given Message-ID.\\
-S y     & {\bf Yank} the current article into an existing message-buffer.
-[p/p]\\
-\end{keys}}}
-
-\newcommand{\MIMESummary}{%
-{\esamepage
-For the commands operating on one MIME part (a subset of gnus-article-*), a
-prefix selects which part to operate on. If the point is placed over a
-MIME button in the article buffer, use the corresponding bindings for the
-article buffer instead.
-\begin{keys}{W M w}
-K v      & (b) {\bf View} the MIME-part.\\
-K o      & {\bf Save} the MIME part.\\
-K c      & {\bf Copy} the MIME part.\\
-K e      & View the MIME part {\bf externally}.\\
-K i      & View the MIME part {\bf internally}.\\
-K $\mid$ & Pipe the MIME part to an external command.\\
-K b      & Make all the MIME parts have buttons in front of them.\\
-K m      & Try to repair {\bf multipart-headers}.\\
-X m      & Save all parts matching a MIME type to a directory. [p/p]\\
-M-t      & Toggle the buttonized display of the article buffer.\\
-W M w    & Decode RFC2047-encoded words in the article headers.\\
-W M c    & Decode encoded article bodies. [Prefix: prompt for charset]\\
-W M v    & View all MIME parts in the current article.\\
-\end{keys}}}
-
-\newcommand{\SortSummary}{%
-{\esamepage
+\end{keys}
+}
+
+\def\SortSummary{
+\subsec{Sort the Summary Buffer}
 \begin{keys}{C-c C-s C-a}
-C-c C-s C-a & Sort the summary-buffer by {\bf author}.\\
-C-c C-s C-d & Sort the summary-buffer by {\bf date}.\\
-C-c C-s C-i & Sort the summary-buffer by article score.\\
-C-c C-s C-l & Sort the summary-buffer by amount of lines.\\
-C-c C-s C-c & Sort the summary-buffer by length.\\
-C-c C-s C-n & Sort the summary-buffer by article {\bf number}.\\
-C-c C-s C-s & Sort the summary-buffer by {\bf subject}.\\
-\end{keys}}}
-
-\newcommand{\MailGroups}{% formerly \Bsubmap
-{\esamepage
+C-c C-s C-a & Sort the summary by {\bf author}.\\
+C-c C-s C-d & Sort the summary by {\bf date}.\\
+C-c C-s C-i & Sort the summary by article score.\\
+C-c C-s C-n & Sort the summary by article {\bf number}.\\
+C-c C-s C-s & Sort the summary by {\bf subject}.\\
+\end{keys}
+}
+
+\def\Asubmap{
+\subsec{Article Buffer Commands}
+\begin{keys}{A m}
+A g     & (g) (Re)fetch this article ({\bf get}). [Prefix: just show the
+article.]\\ 
+A r     & (^, A ^) Go to the parent of this article (the {\bf References}
+header).\\ 
+M-^     & Fetch the article with a given Message-ID.\\
+A s     & (s) Perform an i{\bf search} in the article buffer.\\
+A D     & (C-d) Un{\bf digestify} this article into a separate group.\\
+\end{keys}
+}
+
+\def\Bsubmap{
+\subsec{Mail-Group Commands}
+{\samepage
 These commands (except `B c') are only valid in a mail group.\\*
 \begin{keys}{B M-C-e}
-B DEL   & (B backspace, B delete) {\bf Delete} the mail article from disk (!).
-[p/p]\\
-B B     & Crosspost this article to another group.\\
+B DEL   & {\bf Delete} the mail article from disk (!). [p/p]\\
 B c     & {\bf Copy} this article from any group to a mail group. [p/p]\\
 B e     & {\bf Expire} all expirable articles in this group. [p/p]\\
 B i     & {\bf Import} a random file into this group.\\
 B m     & {\bf Move} the article from one mail group to another. [p/p]\\
-B p     & Query whether the article was posted as well.\\
-B q     & {\bf Query} where the article will end up after fancy splitting\\
+B q     & {\bf Query} where will the article go during fancy splitting\\
 B r     & {\bf Respool} this mail article. [p/p]\\
-B t     & {\bf Trace} the fancy splitting patterns applied to this article.\\
 B w     & (e) Edit this article.\\
 B M-C-e & {\bf Expunge} (delete from disk) all expirable articles in this group
 (!). [p/p]\\ 
-\end{keys}}}
-
-\newcommand{\DraftGroup}{% formerly \Dsubmap
-{\esamepage
-The ``drafts''-group contains messages that have been saved but not sent
-and rejected articles. \\*
-\begin{keys}{B DEL}
-D e      & {\bf edit} message in draft group.\\
-B DEL    & \textbf{Delete} message (like in mailgroup).\\
-\end{keys}}}
-
-\newcommand{\SelectArticles}{% formerly \Gsubmap
-{\esamepage
+\end{keys}
+}}
+
+\def\Gsubmap{
+\subsec{Select Articles}
+{\samepage
 These commands select the target article. They do not understand the prefix.\\*
 \begin{keys}{G C-n}
-h       & Enter article-buffer.\\
 G b     & (,) Go to the {\bf best} article (the one with highest score).\\
 G f     & (.) Go to the {\bf first} unread article.\\
+G l     & (l) Go to the {\bf last} article read.\\
 G n     & (n) Go to the {\bf next} unread article.\\
-G p     & (p) Go to the {\bf previous} unread article.\\
-%
+p       & Go to the {\bf previous} unread article.\\
+G p     & {\bf Pop} an article off the summary history and go to it.\\
 G N     & (N) Go to {\bf the} next article.\\
 G P     & (P) Go to the {\bf previous} article.\\
-%
 G C-n   & (M-C-n) Go to the {\bf next} article with the same subject.\\
 G C-p   & (M-C-p) Go to the {\bf previous} article with the same subject.\\
-%
-G l     & (l) Go to the previously read article ({\bf last-read-article}).\\
-G o     & Pop an article off the summary history and go to it.\\
-%
-G g     & Search an article via subject.\\
-G j     & (j) Search an article via Message-Id or subject.\\
-\end{keys}}}
-
-\newcommand{\ArticleModeGeneral}{%
-{\esamepage
-The normal navigation keys work in Article mode. Some additional keys are:\\*
-\begin{keys}{C-c RET}
-C-c \^{} & Get the article with the Message-ID near point.\\
-C-c RET & Send reply to address near point.\\
-h       & Go to the \textbf{header}-line of the article in the
-summary-buffer.\\
-s       & Go to \textbf{summary}-buffer.\\
-RET     & (middle mouse button) Activate the button at point to follow
-an URL or Message-ID.\\
-TAB     & Move the point to the next button.\\
-M-TAB   & Move point to previous button.\\
-\end{keys}}}
-
-\newcommand{\WashArticle}{% formerly \Wsubmap
-{\esamepage
-\begin{keys}{W W H}
-W b     & Make Message-IDs and URLs in the article mouse-clickable
-{\bf buttons}.\\  
-W l     & (w) Remove page breaks ({\bf\^{}L}) from the article.\\
-W c     & Translate CRLF-pairs to LF and then the remaining CR's to LF's.\\
-W d     & Treat {\bf dumbquotes}.\\
-W f     & Look for and display any X-{\bf Face} headers.\\
-W m     & Toggle {\bf MIME} processing.\\
-W o     & Treat {\bf overstrike} or underline (\^{}H\_) in the article.\\
-W q     & Treat {\bf quoted}-printable in the article.\\
-W r     & (C-c C-r) Do a Caesar {\bf rotate} (rot13) on the article.\\
-W t     & (t) {\bf Toggle} display of all headers.\\
-W v     & (v) Toggle permanent {\bf verbose} displaying of all headers.\\
-W w     & Do word {\bf wrap} in the article.\\
-W B     & Add clickable {\bf buttons} to the article headers.\\
-W C     & {\bf Capitalize} first word in each sentence.\\
-W Q     & Fill long lines.\\
-%
-W W H   & Strip certain {\bf headers} from body.\\
-%
-W E l   & Strip blank {\bf lines} from the beginning of the article.\\
-W E m   & Replace blank lines with empty lines and remove {\bf multiple}
-blank lines.\\
-W E t   & Remove {\bf trailing} blank lines.\\
-W E a   & Strip blank lines at the beginning and the end
-(W E l, W E m and W E t).\\
-W E A   & Strip {\bf all} blank lines.\\
-W E s   & Strip leading blank lines from the article body.\\
-W E e   & Strip trailing blank lines from the article body.\\
-%
-W T u   & (W T z) Display the article timestamp in GMT ({\bf UT, ZULU}).\\
-W T i   & Display the article timestamp in {\bf ISO} 8601.\\
-W T l   & Display the article timestamp in the {\bf local} timezone.\\
-W T s   & Display according to `gnus-article-time-format'.\\
-W T e   & Display the time {\bf elapsed} since it was sent.\\
-W T o   & Display the {\bf original} timestamp.\\
-\end{keys}}}
-
-\newcommand{\HideHighlightArticle}{%
-{\esamepage
-\begin{keys}{W W C-c}
-W W a   & Hide {\bf all} unwanted parts. Calls W W h, W W s, W W C-c.\\
-W W h   & Hide article {\bf headers}.\\
-W W b   & Hide {\bf boring} headers.\\
-W W s   & Hide {\bf signature}.\\
-W W l   & Hide {\bf list} identifiers in subject-header.\\
-W W p   & Hide {\bf PGP}-signatures.\\
-W W P   & Hide {\bf PEM} (privacy enhanced messages).\\
-W W B   & Hide banner specified by group parameter.\\
-W W c   & Hide {\bf citation}.\\
-W W C-c & Hide {\bf citation} using a more intelligent algorithm.\\
-W W C   & Hide cited text in articles that aren't roots.\\
-%
-W e     & {\bf Emphasize} article.\\
-%
-W H a   & Highlight {\bf all} parts. Calls W b, W H c, W H h, W H s.\\
-W H c   & Highlight article {\bf citations}.\\
-W H h   & Highlight article {\bf headers}.\\
-W H s   & Highlight article {\bf signature}.\\
 \end{keys}
-For all hiding-commands: A positive prefix always hides, and a negative
-prefix will show what was previously hidden.
 }}
 
-\newcommand{\MIMEArticleMode}{%
-{\esamepage
-\begin{keys}{M-RET}
-RET     & (BUTTON-2) Toggle display of the MIME object.\\
-v       & (M-RET) Prompt for a method and then view object using this method.\\
-o       & Prompt for a filename and save the MIME object.\\
-c       & {\bf Copy} the MIME object to a new buffer and display this buffer.\\
-t       & View the MIME object as a different {\bf type}.\\
-$\mid$  & Pipe the MIME object to a process.\\
-\end{keys}}}
-
-%% end of article mode for reading ..........................................
-
-\newcommand{\MarkArticlesGeneral}{% formerly \Msubmap
-{\esamepage
+\def\Hsubmap{
+\subsec{Help Commands}
+\begin{keys}{H d}
+H d     & (C-c C-d) {\bf Describe} this group. [Prefix: re-read the description
+from the server.]\\
+H f     & Try to fetch the {\bf FAQ} for this group using ange-ftp.\\
+H h     & Give a very short {\bf help} message.\\
+H i     & (C-c C-i) Go to the Gnus online {\bf info}.\\
+H v     & Display the Gnus {\bf version} number.\\
+\end{keys}
+}
+
+\def\Msubmap{
+\subsec{Mark Articles}
 \begin{keys}{M M-C-r}
 d       & (M d, M r) Mark this article as read and move to the next one.
 [scope]\\ 
 D       & Mark this article as read and move to the previous one. [scope]\\
-!       & (u, M !, M t) Tick this article (mark it as interesting) and move
+u       & (!, M !, M t) Tick this article (mark it as interesting) and move
 to the next one. [scope]\\
 U       & Tick this article and move to the previous one. [scope]\\ 
-M ?     & (?) Mark this article as dormant (only followups are
-interesting). [scope]\\ 
-M D     & Show all {\bf dormant} articles (normally they are hidden unless they
-have any followups).\\
-M M-D   & Hide all {\bf dormant} articles.\\
-C-w     & Mark all articles between point and mark as read.\\
 M-u     & (M SPC, M c) Clear all marks from this article and move to the next
 one. [scope]\\ 
 M-U     & Clear all marks from this article and move to the previous one.
-[scope]\\
-%
+[scope]\\ 
+M ?     & (?) Mark this article as dormant (only followups are
+interesting). [scope]\\ 
+M b     & Set a {\bf bookmark} in this article.\\
 M e     & (E, M x) Mark this article as {\bf expirable}. [scope]\\
-%
 M k     & (k) {\bf Kill} all articles with the same subject then select the
-next unread one.\\ 
+next one.\\ 
+M B     & Remove the {\bf bookmark} from this article.\\
+M C     & {\bf Catch-up} the articles that are not ticked.\\
+M D     & Show all {\bf dormant} articles (normally they are hidden unless they
+have any followups).\\
+M H     & Catch-up (mark read) this group to point ({\bf here}).\\
 M K     & (C-k) {\bf Kill} all articles with the same subject as this one.\\
-%
-M C     & {\bf Catch-up} the articles that are not ticked and not dormant.\\
+C-w     & Mark all articles between point and mark as read.\\
+M S     & (C-c M-C-s) {\bf Show} all expunged articles.\\
 M C-c   & {\bf Catch-up} all articles in this group.\\
-M H     & Catch-up (mark read) this group to point (to-{\bf here}).\\
-%
-M b     & Set a {\bf bookmark} in this article.\\
-M B     & Remove the {\bf bookmark} from this article.\\
-%
 M M-r   & (x) Expunge all {\bf read} articles from this group.\\
+M M-D   & Hide all {\bf dormant} articles.\\
 M M-C-r & Expunge all articles having a given mark.\\
-M S     & (C-c M-C-s) {\bf Show} all expunged articles.\\
-M M C-h & Displays some more keys doing ticking slightly differently.\\
 \end{keys}
-The variable `gnus-summary-goto-unread' controls what happens after a mark
-has been set (C-x C-i g Setting Marks RET)
-}}
 
-\newcommand{\MarkByScore}{%
-\begin{keys}{M V m}
+\subsubsec{Mark Based on Score}
+\begin{keys}{M s m}
 M V c   & {\bf Clear} all marks from all high-scored articles. [score]\\
 M V k   & {\bf Kill} all low-scored articles. [score]\\
 M V m   & Mark all high-scored articles with a given {\bf mark}. [score]\\
 M V u   & Mark all high-scored articles as interesting (tick them). [score]\\
-\end{keys}}}
+\end{keys}
 
-\newcommand{\ProcessMark}{%
-{\esamepage 
-These commands set and remove the process mark (\#). You only need to use
+\subsubsec{The Process Mark}
+{\samepage 
+These commands set and remove the process mark \#. You only need to use
 it if the set of articles you want to operate on is non-contiguous. Else
 use a numeric prefix.\\*
 \begin{keys}{M P R}
+M P a   & Mark {\bf all} articles (in series order).\\
 M P p   & (\#, M \#) Mark this article.\\
-M P u   & (M-\#, M M-\#) \textbf{unmark} this article.\\
-M P b   & Mark all articles in {\bf buffer}.\\
 M P r   & Mark all articles in the {\bf region}.\\
-M P R   & Mark all articles matching a {\bf regexp}.\\
-M P t   & Mark all articles in this (sub){\bf thread}.\\
 M P s   & Mark all articles in the current {\bf series}.\\
+M P t   & Mark all articles in this (sub){\bf thread}.\\
+M P u   & (M-\#, M M-\#) {\bf Unmark} this article.\\
+M P R   & Mark all articles matching a {\bf regexp}.\\
 M P S   & Mark all {\bf series} that already contain a marked article.\\
-M P a   & Mark {\bf all} articles (in series order).\\
-M P U   & \textbf{unmark} all articles.\\
-%
-M P i   & {\bf Invert} the list of process-marked articles.\\
-M P k   & Push the current process-mark set onto stack and unmark
-all articles.\\
-M P y   & Pop process-mark set from stack and restore it.\\
-\end{keys}}}
-
-\newcommand{\Limiting}{%
-{\esamepage
-\begin{keys}{/M}
-//   & (/s) Limit the summary-buffer to articles matching {\bf subject}.\\
-/a   & Limit the summary-buffer to articles matching {\bf author}.\\
-/x   & Limit depending on ``extra'' headers.\\
-/u   & (x) Limit to {\bf unread} articles.
-[Prefix: also exclude ticked and dormant articles]\\
-/m   & Limit to articles marked with specified {\bf mark}.\\
-/t   & Ask for a number and exclude articles younger than that many days.
-[Prefix: exclude older articles]\\
-/n   & Limit to current article. [p/p]\\
-/w   & Pop the previous limit off the stack and restore it.
-[Prefix: pop all limits]\\
-/v   & Limit to score. [score]\\
-/E   & (M S) Include all expunged articles in the limit.\\
-/D   & Include all dormant articles in the limit.\\
-/*   & Include all cached articles in the limit.\\
-/d   & Exclude all dormant articles from the limit.\\
-/M   & Exclude all marked articles.\\
-/T   & Include all articles from the current thread in the limit.\\
-/c   & Exclude all dormant articles that have no children from the limit.\\
-/C   & Mark all excluded unread articles as read.
-[Prefix: also mark ticked and dormant articles]\\
-\end{keys}}}
-
-\newcommand{\OutputArticles}{% formerly \Osubmap
-{\esamepage
+M P U   & {\bf Unmark} all articles.\\
+\end{keys}
+}}
+
+\def\Osubmap{
+\subsec{Output Articles}
 \begin{keys}{O m}
-O o     & (o, C-o) Save this article using the default article saver. [p/p]\\
-O b     & Save this article's {\bf body} in plain file format [p/p]\\
 O f     & Save this article in plain {\bf file} format. [p/p]\\
-O F     & like O f, but overwrite file's contents. [p/p]\\
 O h     & Save this article in {\bf mh} folder format. [p/p]\\
 O m     & Save this article in {\bf mail} format. [p/p]\\
+O o     & (o, C-o) Save this article using the default article saver. [p/p]\\
+O p     & ($\mid$) Pipe this article to a shell command. [p/p]\\
 O r     & Save this article in {\bf rmail} format. [p/p]\\
 O v     & Save this article in {\bf vm} format. [p/p]\\
-O p     & ($\mid$) Pipe this article to a shell command. [p/p]\\
-\end{keys}}}
-
-\newcommand{\PostReplyetc}{% formerly \Ssubmap
-{\esamepage
-These commands put you in a separate news or mail buffer. See the section
-about composing messages for more information.
-%After
-%editing the article, send it by pressing C-c C-c.  If you are in a
-%foreign group and want to post the article using the foreign server, give
-%a prefix to C-c C-c.\\* 
+\end{keys}
+}
+
+\def\Ssubmap{
+\subsec{Post, Followup, Reply, Forward, Cancel}
+{\samepage
+These commands put you in a separate post or mail buffer. After
+editing the article, send it by pressing C-c C-c.  If you are in a
+foreign group and want to post the article using the foreign server, give
+a prefix to C-c C-c.\\* 
 \begin{keys}{S O m}
-S p     & (a) {\bf Post} an article to this group.\\
+S b     & {\bf Both} post a followup to this article, and send a reply.\\
+S c     & (C) {\bf Cancel} this article (only works if it is your own).\\
 S f     & (f) Post a {\bf followup} to this article.\\
-S F     & (F) Post a {\bf followup} and include the original. [p/p]\\
-S o p   & Forward this article as a {\bf post} to a newsgroup.
-[Prefix: include all headers]\\
-S M-c   & Send a complaint about excessive crossposting to the author of this
-article. [p/p]\\
-%
 S m     & (m) Send {\bf a} mail to some other person.\\
+S o m   & (C-c C-f) Forward this article by {\bf mail} to a person.\\
+S o p   & Forward this article as a {\bf post} to a newsgroup.\\
+S p     & (a) {\bf Post} an article to this group.\\
 S r     & (r) Mail a {\bf reply} to the author of this article.\\
-S R     & (R) Mail a {\bf reply} and include the original. [p/p]\\
-S w     & Mail a {\bf wide} reply to this article.\\
-S W     & Mail a {\bf wide} reply to this article.\\
-S o m   & (C-c C-f) Forward this article by {\bf mail} to a person.
-[Prefix: include all headers]\\
-S D b   & Resend {\bf bounced} mail.\\
-S D r   & {\bf Resend} mail to a different person.\\
-%
-S n     & Post a followup via {\bf news} even if you got the message
-through mail.\\
-S N     & Post a followup via {\bf news} and include the original mail.
-[p/p]\\
-%
-S c     & (C) {\bf Cancel} this article (only works if it is your own).\\
 S s     & {\bf Supersede} this article with a new one (only for own
-articles).\\
-%
+articles).\\ 
+S u     & {\bf Uuencode} a file and post it as a series.\\
+S B     & {\bf Both} post a followup, send a reply, and include the
+original. [p/p]\\ 
+S F     & (F) Post a {\bf followup} and include the original. [p/p]\\
 S O m   & Digest these series and forward by {\bf mail}. [p/p]\\
 S O p   & Digest these series and forward as a {\bf post} to a newsgroup.
 [p/p]\\ 
-%
-S u     & {\bf Uuencode} a file and post it as a series.\\
+S R     & (R) Mail a {\bf reply} and include the original. [p/p]\\
 \end{keys}
 If you want to cancel or supersede an article you just posted (before it
 has appeared on the server), go to the *post-news* buffer, change
 `Message-ID' to `Cancel' or `Supersedes' and send it again with C-c C-c.
 }}
 
-\newcommand{\Threading}{% formerly \Tsubmap
-{\esamepage
-\begin{keys}{T M-\#}
+\def\Tsubmap{
+\subsec{Thread Commands}
+\begin{keys}{T \#}
 T \#    & Mark this thread with the process mark.\\
-T M-\#  & Remove process-marks from this thread.\\
-%
-T t     & Re-{\bf thread} the current article's thread.\\
-% movement
-T n     & (M-C-f) Go to the {\bf next} thread. [distance]\\
-T p     & (M-C-b) Go to the {\bf previous} thread. [distance]\\
-T d     & {\bf Descend} this thread. [distance]\\
-T u     & Ascend this thread ({\bf up}-thread). [distance]\\
-T o     & Go to the top of this thread.\\
-%
-T s     & {\bf Show} the thread hidden under this article.\\
+T d     & Move to the next article in this thread ({\bf down}). [distance]\\
 T h     & {\bf Hide} this (sub)thread.\\
-%
 T i     & {\bf Increase} the score of this thread.\\
-T l     & (M-C-l) {\bf Lower} the score of this thread.\\
-%
 T k     & (M-C-k) {\bf Kill} the current (sub)thread. [Negative prefix:
 tick it, positive prefix: unmark it.]\\
-%
+T l     & (M-C-l) {\bf Lower} the score of this thread.\\
+T n     & (M-C-f) Go to the {\bf next} thread. [distance]\\
+T p     & (M-C-b) Go to the {\bf previous} thread. [distance]\\
+T s     & {\bf Show} the thread hidden under this article.\\
+T u     & Move to the previous article in this thread ({\bf up}). [distance]\\
 T H     & {\bf Hide} all threads.\\
 T S     & {\bf Show} all hidden threads.\\
 T T     & (M-C-t) {\bf Toggle} threading.\\
-\end{keys}}}
+\end{keys}
+}
 
-\newcommand{\Scoring}{% formerly \Vsubmap
-{\esamepage
+\def\Vsubmap{
+\subsec{Score (Value) Commands}
+{\samepage
 Read about Adaptive Scoring in the online info.\\*
 \begin{keys}{\bf A p m l}
 V a     & {\bf Add} a new score entry, specifying all elements.\\
@@ -786,6 +528,7 @@ interface.\\
 V S     & Display the {\bf score} of this article.\\
 \bf A p m l& Make a scoring entry based on this article.\\
 \end{keys}
+
 The four letters stand for:\\*
 \quad \B{A}ction: I)ncrease, L)ower;\\*
 \quad \B{p}art: a)utor (from), s)ubject, x)refs (cross-posting), d)ate, l)ines,
@@ -805,10 +548,51 @@ t)emporary.
 \begin{keys}{C-c C-c}
 C-c C-c & Finish editing the score file.\\
 C-c C-d & Insert the current {\bf date} as number of days.\\
-\end{keys}}}
+\end{keys}
+}}
+
+\def\Wsubmap{
+\subsec{Wash the Article Buffer}
+\begin{keys}{W C-c}
+W b     & Make Message-IDs and URLs in the article to mouse-clickable {\bf
+  buttons}.\\  
+W c     & Remove extra {\bf CRs} (^M) from the article.\\
+W f     & Look for and display any X-{\bf Face} headers.\\
+W l     & (w) Remove page breaks ({\bf^L}) from the article.\\
+W m     & Toggle {\bf MIME} processing.\\
+W o     & Treat {\bf overstrike} or underline (^H\_) in the article.\\
+W q     & Treat {\bf quoted}-printable in the article.\\
+W r     & (C-c C-r) Do a Caesar {\bf rotate} (rot13) on the article.\\
+W t     & (t) {\bf Toggle} the displaying of all headers.\\
+v       & Toggle permanent {\bf verbose} displaying of all headers.\\
+W w     & Do word {\bf wrap} in the article.\\
+W T e   & Convert the article timestamp to time {\bf elapsed} since sent.\\
+W T l   & Convert the article timestamp to the {\bf local} timezone.\\
+W T u   & (W T z) Convert the article timestamp to {\bf UTC} ({\bf Zulu},
+GMT).\\ 
+\end{keys}
+
+\subsubsec{Hide/Highlight Parts of the Article}
+\begin{keys}{W W C-c}
+W W a   & Hide {\bf all} unwanted parts. Calls W W h, W W s, W W C-c.\\
+W W c   & Hide article {\bf citation}.\\
+W W h   & Hide article {\bf headers}.\\
+W W s   & Hide article {\bf signature}.\\
+W W C-c & Hide article {\bf citation} using a more intelligent algorithm.\\
+%\end{keys}
+%
+%\subsubsec{Highlight Parts of the Article}
+%\begin{keys}{W H A}
+W H a   & Highlight {\bf all} parts. Calls W b, W H c, W H h, W H s.\\
+W H c   & Highlight article {\bf citation}.\\
+W H h   & Highlight article {\bf headers}.\\
+W H s   & Highlight article {\bf signature}.\\
+\end{keys}
+}
 
-\newcommand{\ExtractSeries}{% formerly \Xsubmap
-{\esamepage
+\def\Xsubmap{
+\subsec{Extract Series (Uudecode etc)}
+{\samepage
 Gnus recognizes if the current article is part of a series (multipart
 posting whose parts are identified by numbers in their subjects, e.g.{}
 1/10\dots10/10) and processes the series accordingly. You can mark and
@@ -837,86 +621,44 @@ C-c C-v C-v & (X v u) Uudecode and view these series. [p/p]\\
 \end{keys}
 }}
 
-\newcommand{\ExitSummary}{% formerly \Zsubmap
-{\esamepage
+\def\Zsubmap{
+\subsec{Exit the Current Group}
 \begin{keys}{Z G}
-Z Z     & (q, Z Q) Exit this group.\\
-Z E     & (Q) {\bf Exit} without updating the group information.\\
-%
 Z c     & (c) Mark all unticked articles as read ({\bf catch-up}) and exit.\\
-Z C     & Mark all articles as read ({\bf catch-up}) and exit.\\
-%
 Z n     & Mark all articles as read and go to the {\bf next} group.\\
+Z C     & Mark all articles as read ({\bf catch-up}) and exit.\\
+Z E     & (Q) {\bf Exit} without updating the group information.\\
+Z G     & (M-g) Check for new articles in this group ({\bf get}).\\
 Z N     & Exit and go to {\bf the} next group.\\
 Z P     & Exit and go to the {\bf previous} group.\\
-%
-Z G     & (M-g) Check for new articles in this group ({\bf get}).\\
 Z R     & Exit this group, and then enter it again ({\bf reenter}).
 [Prefix: select all articles, read and unread.]\\
-Z s     & Update and save the dribble buffer. [Prefix: save .newsrc* as well]\\
-\end{keys}}}
+Z Z     & (q, Z Q) Exit this group.\\
+\end{keys}
+}
 
-\newcommand{\MsgCompositionGeneral}{%
-Press C-c ? in the composition-buffer to get this information.
-{\esamepage
+\def\ArticleMode{
+\sec{Article Mode}
+{\samepage
+% All keys for Summary mode also work in Article mode.
+The normal navigation keys work in Article mode.
+Some additional keys are:\\*
 \begin{keys}{C-c C-m}
-% sending
-C-c C-c & Send message and exit. [Prefix: send via foreign server]\\
-C-c C-s & Send message. [Prefix: send via foreign server]\\
-C-c C-d & Don't send message (save as \textbf{draft}).\\
-C-c C-k & \textbf{Kill} message-buffer.\\
-C-c C-m & {\bf Mail} reply to the address near point.
-[Prefix: include the original]\\
-% modify headers/body
-C-c C-t & Paste the recipient's address into \textbf{To:}-field.\\
-C-c C-n & Insert a \textbf{Newsgroups:}-header.\\
-C-c C-o & Sort headers.\\
-C-c C-e & \textbf{Elide} region.\\
-C-c C-v & Kill everything outside region.\\
-C-c C-r & Do a \textbf{Rot-13} on the body.\\
-C-c C-w & Insert signature (from `message-signature-file').\\
-C-c C-z & Kill everything up to signature.\\
-C-c C-y & \textbf{Yank} original message.\\
-C-c C-q & Fill the yanked message.\\
-\end{keys}}}
-
-\newcommand{\MsgCompositionMovementArticle}{%
-The following functions create the header-field if necessary.
-{\esamepage
-\begin{keys}{C-c C-f C-u}
-C-c TAB & Move to \textbf{signature}.\\
-C-c C-b & Move to \textbf{body}.\\
-C-c C-f C-t & Move to \textbf{To:}.\\
-C-c C-f C-c & Move to \textbf{Cc:}.\\
-C-c C-f C-b & Move to \textbf{Bcc:}.\\
-C-c C-f C-w & Move to \textbf{Fcc:}.\\
-C-c C-f C-s & Move to \textbf{Subject:}.\\
-C-c C-f C-r & Move to \textbf{Reply-To:}.\\
-C-c C-f C-f & Move to \textbf{Followup-To:}.\\
-C-c C-f C-n & Move to \textbf{Newsgroups:}.\\
-C-c C-f C-u & Move to \textbf{Summary:}.\\
-C-c C-f C-k & Move to \textbf{Keywords:}.\\
-C-c C-f C-d & Move to \textbf{Distribution:}.\\
-\end{keys}}}
-
-\newcommand{\MsgCompositionMML}{%
-{\esamepage
-\begin{keys}{M-m P}
-M-m f   & (C-c C-a) Attach \textbf{file}.\\
-M-m b   & Attach contents of \textbf{buffer}.\\
-M-m e   & Attach \textbf{external} file (ftp..).\\
-M-m P   & Create MIME-\textbf{preview} (new buffer).\\
-M-m v   & \textbf{Validate} article.\\
-M-m p   & Insert \textbf{part}.\\
-M-m m   & Insert \textbf{multi}-part.\\
-M-m q   & \textbf{Quote} region.\\
-% TODO: narrow headers (M-m n) ?
-\end{keys}}}
-
-%% TODO:
-\newcommand{\ServerMode}{%
-{\esamepage
-To enter this mode, press `\^' while in Group mode.\\*
+RET     & (middle mouse button) Activate the button at point to follow
+an URL or Message-ID.\\
+TAB     & Move the point to the next button.\\
+h       & (s) Go to the {\bf header} line of the article in the {\bf
+summary} buffer.\\ 
+C-c ^   & Get the article with the Message-ID near point.\\
+C-c C-m & {\bf Mail} reply to the address near point (prefix: include the
+original).\\ 
+\end{keys}
+}}
+
+\def\ServerMode{
+\sec{Server Mode}
+{\samepage
+To enter this mode, press `^' while in Group mode.\\*
 \begin{keys}{SPC}
 SPC     & (RET) Browse this server.\\
 a       & {\bf Add} a new server.\\
@@ -925,13 +667,13 @@ e       & {\bf Edit} a server.\\
 k       & {\bf Kill} this server. [scope]\\
 l       & {\bf List} all servers.\\
 q       & Return to the group buffer ({\bf quit}).\\
-s       & Request that the server scan its sources for new articles.\\
-g       & Request that the server regenerate its data.\\
 y       & {\bf Yank} the previously killed server.\\
-\end{keys}}}
+\end{keys}
+}}
 
-\newcommand{\BrowseServer}{%
-{\esamepage
+\def\BrowseServer{
+\sec{Browse Server Mode}
+{\samepage
 To enter this mode, press `B' while in Group mode.\\*
 \begin{keys}{RET}
 RET     & Enter the current group.\\
@@ -941,4 +683,5 @@ n       & Go to the {\bf next} group. [distance]\\
 p       & Go to the {\bf previous} group. [distance]\\
 q       & (l) {\bf Quit} browse mode.\\
 u       & Subscribe to the current group. [scope]\\
-\end{keys}}}
+\end{keys}
+}}
index 65afc47..8f551d7 100644 (file)
@@ -1021,6 +1021,17 @@ qualified domain name (FQDN) (\e$B40A4$K>r7o$rK~$?$7$?%I%a%$%sL>\e(B) \e$B$G$J$$$J$
 @section \e$B$$$m$$$m$J%a%C%;!<%8JQ?t\e(B
 
 @table @code
+@c @item message-default-charset
+@c @vindex message-default-charset
+@c @cindex charset
+@c Symbol naming a @sc{mime} charset.  Non-ASCII characters in messages are
+@c assumed to be encoded using this charset.  The default is @code{nil},
+@c which means ask the user.  (This variable is used only on non-@sc{mule}
+@c Emacsen.  
+@c @xref{Charset Translation, , Charset Translation, emacs-mime, 
+@c       Emacs MIME Manual}, for details on the @sc{mule}-to-@sc{mime}
+@c translation process.
+@c
 @item message-signature-separator
 @vindex message-signature-separator
 \e$B=pL>J,N%$K9gCW$9$k@55,I=8=$G$9!#=i4|CM$O\e(B @samp{^-- *$} \e$B$G$9!#\e(B
index 0bbbc50..cb756a3 100644 (file)
@@ -1046,6 +1046,17 @@ posting a prepared news message.
 @section Various Message Variables
 
 @table @code
+@item message-default-charset
+@vindex message-default-charset
+@cindex charset
+Symbol naming a @sc{mime} charset.  Non-ASCII characters in messages are
+assumed to be encoded using this charset.  The default is @code{nil},
+which means ask the user.  (This variable is used only on non-@sc{mule}
+Emacsen.  
+@xref{Charset Translation, , Charset Translation, emacs-mime, 
+      Emacs MIME Manual}, for details on the @sc{mule}-to-@sc{mime}
+translation process.
+
 @item message-signature-separator
 @vindex message-signature-separator
 Regexp matching the signature separator.  It is @samp{^-- *$} by
index a7d0a5c..3b5f803 100644 (file)
 \thispagestyle{empty}
 \vfill
 
-This manual was written by Lars Magne Ingebrigtsen (1968 --- ) who
+\begin{picture}(10,10)
+\put(90,-10){\makebox(0,0)[tr]{\epsfig{figure=tmp/larsi.ps,height=3cm}}}
+\end{picture}
+
+\hspace*{4cm}\parbox[t]{10cm}{
+This manual was written by Lars Magne Ingebrigtsen (b. 1968) who
 resides in Oslo, Norway and poses as a student, but doesn't get much
 studying done, for some strange reason or other.  When not worshipping
 at the altar of Emacs, he can often be found slouching on his couch
 reading while bopping his head gently to some obscure music.  He does
 not have a cat.
 
-\marginpar[\vspace*{-2.5cm}\epsfig{figure=tmp/larsi.ps,height=2cm}]{\vspace*{-2.2cm}\epsfig{figure=tmp/larsi.ps,height=2.5cm}}
-
-Graphics by Luis Fernandes.  Set in Adobe Bembo, Adobe Futura and
-Bitstream Courier.
+Graphics by Luis Fernandes.  Set in Bembo and Futura.
+}
 
 \clearpage
 \mbox{}