Synch with Gnus.
authoryamaoka <yamaoka>
Mon, 18 Sep 2000 00:25:28 +0000 (00:25 +0000)
committeryamaoka <yamaoka>
Mon, 18 Sep 2000 00:25:28 +0000 (00:25 +0000)
18 files changed:
contrib/rfc2015.el
lisp/ChangeLog
lisp/dgnushack.el
lisp/gnus-art.el
lisp/gnus-sum.el
lisp/gnus-topic.el
lisp/mm-decode.el
lisp/mm-view.el
lisp/mml.el
lisp/qp.el
lisp/rfc2047.el
lisp/smiley.el
make.bat
texi/ChangeLog
texi/gnus-ja.texi
texi/gnus.texi
texi/gnusref.tex
texi/refcard.tex

index 00b51e3..d182bbb 100644 (file)
@@ -1,17 +1,18 @@
 ;;; rfc2015.el --- MIME Security with Pretty Good Privacy (PGP)
-;; Copyright (c) 2000 Free Software Foundation, Inc.
+;; Copyright (c) 2000 Shenghuo Zhu
 
 ;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
 ;; Keywords: PGP MIME
 
-;; This file is a part of GNU Emacs.
+;; This file is not (yet) a part of GNU Emacs. Hope it 
+;; will be a part of oGnus distribution, then GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; This file 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
+;; This file 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.
index e2daee9..90802f0 100644 (file)
@@ -1,3 +1,85 @@
+2000-09-17 01:13:46  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * rfc2047.el (rfc2047-q-encoding-alist): Remove = and _ from the
+       pattern. Avoid using 8 bit chars.
+       * qp.el (quoted-printable-encode-region): Avoid using 8 bit chars.
+
+2000-09-16 15:57:42  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * smiley.el (smiley-buffer-ems, smiley-create-glyph-ems,
+       smiley-toggle-extent-ems, smiley-toggle-extents-ems,
+       smiley-toggle-buffer-ems): New functions for Emacs 21. Toggle
+       functions are not implemented yet.
+       
+       * dgnushack.el (dgnushack-compile): Remove smiley.el and 
+       x-overlay.el from the FSF Emacs black list.
+
+2000-09-15 21:10:20  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * mm-decode.el (mm-inlined-types): Add application/emacs-lisp.
+       (mm-inline-media-tests): Ditto.
+       (mm-automatic-display): Ditto.
+       * mm-view.el (mm-display-inline-fontify): Generalize from 
+       mm-display-patch-inline. 
+       (mm-display-patch-inline): Use it.
+       (mm-display-elisp-inline): Ditto.
+       
+2000-09-15 14:03:00  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-topic.el (gnus-topic-find-groups): Add recursive parameter.
+       (gnus-topic-unmark-topic): Ditto.
+       (gnus-topic-mark-topic): Ditto.
+       (gnus-topic-get-new-news-this-topic): Use it.
+
+2000-09-15 09:01:40  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-art.el (gnus-treat-display-xface): By default, Emacs 21
+       display xface.
+
+2000-08-23 02:54:46  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-group.el (gnus-group-rename-group): Inhibit renaming of
+       zombie or killed groups.
+       
+2000-09-15 00:09:56  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * mml.el (mml-preview): Reinsert unibyte content. 
+       (mml-parse-1): Remove with-unibyte-current-buffer.
+       (mml-generate-mime-1): Ditto.
+       * gnus-msg.el (gnus-summary-mail-forward): Ditto.
+       * message.el (message-forward): Ditto.
+
+2000-09-14 23:13:50  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-art.el (article-de-quoted-unreadable): Guess charset from
+       original article buffer.
+       (article-de-base64-unreadable): Ditto.
+       (article-wash-html): Ditto.
+
+2000-09-14 18:55:30  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-msg.el (gnus-summary-mail-forward): Disable multibyte
+       unless forward-show-mml.
+
+2000-09-14 14:48:57  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-sum.el (gnus-summary-save-parts-type-history): New.
+       (gnus-summary-save-parts-last-directory): New.
+       (gnus-summary-save-parts): Save history.
+
+2000-09-14 Ben Gertzfield <che@debian.org>
+
+       * gnus-sum.el (gnus-summary-save-parts-default-mime): New
+       variable.
+       (gnus-summary-save-parts): Use it.
+
+2000-09-14 11:31:28  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus-art.el (gnus-article-setup-buffer): Clean handle-alist.
+       * gnus-sum.el (gnus-summary-exit): Ditto.
+       (gnus-summary-exit-no-update): Ditto.
+       (gnus-summary-show-article): Ditto.
+
 2000-09-14 08:42:48  ShengHuo ZHU  <zsh@cs.rochester.edu>
 
        * nndoc.el (nndoc-dissect-mime-parts-sub): Remove
