*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 06:29:16 +0000 (06:29 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 06:29:16 +0000 (06:29 +0000)
12 files changed:
lisp/ChangeLog
lisp/Makefile
lisp/gnus-cache.el
lisp/gnus-msg.el
lisp/gnus-setup.el
lisp/gnus-uu.el
lisp/gnus.el
lisp/nndoc.el
lisp/nnheader.el
texi/ChangeLog
texi/gnusref.tex [new file with mode: 0644]
texi/refcard.tex

index b31f03a..5d806d5 100644 (file)
@@ -1,9 +1,45 @@
+Sun Dec 10 10:38:47 1995  Lars Magne Ingebrigtsen  <larsi@narfi.ifi.uio.no>
+
+       * gnus.el (gnus-backlog-shutdown): New function.
+       (gnus-backlog-buffer): Would return a list the first time called. 
+
+       * gnus-msg.el (gnus-summary-send-draft): Didn't manage to actually
+       post anything.
+       (gnus-summary-cancel-article): Would bug out when canceling
+       canceled articles.
+
+       * gnus.el (gnus-create-xref-hashtb): Wouldn't mark component
+       groups as read. 
+       (gnus-method-option-p): Only checked 'post.
+
+Sun Dec 10 07:18:56 1995  David K}gedal  <davidk@lysator.liu.se>
+
+       * gnus-cache.el (gnus-cache-generate-active): Didn't work.
+
+Sun Dec 10 10:01:06 1995  Lars Magne Ingebrigtsen  <larsi@narfi.ifi.uio.no>
+
+       * gnus-setup.el (gnus-use-bbdb): `gnus-startup-hook' wasn't
+       quoted. 
+
+Sun Dec 10 06:37:45 1995  Lars Ingebrigtsen  <lars@eyesore.no>
+
+       * nndoc.el: Reimplemented most of this file.
+
+Sat Dec  9 16:35:54 1995  Lars Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus.el (gnus-summary-setup-buffer): Didn't set
+       `gnus-summary-buffer' reliably. 
+       (gnus-summary-enter-digest-group): Use the original article
+       buffer. 
+
 Sat Dec  9 10:59:52 1995  Lars Magne Ingebrigtsen  <larsi@narfi.ifi.uio.no>
 
        * gnus.el (gnus-group-expire-articles): Wrong arguments.
 
        * nnmail.el (nnmail-time-less): Didn't return proper times.
 
+       * gnus.el: 0.20 is released.
+
 Sat Dec  9 08:50:34 1995  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
 
        * gnus.el (gnus-update-marks): Chop off nils at the end of group
index 406d4c6..fa3aced 100644 (file)
@@ -12,4 +12,4 @@ tags:
        etags *.el
 
 separately:
-       rm -f *.elc ; for i in *.el; do $(EMACS) $(FLAGS) -f batch-byte-compile $i; done
\ No newline at end of file
+       rm -f *.elc ; for i in *.el; do $(EMACS) $(FLAGS) -f batch-byte-compile $$i; done
index a14f2c8..c8bab9d 100644 (file)
@@ -446,30 +446,32 @@ If LOW, update the lower bound instead."
 (defun gnus-cache-generate-active (&optional directory)
   "Generate the cache active file."
   (let* ((top (null directory))
-        (directory (or directory gnus-cache-directory))
-        (files (directory-files directory))
+        (directory (or directory (expand-file-name gnus-cache-directory)))
+        (files (directory-files directory 'full))
         (group 
          (progn
            (string-match (concat "^" (expand-file-name gnus-cache-directory))
                          directory)
            (gnus-replace-chars-in-string 
-            (substring (expand-file-name gnus-cache-directory) (match-end 0))
+            (substring directory (match-end 0))
             ?/ ?.)))
         nums alphs)
     (when top
       (setq gnus-cache-active-hashtb (gnus-make-hashtable 123)))
     ;; Separate articles from all other files and directories.
     (while files
-      (if (string-match "^[0-9]$" (car files))
-         (push (string-to-int (pop files)) nums)
+      (if (string-match "^[0-9]+$" (file-name-nondirectory (car files)))
+         (push (string-to-int (file-name-nondirectory (pop files))) nums)
        (push (pop files) alphs)))
     ;; If we have nums, then this is probably a valid group.
     (setq nums (sort nums '<))
-    (gnus-sethash group (cons (car nums) (gnus-last-element nums))
-                 gnus-cache-active-hashtb)
+    (if nums
+       (gnus-sethash group (cons (car nums) (gnus-last-element nums))
+                     gnus-cache-active-hashtb))
     ;; Go through all the other files.
     (while alphs
-      (when (file-directory-p (car alphs))
+      (when (and (file-directory-p (car alphs))
+                (not (string-match "^\\.\\.?$" (file-name-nondirectory (car alphs)))))
        ;; We descend directories.
        (gnus-cache-generate-active (car alphs)))
       (setq alphs (cdr alphs)))
index b58819c..8d997d5 100644 (file)
@@ -424,14 +424,15 @@ If prefix argument YANK is non-nil, original article is yanked automatically."
   "Cancel an article you posted."
   (interactive "P")
   (gnus-set-global-variables)
-  (let ((articles (gnus-summary-work-articles n)))
-    (while articles
-      (gnus-summary-select-article t nil nil (car articles))
-      (and (gnus-eval-in-buffer-window gnus-article-buffer (gnus-cancel-news))
-          (gnus-summary-mark-as-read (car articles) gnus-canceled-mark))
-      (gnus-summary-remove-process-mark (car articles))
-      (gnus-article-hide-headers-if-wanted)
-      (setq articles (cdr articles)))))
+  (let ((articles (gnus-summary-work-articles n))
+       article)
+    (while (setq article (pop articles))
+      (when (gnus-summary-select-article t nil nil article)
+       (when (gnus-eval-in-buffer-window 
+              gnus-original-article-buffer (gnus-cancel-news))
+         (gnus-summary-mark-as-read article gnus-canceled-mark))
+       (gnus-article-hide-headers-if-wanted))
+      (gnus-summary-remove-process-mark article))))
 
 (defun gnus-summary-supersede-article ()
   "Compose an article that will supersede a previous article.
@@ -2546,17 +2547,22 @@ Headers will be generated before sending."
     (erase-buffer)
     ;; Set proper mode.
     (funcall (car type))
-    (and (eq major-mode 'mail-mode)
-        (gnus-inews-modify-mail-mode-map))
+    (gnus-inews-modify-mail-mode-map)
+    (when (eq major-mode 'news-reply-mode)
+      (local-set-key "\C-c\C-c" 'gnus-inews-news))
     ;; Arrange for deletion of the draft after successful sending.
     (make-local-variable 'gnus-message-sent-hook)
     (setq gnus-message-sent-hook
          (list
-          (`
-           (lambda ()
+          `(lambda ()
              (gnus-request-expire-articles 
-              (quote (, (list (cdr gnus-article-current))))
-              (, gnus-newsgroup-name) t)))))
+              (quote ,(list (cdr gnus-article-current)))
+              ,gnus-newsgroup-name t)
+               (and (buffer-name ,gnus-summary-buffer)
+                    (save-excursion
+                      (set-buffer ,gnus-summary-buffer)
+                      (gnus-summary-mark-article 
+                       ,(cdr gnus-article-current) gnus-canceled-mark))))))
     ;; Insert the draft.
     (insert-buffer-substring gnus-article-buffer)
     ;; Insert the separator.
index 9ec72d8..5a5f6cb 100644 (file)
 
       (autoload 'bbdb-insinuate-gnus "bbdb-gnus"
        "Hook BBDB into Gnus" t)
-      (add-hook gnus-startup-hook 'bbdb-insinuate-gnus)
+      (add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus)
 
       (if gnus-use-sendmail
          (progn
index dc58850..cff62d9 100644 (file)
@@ -700,6 +700,7 @@ The headers will be included in the sequence they are matched.")
                        (mail-header-subject header))
                  gnus-uu-digest-from-subject)))
     (let ((name (file-name-nondirectory gnus-uu-saved-article-name))
+         (delim (concat "^" (make-string 30 ?-) "$"))
          beg subj headers headline sorthead body end-string state)
       (if (or (eq in-state 'first) 
              (eq in-state 'first-and-last))
@@ -728,10 +729,12 @@ The headers will be included in the sequence they are matched.")
              (put-text-property (point-min) (point-max) 'intangible nil))
            (goto-char (point-min))
            (re-search-forward "\n\n")
-           ;; Quote all lines that begin with a dash.
+           ;; Quote all 30-dash lines.
            (save-excursion
-             (while (re-search-forward "^-" nil t)
-               (replace-match "- -")))
+             (while (re-search-forward delim nil t)
+               (beginning-of-line)
+               (delete-char 1)
+               (insert " ")))
            (setq body (buffer-substring (1- (point)) (point-max)))
            (narrow-to-region (point-min) (point))
            (if (not (setq headers gnus-uu-digest-headers))
index 0dba0db..f496629 100644 (file)
@@ -1039,7 +1039,7 @@ with some simple extensions.
     ("nnmbox" mail respool) 
     ("nnml" mail respool)
     ("nnmh" mail respool) 
-    ("nndir" none prompt-address address)
+    ("nndir" post-mail prompt-address address)
     ("nneething" none prompt-address)
     ("nndoc" none prompt-address) 
     ("nnbabyl" mail respool) 
@@ -1439,7 +1439,7 @@ variable (string, integer, character, etc).")
   "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)"
   "The mail address of the Gnus maintainers.")
 
-(defconst gnus-version "September Gnus v0.20"
+(defconst gnus-version "September Gnus v0.21"
   "Version number for this version of Gnus.")
 
 (defvar gnus-info-nodes
@@ -1771,7 +1771,7 @@ Thank you for your help in stamping out bugs.
      ("gnus-msg" (gnus-summary-send-map keymap)
       gnus-mail-yank-original gnus-mail-send-and-exit
       gnus-sendmail-setup-mail gnus-article-mail 
-      gnus-inews-message-id)
+      gnus-inews-message-id gnus-news-mail gnus-mail-reply)
      ("gnus-msg" :interactive t
       gnus-group-post-news gnus-group-mail gnus-summary-post-news
       gnus-summary-followup gnus-summary-followup-with-original
@@ -2807,6 +2807,8 @@ If optional argument RE-ONLY is non-nil, strip `Re:' only."
   (if (get-file-buffer (gnus-newsgroup-kill-file nil))
       (kill-buffer (get-file-buffer (gnus-newsgroup-kill-file nil))))
   (gnus-kill-buffer nntp-server-buffer)
+  ;; Backlog.
+  (and gnus-keep-backlog (gnus-backlog-shutdown))
   ;; Kill Gnus buffers.
   (while gnus-buffer-list
     (gnus-kill-buffer (car gnus-buffer-list))
@@ -4645,7 +4647,8 @@ Returns whether the fetching was successful or not."
 (defun gnus-group-read-ephemeral-group 
   (group method &optional activate quit-config)
   (let ((group (if (gnus-group-foreign-p group) group
-                (gnus-group-prefixed-name group method))))
+                (gnus-group-prefixed-name group method)))
+       (cur (current-buffer)))
     (gnus-sethash 
      group
      (list t nil (list group gnus-level-default-subscribed nil nil 
@@ -4664,7 +4667,8 @@ Returns whether the fetching was successful or not."
        (gnus-group-read-group t t group)
       (error nil)
       (quit nil))
-    (not (equal major-mode 'gnus-group-mode))))
+;    (debug (current-buffer))
+    (not (equal (current-buffer) cur))))
   
 (defun gnus-group-jump-to-group (group)
   "Jump to newsgroup GROUP."
@@ -6859,6 +6863,7 @@ article number."
     (if (get-buffer buffer)
        (progn
          (set-buffer buffer)
+         (setq gnus-summary-buffer (current-buffer))
          (not gnus-newsgroup-prepared))
       ;; Fix by Sudish Joseph <joseph@cis.ohio-state.edu>
       (setq gnus-summary-buffer (set-buffer (get-buffer-create buffer)))
@@ -8083,7 +8088,11 @@ If WHERE is `summary', the summary mode line format will be used."
   "Go through the HEADERS list and add all Xrefs to a hash table.
 The resulting hash table is returned, or nil if no Xrefs were found."
   (let* ((from-method (gnus-find-method-for-group from-newsgroup))
-        (prefix (gnus-group-real-prefix from-newsgroup))
+        (virtual (memq 'virtual 
+                       (assoc (symbol-name (car (gnus-find-method-for-group 
+                                                 from-newsgroup)))
+                              gnus-valid-select-methods)))     
+        (prefix (if virtual "" (gnus-group-real-prefix from-newsgroup)))
         (xref-hashtb (make-vector 63 0))
         start group entry number xrefs header)
     (while headers
@@ -9796,25 +9805,33 @@ Return how many articles were fetched."
   (interactive "P")
   (gnus-set-global-variables)
   (gnus-summary-select-article)
-  ;; We do not want a narrowed article.
-  (gnus-summary-stop-page-breaking)
   (let ((name (format "%s-%d" 
                      (gnus-group-prefixed-name 
                       gnus-newsgroup-name (list 'nndoc "")) 
                      gnus-current-article))
        (ogroup gnus-newsgroup-name)
        (buf (current-buffer)))
-    (if (gnus-group-read-ephemeral-group 
-        name `(nndoc ,name (nndoc-address ,(get-buffer gnus-article-buffer))
-                     (nndoc-article-type ,(if force 'digest 'guess))) t)
-       ;; Make all postings to this group go to the parent group.
-       (setcdr (nthcdr 4 (gnus-get-info name))
-               (list (list (cons 'to-group ogroup))))
-      ;; Couldn't select this doc group.
-      (switch-to-buffer buf)
-      (gnus-set-global-variables)
-      (gnus-configure-windows 'summary)
-      (gnus-message 3 "Article not a digest?"))))
+    (save-excursion
+      (set-buffer gnus-original-article-buffer)
+      (goto-char (point-min))
+      (search-forward "\n\n" nil t)
+      (narrow-to-region (point) (point-max)))
+    (unwind-protect
+       (if (gnus-group-read-ephemeral-group 
+            name `(nndoc ,name (nndoc-address 
+                                ,(get-buffer gnus-original-article-buffer))
+                         (nndoc-article-type ,(if force 'digest 'guess))) t)
+           ;; Make all postings to this group go to the parent group.
+           (setcdr (nthcdr 4 (gnus-get-info name))
+                   (list (list (cons 'to-group ogroup))))
+         ;; Couldn't select this doc group.
+         (switch-to-buffer buf)
+         (gnus-set-global-variables)
+         (gnus-configure-windows 'summary)
+         (gnus-message 3 "Article couldn't be entered?"))
+      (save-excursion
+       (set-buffer gnus-original-article-buffer)
+       (widen)))))
 
 (defun gnus-summary-isearch-article (&optional regexp-p)
   "Do incremental search forward on the current article.
@@ -10844,8 +10861,8 @@ returned."
 
 (defun gnus-summary-mark-article (&optional article mark no-expire)
   "Mark ARTICLE with MARK.  MARK can be any character.
-Four MARK strings are reserved: `? ' (unread), `?!' (ticked), `??'
-(dormant) and `?E' (expirable).
+Four MARK strings are reserved: `? ' (unread), `?!' (ticked), 
+`??' (dormant) and `?E' (expirable).
 If MARK is nil, then the default character `?D' is used.
 If ARTICLE is nil, then the article on the current line will be
 marked." 
@@ -13427,10 +13444,12 @@ If GROUP is nil, all groups on METHOD are scanned."
      (force-group-method group-method)
      ;; Override normal method.
      ((and gnus-post-method
-          (gnus-method-option-p group-method 'post))
+          (or (gnus-method-option-p group-method 'post)
+              (gnus-method-option-p group-method 'post-mail)))
       gnus-post-method)
      ;; Perhaps this is a mail group?
-     ((not (gnus-member-of-valid 'post group))
+     ((and (not (gnus-member-of-valid 'post group))
+          (not (gnus-method-option-p group-method 'post-mail)))
       group-method)
      ;; Use the normal select method.
      (t gnus-select-method))))
@@ -13443,8 +13462,8 @@ If GROUP is nil, all groups on METHOD are scanned."
 
 (defun gnus-method-option-p (method option)
   "Return non-nil if select METHOD has OPTION as a parameter."
-  (memq 'post (assoc (format "%s" (car method))
-                    gnus-valid-select-methods)))
+  (memq option (assoc (format "%s" (car method))
+                     gnus-valid-select-methods)))
 
 (defmacro gnus-server-equal (ss1 ss2)
   "Say whether two servers are equal."
@@ -14145,7 +14164,7 @@ newsgroup."
           t)
         (condition-case ()
             (gnus-request-group group)
-          (error nil)
+       ;   (error nil)
           (quit nil))
         (save-excursion
           (set-buffer nntp-server-buffer)
@@ -15077,13 +15096,21 @@ If FORCE is non-nil, the .newsrc file is read."
        (set-buffer (get-buffer-create gnus-backlog-buffer))
        (buffer-disable-undo (current-buffer))
        (setq buffer-read-only t)
-       (gnus-add-current-to-buffer-list))))
+       (gnus-add-current-to-buffer-list)
+       (get-buffer gnus-backlog-buffer))))
 
 (defun gnus-backlog-setup ()
   "Initialize backlog variables."
   (unless gnus-backlog-hashtb
     (setq gnus-backlog-hashtb (make-vector 1023 0))))
 
+(defun gnus-backlog-shutdown ()
+  "Clear all backlog variables and buffers."
+  (when (get-buffer gnus-backlog-buffer)
+    (kill-buffer gnus-backlog-buffer))
+  (setq gnus-backlog-hashtb nil
+       gnus-backlog-articles nil))
+
 (defun gnus-backlog-enter-article (group number buffer)
   (gnus-backlog-setup)
   (let ((ident (intern (concat group ":" (int-to-string number))
@@ -15145,7 +15172,8 @@ If FORCE is non-nil, the .newsrc file is read."
                 (1+ beg) 'gnus-backlog (current-buffer) (point-max)))))
       (let ((buffer-read-only nil))
        (erase-buffer)
-       (insert-buffer-substring gnus-backlog-buffer beg end)))))
+       (insert-buffer-substring gnus-backlog-buffer beg end)
+       t))))
 
 ;; Allow redefinition of Gnus functions.
 
index 30c1737..100b40f 100644 (file)
 (require 'nnmail)
 
 (defvar nndoc-article-type 'mbox
-  "*Type of the file - one of `mbox', `babyl', `digest', or `forward'.")
-
-(defvar nndoc-digest-type 'traditional
-  "Type of the last digest.  Auto-detected from the article header.
-Possible values:
-  `traditional' -- the \"lots of dashes\" (30+) rules used;
-                   we currently also do unconditional RFC 934 unquoting.
-  `rfc1341' -- RFC 1341 digest (MIME, unique boundary, no quoting).")
-
-(defconst nndoc-type-to-regexp
-  `((mbox 
-     ,(concat "^" rmail-unix-mail-delimiter)
-     ,(concat "^" rmail-unix-mail-delimiter)
-     nil "^$" nil nil nil)
-    (babyl "\^_\^L *\n" "\^_" "^[0-9].*\n" "^$" nil nil
-          "^$")
-    (digest
-     "^------------------------------*[\n \t]+"
-     "^------------------------------*[\n \t]+"
-     nil "^ ?$"   
-     "^------------------------------*[\n \t]+"
-     "^End of" nil)
+  "*Type of the file.
+One of `mbox', `babyl', `digest', `news', `rnews', `mmdf',
+`forward', `mime-digest', `standard-digest', `slack-digest', or
+`guess'.")
+
+(defvar nndoc-type-alist 
+  `((mmdf 
+     (article-begin .  "^\^A\^A\^A\^A\n")
+     (body-end .  "^\^A\^A\^A\^A\n"))
+    (news
+     (article-begin . "^Path:"))
+    (rnews
+     (article-begin . "^#! *rnews +\\([0-9]\\)+ *\n")
+     (body-end-function . nndoc-rnews-body-end))
+    (mbox 
+     (article-begin . 
+                   ,(let ((delim (concat "^" rmail-unix-mail-delimiter)))
+                      (if (string-match "\n\\'" delim)
+                          (substring delim 0 (match-beginning 0))
+                        delim)))
+     (body-end-function . nndoc-mbox-body-end))
+    (babyl 
+     (article-begin . "\^_\^L *\n")
+     (body-end . "\^_")
+     (head-begin . "^[0-9].*\n"))
     (forward
-     "^-+ Start of forwarded message -+\n+"
-     "^-+ End of forwarded message -+\n"
-     nil "^ ?$" nil nil nil)
-    (mmdf
-     "^\^A\^A\^A\^A\n" "^\^A\^A\^A\^A\n" nil "^$"
-     nil nil nil))
-  "Regular expressions for articles of the various types.
-article-begin, article-end, head-begin, head-end, 
-first-article, end-of-file, body-begin.")
-
+     (article-begin . "^-+ Start of forwarded message -+\n+")
+     (body-end . "^-+ End of forwarded message -+\n"))
+    (slack-digest
+     (article-begin . "^------------------------------*[\n \t]+")
+     (head-end . "^ ?$")
+     (body-begin . "^ ?$")
+     (file-end . "^End of")
+     (prepare-body . nndoc-prepare-digest-body))
+    (mime-digest
+     (article-begin . "")
+     (body-end . "")
+     (file-end . ""))
+    (standard-digest
+     (first-article . ,(concat "^" (make-string 70 ?-) "\n\n"))
+     (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n"))
+     (prepare-body . nndoc-prepare-digest-body)
+     (body-end-function . nndoc-digest-body-end)
+     (file-end . "^End of .* Digest"))
+    (guess 
+     (guess . nndoc-guess-type))
+    (digest
+     (guess . nndoc-guess-digest-type))
+    ))
 
 \f
 
-(defvar nndoc-article-begin nil)
+(defvar nndoc-file-begin nil)
+(defvar nndoc-first-article nil)
 (defvar nndoc-article-end nil)
+(defvar nndoc-article-begin nil)
 (defvar nndoc-head-begin nil)
 (defvar nndoc-head-end nil)
-(defvar nndoc-first-article nil)
-(defvar nndoc-end-of-file nil)
+(defvar nndoc-file-end nil)
 (defvar nndoc-body-begin nil)
+(defvar nndoc-body-end-function nil)
+(defvar nndoc-body-end nil)
+(defvar nndoc-dissection-alist nil)
+(defvar nndoc-prepare-body nil)
 
 (defvar nndoc-current-server nil)
 (defvar nndoc-server-alist nil)
@@ -106,54 +127,26 @@ first-article, end-of-file, body-begin.")
 
 ;;; Interface functions
 
-(defun nndoc-retrieve-headers (sequence &optional newsgroup server fetch-old)
+(defun nndoc-retrieve-headers (articles &optional newsgroup server fetch-old)
+  (nndoc-possibly-change-buffer newsgroup server)
   (save-excursion
     (set-buffer nntp-server-buffer)
     (erase-buffer)
-    (let ((prev 2)
-         article p beg lines)
-      (nndoc-possibly-change-buffer newsgroup server)
-      (if (stringp (car sequence))
+    (let (article entry)
+      (if (stringp (car articles))
          'headers
-       (set-buffer nndoc-current-buffer)
-       (widen)
-       (goto-char (point-min))
-       (re-search-forward (or nndoc-first-article 
-                              nndoc-article-begin) nil t)
-       (or (not nndoc-head-begin)
-           (re-search-forward nndoc-head-begin nil t))
-       (re-search-forward nndoc-head-end nil t)
-       (while sequence
-         (setq article (car sequence))
-         (set-buffer nndoc-current-buffer)
-         (if (not (nndoc-forward-article (max 0 (- article prev))))
-             ()
-           (setq p (point))
-           (setq beg (or (and
-                          (re-search-backward nndoc-article-begin nil t)
-                          (match-end 0))
-                         (point-min)))
-           (goto-char p)
-           (setq lines (count-lines 
-                        (point)
-                        (or
-                         (and (re-search-forward nndoc-article-end nil t)
-                              (goto-char (match-beginning 0)))
-                         (goto-char (point-max)))))
-
-           (set-buffer nntp-server-buffer)
-           (insert (format "221 %d Article retrieved.\n" article))
-           (insert-buffer-substring nndoc-current-buffer beg p)
-           (goto-char (point-max))
-           (or (= (char-after (1- (point))) ?\n) (insert "\n"))
-           (insert (format "Lines: %d\n" lines))
-           (insert ".\n"))
-
-         (setq prev article
-               sequence (cdr sequence)))
+       (while articles
+         (setq entry (cdr (assq (setq article (pop articles))
+                                nndoc-dissection-alist)))
+         (insert (format "221 %d Article retrieved.\n" article))
+         (insert-buffer-substring
+          nndoc-current-buffer (car entry) (nth 1 entry))
+         (goto-char (point-max))
+         (or (= (char-after (1- (point))) ?\n) (insert "\n"))
+         (insert (format "Lines: %d\n" (nth 4 entry)))
+         (insert ".\n"))
 
        ;; Fold continuation lines.
-       (set-buffer nntp-server-buffer)
        (goto-char (point-min))
        (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t)
          (replace-match " " t t))
@@ -175,8 +168,6 @@ first-article, end-of-file, body-begin.")
            (setq nndoc-server-alist (delq state nndoc-server-alist)))
        (nnheader-set-init-variables nndoc-server-variables defs)))
     (setq nndoc-current-server server)
-    (unless (eq nndoc-article-type 'guess)
-      (nndoc-set-delims))
     t))
 
 (defun nndoc-close-server (&optional server)
@@ -193,32 +184,22 @@ first-article, end-of-file, body-begin.")
 (defun nndoc-request-article (article &optional newsgroup server buffer)
   (nndoc-possibly-change-buffer newsgroup server)
   (save-excursion
-    (let ((buffer (or buffer nntp-server-buffer)))
+    (let ((buffer (or buffer nntp-server-buffer))
+         (entry (cdr (assq article nndoc-dissection-alist)))
+         beg)
       (set-buffer buffer)
       (erase-buffer)
       (if (stringp article)
          nil
-       (nndoc-insert-article article)
-       ;; Unquote quoted non-separators in digests.
-       (if (and (eq nndoc-article-type 'digest)
-                (eq nndoc-digest-type 'traditional))
-           (progn
-             (goto-char (point-min))
-             (while (re-search-forward "^- -"nil t)
-               (replace-match "-" t t))))
-       ;; Some assholish digests do not have a blank line after the
-       ;; headers. Aargh!
-       (goto-char (point-min))
-       (if (search-forward "\n\n" nil t)
-           ()                          ; We let this one pass.
-         (if (re-search-forward "^[ \t]+$" nil t)
-             (replace-match "" t t)    ; We nix out a line of blanks.
-           (while (and (looking-at "[^ ]+:")
-                       (zerop (forward-line 1))))
-           ;; We just insert a couple of lines. If you read digests
-           ;; that are so badly formatted, you don't deserve any
-           ;; better. Blphphpht!
-           (insert "\n\n")))
+       (insert-buffer-substring 
+        nndoc-current-buffer (car entry) (nth 1 entry))
+       (insert "\n")
+       (setq beg (point))
+       (insert-buffer-substring 
+        nndoc-current-buffer (nth 2 entry) (nth 3 entry))
+       (goto-char beg)
+       (when nndoc-prepare-body
+         (funcall nndoc-prepare-body))
        t))))
 
 (defun nndoc-request-group (group &optional server dont-check)
@@ -228,13 +209,12 @@ first-article, end-of-file, body-begin.")
        (progn
          (setq nndoc-status-string "No such file or buffer")
          nil)
-      (nndoc-set-header-dependent-regexps) ; hack for MIME digests
       (if dont-check
          t
        (save-excursion
          (set-buffer nntp-server-buffer)
          (erase-buffer)
-         (let ((number (nndoc-number-of-articles)))
+         (let ((number (length nndoc-dissection-alist)))
            (if (zerop number)
                (progn
                  (nndoc-close-group group)
@@ -251,6 +231,7 @@ first-article, end-of-file, body-begin.")
                                nndoc-group-alist))
   (setq nndoc-current-buffer nil)
   (setq nndoc-current-server nil)
+  (setq nndoc-dissection-alist nil)
   t)
 
 (defun nndoc-request-list (&optional server)
@@ -295,142 +276,159 @@ first-article, end-of-file, body-begin.")
        (erase-buffer)
        (if (stringp nndoc-address)
            (insert-file-contents nndoc-address)
-         (save-excursion
-           (set-buffer nndoc-address)
-           (widen))
          (insert-buffer-substring nndoc-address)))))
-    (when (eq nndoc-article-type 'guess)
-      (save-excursion
-       (set-buffer nndoc-current-buffer)
-       (setq nndoc-article-type (nndoc-guess-doc-type))
-       (nndoc-set-delims)))
+    (save-excursion
+      (set-buffer nndoc-current-buffer)
+      (nndoc-set-delims)
+      (nndoc-dissect-buffer))
     t))
 
 
 ;; MIME (RFC 1341) digest hack by Ulrik Dickow <dickow@nbi.dk>.
-(defun nndoc-set-header-dependent-regexps ()
-  (if (not (eq nndoc-article-type 'digest))
-      ()
-    (let ((case-fold-search t)      ; We match a bit too much, keep it simple.
-         boundary-id b-delimiter)
-      (save-excursion
-       (set-buffer nndoc-current-buffer)
-       (goto-char (point-min))
-       (if (and
-            (re-search-forward
-             (concat "\n\n\\|^Content-Type: *multipart/digest;[ \t\n]*[ \t]"
-                     "boundary=\"\\([^\"\n]*[^\" \t\n]\\)\"")
-             nil t)
-            (match-beginning 1))
-           (setq nndoc-digest-type 'rfc1341
-                 boundary-id (format "%s"
-                                     (buffer-substring
-                                      (match-beginning 1) (match-end 1)))
-                 b-delimiter       (concat "\n--" boundary-id "[\n \t]+")
-                 nndoc-article-begin b-delimiter ; Too strict: "[ \t]*$"
-                 nndoc-article-end (concat "\n--" boundary-id
-                                           "\\(--\\)?[\n \t]+")
-                 nndoc-first-article b-delimiter ; ^eof ends article too.
-                 nndoc-end-of-file (concat "\n--" boundary-id "--[ \t]*$"))
-         (setq nndoc-digest-type 'traditional))))))
-
-(defun nndoc-forward-article (n)
-  (while (and (> n 0)
-             (re-search-forward nndoc-article-begin nil t)
-             (or (not nndoc-head-begin)
-                 (re-search-forward nndoc-head-begin nil t))
-             (re-search-forward nndoc-head-end nil t))
-    (setq n (1- n)))
-  (zerop n))
-
-(defun nndoc-number-of-articles ()
-  (save-excursion
-    (set-buffer nndoc-current-buffer)
-    (widen)
-    (goto-char (point-min))
-    (let ((num 0))
-      (if (re-search-forward (or nndoc-first-article
-                                nndoc-article-begin) nil t)
-         (progn
-           (setq num 1)
-           (while (and (re-search-forward nndoc-article-begin nil t)
-                       (or (not nndoc-end-of-file)
-                           (not (looking-at nndoc-end-of-file)))
-                       (or (not nndoc-head-begin)
-                           (re-search-forward nndoc-head-begin nil t))
-                       (re-search-forward nndoc-head-end nil t))
-             (setq num (1+ num)))))
-      num)))
-
-(defun nndoc-narrow-to-article (article)
-  (save-excursion
-    (set-buffer nndoc-current-buffer)
-    (widen)
+(defun nndoc-guess-digest-type ()
+  (let ((case-fold-search t)           ; We match a bit too much, keep it simple.
+       boundary-id b-delimiter entry)
     (goto-char (point-min))
-    (while (and (re-search-forward nndoc-article-begin nil t)
-               (not (zerop (setq article (1- article))))))
-    (if (not (zerop article))
-       ()
-      (narrow-to-region 
-       (match-end 0)
-       (or (and (re-search-forward nndoc-article-end nil t)
-               (match-beginning 0))
-          (point-max)))
-      t)))
-
-;; Insert article ARTICLE in the current buffer.
-(defun nndoc-insert-article (article)
-  (let ((ibuf (current-buffer)))
-    (save-excursion
-      (set-buffer nndoc-current-buffer)
-      (widen)
-      (goto-char (point-min))
-      (while (and (re-search-forward nndoc-article-begin nil t)
-                 (not (zerop (setq article (1- article))))))
-      (when (zerop article)
-       (narrow-to-region 
-        (match-end 0)
-        (or (and (re-search-forward nndoc-article-end nil t)
-                 (match-beginning 0))
-            (point-max)))
-       (goto-char (point-min))
-       (and nndoc-head-begin
-            (re-search-forward nndoc-head-begin nil t)
-            (narrow-to-region (point) (point-max)))
-       (or (re-search-forward nndoc-head-end nil t)
-           (goto-char (point-max)))
-       (append-to-buffer ibuf (point-min) (point))
-       (and nndoc-body-begin 
-            (re-search-forward nndoc-body-begin nil t))
-       (append-to-buffer ibuf (point) (point-max))
-       t))))
-
-(defun nndoc-guess-doc-type ()
-  "Guess what document type is in the current buffer.
-Returns one of `babyl', `mbox', `digest', `forward', `mmdf' or nil."
+    (cond 
+     ;; MIME digest.
+     ((and
+       (re-search-forward
+       (concat "\n\n\\|^Content-Type: *multipart/digest;[ \t\n]*[ \t]"
+               "boundary=\"\\([^\"\n]*[^\" \t\n]\\)\"")
+       nil t)
+       (match-beginning 1))
+      (setq boundary-id (match-string 1)
+           b-delimiter (concat "\n--" boundary-id "[\n \t]+"))
+      (setq entry (assq 'mime-digest nndoc-type-alist))
+      (setcdr entry
+             (list
+              (cons 'article-begin b-delimiter)
+              (cons 'body-end 
+                    (concat "\n--" boundary-id "\\(--\\)?[\n \t]+"))
+              (cons 'file-end (concat "\n--" boundary-id "--[ \t]*$"))))
+      'mime-digest)
+     ((and (re-search-forward (concat "^" (make-string 70 ?-) "\n\n") nil t)
+          (re-search-forward 
+           (concat "\n\n" (make-string 30 ?-) "\n\n") nil t))
+      'standard-digest)
+     ;; Stupid digest.
+     (t
+      'slack-digest))))
+
+(defun nndoc-guess-type ()
+  "Guess what document type is in the current buffer."
   (goto-char (point-min))
   (cond 
    ((looking-at rmail-unix-mail-delimiter)
     'mbox)
    ((looking-at "\^A\^A\^A\^A$")
     'mmdf)
-   ((and (re-search-forward "^-+ Start of forwarded message -+\n+" nil t)
-        (not (re-search-forward "^Subject:.*digest" nil t)))
+   ((looking-at "^Path:.*\n")
+    'rnews)
+   ((save-excursion
+      (and (re-search-forward "^-+ Start of forwarded message -+\n+" nil t)
+          (not (re-search-forward "^Subject:.*digest" nil t))))
     'forward)
    ((re-search-forward "\^_\^L *\n" nil t)
     'babyl)
+   ((re-search-forward "^Path: .*!" nil t)
+    'news)
    (t 
     'digest)))
 
 (defun nndoc-set-delims ()
-  (let ((defs (cdr (assq nndoc-article-type nndoc-type-to-regexp))))
-    (setq nndoc-article-begin (nth 0 defs))
-    (setq nndoc-article-end (nth 1 defs))
-    (setq nndoc-head-begin (nth 2 defs))
-    (setq nndoc-head-end (nth 3 defs))
-    (setq nndoc-first-article (nth 4 defs))
-    (setq nndoc-end-of-file (nth 5 defs))
-    (setq nndoc-body-begin (nth 6 defs))))
+  (let ((vars '(nndoc-file-begin 
+               nndoc-first-article 
+               nndoc-article-end nndoc-head-begin nndoc-head-end
+               nndoc-file-end nndoc-article-begin
+               nndoc-body-begin nndoc-body-end-function nndoc-body-end
+               nndoc-prepare-body)))
+    (while vars
+      (set (pop vars) nil)))
+  (let* (defs guess)
+    ;; Guess away until we find the real file type.
+    (while (setq defs (cdr (assq nndoc-article-type nndoc-type-alist))
+                guess (assq 'guess defs))
+      (setq nndoc-article-type (funcall (cdr guess))))
+    (while defs
+      (set (intern (format "nndoc-%s" (car (car defs))))
+          (cdr (pop defs))))))
+
+(defun nndoc-search (regexp)
+  (prog1
+      (re-search-forward regexp nil t)
+    (beginning-of-line)))
+
+(defun nndoc-dissect-buffer ()
+  (let ((i 0)
+       (first t)
+       head-begin head-end body-begin body-end)
+    (setq nndoc-dissection-alist nil)
+    (save-excursion
+      (set-buffer nndoc-current-buffer)
+      (goto-char (point-min))
+      ;; Find the beginning of the file.
+      (when nndoc-file-begin
+       (nndoc-search nndoc-file-begin))
+      ;; Go through the file.
+      (while (if (and first nndoc-first-article)
+                (nndoc-search nndoc-first-article)
+              (nndoc-search nndoc-article-begin))
+       (setq first nil)
+       (when nndoc-head-begin
+         (nndoc-search nndoc-head-begin))
+       (setq head-begin (point))
+       (nndoc-search (or nndoc-head-end "^$"))
+       (setq head-end (point))
+       (nndoc-search (or nndoc-body-begin "^\n"))
+       (setq body-begin (point))
+       (or (and nndoc-body-end-function
+                (funcall nndoc-body-end-function))
+           (and nndoc-body-end
+                (nndoc-search nndoc-body-end))
+           (nndoc-search nndoc-article-begin)
+           (progn
+             (goto-char (point-max))
+             (when nndoc-file-end
+               (and (re-search-backward nndoc-file-end nil t)
+                    (beginning-of-line)))))
+       (setq body-end (point))
+       (push (list (incf i) head-begin head-end body-begin body-end
+                   (count-lines body-begin body-end))
+             nndoc-dissection-alist)
+       ))))
+
+(defun nndoc-prepare-digest-body ()
+  "Unquote quoted non-separators in digests."
+  (while (re-search-forward "^- -"nil t)
+    (replace-match "-" t t)))
+
+(defun nndoc-digest-body-end ()
+  (and (re-search-forward nndoc-article-begin nil t)
+       (goto-char (match-beginning 0))))
+
+(defun nndoc-mbox-body-end ()
+  (let ((beg (point))
+       len end)
+    (when
+       (save-excursion
+         (and (re-search-backward nndoc-article-begin nil t)
+              (setq end (point))
+              (search-forward "\n\n" beg t)
+              (re-search-backward "^Content-Length: \\([0-9]+\\) *$" end t)
+              (setq len (string-to-int (match-string 1)))
+              (search-forward "\n\n" beg t)
+              (or (= (setq len (+ (point) len)) (point-max))
+                  (and (< len (point-max))
+                       (goto-char len)
+                       (looking-at nndoc-article-begin)))))
+      (goto-char len))))
+
+(defun nndoc-rnews-body-end ()
+  (save-excursion
+    (and (re-search-backward nndoc-article-begin nil t)
+        (goto-char (+ (point) (string-to-int (match-string 1)))))))
+  
 
 (provide 'nndoc)
 
index ed873be..6a8ad98 100644 (file)
@@ -37,6 +37,7 @@
 ;;; Code:
 
 (require 'mail-utils)
+(require 'sendmail)
 (eval-when-compile (require 'cl))
 
 (defvar nnheader-max-head-length 4096
index e6b6cb7..2e62d19 100644 (file)
@@ -1,3 +1,7 @@
+Sat Dec  9 16:55:29 1995  Lars Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus.texi (nndoc): Change.
+
 Fri Dec  8 06:25:29 1995  Lars Ingebrigtsen  <lars@eyesore.no>
 
        * gnus.texi (Group Buffer Format): Addition.
diff --git a/texi/gnusref.tex b/texi/gnusref.tex
new file mode 100644 (file)
index 0000000..da186fe
--- /dev/null
@@ -0,0 +1,687 @@
+% include file for the Gnus refcard and booklet
+\def\progver{5.0}\def\refver{5.0} % program and refcard versions
+\def\date{16 September 1995}
+\def\author{Vladimir Alexiev $<$vladimir@cs.ualberta.ca$>$}
+\raggedbottom\raggedright
+\newlength{\logowidth}\setlength{\logowidth}{6.861in}
+\newlength{\logoheight}\setlength{\logoheight}{7.013in}
+\newlength{\keycolwidth}
+\newenvironment{keys}[1]% #1 is the widest key
+  {\nopagebreak%\noindent%
+   \settowidth{\keycolwidth}{#1}%
+   \addtolength{\keycolwidth}{\tabcolsep}%
+   \addtolength{\keycolwidth}{-\columnwidth}%
+   \begin{tabular}{@{}l@{\hspace{\tabcolsep}}p{-\keycolwidth}@{}}}%
+  {\end{tabular}\\}
+\catcode`\^=12 % allow ^ to be typed literally
+\newcommand{\B}[1]{{\bf#1})}    % bold l)etter
+
+\def\Title{
+\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}}}}
+
+\def\CopyRight{
+\begin{center}
+Copyright \copyright\ 1995 Free Software Foundation, Inc.\\*
+Copyright \copyright\ 1995 \author.\\*
+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
+above email address. \Guide{} last edited on \date.
+}
+
+\def\Notes{
+\subsec{Notes}
+{\samepage
+Gnus is complex. Currently it has some 346 interactive (user-callable)
+functions. Of these 279 are in the two major modes (Group and
+Summary/Article). Many of these functions have more than one binding, some
+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.
+%Some functions were not yet documented at the time of creating this
+%\guide and are clearly indicated as such.
+\\*[\baselineskip]
+\begin{keys}{C-c C-i}
+C-c C-i & Go to the Gnus online {\bf info}.\\
+C-c C-b & Send a Gnus {\bf bug} report.\\
+\end{keys}
+}}
+
+\def\GroupLevels{
+\subsec{Group Subscribedness Levels}
+The table below assumes that you use the default Gnus levels.
+Fill your user-specific levels in the blank cells.\\[1\baselineskip]
+
+\begin{tabular}{|c|l|l|}
+\hline
+Level & Groups & Status \\
+\hline
+1 & 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}
+}
+
+\def\Marks{
+\subsec{Mark Indication Characters}
+{\samepage If a command directly sets a mark, it is shown in parentheses.\\*
+\newlength{\markcolwidth}
+\settowidth{\markcolwidth}{` '}% widest character
+\addtolength{\markcolwidth}{4\tabcolsep}
+\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).\\
+C   & (C, S c) {\bf Canceled} (only for your own articles).\\
+E   & (E, M e, M x) {\bf Expirable}. Only has effect in mail groups.\\
+\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}.\\
+O   & {\bf Old} (marked read in a previous session).\\
+K   & (k, M k; C-k, M K) {\bf Killed}.\\
+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 Other marks}}\\
+\hline
+\#  & (\#, M \#, M P p) Processable (will be affected by the next operation).\\
+A   & {\bf Answered} (followed-up or replied).\\
++   & Over default score.\\
+$-$ & Under default score.\\
+=   & Has children (thread underneath it). Add `\%e' to
+      `gnus-summary-line-format'.\\
+\hline
+\end{tabular}
+}}
+
+\def\GroupMode{
+\sec{Group Mode}
+\begin{keys}{C-c M-C-x}
+RET     & (=) Select this group. [Prefix: how many (read) articles to fetch.
+Positive: newest articles, negative: oldest ones.]\\
+SPC     & Select this group and display the first unread article. [Same
+prefix as above.]\\ 
+?       & Give a very short help message.\\
+$<$     & Go to the beginning of the Group buffer.\\
+$>$     & Go to the end of the Group buffer.\\
+,       & Jump to the lowest-level group with unread articles.\\
+.       & Jump to the first group with unread articles.\\
+^       & 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]\\
+j       & {\bf Jump} to a group.\\
+m       & {\bf Mail} a message to someone.\\
+n       & Go to the {\bf next} group with unread articles. [distance]\\
+p       & (DEL) Go to the {\bf previous} group with unread articles.
+[distance]\\ 
+q       & {\bf Quit} Gnus.\\
+r       & Read the init file ({\bf reset}).\\
+s       & {\bf Save} the `.newsrc.eld' file (and `.newsrc' if
+`gnus-save-newsrc-file').\\ 
+z       & Suspend (kill all buffers of) Gnus.\\
+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.\\
+V       & Display the Gnus {\bf version} number.\\
+Z       & Clear the dribble buffer.\\
+C-c C-d & Show the {\bf description} of this group. [Prefix: re-read it
+from the server.]\\ 
+C-c C-s & {\bf Sort} the groups by name, number of unread articles, or level
+(depending on `gnus-group-sort-function').\\
+C-c C-x & Run all expirable articles in this group through the {\bf expiry} 
+process.\\
+C-c M-C-x & Run all articles in all groups through the {\bf expiry} process.\\
+C-x C-t & {\bf Transpose} two groups.\\
+M-d     & {\bf Describe} ALL groups. [Prefix: re-read the description from the
+server.]\\
+M-f     & Fetch this group's {\bf FAQ} (using ange-ftp).\\
+M-g     & Check the server for new articles in this group ({\bf get}). [p/p]\\
+M-n     & Go to the {\bf previous} unread group on the same or lower level.
+[distance]\\ 
+M-p     & Go to the {\bf next} unread group on the same or lower level.
+[distance]\\ 
+\end{keys}
+}
+
+\def\GroupCommands{
+\subsec{List Groups}
+{\samepage
+\begin{keys}{A m}
+A a     & (C-c C-a) List all groups whose names match a regexp ({\bf
+apropos}).\\ 
+A d     & List all groups whose names or {\bf descriptions} match a regexp.\\ 
+A k     & (C-c C-l) List all {\bf killed} groups.\\
+A m     & List groups that {\bf match} a regexp and have unread articles.
+[level]\\ 
+A s     & (l) List {\bf subscribed} groups with unread articles. [level]\\
+A u     & (L) List all groups (including {\bf unsubscribed}). [If no prefix
+is given, level 7 is the default]\\ 
+A z     & List the {\bf zombie} groups.\\
+A M     & List groups that {\bf match} a regexp.\\
+\end{keys}
+}
+
+\subsec{Create/Edit Foreign Groups}
+{\samepage
+The select methods are indicated in parentheses.\\*
+\begin{keys}{G m}
+G a     & Make the Gnus list {\bf archive} group. (nndir over ange-ftp)\\
+G d     & Make a {\bf directory} group (every file must be a posting and files
+must have numeric names). (nndir)\\
+G e     & (M-e) {\bf Edit} this group's select method.\\
+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 v     & Add this group to a {\bf virtual} group. [p/p]\\
+G D     & Enter a {\bf directory} as a (temporary) group. (nneething without
+recording articles read.)\\
+G E     & {\bf Edit} this group's info (select method, articles read, etc).\\
+G V     & Make a new empty {\bf virtual} group. (nnvirtual)\\
+\end{keys}
+You can also create mail-groups and read your mail with Gnus (very useful
+if you are subscribed to any mailing lists), using one of the methods
+nnmbox, nnbabyl, nnml, nnmh, or nnfolder. Read about it in the online info
+(C-c C-i g Reading Mail RET).
+}
+
+%\subsubsec{Soup Commands}
+%\begin{keys}{G s w}
+%G s b   & gnus-group-brew-soup: not documented.\\
+%G s p   & gnus-soup-pack-packet: not documented.\\
+%G s r   & nnsoup-pack-replies: not documented.\\
+%G s s   & gnus-soup-send-replies: not documented.\\
+%G s w   & gnus-soup-save-areas: not documented.\\
+%\end{keys}
+
+\subsec{Mark Groups}
+\begin{keys}{M m}
+M m     & (\#) Set the process {\bf mark} on this group. [scope]\\
+M u     & (M-\#) Remove the process mark from this group ({\bf unmark}).
+[scope]\\ 
+M w     & Mark all groups in the current region.\\
+\end{keys}
+
+\subsec{Unsubscribe, Kill and Yank Groups}
+\begin{keys}{S w}
+S k     & (C-k) {\bf Kill} this group.\\
+S l     & Set the {\bf level} of this group. [p/p]\\
+S s     & (U) Prompt for a group and toggle its {\bf subscription}.\\
+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.\\
+\end{keys}
+}
+
+\def\SummaryMode{
+\sec{Summary Mode}  %{Summary and Article Modes}
+\begin{keys}{SPC}
+SPC     & (A SPC, A n) Select an article, scroll it one page, move to the
+next one.\\ 
+DEL     & (A DEL, A p, b) Scroll this article one page back. [distance]\\
+RET     & Scroll this article one line forward. [distance]\\
+=       & Expand the Summary window. [Prefix: shrink it to display the
+Article window]\\
+$<$     & (A $<$, A b) Scroll to the beginning of this article.\\
+$>$     & (A $>$, A e) Scroll to the end of this article.\\
+\&      & Execute a command on all articles matching a regexp.
+[Prefix: move backwards.]\\
+j       & (G g) Ask for an article number and then {\bf jump} to that summary
+line.\\ 
+C-t     & Toggle {\bf truncation} of summary lines.\\
+M-\&    & Execute a command on all articles having the process mark.\\
+M-k     & Edit this group's {\bf kill} file.\\
+M-n     & (G M-n) Go to the {\bf next} summary line of an unread article.
+[distance]\\ 
+M-p     & (G M-p) Go to the {\bf previous} summary line of an unread article. 
+[distance]\\ 
+M-r     & Search through all previous articles for a regexp.\\
+M-s     & {\bf Search} through all subsequent articles for a regexp.\\
+M-K     & Edit the general {\bf kill} file.\\
+\end{keys}
+}
+
+\def\SortSummary{
+\subsec{Sort the Summary Buffer}
+\begin{keys}{C-c C-s C-a}
+C-c C-s C-a & Sort the summary by {\bf author}.\\
+C-c C-s C-d & Sort the summary by {\bf date}.\\
+C-c C-s C-i & Sort the summary by article score.\\
+C-c C-s C-n & Sort the summary by article {\bf number}.\\
+C-c C-s C-s & Sort the summary by {\bf subject}.\\
+\end{keys}
+}
+
+\def\Asubmap{
+\subsec{Article Buffer Commands}
+\begin{keys}{A m}
+A g     & (g) (Re)fetch this article ({\bf get}). [Prefix: just show the
+article.]\\ 
+A r     & (^, A ^) Go to the parent of this article (the {\bf References}
+header).\\ 
+M-^     & Fetch the article with a given Message-ID.\\
+A s     & (s) Perform an i{\bf search} in the article buffer.\\
+A D     & (C-d) Un{\bf digestify} this article into a separate group.\\
+\end{keys}
+}
+
+\def\Bsubmap{
+\subsec{Mail-Group Commands}
+{\samepage
+These commands (except `B c') are only valid in a mail group.\\*
+\begin{keys}{B M-C-e}
+B DEL   & {\bf Delete} the mail article from disk (!). [p/p]\\
+B c     & {\bf Copy} this article from any group to a mail group. [p/p]\\
+B e     & {\bf Expire} all expirable articles in this group. [p/p]\\
+B i     & {\bf Import} a random file into this group.\\
+B m     & {\bf Move} the article from one mail group to another. [p/p]\\
+B q     & {\bf Query} where will the article go during fancy splitting\\
+B r     & {\bf Respool} this mail article. [p/p]\\
+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}
+}}
+
+\def\Gsubmap{
+\subsec{Select Articles}
+{\samepage
+These commands select the target article. They do not understand the prefix.\\*
+\begin{keys}{G C-n}
+G b     & (,) Go to the {\bf best} article (the one with highest score).\\
+G f     & (.) Go to the {\bf first} unread article.\\
+G l     & (l) Go to the {\bf last} article read.\\
+G n     & (n) Go to the {\bf next} unread article.\\
+p       & Go to the {\bf previous} unread article.\\
+G p     & {\bf Pop} an article off the summary history and go to it.\\
+G N     & (N) Go to {\bf the} next article.\\
+G P     & (P) Go to the {\bf previous} article.\\
+G C-n   & (M-C-n) Go to the {\bf next} article with the same subject.\\
+G C-p   & (M-C-p) Go to the {\bf previous} article with the same subject.\\
+\end{keys}
+}}
+
+\def\Hsubmap{
+\subsec{Help Commands}
+\begin{keys}{H d}
+H d     & (C-c C-d) {\bf Describe} this group. [Prefix: re-read the description
+from the server.]\\
+H f     & Try to fetch the {\bf FAQ} for this group using ange-ftp.\\
+H h     & Give a very short {\bf help} message.\\
+H i     & (C-c C-i) Go to the Gnus online {\bf info}.\\
+H v     & Display the Gnus {\bf version} number.\\
+\end{keys}
+}
+
+\def\Msubmap{
+\subsec{Mark Articles}
+\begin{keys}{M M-C-r}
+d       & (M d, M r) Mark this article as read and move to the next one.
+[scope]\\ 
+D       & Mark this article as read and move to the previous one. [scope]\\
+u       & (!, M !, M t) Tick this article (mark it as interesting) and move
+to the next one. [scope]\\
+U       & Tick this article and move to the previous one. [scope]\\ 
+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 ?     & (?) Mark this article as dormant (only followups are
+interesting). [scope]\\ 
+M b     & Set a {\bf bookmark} in this article.\\
+M e     & (E, M x) Mark this article as {\bf expirable}. [scope]\\
+M k     & (k) {\bf Kill} all articles with the same subject then select the
+next one.\\ 
+M B     & Remove the {\bf bookmark} from this article.\\
+M C     & {\bf Catch-up} the articles that are not ticked.\\
+M D     & Show all {\bf dormant} articles (normally they are hidden unless they
+have any followups).\\
+M H     & Catch-up (mark read) this group to point ({\bf here}).\\
+M K     & (C-k) {\bf Kill} all articles with the same subject as this one.\\
+C-w     & Mark all articles between point and mark as read.\\
+M S     & (C-c M-C-s) {\bf Show} all expunged articles.\\
+M C-c   & {\bf Catch-up} all articles in this group.\\
+M M-r   & (x) Expunge all {\bf read} articles from this group.\\
+M M-D   & Hide all {\bf dormant} articles.\\
+M M-C-r & Expunge all articles having a given mark.\\
+\end{keys}
+
+\subsubsec{Mark Based on Score}
+\begin{keys}{M s m}
+M V c   & {\bf Clear} all marks from all high-scored articles. [score]\\
+M V k   & {\bf Kill} all low-scored articles. [score]\\
+M V m   & Mark all high-scored articles with a given {\bf mark}. [score]\\
+M V u   & Mark all high-scored articles as interesting (tick them). [score]\\
+\end{keys}
+
+\subsubsec{The Process Mark}
+{\samepage 
+These commands set and remove the process mark \#. You only need to use
+it if the set of articles you want to operate on is non-contiguous. Else
+use a numeric prefix.\\*
+\begin{keys}{M P R}
+M P a   & Mark {\bf all} articles (in series order).\\
+M P p   & (\#, M \#) Mark this article.\\
+M P r   & Mark all articles in the {\bf region}.\\
+M P s   & Mark all articles in the current {\bf series}.\\
+M P t   & Mark all articles in this (sub){\bf thread}.\\
+M P u   & (M-\#, M M-\#) {\bf Unmark} this article.\\
+M P R   & Mark all articles matching a {\bf regexp}.\\
+M P S   & Mark all {\bf series} that already contain a marked article.\\
+M P U   & {\bf Unmark} all articles.\\
+\end{keys}
+}}
+
+\def\Osubmap{
+\subsec{Output Articles}
+\begin{keys}{O m}
+O f     & Save this article in plain {\bf file} format. [p/p]\\
+O h     & Save this article in {\bf mh} folder format. [p/p]\\
+O m     & Save this article in {\bf mail} format. [p/p]\\
+O o     & (o, C-o) Save this article using the default article saver. [p/p]\\
+O p     & ($\mid$) Pipe this article to a shell command. [p/p]\\
+O r     & Save this article in {\bf rmail} format. [p/p]\\
+O v     & Save this article in {\bf vm} format. [p/p]\\
+\end{keys}
+}
+
+\def\Ssubmap{
+\subsec{Post, Followup, Reply, Forward, Cancel}
+{\samepage
+These commands put you in a separate post or mail buffer. After
+editing the article, send it by pressing C-c C-c.  If you are in a
+foreign group and want to post the article using the foreign server, give
+a prefix to C-c C-c.\\* 
+\begin{keys}{S O m}
+S b     & {\bf Both} post a followup to this article, and send a reply.\\
+S c     & (C) {\bf Cancel} this article (only works if it is your own).\\
+S f     & (f) Post a {\bf followup} to this article.\\
+S m     & (m) Send {\bf a} mail to some other person.\\
+S o m   & (C-c C-f) Forward this article by {\bf mail} to a person.\\
+S o p   & Forward this article as a {\bf post} to a newsgroup.\\
+S p     & (a) {\bf Post} an article to this group.\\
+S r     & (r) Mail a {\bf reply} to the author of this article.\\
+S s     & {\bf Supersede} this article with a new one (only for own
+articles).\\ 
+S u     & {\bf Uuencode} a file and post it as a series.\\
+S B     & {\bf Both} post a followup, send a reply, and include the
+original. [p/p]\\ 
+S F     & (F) Post a {\bf followup} and include the original. [p/p]\\
+S O m   & Digest these series and forward by {\bf mail}. [p/p]\\
+S O p   & Digest these series and forward as a {\bf post} to a newsgroup.
+[p/p]\\ 
+S R     & (R) Mail a {\bf reply} and include the original. [p/p]\\
+\end{keys}
+If you want to cancel or supersede an article you just posted (before it
+has appeared on the server), go to the *post-news* buffer, change
+`Message-ID' to `Cancel' or `Supersedes' and send it again with C-c C-c.
+}}
+
+\def\Tsubmap{
+\subsec{Thread Commands}
+\begin{keys}{T \#}
+T \#    & Mark this thread with the process mark.\\
+T d     & Move to the next article in this thread ({\bf down}). [distance]\\
+T h     & {\bf Hide} this (sub)thread.\\
+T i     & {\bf Increase} the score of this thread.\\
+T k     & (M-C-k) {\bf Kill} the current (sub)thread. [Negative prefix:
+tick it, positive prefix: unmark it.]\\
+T l     & (M-C-l) {\bf Lower} the score of this thread.\\
+T n     & (M-C-f) Go to the {\bf next} thread. [distance]\\
+T p     & (M-C-b) Go to the {\bf previous} thread. [distance]\\
+T s     & {\bf Show} the thread hidden under this article.\\
+T u     & Move to the previous article in this thread ({\bf up}). [distance]\\
+T H     & {\bf Hide} all threads.\\
+T S     & {\bf Show} all hidden threads.\\
+T T     & (M-C-t) {\bf Toggle} threading.\\
+\end{keys}
+}
+
+\def\Vsubmap{
+\subsec{Score (Value) Commands}
+{\samepage
+Read about Adaptive Scoring in the online info.\\*
+\begin{keys}{\bf A p m l}
+V a     & {\bf Add} a new score entry, specifying all elements.\\
+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}
+}}
+
+\def\Wsubmap{
+\subsec{Wash the Article Buffer}
+\begin{keys}{W C-c}
+W b     & Make Message-IDs and URLs in the article to mouse-clickable {\bf
+  buttons}.\\  
+W c     & Remove extra {\bf CRs} (^M) from the article.\\
+W f     & Look for and display any X-{\bf Face} headers.\\
+W l     & (w) Remove page breaks ({\bf^L}) from the article.\\
+W m     & Toggle {\bf MIME} processing.\\
+W o     & Treat {\bf overstrike} or underline (^H\_) in the article.\\
+W q     & Treat {\bf quoted}-printable in the article.\\
+W r     & (C-c C-r) Do a Caesar {\bf rotate} (rot13) on the article.\\
+W t     & (t) {\bf Toggle} the displaying of all headers.\\
+v       & Toggle permanent {\bf verbose} displaying of all headers.\\
+W w     & Do word {\bf wrap} in the article.\\
+W T e   & Convert the article timestamp to time {\bf elapsed} since sent.\\
+W T l   & Convert the article timestamp to the {\bf local} timezone.\\
+W T u   & (W T z) Convert the article timestamp to {\bf UTC} ({\bf Zulu},
+GMT).\\ 
+\end{keys}
+
+\subsubsec{Hide/Highlight Parts of the Article}
+\begin{keys}{W W C-c}
+W W a   & Hide {\bf all} unwanted parts. Calls W W h, W W s, W W C-c.\\
+W W c   & Hide article {\bf citation}.\\
+W W h   & Hide article {\bf headers}.\\
+W W s   & Hide article {\bf signature}.\\
+W W C-c & Hide article {\bf citation} using a more intelligent algorithm.\\
+%\end{keys}
+%
+%\subsubsec{Highlight Parts of the Article}
+%\begin{keys}{W H A}
+W H a   & Highlight {\bf all} parts. Calls W b, W H c, W H h, W H s.\\
+W H c   & Highlight article {\bf citation}.\\
+W H h   & Highlight article {\bf headers}.\\
+W H s   & Highlight article {\bf signature}.\\
+\end{keys}
+}
+
+\def\Xsubmap{
+\subsec{Extract Series (Uudecode etc)}
+{\samepage
+Gnus recognizes if the current article is part of a series (multipart
+posting whose parts are identified by numbers in their subjects, e.g.{}
+1/10\dots10/10) and processes the series accordingly. You can mark and
+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}
+}}
+
+\def\Zsubmap{
+\subsec{Exit the Current Group}
+\begin{keys}{Z G}
+Z c     & (c) Mark all unticked articles as read ({\bf catch-up}) and exit.\\
+Z n     & Mark all articles as read and go to the {\bf next} group.\\
+Z C     & Mark all articles as read ({\bf catch-up}) and exit.\\
+Z E     & (Q) {\bf Exit} without updating the group information.\\
+Z G     & (M-g) Check for new articles in this group ({\bf get}).\\
+Z N     & Exit and go to {\bf the} next group.\\
+Z P     & Exit and go to the {\bf previous} group.\\
+Z R     & Exit this group, and then enter it again ({\bf reenter}).
+[Prefix: select all articles, read and unread.]\\
+Z Z     & (q, Z Q) Exit this group.\\
+\end{keys}
+}
+
+\def\ArticleMode{
+\sec{Article Mode}
+{\samepage
+% All keys for Summary mode also work in Article mode.
+The normal navigation keys work in Article mode.
+Some additional keys are:\\*
+\begin{keys}{C-c C-m}
+RET     & (middle mouse button) Activate the button at point to follow
+an URL or Message-ID.\\
+TAB     & Move the point to the next button.\\
+h       & (s) Go to the {\bf header} line of the article in the {\bf
+summary} buffer.\\ 
+C-c ^   & Get the article with the Message-ID near point.\\
+C-c C-m & {\bf Mail} reply to the address near point (prefix: include the
+original).\\ 
+\end{keys}
+}}
+
+\def\ServerMode{
+\sec{Server Mode}
+{\samepage
+To enter this mode, press `^' while in Group mode.\\*
+\begin{keys}{SPC}
+SPC     & (RET) Browse this server.\\
+a       & {\bf Add} a new server.\\
+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}).\\
+y       & {\bf Yank} the previously killed server.\\
+\end{keys}
+}}
+
+\def\BrowseServer{
+\sec{Browse Server Mode}
+{\samepage
+To enter this mode, press `B' while in Group mode.\\*
+\begin{keys}{RET}
+RET     & Enter the current group.\\
+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}
+}}
index 8cd58b8..a701cd4 100644 (file)
-% Reference Card for (ding) Gnus
+% Reference Card for (ding) Gnus, 3 twocolumn pages.
 % To be processed with latex 2.09
-\def\author{Vladimir Alexiev $<$vladimir@cs.ualberta.ca$>$}
-\def\progver{0.98}\def\refver{0.3} % program and refcard versions
-\def\date{1 August 1995}
+\def\Guide{Card}\def\guide{card}
+\def\logoscale{0.25}
+\def\sec{\section*}
+\def\subsec{\subsection*}
+\def\subsubsec{\subsubsection*}
 \documentstyle{article}
-\textwidth 7.5in \textheight 10in \topmargin -1.0in
+\textwidth 7.26in \textheight 10in \topmargin -1.0in
 % the same settings work for A4, although there is a bit of space at the
-% bottom of the page)
+% top and bottom of the page
 \oddsidemargin -0.5in \evensidemargin -0.5in
 \begin{document}
 \twocolumn\scriptsize\pagestyle{empty}
-\raggedbottom\raggedright
-\newlength{\mywidth}
-\newenvironment{keys}[1] % #1 is the widest key
-  {\nopagebreak
-   \settowidth{\mywidth}{#1}
-   \addtolength{\mywidth}{\tabcolsep}
-   \addtolength{\mywidth}{-\columnwidth}
-   \begin{tabular}{@{}l@{\hspace{\tabcolsep}}p{-\mywidth}@{}}}
-  {\end{tabular}\\}
-\catcode`\^=12 % allow ^ to be typed literally
-
-\begin{center}
-{\bf\LARGE (ding) Gnus \progver\ Reference Card\\}
-{\normalsize Refcard version \refver}
-\end{center}
-
-\vspace{1in}
-\centerline{(Gnus logo goes here)}
-\vspace{1in}
-\vfill
-
-\subsection*{Group Subscribedness Levels}
-\begin{tabular}{|r|c|l|}
-\hline
-1 & mail groups   &              \\
-2 & mail groups   &              \\
-3 &               & subscribed   \\
-4 &               &              \\
-5 & default list level &         \\
-\hline
-6 &               &              \\
-7 &               & unsubscribed \\
-\hline
-8 &               & zombies      \\
-\hline
-9 &               & killed       \\
-\hline
-\end{tabular}
-
-\section*{Group Mode}
-\begin{keys}{C-c M-C-x}
-RET     & (=) Select this group. [Prefix: how many (read) articles to fetch.
-Positive: newest articles, negative: oldest ones.]\\
-SPC     & Select this group and display the first unread article. [Same
-prefix as above.]\\ 
-?       & Give a very short help message.\\
-$<$     & Go to the beginning of the Group buffer.\\
-$>$     & Go to the end of the Group buffer.\\
-,       & Jump to the lowest-level group with unread articles.\\
-.       & Jump to the first group with unread articles.\\
-^       & Enter the Server buffer mode.\\
-a       & Post an article to a group.\\
-b       & Find bogus groups and delete them.\\
-c       & Mark all unticked articles in this group as read (catchup). [p/p]\\
-g       & Check the server for new articles. [level]\\
-j       & Jump to a group.\\
-m       & Mail a message to someone.\\
-n       & Go to the next group with unread articles. [distance]\\
-p       & (DEL) Go to the previous group with unread articles. [distance]\\
-q       & Quit Gnus.\\
-r       & Read the init file.\\
-s       & Save the `.newsrc.eld' file (and `.newsrc' if
-`gnus-save-newsrc-file').\\ 
-z       & Suspend (kill all buffers of) Gnus.\\
-B       & Browse a foreign server.\\
-C       & Mark all articles in this group as read (catchup). [p/p]\\
-F       & Find new groups and process them.\\
-N       & Go to the next group. [distance]\\
-P       & Go to the previous group. [distance]\\
-Q       & Quit Gnus without saving any startup (.newsrc) files.\\
-R       & Restart Gnus.\\
-V       & Display the Gnus version number.\\
-Z       & Clear the dribble buffer.\\
-C-c C-d & Show the description of this group. [Prefix: re-read it from the
-server.]\\ 
-C-c C-s & 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 expiry 
-process.\\
-C-c M-C-x & Run all articles in all groups through the expiry process.\\
-C-x C-t & Transpose two groups.\\
-M-d     & Describe ALL groups. [Prefix: re-read the description from the
-server.]\\
-M-f     & Fetch this group's FAQ (using ange-ftp).\\
-M-g     & Check the server for new articles in this group. [p/p]\\
-M-n     & Go to the previous unread group on the same or lower level.
-[distance]\\ 
-M-p     & Go to the next unread group on the same or lower level. [distance]\\
-\end{keys}
-
+\input{gnusref}
+
+% page 1, left column
+\Title
+\par
+\vspace{0.5\baselineskip}
+\Logo{refcard}
+\vspace*{\fill}
+\GroupLevels
+\GroupMode
 \pagebreak
 
-\subsubsection*{Notes}
-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
-refcard, 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.
-%Some functions were not yet documented at the time of creating this
-%reference card and are clearly indicated as such.
-\\*[\baselineskip]
-\begin{keys}{C-c C-i}
-C-c C-i & Go to the Gnus online info.\\
-C-c C-b & Send a Gnus bug report.\\
-\end{keys}
-\vfill
-
-\subsection*{List Groups}
-\begin{keys}{A m}
-A a     & (C-c C-a) List all groups whose names match a regexp (apropos).\\
-A d     & List all groups whose names or descriptions match a regexp.\\ 
-A k     & (C-c C-l) List all killed groups.\\
-A m     & List groups that match a regexp and have unread articles. [level]\\
-A s     & (l) List groups with unread articles. [level]\\
-A u     & (L) List all groups. [If no prefix is given, level 7 is the
-default]\\ 
-A z     & List the zombie groups.\\
-A M     & List groups that match a regexp.\\
-\end{keys}
-
-\subsection*{Create/Edit Foreign Groups}
-The select methods are indicated in parentheses.\\*
-\begin{keys}{G m}
-G a     & Make the Gnus list archive group. (nndir over ange-ftp)\\
-G d     & Make a directory group (every file must be a posting and files
-must have numeric names). (nndir)\\
-G e     & (M-e) Edit this group's select method.\\
-G f     & Make a group based on a file. (nndoc)\\
-G h     & Make the (ding) Gnus help (documentation) group. (nndoc)\\
-G k     & Make a kiboze group. (nnkiboze)\\
-G m     & Make a new group.\\
-G p     & Edit this group's parameters.\\
-G v     & Add this group to a virtual group. [p/p]\\
-G D     & Enter a directory as a (temporary) group. (nneething without
-recording articles read.)\\
-G E     & Edit this group's info (select method, articles read, etc).\\
-G V     & Make a new empty virtual group. (nnvirtual)\\
-\end{keys}
-You can also create mail-groups and read your mail with Gnus (very useful
-if you are subscribed to any mailing lists), using one of the methods
-nnmbox, nnbabyl, nnml, nnmh, or nnfolder. Read about it in the online info
-(C-c C-i g Reading Mail RET).
-
-%\subsubsection*{Soup Commands}
-%\begin{keys}{G s w}
-%G s b   & gnus-group-brew-soup: not documented.\\
-%G s p   & gnus-soup-pack-packet: not documented.\\
-%G s r   & nnsoup-pack-replies: not documented.\\
-%G s s   & gnus-soup-send-replies: not documented.\\
-%G s w   & gnus-soup-save-areas: not documented.\\
-%\end{keys}
-
-\subsection*{Mark Groups}
-\begin{keys}{M m}
-M m     & (\#) Set the process mark on this group. [scope]\\
-M u     & (M-\#) Remove the process mark from this group. [scope]\\
-M w     & Mark all groups in the current region.\\
-\end{keys}
-
-\subsection*{Unsubscribe, Kill and Yank Groups}
-\begin{keys}{S w}
-S k     & (C-k) Kill this group.\\
-S l     & Set the level of this group. [p/p]\\
-S s     & (U) Prompt for a group and toggle its subscription.\\
-S t     & (u) Toggle subscription to this group. [p/p]\\
-S w     & (C-w) Kill all groups in the region.\\
-S y     & (C-y) Yank the last killed group.\\
-S z     & Kill all zombie groups.\\
-\end{keys}
-
+% page 1, right column
+\Notes
+\vspace*{\fill}
+\GroupCommands
 \pagebreak
 
-\section*{Summary and Article Modes}
-\begin{keys}{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]\\
-$<$     & (A $<$, A b) Scroll to the beginning of this article.\\
-$>$     & (A $>$, A e) Scroll to the end of this article.\\
-j       & (G g) Ask for an article number and then go to that summary line.\\
-M-n     & (G M-n) Go to the next summary line of an unread article.
-[distance]\\ 
-M-p     & (G M-p) Go to the previous summary line of an unread article. 
-[distance]\\ 
-\end{keys}
-
-\subsection*{Article Buffer Commands}
-\begin{keys}{A m}
-A c     & (C-c C-r) Do a Caesar rotate (rot13) on the article buffer.\\
-A g     & (g) (Re)fetch this article. [Prefix: just show the article.]\\
-A m     & Toggle MIME processing.\\
-A r     & (^, A^) Go to the parent of this article (the References header).\\
-A s     & (s) Perform an isearch in the article buffer.\\
-A t     & (t) Toggle the displaying of all headers.\\
-A w     & (w) Remove page breaks (^L) from this article.\\
-\end{keys}
-
-\subsection*{Mail-Group Commands}
-These commands (B c) are only valid in a mail group.\\*
-\begin{keys}{B M-C-e}
-B DEL   & Delete the mail article from disk (!). [p/p]\\
-B c     & Copy this article from any group to a mail group. [p/p]\\
-B e     & Expire all expirable articles in this group. [p/p]\\
-B i     & Import a random file into this group.\\
-B m     & Move the article from one mail group to another. [p/p]\\
-B q     & Where will the article go during fancy splitting?\\
-B r     & Respool this mail article. [p/p]\\
-B w     & (e) Edit this article.\\
-B M-C-e & Expunge (delete from disk) all expirable articles in this group
-(!). [p/p]\\ 
-\end{keys}
-
-\subsection*{Select Articles}
-These commands select the target article. They do not understand the prefix.\\*
-\begin{keys}{G C-n}
-G b     & (,) Go to the best article (the one with highest score).\\
-G f     & (.) Go to the first unread article.\\
-G l     & (l) Go to the last article read.\\
-G n     & (n) Go to the next unread article.\\
-p       & Go to the previous unread article.\\
-G p     & Pop an article off the summary history and go to it.\\
-G N     & (N) Go to the next article.\\
-G P     & (P) Go to the previous article.\\
-G C-n   & (M-C-n) Go to the next article with the same subject.\\
-G C-p   & (M-C-p) Go to the previous article with the same subject.\\
-\end{keys}
-
-\subsection*{Help Commands}
-\begin{keys}{H d}
-H d     & (C-c C-d) Describe this group. [Prefix: re-read the description
-from the server.]\\
-H f     & Try to fetch the FAQ for this group using ange-ftp.\\
-H h     & Give a very short help message.\\
-H i     & (C-c C-i) Go to the Gnus online info.\\
-H v     & Display the Gnus version number.\\
-\end{keys}
-
-\subsection*{Thread Commands}
-\begin{keys}{T \#}
-T \#    & Mark this thread with the process mark.\\
-T d     & Move to the next article in this thread (down). [distance]\\
-T h     & Hide this (sub)thread.\\
-T i     & Increase the score of this thread.\\
-T k     & (M-C-k) Mark the current (sub)thread as read. [Negative prefix:
-tick it, positive prefix: unmark it.]\\
-T l     & (M-C-l) Lower the score of this thread.\\
-T n     & Go to the next thread. [distance]\\
-T p     & Go to the previous thread. [distance]\\
-T s     & Show the thread hidden under this article.\\
-T u     & Move to the previous article in this thread (up). [distance]\\
-T H     & Hide all threads.\\
-T S     & Show all hidden threads.\\
-T T     & (M-C-t) Toggle threading.\\
-\end{keys}
-
-\subsection*{Mark Articles}
-\begin{keys}{M M-C-r}
-d       & (M d, M r) Mark this article as read and move to the next one.
-[scope]\\ 
-D       & Mark this article as read and move to the previous one. [scope]\\
-u       & (!, M !, M t) Tick this article (mark it as interesting) and move
-to the next one. [scope]\\
-U       & Tick this article and move to the previous one. [scope]\\ 
-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 ?     & (?) Mark this article as dormant (only followups are
-interesting). [scope]\\ 
-M b     & Set a bookmark in this article.\\
-M e     & (E, M x) Mark this article as expirable. [scope]\\
-M k     & (k) Kill all articles with the same subject then select the next
-one.\\ 
-M B     & Remove the bookmark from this article.\\
-M C     & Catchup the articles that are not marked as unread.\\
-M D     & Show all dormant articles (normally they are hidden unless they
-have any followups).\\
-M H     & Catchup (mark read) this group to point.\\
-M K     & (C-k) Kill all articles with the same subject as this one.\\
-C-w     & Mark all articles between point and mark as read.\\
-M S     & (C-c M-C-s) Show all expunged articles.\\
-M C-c   & Catchup all articles in this group.\\
-M M-r   & (x) Expunge all read articles from this group.\\
-M M-D   & Hide all dormant articles.\\
-M M-C-r & Expunge all articles having a given mark.\\
-\end{keys}
-
-\subsubsection*{The Process Mark}
-{\samepage These commands set and remove the process mark \#. You only need
-to use it if the set of articles you want to operate on is
-non-contiguous. Else use a numeric prefix.} \\* 
-\begin{keys}{M p R}
-M p a   & Mark all articles (in series order).\\
-M p p   & (\#, M \#) Mark this article.\\
-M p r   & Mark all articles in the region.\\
-M p s   & Mark all articles in the current series.\\
-M p t   & Mark all articles in this (sub)thread.\\
-M p u   & (M-\#, M M-\#) Unmark this article.\\
-M p R   & Mark all articles matching a regexp.\\
-M p S   & Mark all series that already contain a marked article.\\
-M p U   & Unmark all articles.\\
-\end{keys}
-
-\subsubsection*{Mark Based on Score}
-\begin{keys}{M s m}
-M s c   & Clear all marks from all high-scored articles. [score]\\
-M s k   & Kill all low-scored articles. [score]\\
-M s m   & Mark all high-scored articles with a given mark. [score]\\
-M s u   & Mark all high-scored articles as interesting (tick them). [score]\\
-\end{keys}
-
-\subsection*{Output Articles}
-\begin{keys}{O m}
-O f     & Save this article in plain file format. [p/p]\\
-O h     & Save this article in mh folder format. [p/p]\\
-O m     & Save this article in mail format. [p/p]\\
-O o     & (o) Save this article using the default article saver. [p/p]\\
-O p     & ($\mid$) Pipe this article to a shell command. [p/p]\\
-O r     & Save this article in rmail format. [p/p]\\
-O v     & Save this article in vm format. [p/p]\\
-\end{keys}
-
-\subsection*{Wash the Article Buffer}
-\begin{keys}{W C-c}
-W a     & Hide unwanted parts of the article. Calls W h, W s, W C-c.\\
-W b     & Make external references in the article (Message-IDs and URLs) to
-mouse-clickable buttons.\\ 
-W c     & Hide article citation.\\
-W d     & Remove extra CRs from the article.\\
-W f     & Look for and display any X-Face headers.\\
-W h     & Hide article headers.\\
-W o     & Treat overstrike or underline in the article.\\
-W q     & Treat quoted-printable in the article.\\
-W s     & Hide article signature.\\
-W t     & Convert the article timestamp to UTC (GMT).\\
-W w     & Do word wrap in the article.\\
-W A     & Highlight this article. Calls W b, W C, W H, W S.\\
-W C     & Highlight article citation.\\
-W H     & Highlight article headers.\\
-W S     & Highlight article signature.\\
-W T     & Convert the article timestamp to time lapsed since sent.\\
-W C-c   & Hide article citation using a more intelligent algorithm.\\
-W C-t   & Convert the article timestamp to the local timezone.\\
-\end{keys}
-
-\subsection*{Post, Followup, Reply, Forward, Cancel}
-\samepage{These commands put you in a separate post or mail buffer. After
-editing the article, send it by pressing C-c C-c.  If you are in a
-foreign group and want to post the article using the foreign server, give
-a prefix to C-c C-c.} \\* 
-\begin{keys}{S O m}
-S b     & Both post a followup to this article, and send a reply.\\
-S c     & (C) Cancel this article (only works if it is your own).\\
-S f     & (f) Post a followup to this article.\\
-S m     & (m) Send a mail to some other person.\\
-S o m   & (C-c C-f) Forward this article by mail to a person.\\
-S o p   & Forward this article to a newsgroup.\\
-S p     & (a) Post an article to this group.\\
-S r     & (r) Mail a reply to the author of this article.\\
-S s     & Supersede this article with a new one (only for own articles).\\
-S u     & Uuencode a file and post it as a series.\\
-S B     & Post a followup, send a reply, and include the original. [p/p]\\
-S F     & (F) Post a followup and include the original. [p/p]\\
-S O m   & Digest these series and forward by mail. [p/p]\\
-S O p   & Digest these series and forward to a newsgroup.\\
-S R     & (R) Mail a reply and include the original. [p/p]\\
-\end{keys}
-If you want to cancel or supersede an article you just posted (before it
-has appeared on the server), go to the *post-news* buffer, change
-`Message-ID' to `Cancel' or `Supersedes' and send it again with C-c C-c.
-
-\subsection*{Extract Series (Uudecode etc)}
-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 b}inhex these series. [p/p]\\
-X o     & Simply {\bf o}utput these series (no decoding). [p/p]\\ 
-X p     & Unpack these {\bf p}ostscript series. [p/p]\\
-X s     & Un-{\bf s}har these series. [p/p]\\
-X u     & {\bf U}udecode 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}
-
-\subsection*{Exit the Current Group}
-\begin{keys}{Z G}
-Z c     & (c) Mark all unticked articles as read and exit.\\
-Z n     & Mark all articles as read and go to the next group.\\
-Z C     & Mark all articles as read and exit.\\
-Z E     & (Q) Exit without updating the group information.\\
-Z G     & (M-g) Check for new articles in this group.\\
-Z N     & Exit and go to the next group.\\
-Z P     & Exit and go to the previous group.\\
-Z R     & Exit this group, and then enter it again. [Prefix: select all
-articles, read and unread.]\\
-Z Z     & (q, Z Q) Exit this group.\\
-\end{keys}
-
-\subsection*{Various Group Commands}
-\begin{keys}{V C-r}
-V \&    & (\&) Execute a command on all articles matching a regexp.
-[Prefix: move backwards.]\\
-V e     & (=) Expand the Summary window. [Prefix: shrink it to display the
-Article window]\\
-V k     & (M-k) Edit this group's kill file.\\
-V r     & (M-^) Fetch the article with a given Message-ID.\\
-V u     & Execute a command on all articles having the process mark.\\
-V D     & (C-d) Undigestify this article into a separate group.\\
-V K     & (M-K) Edit the general kill file.\\
-V T     & (C-t) Toggle truncation of summary lines.\\
-V C-r   & Search through all previous articles for a regexp.\\
-V C-s   & Search through all subsequent articles for a regexp.\\
-\end{keys}
-
-\subsubsection*{Sort the Summary Buffer}
-\begin{keys}{V s n}
-V s a   & (C-c C-s C-a) Sort the summary by author.\\
-V s d   & (C-c C-s C-d) Sort the summary by date.\\
-V s i   & (C-c C-s C-i) Sort the summary by article score.\\
-V s n   & (C-c C-s C-n) Sort the summary by article number.\\
-V s s   & (C-c C-s C-s) Sort the summary by subject.\\
-\end{keys}
-
-\subsubsection*{Score Commands}
-Read about Adaptive Scoring in the online info.
-\newcommand{\B}[1]{{\bf#1})}    % bold l)etter
-\begin{keys}{\bf A p m l}
-V S a   & Add a new score entry, specifying all elements.\\
-V S c   & Specify a new score file as current.\\
-V S e   & Edit the current score alist.\\
-V S f   & Edit a score file and make it the current one.\\
-V S m   & Mark all articles below a given score as read.\\
-V S s   & Set the score of this article.\\
-V S t   & Display all score rules applied to this article.\\
-V S x   & Expunge all low-scored articles. [score]\\
-V S C   & Customize the current score file through a user-friendly interface.\\
-V S S   & Display the score of this article.\\
-\bf A p m l& Make a scoring entry based on this article.\\
-\end{keys}
-
-{\samepage
-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 date as number of days.\\
-\end{keys}
-}
-
-\section*{Article Mode}
-All keys for Summary mode also work in Article mode.
-The normal navigation keys work in Article mode.
-Some additional keys are:\\*
-\begin{keys}{C-c C-m}
-RET     & (mouse-2 (middle button)) Activate the button at point (to follow
-an URL etc).\\
-TAB     & Move the point to the next button.\\
-C-c ^   & Get the article with the Message-ID near point.\\
-C-c C-m & Send reply to the address near point and include the original.\\
-h       & Go to the header line of the article in the summary buffer.\\
-\end{keys}
-
-\section*{Server Mode}
-To enter this mode, press `^' while in Group mode.\\*
-\begin{keys}{SPC}
-SPC     & (RET) Browse this server.\\
-a       & Add a new server.\\
-c       & Copy this server.\\
-e       & Edit a server.\\
-k       & Kill this server. [scope]\\
-l       & List all servers.\\
-q       & Return to the group buffer.\\
-y       & Yank the previously killed server.\\
-\end{keys}
+% page 2, left column
+\SummaryMode
+\Asubmap
+\Bsubmap
+\Gsubmap
+\Hsubmap
+\Tsubmap
+\pagebreak
 
-\section*{Browse Server Mode}
-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 next group. [distance]\\
-p       & Go to the previous group. [distance]\\
-q       & (l) Exit browse mode.\\
-u       & Subscribe to the current group. [scope]\\
-\end{keys}
+% page 2, right column
+\Msubmap
+\Marks
+\pagebreak
 
-\vfill\samepage
-\begin{center}
-Copyright \copyright\ 1987 Free Software Foundation, Inc.\\*
-Copyright \copyright\ 1995 \author.\\*
-Created from the Gnus manual Copyright \copyright\ 1994 Lars Magne
-Ingebrigtsen.\\*
-and the Emacs Help Bindings feature (C-h b).\\*
-\end{center}
+% page 3
+\Osubmap
+\Ssubmap
+\Xsubmap
+\Vsubmap
+\SortSummary
+\Wsubmap
+\Zsubmap
+\ArticleMode
+\ServerMode
+
+% page 4
+\BrowseServer
+\pagebreak
+\onecolumn
+\vspace*{\fill}
+\CopyRight
 
-Permission is granted to make and distribute copies of this reference card
-provided the copyright notice and this permission are preserved on all
-copies. 
-Please send corrections, additions and suggestions to the above email
-address. Refcard version \refver. \hfill \date
 \end{document}
-
-