index f6d583c..175239d 100644 (file)
@@ -216,7 +216,7 @@ Modify to suit your needs."))
        (error '("gnus-bbdb.el")))
       (unless (featurep 'xemacs)
        '("gnus-xmas.el" "gnus-picon.el" "messagexmas.el"
-         "nnheaderxm.el" "smiley.el" "gnus-ml.el"))
+         "nnheaderxm.el" "gnus-ml.el"))
       (when (and (fboundp 'md5) (subrp (symbol-function 'md5)))
        '("md5.el"))))
     (while (setq file (pop files))
index 6103504..9308c95 100644 (file)
@@ -902,11 +902,12 @@ See the manual for details."
 (put 'gnus-treat-overstrike 'highlight t)
 
 (defcustom gnus-treat-display-xface
-  (if (or (and gnus-xemacs (featurep 'xface))
-         (eq 'x-face-mule-gnus-article-display-x-face
-             gnus-article-x-face-command))
-      'head
-    nil)
+  (and (or (and (fboundp 'image-type-available-p)
+               (image-type-available-p 'xbm))
+          (and gnus-xemacs (featurep 'xface))
+          (eq 'x-face-mule-gnus-article-display-x-face
+              gnus-article-x-face-command))
+       'head)
   "Display X-Face headers.
 Valid values are nil, t, `head', `last', an integer or a predicate.
 See the manual for details."
@@ -1657,9 +1658,21 @@ If FORCE, decode the article whether it is marked as quoted-printable
 or not."
   (interactive (list 'force))
   (save-excursion
-    (let ((buffer-read-only nil)
-         (type (gnus-fetch-field "content-transfer-encoding"))
-         (charset gnus-newsgroup-charset))
+    (let ((buffer-read-only nil) type charset)
+      (if (gnus-buffer-live-p gnus-original-article-buffer)
+         (with-current-buffer gnus-original-article-buffer
+           (setq type
+                 (gnus-fetch-field "content-transfer-encoding"))
+           (let* ((ct (gnus-fetch-field "content-type"))
+                  (ctl (and ct 
+                            (ignore-errors
+                              (mail-header-parse-content-type ct)))))
+             (setq charset (and ctl
+                                (mail-content-type-get ctl 'charset)))
+             (if (stringp charset)
+                 (setq charset (intern (downcase charset)))))))
+      (unless charset 
+       (setq charset gnus-newsgroup-charset))
       (when (or force
                (and type (string-match "quoted-printable" (downcase type))))
        (article-goto-body)
@@ -1670,9 +1683,21 @@ or not."
 If FORCE, decode the article whether it is marked as base64 not."
   (interactive (list 'force))
   (save-excursion
-    (let ((buffer-read-only nil)
-         (type (gnus-fetch-field "content-transfer-encoding"))
-         (charset gnus-newsgroup-charset))
+    (let ((buffer-read-only nil) type charset)
+      (if (gnus-buffer-live-p gnus-original-article-buffer)
+         (with-current-buffer gnus-original-article-buffer
+           (setq type
+                 (gnus-fetch-field "content-transfer-encoding"))
+           (let* ((ct (gnus-fetch-field "content-type"))
+                  (ctl (and ct 
+                            (ignore-errors
+                              (mail-header-parse-content-type ct)))))
+             (setq charset (and ctl
+                                (mail-content-type-get ctl 'charset)))
+             (if (stringp charset)
+                 (setq charset (intern (downcase charset)))))))
+      (unless charset 
+       (setq charset gnus-newsgroup-charset))
       (when (or force
                (and type (string-match "base64" (downcase type))))
        (article-goto-body)
@@ -1698,7 +1723,19 @@ If FORCE, decode the article whether it is marked as base64 not."
   (interactive)
   (save-excursion
     (let ((buffer-read-only nil)
-         (charset gnus-newsgroup-charset))
+         charset)
+      (if (gnus-buffer-live-p gnus-original-article-buffer)
+         (with-current-buffer gnus-original-article-buffer
+           (let* ((ct (gnus-fetch-field "content-type"))
+                  (ctl (and ct 
+                            (ignore-errors
+                              (mail-header-parse-content-type ct)))))
+             (setq charset (and ctl
+                                (mail-content-type-get ctl 'charset)))
+             (if (stringp charset)
+                 (setq charset (intern (downcase charset)))))))
+      (unless charset 
+       (setq charset gnus-newsgroup-charset))
       (article-goto-body)
       (save-window-excursion
        (save-restriction
index a86eedd..51a0bfb 100644 (file)
@@ -936,6 +936,14 @@ For example: ((1 . cn-gb-2312) (2 . big5))."
   :type '(choice (const nil)
                 integer))
 
+(defcustom gnus-summary-save-parts-default-mime "image/.*"
+  "*A regexp to match MIME parts when saving multiple parts of a message
+with gnus-summary-save-parts (X m). This regexp will be used by default
+when prompting the user for which type of files to save."
+  :group 'gnus-summary
+  :type 'regexp)
+
+
 ;;; Internal variables
 
 (defvar gnus-article-mime-handles nil)
@@ -953,6 +961,9 @@ For example: ((1 . cn-gb-2312) (2 . big5))."
 (defvar gnus-sort-gathered-threads-function 'gnus-thread-sort-by-number
   "Function called to sort the articles within a thread after it has been gathered together.")
 
+(defvar gnus-summary-save-parts-type-history nil)
+(defvar gnus-summary-save-parts-last-directory nil)
+
 ;; Avoid highlighting in kill files.
 (defvar gnus-summary-inhibit-highlight nil)
 (defvar gnus-newsgroup-selected-overlay nil)
@@ -9322,8 +9333,14 @@ save those articles instead."
   "Save parts matching TYPE to DIR.
 If REVERSE, save parts that do not match TYPE."
   (interactive
-   (list (read-string "Save parts of type: " "image/.*")
-        (read-file-name "Save to directory: " nil nil t)
+   (list (read-string "Save parts of type: " 
+                     (or (car gnus-summary-save-parts-type-history)
+                         gnus-summary-save-parts-default-mime)
+                     'gnus-summary-save-parts-type-history)
+        (setq gnus-summary-save-parts-last-directory
+              (read-file-name "Save to directory: " 
+                              gnus-summary-save-parts-last-directory
+                              nil t))
         current-prefix-arg))
   (gnus-summary-iterate n
     (let ((gnus-display-mime-function nil)
index 498b9f8..a113d14 100644 (file)
@@ -193,8 +193,9 @@ If TOPIC, start with that topic."
     (beginning-of-line)
     (get-text-property (point) 'gnus-active)))
 
-(defun gnus-topic-find-groups (topic &optional level all lowest)
-  "Return entries for all visible groups in TOPIC."
+(defun gnus-topic-find-groups (topic &optional level all lowest recursive)
+  "Return entries for all visible groups in TOPIC.
+If RECURSIVE is t, return groups in its subtopics too."
   (let ((groups (cdr (assoc topic gnus-topic-alist)))
         info clevel unread group params visible-groups entry active)
     (setq lowest (or lowest 1))
@@ -232,7 +233,18 @@ If TOPIC, start with that topic."
           (cdr (assq 'visible params)))
        ;; Add this group to the list of visible groups.
        (push (or entry group) visible-groups)))
-    (nreverse visible-groups)))
+    (setq visible-groups (nreverse visible-groups))
+    (when recursive 
+      (if (eq recursive t)
+         (setq recursive (cdr (gnus-topic-find-topology topic))))
+      (mapcar (lambda (topic-topology)
+               (setq visible-groups 
+                     (nconc visible-groups 
+                            (gnus-topic-find-groups
+                             (caar topic-topology) 
+                             level all lowest topic-topology))))
+             (cdr recursive)))
+    visible-groups))
 
 (defun gnus-topic-previous-topic (topic)
   "Return the previous topic on the same level as TOPIC."
@@ -1293,30 +1305,37 @@ If PERMANENT, make it stay shown in subsequent sessions as well."
        (setcar (cdr (cadr topic)) 'visible)
        (gnus-group-list-groups)))))
 
-(defun gnus-topic-mark-topic (topic &optional unmark)
-  "Mark all groups in the topic with the process mark."
-  (interactive (list (gnus-group-topic-name)))
+(defun gnus-topic-mark-topic (topic &optional unmark recursive)
+  "Mark all groups in the TOPIC with the process mark.
+If RECURSIVE is t, mark its subtopics too."
+  (interactive (list (gnus-group-topic-name)
+                    nil
+                    (and current-prefix-arg t)))
   (if (not topic)
       (call-interactively 'gnus-group-mark-group)
     (save-excursion
-      (let ((groups (gnus-topic-find-groups topic gnus-level-killed t)))
+      (let ((groups (gnus-topic-find-groups topic gnus-level-killed t nil 
+                                           recursive)))
        (while groups
          (funcall (if unmark 'gnus-group-remove-mark 'gnus-group-set-mark)
                   (gnus-info-group (nth 2 (pop groups)))))))))
 
-(defun gnus-topic-unmark-topic (topic &optional unmark)
-  "Remove the process mark from all groups in the topic."
-  (interactive (list (gnus-group-topic-name)))
+(defun gnus-topic-unmark-topic (topic &optional dummy recursive)
+  "Remove the process mark from all groups in the TOPIC.
+If RECURSIVE is t, unmark its subtopics too."
+  (interactive (list (gnus-group-topic-name)
+                    nil
+                    (and current-prefix-arg t)))
   (if (not topic)
       (call-interactively 'gnus-group-unmark-group)
-    (gnus-topic-mark-topic topic t)))
+    (gnus-topic-mark-topic topic t recursive)))
 
 (defun gnus-topic-get-new-news-this-topic (&optional n)
   "Check for new news in the current topic."
   (interactive "P")
   (if (not (gnus-group-topic-p))
       (gnus-group-get-new-news-this-group n)
-    (gnus-topic-mark-topic (gnus-group-topic-name))
+    (gnus-topic-mark-topic (gnus-group-topic-name) nil (and n t))
     (gnus-group-get-new-news-this-group)))
 
 (defun gnus-topic-move-matching (regexp topic &optional copyp)
index 85f3a5a..19a79cd 100644 (file)
     ("text/x-patch" mm-display-patch-inline
      (lambda (handle)
        (locate-library "diff-mode")))
+    ("application/emacs-lisp" mm-display-elisp-inline identity)
     ("text/html"
      mm-inline-text
      (lambda (handle)
 
 (defcustom mm-inlined-types
   '("image/.*" "text/.*" "message/delivery-status" "message/rfc822"
-    "message/partial"
+    "message/partial" "application/emacs-lisp"
     "application/pgp-signature")
   "List of media types that are to be displayed inline."
   :type '(repeat string)
 (defcustom mm-automatic-display
   '("text/plain" "text/enriched" "text/richtext" "text/html"
     "text/x-vcard" "image/.*" "message/delivery-status" "multipart/.*"
-    "message/rfc822" "text/x-patch" "application/pgp-signature")
+    "message/rfc822" "text/x-patch" "application/pgp-signature" 
+    "application/emacs-lisp")
   "A list of MIME types to be displayed automatically."
   :type '(repeat string)
   :group 'mime-display)
index 45ed4d2..5bf4f09 100644 (file)
                (error nil))
              (delete-region ,(point-min-marker) ,(point-max-marker)))))))))
 
-(defun mm-display-patch-inline (handle)
+(defun mm-display-inline-fontify (handle mode)
   (let (text)
     (with-temp-buffer
       (mm-insert-part handle)
-      (diff-mode)
+      (funcall mode)
       (font-lock-fontify-buffer)
       (when (fboundp 'extent-list)
        (map-extents (lambda (ext ignored)
       (setq text (buffer-string)))
     (mm-insert-inline handle text)))
 
+(defun mm-display-patch-inline (handle)
+  (mm-display-inline-fontify handle 'diff-mode))
+
+(defun mm-display-elisp-inline (handle)
+  (mm-display-inline-fontify handle 'emacs-lisp-mode))
+
 (provide 'mm-view)
 
 ;; mm-view.el ends here
index 86faed8..1d71f4b 100644 (file)
@@ -126,10 +126,7 @@ The function is called with one parameter, which is the generated part.")
                warn t))
        (setq raw (cdr (assq 'raw tag))
              point (point)
-             contents (if raw
-                          (mm-with-unibyte-current-buffer
-                            (mml-read-part (eq 'mml (car tag))))
-                        (mml-read-part (eq 'mml (car tag))))
+             contents (mml-read-part (eq 'mml (car tag)))
              charsets (if raw nil 
                         (mm-find-mime-charset-region point (point))))
        (when (and (not raw) (memq nil charsets))
@@ -352,8 +349,7 @@ If MML is non-nil, return the buffer up till the correspondent mml tag."
                  coded (buffer-string))))
        (mml-insert-mime-headers cont type charset encoding)
        (insert "\n")
-       (mm-with-unibyte-current-buffer
-         (insert coded))))
+       (insert coded)))
      ((eq (car cont) 'external)
       (insert "Content-Type: message/external-body")
       (let ((parameters (mml-parameter-string
@@ -852,7 +848,12 @@ If RAW, don't highlight the article."
        (replace-match "\n"))
     (mml-to-mime)
     (if raw
-       (mm-disable-multibyte)
+       (when (fboundp 'set-buffer-multibyte)
+         (let ((s (buffer-string)))
+           ;; Insert the content into unibyte buffer.
+           (erase-buffer)
+           (mm-disable-multibyte)
+           (insert s)))
       (let ((gnus-newsgroup-charset (car message-posting-charset)))
        (run-hooks 'gnus-article-decode-hook)
        (let ((gnus-newsgroup-name "dummy"))
index ea2a818..5979006 100644 (file)
@@ -98,7 +98,9 @@ encode lines starting with \"From\"."
       ;; Encode all the non-ascii and control characters.
       (goto-char (point-min))
       (while (and (skip-chars-forward
-                  (or class "^\000-\007\013\015-\037\200-\377="))
+                  ;; Avoid using 8bit characters. = is \075.
+                  ;; Equivalent to "^\000-\007\013\015-\037\200-\377="
+                  (or class "\010-\012\014\040-\074\076-\177"))
                  (not (eobp)))
        (insert
         (prog1
index 7a86311..0b10d04 100644 (file)
@@ -79,8 +79,11 @@ Valid encodings are nil, `Q' and `B'.")
   "Alist of RFC2047 encodings to encoding functions.")
 
 (defvar rfc2047-q-encoding-alist
-  '(("\\(From\\|Cc\\|To\\|Bcc\||Reply-To\\):" . "-A-Za-z0-9!*+/=_")
-    ("." . "^\000-\007\011\013\015-\037\200-\377=_?"))
+  '(("\\(From\\|Cc\\|To\\|Bcc\||Reply-To\\):" . "-A-Za-z0-9!*+/") 
+    ;; = (\075), _ (\137), ? (\077) are used in the encoded word.
+    ;; Avoid using 8bit characters. Some versions of Emacs has bug!
+    ;; Equivalent to "^\000-\007\011\013\015-\037\200-\377=_?"
+    ("." . "\010\012\014\040-\074\076\100-\136\140-\177"))
   "Alist of header regexps and valid Q characters.")
 
 ;;;
index 7778567..0f71178 100644 (file)
 ;; The smilies were drawn by Joe Reiss <jreiss@vt.edu>.
 
 (eval-when-compile (require 'cl))
-
-(require 'annotations)
-(require 'messagexmas)
 (require 'custom)
 
+(eval-and-compile
+  (when (featurep 'xemacs)
+    (require 'annotations)
+    (require 'messagexmas)))
+
 (defgroup smiley nil
-  "Turn :-)'s into real images (XEmacs)."
+  "Turn :-)'s into real images."
   :group 'gnus-visual)
 
-(defcustom smiley-data-directory (message-xmas-find-glyph-directory "smilies")
+;; FIXME: Where is the directory when using Emacs?
+(defcustom smiley-data-directory
+  (if (featurep 'xemacs)
+      (message-xmas-find-glyph-directory "smilies")
+    "/usr/local/lib/xemacs/xemacs-packages/etc/smilies")
   "*Location of the smiley faces files."
   :type 'directory
   :group 'smiley)
@@ -153,7 +159,6 @@ above them."
   :group 'smiley)
 
 (defvar smiley-glyph-cache nil)
-(defvar smiley-running-xemacs (string-match "XEmacs" emacs-version))
 
 (defvar smiley-map (make-sparse-keymap "smiley-keys")
   "Keymap to toggle smiley states.")
@@ -169,26 +174,30 @@ above them."
      ["Toggle All Smilies" (smiley-toggle-extents ,e) t])))
 
 (defun smiley-create-glyph (smiley pixmap)
-  (and
-   smiley-running-xemacs
-   (or
-    (cdr-safe (assoc pixmap smiley-glyph-cache))
-    (let* ((xpm-color-symbols
-           (and (featurep 'xpm)
-                (append `(("flesh" ,smiley-flesh-color)
-                          ("features" ,smiley-features-color)
-                          ("tongue" ,smiley-tongue-color))
-                        xpm-color-symbols)))
-          (glyph (make-glyph
-                  (list
-                   (cons (if (featurep 'gtk) 'gtk 'x)
-                         (expand-file-name pixmap smiley-data-directory))
-                   (cons 'mswindows
-                         (expand-file-name pixmap smiley-data-directory))
-                   (cons 'tty smiley)))))
-      (setq smiley-glyph-cache (cons (cons pixmap glyph) smiley-glyph-cache))
-      (set-glyph-face glyph 'default)
-      glyph))))
+  (or
+   (cdr-safe (assoc pixmap smiley-glyph-cache))
+   (let* ((xpm-color-symbols
+          (and (featurep 'xpm)
+               (append `(("flesh" ,smiley-flesh-color)
+                         ("features" ,smiley-features-color)
+                         ("tongue" ,smiley-tongue-color))
+                       xpm-color-symbols)))
+         (glyph (make-glyph
+                 (list
+                  (cons (if (featurep 'gtk) 'gtk 'x)
+                        (expand-file-name pixmap smiley-data-directory))
+                  (cons 'mswindows
+                        (expand-file-name pixmap smiley-data-directory))
+                  (cons 'tty smiley)))))
+     (setq smiley-glyph-cache (cons (cons pixmap glyph) smiley-glyph-cache))
+     (set-glyph-face glyph 'default)
+     glyph)))
+
+(defun smiley-create-glyph-ems (smiley pixmap)
+  (condition-case e
+      (create-image (expand-file-name pixmap smiley-data-directory))
+    (error nil)))
+
 
 ;;;###autoload
 (defun smiley-region (beg end)
@@ -213,6 +222,14 @@ above them."
            (reveal-annotation ant)
            (set-extent-property ext 'invisible t)))))))
 
+;; FIXME::
+(defun smiley-toggle-extent-ems (event)
+  "Toggle smiley at given point.
+Note -- this function hasn't been implemented yet."
+  (interactive "e")
+  (error "This function hasn't been implemented yet.")
+)
+
 (defun smiley-toggle-extents (e)
   (interactive "e")
   (map-extents
@@ -229,6 +246,12 @@ above them."
        nil))
    (event-buffer e)))
 
+;; FIXME::
+(defun smiley-toggle-extents-ems (e)
+  (interactive "e")
+  (error "This function hasn't been implemented yet.")
+)
+
 ;;;###autoload
 (defun smiley-buffer (&optional buffer st nd)
   (interactive)
@@ -295,6 +318,44 @@ Mouse button3 - menu"))
                  (make-annotation ")" end 'text))
                (goto-char end)))))))))
 
+;; FIXME: No popup menu, no customized color
+(defun smiley-buffer-ems (&optional buffer st nd)
+  (interactive)
+  (when window-system
+    (save-excursion
+      (when buffer
+       (set-buffer buffer))
+      (let ((buffer-read-only nil)
+           (alist (if (symbolp smiley-regexp-alist)
+                      (symbol-value smiley-regexp-alist)
+                    smiley-regexp-alist))
+           (case-fold-search nil)
+           entry regexp beg group file)
+       (dolist (overlay (overlays-in (or st (point-min))
+                                     (or nd (point-max))))
+         (when (overlay-get overlay 'smiley)
+           (remove-text-properties (overlay-start overlay)  
+                                   (overlay-end overlay) '(display))
+           (delete-overlay overlay)))
+       (goto-char (or st (point-min)))
+       (setq beg (point))
+       ;; loop through alist
+       (while (setq entry (pop alist))
+         (setq regexp (car entry)
+               group (cadr entry)
+               file (caddr entry))
+         (goto-char beg)
+         (while (re-search-forward regexp nd t)
+           (let* ((start (match-beginning group))
+                  (end (match-end group))
+                  (glyph (smiley-create-glyph nil file))
+                  (overlay (make-overlay start end)))
+             (when glyph
+               (add-text-properties start end
+                                    `(display ,glyph))
+               (overlay-put overlay 'smiley glyph)
+               (goto-char end)))))))))
+
 (defun smiley-end-paren-p (start end)
   "Try to guess whether the current smiley is an end-paren smiley."
   (save-excursion
@@ -334,6 +395,32 @@ With arg, turn displaying on if and only if arg is positive."
        (set-extent-property (cdar on) 'invisible nil)
        (setq on (cdr on))))))
 
+;; Simply removing all smiley if existing.
+;; FIXME: make it work as the one in XEmacs.
+(defun smiley-toggle-buffer-ems (&optional arg buffer st nd)
+  "Toggle displaying smiley faces.
+With arg, turn displaying on if and only if arg is positive." 
+  (interactive "P")
+  (save-excursion
+    (when buffer
+      (set-buffer buffer))
+    (let (found)
+      (dolist (overlay (overlays-in (or st (point-min))
+                                   (or nd (point-max))))
+       (when (overlay-get overlay 'smiley)
+         (remove-text-properties (overlay-start overlay)  
+                                 (overlay-end overlay) '(display))
+         (setq found t)))
+      (unless found
+       (smiley-buffer buffer st nd)))))
+
+(unless (featurep 'xemacs)
+  (defalias 'smiley-create-glyph 'smiley-create-glyph-ems)
+  (defalias 'smiley-toggle-extent 'smiley-toggle-extent-ems)
+  (defalias 'smiley-toggle-extents 'smiley-toggle-extents-ems)
+  (defalias 'smiley-buffer 'smiley-buffer-ems)
+  (defalias 'smiley-toggle-buffer 'smiley-toggle-buffer-ems))
+
 (defvar gnus-article-buffer)
 ;;;###autoload
 (defun gnus-smiley-display (&optional arg)
@@ -345,7 +432,8 @@ With arg, turn displaying on if and only if arg is positive."
     (save-restriction
       (widen)
       (article-goto-body)
-      (smiley-toggle-buffer arg (current-buffer) (point) (point-max)))))
+      (let (buffer-read-only)
+       (smiley-toggle-buffer arg (current-buffer) (point) (point-max))))))
 
 (provide 'smiley)
 
index 9e9936c..cce7352 100755 (executable)
--- a/make.bat
+++ b/make.bat
@@ -28,17 +28,22 @@ set PWD=
 \r
 if "%1" == "" goto usage\r
 \r
+rem Emacs 20.7 no longer includes emacs.bat. Use emacs.exe if the batch file is\r
+rem not present -- this also fixes the problem about too many parameters on Win9x.\r
+set emacs=emacs.exe\r
+if exist %1\bin\emacs.bat set emacs=emacs.bat\r
+\r
 cd lisp\r
-call %1\bin\emacs.bat -batch -q -no-site-file -l ./dgnushack.el -f dgnushack-compile\r
+call %1\bin\%emacs% -batch -q -no-site-file -l ./dgnushack.el -f dgnushack-compile\r
 if not "%2" == "copy" goto info\r
 attrib -r %1\lisp\gnus\*\r
 copy *.el* %1\lisp\gnus\r
 \r
 :info\r
 cd ..\texi\r
-call %1\bin\emacs.bat -batch -q -no-site-file message.texi -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer\r
-call %1\bin\emacs.bat -batch -q -no-site-file emacs-mime.texi -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer\r
-call %1\bin\emacs.bat -batch -q -no-site-file gnus.texi -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer\r
+call %1\bin\%emacs% -batch -q -no-site-file message.texi -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer\r
+call %1\bin\%emacs% -batch -q -no-site-file emacs-mime.texi -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer\r
+call %1\bin\%emacs% -batch -q -no-site-file gnus.texi -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer\r
 if not "%2" == "copy" goto done\r
 copy gnus %1\info\r
 copy gnus-?? %1\info\r
index 35e74d5..91e231f 100644 (file)
@@ -1,3 +1,22 @@
+2000-09-17 Felix Natter  <f.natter@ndh.net>
+
+       * gnusref.tex: New version.
+
+       * refcard.tex: New version.
+
+2000-09-17 18:03:52  ShengHuo ZHU  <zsh@cs.rochester.edu>
+
+       * gnus.texi (Article Hiding): Doc fix as suggested by Felix Natter
+       <fnatter@gmx.net>.
+
+2000-06-22 Michael Totschnig <michaelt@supernet.ca>
+
+       * gnus.texi (Agent Basics): Doc fix.
+
+2000-09-14 Jason R. Mastaler <jason@mastaler.com>
+
+       * gnus.texi (Mail Source Specifiers): Use $HOME.
+
 2000-08-14  Kai Grossjohann  <Kai.Grossjohann@CS.Uni-Dortmund.DE>
 
        * gnus.texi (Mail Source Specifiers): Replace `@paragraph' with
index d47674a..0025ad5 100644 (file)
@@ -6984,7 +6984,8 @@ Fonts})\e$B!#F1$8%a%C%;!<%8$NCf$KJ#?t$N5-;v$+$i$N0zMQ$,$"$k$H!"\e(Bgnus \e$B$O$=$l$
 \e$B=|$7$^$9!#$3$l$i$O$$$/$D$+$N%a!<%j%s%0%j%9%H$N%5!<%P!<$,A4$F\e(B
 \e$B$N\e(B @code{Subject} \e$B%X%C%@!<$N:G=i$K$D$1$kJ8;zNs$G$9\e(B---\e$BNc$($P!"\e(B
 @samp{[zebra 4711]}\e$B!#J8;zNs$N=i$a$K$"$k\e(B @samp{Re: } \e$B$O!":o=|$r9T$J$&A0$K\e(B
-\e$BD7$S1[$5$l$^$9!#\e(B
+\e$BD7$S1[$5$l$^$9!#\e(B@code{gnus-list-identifiers} \e$B$K\e(B @code{\\(..\\)} \e$B$r4^$a$F\e(B
+\e$B$O$$$1$^$;$s!#\e(B
 
 @table @code
 
@@ -10559,7 +10560,7 @@ POP \e$B%a!<%k%5!<%P!<!"\e(Bprocmail \e$B%G%#%l%/%H%j!<!"\e(Bmaildir \e$B$J$I$,Nc$H$7
 #  flu@@iki.fi
 
 MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail
-TMP=~/Mail/tmp
+TMP=$HOME/Mail/tmp
 rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP
 @end example
 
@@ -11505,6 +11506,7 @@ Gnus \e$B$O5-;v$rI=<($9$k$H$-$K$=$l$r@vBu$9$k$?$a$K2aEY$N4X?t$rDs6!$7$F$$$^\e(B
 \e$B@P4o;~Be$N%a!<%k%X%C%@!<$r;H$C$F$$$k?M$K$ONI$$;v$@$H;W$$$^$9!#$3$N4X?t$O\e(B
 \e$B@55,I=8=\e(B @code{nnmail-list-identifiers} \e$B$K9gCW$9$kJ8;zNs$r<h$j=|$-$^$9!#\e(B
 \e$B$=$l$O@55,I=8=$N%j%9%H$G$"$k;v$b$G$-$^$9!#\e(B
+@code{nnmail-list-identifiers} \e$B$K\e(B @code{\\(..\\)} \e$B$r4^$a$F$O$$$1$^$;$s!#\e(B
 
 \e$BNc$($P!"\e(B@samp{(idm)} \e$B$H\e(B @samp{nagnagnag} \e$BF10l<1JL;R$r<h$j=|$-$?$$$N$J$i\e(B:
 
@@ -13598,9 +13600,9 @@ Gnus \e$B$r\e(B @code{gnus-unplugged} \e$B$G5/F0$7$^$9!#$3$l$O\e(B gnus \e$B%(!<%8%'%
 @item
 \e$B$=$7$F!"$=$N>l$G$9$0$K?7$7$$%K%e!<%9$rFI$`$3$H$b$G$-$^$9$7!"%K%e!<%9$r%m!<\e(B
 \e$B%+%k%^%7%s$K%@%&%s%m!<%I$9$k$3$H$b$G$-$^$9!#8e<T$r<B9T$7$?$1$l$P!"\e(B
-@kbd{J s} \e$B$r2!$7$F!"A4%0%k!<%W$+$iE,@Z$J5-;v$rA4$F<hF@$7$^$9!#\e(B(Gnus \e$B$K$I\e(B
-\e$B$N5-;v$r%@%&%s%m!<%I$7$?$$$+$r;XDj$9$k$K$O\e(B @pxref{Agent Categories} \e$B$r;2\e(B
-\e$B>H$7$F$/$@$5$$!#\e(B)
+@kbd{g} \e$B$r2!$7$F?7Ce%a!<%k$r8!::$7$F$+$i\e(B @kbd{J s} \e$B$GA4%0%k!<%W$+$iE,@Z\e(B
+\e$B$J5-;v$rA4$F<hF@$7$^$9!#\e(B(Gnus \e$B$K$I$N5-;v$r%@%&%s%m!<%I$7$?$$$+$r;XDj$9$k\e(B
+\e$B$K$O\e(B @pxref{Agent Categories} \e$B$r;2>H$7$F$/$@$5$$!#\e(B)
 
 @item
 \e$B5-;v$r<hF@$7$?8e$O\e(B @kbd{J j} \e$B$r2!$7$F!"\e(Bgnus \e$B$r:F$S@Z$jN%$7>uBV$K$5$;!"\e(B
index 4adc42d..31b8c96 100644 (file)
@@ -7130,10 +7130,11 @@ Signature}.
 @kindex W W l (Summary)
 @findex gnus-article-hide-list-identifiers
 @vindex gnus-list-identifiers
-Strip list identifiers specified in @code{gnus-list-identifiers}.
-These are strings some mailing list servers add to the beginning of
-all @code{Subject} headers---for example, @samp{[zebra 4711]}.  Any
-leading @samp{Re: } is skipped before stripping.
+Strip list identifiers specified in @code{gnus-list-identifiers}.  These
+are strings some mailing list servers add to the beginning of all
+@code{Subject} headers---for example, @samp{[zebra 4711]}.  Any leading
+@samp{Re: } is skipped before stripping. @code{gnus-list-identifiers}
+may not contain @code{\\(..\\)}.
 
 @table @code
 
@@ -11080,7 +11081,7 @@ The @samp{getmail} script would look something like the following:
 #  flu@@iki.fi
 
 MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail
-TMP=~/Mail/tmp
+TMP=$HOME/Mail/tmp
 rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP
 @end example
 
@@ -12067,7 +12068,8 @@ Some list servers add an identifier---for example, @samp{(idm)}---to the
 beginning of all @code{Subject} headers.  I'm sure that's nice for
 people who use stone age mail readers.  This function will remove
 strings that match the @code{nnmail-list-identifiers} regexp, which can
-also be a list of regexp.
+also be a list of regexp.  @code{nnmail-list-identifiers} may not contain
+@code{\\(..\\)}.
 
 For instance, if you want to remove the @samp{(idm)} and the
 @samp{nagnagnag} identifiers:
@@ -14176,7 +14178,8 @@ Source Specifiers}).
 
 @item
 You can then read the new news immediately, or you can download the news
-onto your local machine.  If you want to do the latter, you press @kbd{J
+onto your local machine.  If you want to do the latter, you press @kbd{g}
+to check if there are any new news and then @kbd{J
 s} to fetch all the eligible articles in all the groups.  (To let Gnus
 know which articles you want to download, @pxref{Agent Categories}.)
 
index 0ee9168..b8e863d 100644 (file)
-% include file for the Gnus refcard and booklet
+% -*- mode: latex; TeX-master: "refcard.tex" -*-
+                                % include file for the Gnus refcard and booklet
 \newlength{\keycolwidth}
 \newenvironment{keys}[1]% #1 is the widest key
-  {\nopagebreak%\noindent%
-   \settowidth{\keycolwidth}{#1}%
-   \addtolength{\keycolwidth}{\tabcolsep}%
-   \addtolength{\keycolwidth}{-\columnwidth}%
-   \begin{tabular}{@{}l@{\hspace{\tabcolsep}}p{-\keycolwidth}@{}}}%
+{\nopagebreak%\noindent%
+  \settowidth{\keycolwidth}{#1}%
+  \addtolength{\keycolwidth}{\tabcolsep}%
+  \addtolength{\keycolwidth}{-\columnwidth}%
+  \begin{tabular}{@{}l@{\hspace{\tabcolsep}}p{-\keycolwidth}@{}}}%
   {\end{tabular}\\}
 
-% uncomment the first definition if you do not want pagebreaks in maps
-%\newcommand{\esamepage}{\samepage}
+                                % 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}{%
-\begin{center}
-{\bf\LARGE Gnus \progver\ Reference \Guide\\}
-%{\normalsize \Guide\ version \refver}
-\end{center}
-}
+  \begin{center}
+    {\bf\LARGE Gnus \progver\ Reference \Guide\\}
+                                %{\normalsize \Guide\ version \refver}
+  \end{center}
+  }
 
 \newcommand*{\Logo}[1]{\centerline{%
-\makebox[\logoscale\logowidth][l]{\vbox to \logoscale\logoheight
-{\vfill\special{psfile=gnuslogo.#1}}\vspace{-\baselineskip}}}}
+    \makebox[\logoscale\logowidth][l]{\vbox to \logoscale\logoheight
+      {\vfill\special{psfile=gnuslogo.#1}}\vspace{-\baselineskip}}}}
 
 \newcommand{\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).\\*
-Gnus logo copyright \copyright\ 1995 Luis Fernandes.\\*
-\end{center}
-
-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.
-}
+  \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).\\*
+    Gnus logo copyright \copyright\ 1995 Luis Fernandes.\\*
+  \end{center}
+
+  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.
+  }
 
 \newcommand{\Notes}{%
-\subsection*{Notes}
-{\esamepage
-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
-have 3 or even 4 bindings. The total number of keybindings is 389. So in
-order to save 40\% space, every function is listed only once on this
-\guide, under the ``more logical'' binding. Alternative bindings are given
-in parentheses in the beginning of the description.
-
-Many Gnus commands are affected by the numeric prefix. Normally you enter a
-prefix by holding the Meta key and typing a number, but in most Gnus modes
-you don't need to use Meta since the digits are not self-inserting. The
-prefixed behavior of commands is given in [brackets]. Often the prefix is
-used to specify:
-
-\quad [distance] How many objects to move the point over.
-
-\quad [scope] How many objects to operate on (including the current one).
-
-\quad [p/p] The ``Process/Prefix Convention'': If a prefix is given then it
-determines how many objects to operate on. Else if there are some objects
-marked with the process mark \#, these are operated on. Else only the
-current object is affected.
-
-\quad [level] A group subscribedness level. Only groups with a lower or
-equal level will be affected by the operation. If no prefix is given,
-`gnus-group-default-list-level' is used.  If
-`gnus-group-use-permanent-levels', then a prefix to the `g' and `l'
-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
-\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}
-}}
+  \subsection*{Notes}
+  {\esamepage
+    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
+    have 3 or even 4 bindings. The total number of keybindings is 389. So in
+    order to save 40\% space, every function is listed only once on this
+    \guide, under the ``more logical'' binding. Alternative bindings are given
+    in parentheses in the beginning of the description.
+
+    Many Gnus commands are affected by the numeric prefix. Normally you enter a
+    prefix by holding the Meta key and typing a number, but in most Gnus modes
+    you don't need to use Meta since the digits are not self-inserting. The
+    prefixed behavior of commands is given in [brackets]. Often the prefix is
+    used to specify:
+
+    \quad [distance] How many objects to move the point over.
+
+    \quad [scope] How many objects to operate on (including the current one).
+
+    \quad [p/p] The ``Process/Prefix Convention'': If a prefix is given then it
+    determines how many objects to operate on. Else if there are some objects
+    marked with the process mark \#, these are operated on. Else only the
+    current object is affected.
+
+    \quad [level] A group subscribedness level. Only groups with a lower or
+    equal level will be affected by the operation. If no prefix is given,
+    `gnus-group-default-list-level' is used.  If
+    `gnus-group-use-permanent-levels', then a prefix to the `g' and `l'
+    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
+    \begin{keys}{C-c C-i}
+      M-x gnus           & start Gnus. \\
+      M-x gnus-no-server & start Gnus without trying to connect to server
+      (i.e. to read mail). \\
+      M-x gnus-unplugged & start Gnus in \texttt{unplugged}-mode
+      (first see the manual, C-c C-i g Gnus Unplugged RET).\\
+                                %
+      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}{%
-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  &              \\
-\hline
-6 &                     & unsubscribed \\
-7 &                     &              \\
-\hline
-8 &                     & zombies      \\
-\hline
-9 &                     & killed       \\
-\hline
-\end{tabular}}
+  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  &              \\
+    \hline
+    6 &                     & unsubscribed \\
+    7 &                     &              \\
+    \hline
+    8 &                     & zombies      \\
+    \hline
+    9 &                     & killed       \\
+    \hline
+  \end{tabular}}
 
 \newcommand{\MarkCharacters}{%
-{\esamepage If a command directly sets a mark, it is shown in parentheses.\\*
-\newlength{\markcolwidth}
-\settowidth{\markcolwidth}{` '}% widest character
-\addtolength{\markcolwidth}{4\tabcolsep}
-\addtolength{\markcolwidth}{-\columnwidth}
-\newlength{\markdblcolwidth}
-\setlength{\markdblcolwidth}{\columnwidth}
-\addtolength{\markdblcolwidth}{-2\tabcolsep}
-\begin{tabular}{|c|p{-\markcolwidth}|}
-\hline
-\multicolumn{2}{|p{\markdblcolwidth}|}{{\bf ``Read'' Marks.}
-  All these marks appear in the first column of the summary line, and so
-  are mutually exclusive.}\\ 
-\hline
-` ' & (M-u, M SPC, M c) Not read.\\
-!   & (!, M !, M t) Ticked (interesting).\\
-?   & (?, M ?) Dormant (only followups are interesting).\\
-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.
-  Some commands however explicitly differentiate between them (e.g.\ M
-  M-C-r, adaptive scoring).}\\
-\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).\\
-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}}\\
-\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]\\
-\hline
-\end{tabular}
-}}
+  {\esamepage If a command directly sets a mark, it is shown in parentheses.\\*
+    \newlength{\markcolwidth}
+    \settowidth{\markcolwidth}{` '}% widest character
+    \addtolength{\markcolwidth}{4\tabcolsep}
+    \addtolength{\markcolwidth}{-\columnwidth}
+    \newlength{\markdblcolwidth}
+    \setlength{\markdblcolwidth}{\columnwidth}
+    \addtolength{\markdblcolwidth}{-2\tabcolsep}
+    \begin{tabular}{|c|p{-\markcolwidth}|}
+      \hline
+      \multicolumn{2}{|p{\markdblcolwidth}|}{{\bf ``Read'' Marks.}
+        All these marks appear in the first column of the summary line, and so
+        are mutually exclusive.}\\ 
+      \hline
+      ` ' & (M-u, M SPC, M c) Not read.\\
+      !   & (!, M !, M t) Ticked (interesting).\\
+      ?   & (?, M ?) Dormant (only followups are interesting).\\
+      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.
+        Some commands however explicitly differentiate between them (e.g.\ M
+        M-C-r, adaptive scoring).}\\
+      \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).\\
+      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}}\\
+      \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]\\
+      \hline
+    \end{tabular}
+    }}
 
 \newcommand{\GroupModeGeneral}{%
-\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.]\\
-?       & 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.\\
-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}).\\
-s       & {\bf Save} the `.newsrc.eld' file (and `.newsrc' if
-`gnus-save-newsrc-file').\\ 
-z       & Suspend (kill all buffers of) Gnus.\\
-B       & {\bf Browse} a foreign server.\\
-C       & Mark all articles in this group as read ({\bf Catch-up}). [p/p]\\
-F       & {\bf Find} new groups and process them.\\
-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.\\
-Z       & Clear the dribble buffer.\\
-M-c     & Clear data from group (marks and list of read articles). \\
-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]\\
-\end{keys}
-}
+  \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:
+    view 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.]\\
+    ?       & 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.\\
+    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}).\\
+    s       & {\bf Save} the `.newsrc.eld' file (and `.newsrc' if
+    `gnus-save-newsrc-file').\\ 
+    z       & Suspend (kill all buffers of) Gnus.\\
+    B       & {\bf Browse} a foreign server.\\
+    C       & Mark all articles in this group as read ({\bf Catch-up}). [p/p]\\
+    F       & {\bf Find} new groups and process them.\\
+    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.\\
+    Z       & Clear the dribble buffer.\\
+    M-c     & Clear data from group (marks and list of read articles). \\
+    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]\\
+  \end{keys}
+  }
 
 \newcommand{\ListGroups}{%
-{\esamepage
-\begin{keys}{A M}
-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. 
-[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.\\
-\end{keys}
-}
-
-\newcommand{\CreateEditGroups}{%
-{\esamepage
-The select methods are indicated in parentheses.\\*
-\begin{keys}{G DEL}
-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 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
-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}{%
-\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}
-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}.\\
-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}}}
-
-\newcommand{\SummaryModeGeneral}{%
-{\esamepage
-\begin{keys}{M-RET}
-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]\\
-M-\&    & Execute a command on all articles having the process mark.\\
-%
-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-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
-\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
-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 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 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
-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 n     & (n) Go to the {\bf next} unread article.\\
-G p     & (p) Go to the {\bf previous} unread article.\\
-%
-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
-\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
-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]\\
-%
-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.\\ 
-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.\\
-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-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}
-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}}}
+  {\esamepage
+    \begin{keys}{A M}
+      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. 
+      [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.\\
+    \end{keys}
+    }
+
+  \newcommand{\CreateEditGroups}{%
+    {\esamepage
+      The select methods are indicated in parentheses.\\*
+      \begin{keys}{G DEL}
+        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 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
+      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}{%
+    \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}
+        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}.\\
+        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}
+      }
+    }
+
+  \newcommand{\SummaryModeGeneral}{%
+    {\esamepage
+      \begin{keys}{M-RET}
+        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]\\
+        M-\&    & Execute a command on all articles having the process mark.\\
+                                %
+        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-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
+      \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
+      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 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 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      & \textbf{edit} message.\\
+        D s      & \textbf{Send} message. [p/p]\\
+        D S      & \textbf{Send} all messages.\\
+        D t      & \textbf{Toggle} sending (mark as unsendable).\\
+        B DEL    & \textbf{Delete} message (like in mailgroup).\\
+      \end{keys}
+      }
+    }
+
+  \newcommand{\SelectArticles}{% formerly \Gsubmap
+    {\esamepage
+      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 n     & (n) Go to the {\bf next} unread article.\\
+        G p     & (p) Go to the {\bf previous} unread article.\\
+                                %
+        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
+      \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
+        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]\\
+                                %
+        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.\\ 
+        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.\\
+        M C-c   & {\bf Catch-up} all articles in this group.\\
+        M H     & {\bf 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-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}
+      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}
+    }
+  }
 
 \newcommand{\ProcessMark}{%
-{\esamepage 
-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 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 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}}}
+  {\esamepage 
+    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 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 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}}}
+  {\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
-\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 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}}}
+  {\esamepage
+    \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 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.\\* 
-\begin{keys}{S O m}
-S p     & (a) {\bf Post} an article to this group.\\
-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 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).\\
-%
-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.\\
-\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.
-}}
+  {\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.\\* 
+    \begin{keys}{S O m}
+      S p     & (a) {\bf Post} an article to this group.\\
+      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 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).\\
+                                %
+      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.\\
+    \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-\#}
-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 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 H     & {\bf Hide} all threads.\\
-T S     & {\bf Show} all hidden threads.\\
-T T     & (M-C-t) {\bf Toggle} threading.\\
-\end{keys}}}
+  {\esamepage
+    \begin{keys}{T M-\#}
+      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 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 H     & {\bf Hide} all threads.\\
+      T S     & {\bf Show} all hidden threads.\\
+      T T     & (M-C-t) {\bf Toggle} threading.\\
+    \end{keys}
+    }
+  }
 
 \newcommand{\Scoring}{% formerly \Vsubmap
-{\esamepage
-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.\\
-V c     & Specify a new score file as {\bf current}.\\
-V e     & {\bf Edit} the current score alist.\\
-V f     & Edit a score {\bf file} and make it the current one.\\
-V m     & {\bf Mark} all articles below a given score as read.\\
-V s     & Set the {\bf score} of this article.\\
-V t     & Display all score rules applied to this article ({\bf track}).\\
-V x     & {\bf Expunge} all low-scored articles. [score]\\
-V C     & {\bf Customize} the current score file through a user-friendly
-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,
-message-i)d, t)references (parent), f)ollowup, b)ody, h)ead (all headers);\\*
-\quad \B{m}atch type:\\*
-\qquad string: s)ubstring, e)xact, r)egexp, f)uzzy,\\*
-\qquad date: b)efore, a)t, n)this,\\*
-\qquad number: $<$, =, $>$;\\*
-\quad \B{l}ifetime: t)emporary, p)ermanent, i)mmediate.
-
-If you type the second letter in uppercase, the remaining two are assumed
-to be s)ubstring and t)emporary. 
-If you type the third letter in uppercase, the last one is assumed to be 
-t)emporary.
-
-\quad Extra keys for manual editing of a score file:\\*
-\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}}}
+  {\esamepage
+    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.\\
+      V c     & Specify a new score file as {\bf current}.\\
+      V e     & {\bf Edit} the current score alist.\\
+      V f     & Edit a score {\bf file} and make it the current one.\\
+      V m     & {\bf Mark} all articles below a given score as read.\\
+      V s     & Set the {\bf score} of this article.\\
+      V t     & Display all score rules applied to this article ({\bf track}).\\
+      V x     & {\bf Expunge} all low-scored articles. [score]\\
+      V C     & {\bf Customize} the current score file through a user-friendly
+      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,
+    message-i)d, t)references (parent), f)ollowup, b)ody, h)ead (all headers);\\*
+    \quad \B{m}atch type:\\*
+    \qquad string: s)ubstring, e)xact, r)egexp, f)uzzy,\\*
+    \qquad date: b)efore, a)t, n)this,\\*
+    \qquad number: $<$, =, $>$;\\*
+    \quad \B{l}ifetime: t)emporary, p)ermanent, i)mmediate.
+
+    If you type the second letter in uppercase, the remaining two are assumed
+    to be s)ubstring and t)emporary. 
+    If you type the third letter in uppercase, the last one is assumed to be 
+    t)emporary.
+
+    \quad Extra keys for manual editing of a score file:\\*
+    \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}
+    }
+  }
 
 \newcommand{\ExtractSeries}{% formerly \Xsubmap
-{\esamepage
-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
-process more than one series at a time. If the posting contains any
-archives, they are expanded and gathered in a new group.\\*
-\begin{keys}{X p}
-X b     & Un-{\bf binhex} these series. [p/p]\\
-X o     & Simply {\bf output} these series (no decoding). [p/p]\\ 
-X p     & Unpack these {\bf postscript} series. [p/p]\\
-X s     & Un-{\bf shar} these series. [p/p]\\
-X u     & {\bf Uudecode} these series. [p/p]\\
-\end{keys}
-
-Each one of these commands has four variants:\\*
-\begin{keys}{X v \bf Z}
-X   \bf z & Decode these series. [p/p]\\
-X   \bf Z & Decode and save these series. [p/p]\\
-X v \bf z & Decode and view these series. [p/p]\\
-X v \bf Z & Decode, save and view these series. [p/p]\\
-\end{keys}
-where {\bf z} or {\bf Z} identifies the decoding method (b, o, p, s, u).
-
-An alternative binding for the most-often used of these commands is\\*
-\begin{keys}{C-c C-v C-v}
-C-c C-v C-v & (X v u) Uudecode and view these series. [p/p]\\
-\end{keys}
-}}
+  {\esamepage
+    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
+    process more than one series at a time. If the posting contains any
+    archives, they are expanded and gathered in a new group.\\*
+    \begin{keys}{X p}
+      X b     & Un-{\bf binhex} these series. [p/p]\\
+      X o     & Simply {\bf output} these series (no decoding). [p/p]\\ 
+      X p     & Unpack these {\bf postscript} series. [p/p]\\
+      X s     & Un-{\bf shar} these series. [p/p]\\
+      X u     & {\bf Uudecode} these series. [p/p]\\
+    \end{keys}
+
+    Each one of these commands has four variants:\\*
+    \begin{keys}{X v \bf Z}
+      X   \bf z & Decode these series. [p/p]\\
+      X   \bf Z & Decode and save these series. [p/p]\\
+      X v \bf z & Decode and view these series. [p/p]\\
+      X v \bf Z & Decode, save and view these series. [p/p]\\
+    \end{keys}
+    where {\bf z} or {\bf Z} identifies the decoding method (b, o, p, s, u).
+
+    An alternative binding for the most-often used of these commands is\\*
+    \begin{keys}{C-c C-v C-v}
+      C-c C-v C-v & (X v u) Uudecode and view these series. [p/p]\\
+    \end{keys}
+    }}
 
 \newcommand{\ExitSummary}{% formerly \Zsubmap
-{\esamepage
-\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 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}}}
+  {\esamepage
+    \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 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}
+    }
+  }
 
 \newcommand{\MsgCompositionGeneral}{%
-Press C-c ? in the composition-buffer to get this information.
-{\esamepage
-\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}}}
+  Press C-c ? in the composition-buffer to get this information.
+  {\esamepage
+    \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}}}
+  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}}}
+  {\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.\\*
-\begin{keys}{SPC}
-SPC     & (RET) Browse this server.\\
-a       & {\bf Add} a new server.\\
-c       & {\bf Copy} this server.\\
-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}}}
+  {\esamepage
+    To enter this mode, press `\^' while in Group mode.\\*
+    \begin{keys}{SPC}
+      SPC     & (RET) Browse this server.\\
+      a       & {\bf Add} a new server.\\
+      c       & {\bf Copy} this server.\\
+      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}
+    }
+  }
 
 \newcommand{\BrowseServer}{%
-{\esamepage
-To enter this mode, press `B' while in Group mode.\\*
-\begin{keys}{RET}
-RET     & Enter the current group.\\
-SPC     & Enter the current group and display the first article.\\
-?       & Give a very short help message.\\
-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}}}
+  {\esamepage
+    To enter this mode, press `B' while in Group mode.\\*
+    \begin{keys}{RET}
+      RET     & Enter the current group.\\
+      SPC     & Enter the current group and display the first article.\\
+      ?       & Give a very short help message.\\
+      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}
+    }
+  }
+
+\newcommand{\GroupUnplugged}{%
+  {\esamepage
+    \begin{keys}{J S}
+      J j & Toggle plugged-state.\\
+      J s & Fetch articles from current group.\\
+      J s & Fetch articles from all groups for offline-reading.\\
+      J S & \textbf{Send} all sendable messages in the drafts group.\\
+                                %
+      J c & Enter \textbf{category} buffer.\\
+      J a & \textbf{Add} this group to an Agent category [p/p].\\
+      J r & \textbf{Remove} this group from its Agent category [p/p].\\
+    \end{keys}
+    }
+  }
+
+\newcommand{\SummaryUnplugged}{%
+  {\esamepage
+    \begin{keys}{J M-\#}
+      J \#   & \textbf{Mark} the article for downloading.\\
+      J M-\# & \textbf{Unmark} the article for downloading.\\
+      @      & \textbf{Toggle} whether to download the article.\\
+      J c    & Mark all undownloaded articles as read (\textbf{catch-up}).\\
+    \end{keys}
+    }
+  }
+
+\newcommand{\ServerUnplugged}{%
+  {\esamepage
+    \begin{keys}{J a}
+      J a & \textbf{Add} the current server to the list of servers covered
+      by the agent.\\
+      J r & \textbf{Remove} the current server from the list of servers covered
+      by the agent.\\
+    \end{keys}
+    }
+  }
index f5ce217..5e5731f 100644 (file)
@@ -1,5 +1,5 @@
 % -*- latex -*-
-% Reference Card for (ding) Gnus: to be processed with LaTeX2e
+% Reference Card for (ding) Gnus 5.8.x: to be processed with LaTeX2e
 \documentclass{article}
 \def\Guide{Card}\def\guide{card}
 \def\logoscale{0.25}
@@ -8,41 +8,77 @@
 % top and bottom of the page. 
 \oddsidemargin -0.5in \evensidemargin -0.5in
 
-% TODO:
-% - how can you get 'tabular' to wrap around pages ?
-% - some things might not be updated: scoring and server modes, maybe more
+% README:
+% *** purpose
+% this was originally thought of as a reference card, but as it is now 5+
+% pages long, I doubt that it is more useful than the online-help. It helped
+% to get an overview for the Gnus-functionality.
+%
+% *** files
+% refcard.tex (this file), gnusref.tex ("include"-file) and gnuslogo.refcard
+% (Gnus logo).
+%
+% *** printing (about 5 pages now: write me if you can make it shorter..)
+% if you are using latex-mode, you do C-c C-f (process with latex),
+% C-c C-v (view using xdvi/dvi2tty) and C-c C-p (print)
+% the original author has set up the page dimensions cleverly so that this
+% should print on both letter and a4 (see note above)
+% $latex refcard.tex
+% this creates a file refcard.dvi which you can preview using
+% $xdvi refcard.dvi [C-c C-v]
+% and print using something like
+% $dvips refcard.dvi 
+% which creates refcard.ps (print using 'lpr refcard.ps')
+%
+% *** customization:
+% the part following \begin{document} in this file consists of a macro for
+% each section and section-headers (\section*{..}). It should be easy to
+% reorder things and/or remove sections (put '%' at the beginning of the line).
+% (i.e. you might want to omit \notes in the printed version ?)
+% If you think that the order is not logical and you have ideas for
+% improvements, please send mail to the current maintainer.
+%
+% *** ChangeLog:
+% 2000-03-26  Felix Natter  <fnatter@gmx.net>:
+% refcard updated for Gnus 5.8.x: please send corrections or suggestions
+% to the above email-address
+% changes since 2000-03-26:
+% o Create/Edit Foreign Groups: remove S b and S B (not available in 5.8.3)
+% o Send/Reply etc.: remove w and W (the only bindings are S w and S W)
+% Mon Apr  3 18:41:09 2000:
+% o added C-c C-n and C-c C-t (Article)
+% o C-c C-a as alias for M-m f (Article) + some other M-m *-bindings
+% o added section for ``jumping'' in article-mode
+% o now there's a difference between ``reading'' and ``composition''
+% (article-modes)
+% Apr 24th, 2000:
+% o added D s, D S and D t for nndraft
+% o group-mode: i.e. C-u RET does not actually fetch fewer articles; also ,=>;
+% Fri Jul 14 23:15:43 2000:
+% o added README-section
+% Thu Jul 27 20:51:01 2000:
+% o added Unplugged-commands
+%
+% *** TODO:
+% o (LaTeX) how can you get 'tabular' to wrap around pages ?
+% o some things might not be updated: scoring and server modes, maybe more
+% o Gnus Unplugged category-buffer commands need to be written
 
 \begin{document}
-\newlength{\logowidth}
-\setlength{\logowidth}{6.861in}
-\newlength{\logoheight}
-\setlength{\logoheight}{7.013in}
+\newlength{\logowidth} \setlength{\logowidth}{6.861in}
+\newlength{\logoheight} \setlength{\logoheight}{7.013in}
 
-\def\progver{5.8}\def\refver{5.8} % program and refcard versions
-\def\date{26th of March 2000}
+\def\progver{5.8}\def\refver{5.8-4} % program and refcard versions
+\def\date{July 27th, 2000}
 \def\author{Vladimir Alexiev $<$vladimir@cs.ualberta.ca$>$}
 \raggedbottom\raggedright
-%
-% 2000-03-26  Felix Natter  <f.natter@ndh.net>:
-% refcard updated for Gnus 5.8.3: please send corrections or suggestions
-% to the above email-address
-
-% changes since 2000-03-26:
-% - Create/Edit Foreign Groups: remove S b and S B (not there in 5.8.3)
-% - Send/Reply etc.: remove w and W (the only bindings are S w and S W)
-% Mon Apr  3 18:41:09 2000:
-% - added C-c C-n and C-c C-t (Article)
-% - C-c C-a as alias for M-m f (Article) + some other M-m *-bindings
-% - added section for ``jumping'' in article-mode
-% - now there's a difference between ``reading'' and ``composition''
-% article-modes
 
 \twocolumn
 %\tiny
 \scriptsize
 \pagestyle{plain}
 
-% this contains a set of commands containing the actual key-sequences
+% this contains a set of commands containing the actual sections
 % (and some explanations).
 \input{gnusref}
 
 %
 \section*{Group-Mode}
 \GroupModeGeneral
-       \subsection*{Group Subscribedness-Levels}
-       \GroupLevels
-       \subsection*{List Groups}
-       \ListGroups
-       \subsection*{Create/Edit Foreign Groups}
-       \CreateEditGroups
-       \subsection*{Unsubscribe, Kill and Yank Groups}
-       \SubscribeKillYankGroups
-       \subsection*{Mark Groups}
-       \MarkGroups
+    \subsection*{Group Subscribedness-Levels}
+    \GroupLevels
+    \subsection*{List Groups}
+    \ListGroups
+    \subsection*{Create/Edit Foreign Groups}
+    \CreateEditGroups
+    \subsection*{Unsubscribe, Kill and Yank Groups}
+    \SubscribeKillYankGroups
+    \subsection*{Mark Groups}
+    \MarkGroups
+    \subsection*{Group-Unplugged}
+    \GroupUnplugged
 % topics in group-mode
-       \subsection*{Group Topics}
-       \GroupTopicsGeneral
-       \subsubsection*{Topic Sorting}
-       \TopicSorting
+    \subsection*{Group Topics}
+    \GroupTopicsGeneral
+    \subsubsection*{Topic Sorting}
+    \TopicSorting
+%
 % summary-mode
 \section*{Summary-Mode}
 \SummaryModeGeneral
-       \subsection*{Select Articles}
-       \SelectArticles
-%
-       \subsection*{Threading}
-       \Threading
-%
-       \subsection*{Limiting}
-       \Limiting
-       \subsection*{Sort the Summary-Buffer}
-       \SortSummary
-       \subsection*{Score (Value) Commands}
-       \Scoring
+    \subsection*{Select Articles}
+    \SelectArticles
+%
+    \subsection*{Threading}
+    \Threading
+%
+    \subsection*{Limiting}
+    \Limiting
+    \subsection*{Sort the Summary-Buffer}
+    \SortSummary
+    \subsection*{Score (Value) Commands}
+    \Scoring
 % 
-       \subsection*{MIME operations from the Summary-Buffer}
-       \MIMESummary
-       \subsection*{Extract Series (Uudecode etc)}
-       \ExtractSeries
-       \subsection*{Output Articles}
-       \OutputArticles
-%
-       \subsection*{Post, Followup, Reply, Forward, Cancel}
-       \PostReplyetc
-       \subsection*{Message-Composition}
-       \MsgCompositionGeneral
-               \subsubsection*{Jumping in message-buffer}
-               \MsgCompositionMovementArticle
-               \subsubsection*{Attachments/MML}
-               \MsgCompositionMML
+    \subsection*{MIME operations from the Summary-Buffer}
+    \MIMESummary
+    \subsection*{Extract Series (Uudecode etc)}
+    \ExtractSeries
+    \subsection*{Output Articles}
+    \OutputArticles
+%
+    \subsection*{Post, Followup, Reply, Forward, Cancel}
+    \PostReplyetc
+    \subsection*{Message-Composition}
+    \MsgCompositionGeneral
+        \subsubsection*{Jumping in message-buffer}
+        \MsgCompositionMovementArticle
+        \subsubsection*{Attachments/MML}
+        \MsgCompositionMML
 % marking articles
-       \subsection*{Mark Articles}
-       \MarkArticlesGeneral
-               \subsubsection*{Mark Based on Score}
-               \MarkByScore
-               \subsubsection*{The Process Mark}
-               \ProcessMark
-               \subsubsection*{Mark Indication-Characters}
-               \MarkCharacters
-%
-       \subsection*{Mail-Group Commands}
-       \MailGroups
-       \subsection*{Draft-Group Commands}
-       \DraftGroup
+    \subsection*{Mark Articles}
+    \MarkArticlesGeneral
+        \subsubsection*{Mark Based on Score}
+        \MarkByScore
+        \subsubsection*{The Process Mark}
+        \ProcessMark
+        \subsubsection*{Mark Indication-Characters}
+        \MarkCharacters
+%
+    \subsection*{Summary-Unplugged}
+    \SummaryUnplugged
+    \subsection*{Mail-Group Commands}
+    \MailGroups
+    \subsection*{Draft-Group Commands}
+    \DraftGroup
 % exiting
-       \subsection*{Exit the Summary-Buffer}
-       \ExitSummary
+    \subsection*{Exit the Summary-Buffer}
+    \ExitSummary
 %
 %
 \section*{Article Mode (reading)}
 \ArticleModeGeneral
-       \subsection*{Wash the Article-Buffer}
-       \WashArticle
-       \subsection*{Hide/Highlight Parts of the Article}
-       \HideHighlightArticle
-       \subsection*{MIME operations from the Article-Buffer (reading)}
-       \MIMEArticleMode
+    \subsection*{Wash the Article-Buffer}
+    \WashArticle
+    \subsection*{Hide/Highlight Parts of the Article}
+    \HideHighlightArticle
+    \subsection*{MIME operations from the Article-Buffer (reading)}
+    \MIMEArticleMode
 %
 %
 \section*{Server Mode}
 \ServerMode
+    \subsection*{Unplugged-Server}
+    \ServerUnplugged
 %
 %
 \section*{Browse Server Mode}
 
 \end{document}
 
-% \SummaryMode
-% \Gsubmap
-% \Bsubmap
-% \Dsubmap
-% \Tsubmap
-% %\pagebreak
-% % page 2, right column
-% \Msubmap
-% \Marks
-% %\pagebreak
-% \Limiting
-% % page 3
-% \Osubmap
-% \Ssubmap
-% \Xsubmap
-% \Vsubmap
-% \SortSummary
-% \Zsubmap
-% \ArticleMode
-% \ServerMode
-% % page 4
-% \BrowseServer