*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 03:05:51 +0000 (03:05 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 03:05:51 +0000 (03:05 +0000)
lisp/ChangeLog
lisp/gnus-msg.el
lisp/gnus.el
lisp/nnfolder.el
lisp/nnheader.el
lisp/nnmbox.el
lisp/nntp.el
texi/refcard.tex

index cadecec..a6e128e 100644 (file)
@@ -1,5 +1,33 @@
+Fri Aug  4 00:08:59 1995  Lars Magne Ingebrigtsen  <lingebri@sunsci7.cern.ch>
+
+       * nnheader.el (nnheader-find-file-noselect): New function.
+       * nnfolder.el (nnfolder-read-folder): Use it.
+       * nnmbox.el (nnmbox-possibly-change-newsgroup): Ditto.
+
+       * gnus-msg.el (gnus-inews-check-post): Use y-or-n instead of
+       yes-or-no. 
+
+       * nntp.el (nntp-open-server): Didn't use port number when opening.
+       
+       * gnus.el (gnus): Set the name of the current startup file here.
+
+Thu Aug  3 22:15:06 1995  Lars Magne Ingebrigtsen  <lingebri@sunsci7.cern.ch>
+
+       * gnus.el (gnus-remove-some-windows): Didn't delete all summary
+       windows. 
+
+       * nntp.el (nntp-send-xover-command): Wait for reply.
+       (nntp-retrieve-headers-with-xover): Would not do anything useful
+       if nntp-nov-gap was nil.
+
+Thu Aug  3 21:48:51 1995  Lars Magne Ingebrigtsen  <lingebri@sunsci4.cern.ch>
+
+       * gnus-msg.el (gnus-debug): Don't quote non-lists. 
+
 Wed Aug  2 15:08:10 1995  Lars Magne Ingebrigtsen  <lingebri@sunsci7.cern.ch>
 
+       * gnus.el: 0.99.3 is released.
+
        * gnus.el (gnus): Don't read the dribble file that early after
        all. 
        (gnus-active-to-gnus-format): Set group to nil anyway.
index 1a8617e..11e84a8 100644 (file)
@@ -769,7 +769,7 @@ will attempt to use the foreign server to post the article."
         (or (gnus-check-before-posting 'sendsys)
             (save-excursion
               (if (re-search-forward "^Sendsys:\\|^Version:" nil t)
-                  (gnus-yes-or-no-p
+                  (gnus-y-or-n-p
                    (format "The article contains a %s command. Really post? "
                            (buffer-substring (match-beginning 0) 
                                              (1- (match-end 0)))))
@@ -782,7 +782,7 @@ will attempt to use the foreign server to post the article."
                 (or (not message-id)
                     (and (string-match "@" message-id)
                          (string-match "@[^\\.]*\\." message-id))
-                    (gnus-yes-or-no-p
+                    (gnus-y-or-n-p
                      (format 
                       "The Message-ID looks strange: \"%s\". Really post? "
                       message-id))))))
@@ -793,13 +793,13 @@ will attempt to use the foreign server to post the article."
                      (from (mail-fetch-field "from")))
                 (cond
                  ((not from)
-                  (gnus-yes-or-no-p "There is no From line. Really post? "))
+                  (gnus-y-or-n-p "There is no From line. Really post? "))
                  ((not (string-match "@[^\\.]*\\." from))
-                  (gnus-yes-or-no-p
+                  (gnus-y-or-n-p
                    (format 
                     "The address looks strange: \"%s\". Really post? " from)))
                  ((string-match "(.*).*(.*)" from)
-                  (gnus-yes-or-no-p
+                  (gnus-y-or-n-p
                    (format
                     "The From header looks strange: \"%s\". Really post? " 
                     from)))
@@ -818,7 +818,7 @@ will attempt to use the foreign server to post the article."
                  (zerop (forward-line 1))))
          (or (bolp)
              (eobp)
-             (gnus-yes-or-no-p
+             (gnus-y-or-n-p
               (format
                "You have lines longer than 79 characters.  Really post? ")))))
     ;; Check for control characters.
@@ -841,7 +841,7 @@ will attempt to use the foreign server to post the article."
      (gnus-check-before-posting 'new-text)
      (if (and (= (buffer-size) (car gnus-article-check-size))
              (= (gnus-article-checksum) (cdr gnus-article-check-size)))
-        (gnus-yes-or-no-p
+        (gnus-y-or-n-p
          "It looks like there's no new text in your article. Really post? ")
        t))
     ;; Check the length of the signature.
@@ -1738,7 +1738,10 @@ The source file has to be in the Emacs load path."
     (insert "------------------- Environment follows -------------------\n\n")
     (while olist
       (if (boundp (car olist))
-         (insert "(setq " (symbol-name (car olist)) " '" 
+         (insert "(setq " (symbol-name (car olist)) 
+                 (if (or (consp (symbol-value (car olist)))
+                         (symbolp (symbol-value (car olist))))
+                     " '" " ")
                  (prin1-to-string (symbol-value (car olist))) ")\n")
        (insert ";; (makeunbound '" (symbol-name (car olist)) ")\n"))
       (setq olist (cdr olist)))
index 4ec3e3e..b21a8aa 100644 (file)
@@ -1308,7 +1308,7 @@ variable (string, integer, character, etc).")
 (defconst gnus-maintainer "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)"
   "The mail address of the Gnus maintainers.")
 
-(defconst gnus-version "(ding) Gnus v0.99.3"
+(defconst gnus-version "(ding) Gnus v0.99.4"
   "Version number for this version of Gnus.")
 
 (defvar gnus-info-nodes
@@ -2551,13 +2551,16 @@ If optional argument RE-ONLY is non-nil, strip `Re:' only."
                 (delete-window (get-buffer-window buf)))))
        (setq buffers (cdr buffers)))
       ;; Remove windows on *all* summary buffers.
-      (let ((buffers (buffer-list)))
-       (while buffers
-         (if (and (string-match 
-                   "^\\*Summary" (or (buffer-name (car buffers)) ""))
-                  (get-buffer-window (car buffers)))
-             (delete-window (get-buffer-window (car buffers))))
-         (setq buffers (cdr buffers)))))))
+      (walk-windows
+       (lambda (win)
+        (let ((buf (window-buffer win)))
+          (if (string-match  "^\\*Summary" (buffer-name buf))
+              (if first
+                  (progn
+                    (select-window win)
+                    (switch-to-buffer nntp-server-buffer)
+                    (setq first nil))
+                (delete-window win)))))))))
                          
 (defun gnus-version ()
   "Version numbers of this version of Gnus."
@@ -3166,6 +3169,11 @@ prompt the user for the name of an NNTP server to use."
            (gnus-group-quit)
          (run-hooks 'gnus-startup-hook)
          ;; NNTP server is successfully open. 
+
+         ;; Find the current startup file name.
+         (setq gnus-current-startup-file 
+               (gnus-make-newsrc-file gnus-startup-file))
+
          ;; Read the dribble file.
          (and gnus-use-dribble-file (gnus-dribble-read-file))
 
@@ -6452,17 +6460,17 @@ If READ-ALL is non-nil, all articles in the group are selected."
                  (gnus-get-newsgroup-headers-xover articles))
              ;; If we were to fetch old headers, but the backend didn't
              ;; support XOVER, then it is possible we fetched one article
-             ;; that we shouldn't have. If that's the case, we pop it off the
-             ;; list of headers.
+             ;; that we shouldn't have. If that's the case, we remove it.
              (if (not gnus-fetch-old-headers)
                  ()
                (save-excursion
                  (set-buffer nntp-server-buffer)
                  (goto-char (point-min))
-                 (and (looking-at "[0-9]+[ \t]+1[ \t]")
-                      (delete-region 
-                       (point) 
-                       (search-forward "\n.\n" nil t)))))
+                 (and 
+                  (looking-at "[0-9]+[ \t]+1[ \t]") ; This is not a NOV line.
+                  (delete-region       ; So we delete this head.
+                   (point) 
+                   (search-forward "\n.\n" nil t)))))
              (gnus-get-newsgroup-headers)))
       (gnus-message 5 "Fetching headers...done")      
       ;; Remove canceled articles from the list of unread articles.
@@ -10846,6 +10854,8 @@ or not."
             (insert (hexl-hex-string-to-integer
                      (buffer-substring (point) (+ 2 (point)))))
             (delete-char 2))
+           ((looking-at "=")
+            (delete-char 1))
            ((gnus-message 3 "Malformed MIME quoted-printable message"))))))
 
 (defvar gnus-article-time-units
@@ -12653,7 +12663,6 @@ Returns whether the updating was successful."
 (defun gnus-read-newsrc-file (&optional force)
   "Read startup file.
 If FORCE is non-nil, the .newsrc file is read."
-  (setq gnus-current-startup-file (gnus-make-newsrc-file gnus-startup-file))
   ;; Reset variables that might be defined in the .newsrc.eld file.
   (let ((variables gnus-variable-list))
     (while variables
index 64d0b42..528b9d0 100644 (file)
@@ -587,7 +587,8 @@ such things as moving mail.  All buffers always get killed upon server close.")
     ;; We should be paranoid here and make sure the group is in the alist,
     ;; and add it if it isn't.
     ;;(if (not (assoc nnfoler-current-group nnfolder-group-alist)
-    (set-buffer (setq nnfolder-current-buffer (find-file-noselect file)))
+    (set-buffer (setq nnfolder-current-buffer 
+                     (nnheader-find-file-noselect file)))
     (buffer-disable-undo (current-buffer))
     (let ((delim (concat "^" rmail-unix-mail-delimiter))
          (marker (concat "\n" nnfolder-article-marker))
index f01070c..1606b4b 100644 (file)
        (eobp)
       (widen))))    
 
+(defun nnheader-find-file-noselect (file)
+  "Basically does the same as `find-file-noselect', but avoids that function."
+  (save-excursion
+    (or
+     (get-file-buffer file)
+     (prog1
+        (get-buffer-create (create-file-buffer file))
+       (and (file-exists-p file)
+           (not (file-directory-p file))
+           (insert-file-contents file))))))
+
 (provide 'nnheader)
 
 ;;; nnheader.el ends here
index d4cdae7..cb03792 100644 (file)
          (not (buffer-name nnmbox-mbox-buffer)))
       (save-excursion
        (set-buffer (setq nnmbox-mbox-buffer 
-                         (find-file-noselect nnmbox-mbox-file)))
+                         (nnheader-find-file-noselect nnmbox-mbox-file)))
        (buffer-disable-undo (current-buffer))))
   (if (not nnmbox-group-alist)
       (nnmail-activate 'nnmbox))
       (let ((delim (concat "^" rmail-unix-mail-delimiter))
            start end)
        (set-buffer (setq nnmbox-mbox-buffer 
-                         (find-file-noselect nnmbox-mbox-file)))
+                         (nnheader-find-file-noselect nnmbox-mbox-file)))
        (buffer-disable-undo (current-buffer))
        (goto-char (point-min))
        (while (re-search-forward delim nil t)
index c2d595d..485d503 100644 (file)
@@ -356,7 +356,7 @@ instead call function `nntp-status-message' to get status message.")
          (if (member server nntp-timeout-servers)
              nil
            (run-hooks 'nntp-prepare-server-hook)
-           (nntp-open-server-semi-internal nntp-address))))))
+           (nntp-open-server-semi-internal nntp-address nntp-port-number))))))
 
 (defun nntp-close-server (&optional server)
   "Close connection to SERVER."
@@ -510,7 +510,8 @@ instead call function `nntp-status-message' to get status message.")
    (if (not (or (nntp-async-server-opened)
                (nntp-async-open-server)))
        (progn
-        (message "Can't open second connection to %s" nntp-current-server)
+        (message "Can't open second connection to %s" nntp-address)
+;       (debug)
         (ding)
         (setq nntp-async-articles nil)
         (sit-for 2))
@@ -873,7 +874,8 @@ It will prompt for a password."
 
    ;; We don't care about gaps.
    ((not nntp-nov-gap)
-    (nntp-send-xover-command (car sequence) (nntp-last-element sequence)))
+    (nntp-send-xover-command (car sequence) (nntp-last-element sequence)
+                            'wait))
 
    ;; We do it the hard way.  For each gap, an XOVER command is sent
    ;; to the server.  We do not wait for a reply from the server, we
@@ -937,14 +939,17 @@ It will prompt for a password."
 
       nntp-server-xover))))
 
-(defun nntp-send-xover-command (beg end)
+(defun nntp-send-xover-command (beg end &optional wait-for-reply)
   (let ((range (format "%d-%d" beg end)))
     (if (stringp nntp-server-xover)
        ;; If `nntp-server-xover' is a string, then we just send this
-       ;; command. We do not wait for the reply.
-       (progn
-         (nntp-send-strings-to-server nntp-server-xover range)
-         t)
+       ;; command.
+       (if wait-for-reply
+           (nntp-send-command "^\\.\r?\n" nntp-server-xover range)
+         ;; We do not wait for the reply.
+         (progn
+           (nntp-send-strings-to-server nntp-server-xover range)
+           t))
       (let ((commands nntp-xover-commands))
        ;; `nntp-xover-commands' is a list of possible XOVER commands.
        ;; We try them all until we get at positive response. 
@@ -1075,8 +1080,11 @@ If SERVICE, this this as the port number."
            (run-hooks 'nntp-server-hook)
            nntp-server-process)))))
 
+(defvar nntp-dum-num 5)
+
 (defun nntp-open-network-stream (server)
-  (open-network-stream "nntpd" nntp-server-buffer server nntp-port-number))
+  (open-network-stream 
+   "nntpd" nntp-server-buffer server nntp-port-number))
 
 (defun nntp-open-rlogin (server)
   (let ((proc (start-process "nntpd" nntp-server-buffer "rsh" server)))
index cef001f..8cd58b8 100644 (file)
@@ -1,79 +1,64 @@
-% Reference Card for (ding) Gnus 0.98
-% by Vladimir Alexiev <vladimir@cs.ualberta.ca>, 26 July 1995.
+% Reference Card for (ding) Gnus
 % 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}
 \documentstyle{article}
 \textwidth 7.5in \textheight 10in \topmargin -1.0in
-%\textwidth 7.27in \textheight 10.69in \topmargin -1.69in 
-% use this alternative setting for A4 (or leave it alone if you don't mind
-% a bit of space at the top and bottom of the page).
+% the same settings work for A4, although there is a bit of space at the
+% bottom of the page). 
 \oddsidemargin -0.5in \evensidemargin -0.5in
 \begin{document}
 \twocolumn\scriptsize\pagestyle{empty}
 \raggedbottom\raggedright
 \newlength{\mywidth}
-\setlength{\mywidth}{0.5\textwidth}
-\addtolength{\mywidth}{-0.75in}
-\newenvironment{keys}
-  {\nopagebreak[4]\begin{tabular}{@{}l@{\hspace{\tabcolsep}}p{\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
-\def\Bar{\rule[-0.3ex]{0.5pt}{2ex}\hspace{0.1em}} % the bar | symbol
 
 \begin{center}
-{\bf\LARGE (ding) Gnus Reference Card\\}
-{\normalsize for version 0.98}
+{\bf\LARGE (ding) Gnus \progver\ Reference Card\\}
+{\normalsize Refcard version \refver}
 \end{center}
 
-Gnus is complex. Currently it has some 346 interactive (user-callable)
-functions. Of these 279 have keybindings in the two major modes (Group and
-Summary/Article). Of these functions, 96 have more than one binding; some
-have 3 or even 4 bindings. The total number of keybindings is 389. In order
-to save 40\% space, every function is listed only once, 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:
+\vspace{1in}
+\centerline{(Gnus logo goes here)}
+\vspace{1in}
+\vfill
 
-\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 specified
-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.
-
-\begin{keys}
-C-c C-i & Go to the Gnus info node.\\
-C-c C-b & Send a Gnus bug report.\\
-\end{keys}
+\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}
-RET     & (=) Select this group. [Prefix: how many articles to fetch.
+\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 unread group with the lowest level.\\
+,       & 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.\\
@@ -81,7 +66,6 @@ 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.\\
-l       & List groups with unread articles. [level]\\
 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]\\
@@ -93,10 +77,9 @@ 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.\\
-L       & List all groups. [level]\\
 N       & Go to the next group. [distance]\\
 P       & Go to the previous group. [distance]\\
-Q       & Quit Gnus without saving any startup files.\\
+Q       & Quit Gnus without saving any startup (.newsrc) files.\\
 R       & Restart Gnus.\\
 V       & Display the Gnus version number.\\
 Z       & Clear the dribble buffer.\\
@@ -111,13 +94,57 @@ 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 for new articles in this group. [p/p]\\
-M-n     & Go to the previous unread group of the same or lower level. [distance]\\
-M-p     & Go to the next unread group of the same or lower level. [distance]\\
+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}
+
+\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}
+\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.\\
@@ -125,13 +152,13 @@ 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 all zombie groups.\\
+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}
+\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)\\
@@ -152,55 +179,37 @@ 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 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}
+%\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}
+\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}
+\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 (Unsubscribe).\\
-S t     & (u) Toggle subscription to this group (unsubscribe). [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}
 
-\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}
-
-\pagebreak[4]
+\pagebreak
 
 \section*{Summary and Article Modes}
-\begin{keys}
+\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]\\
@@ -215,19 +224,19 @@ M-p     & (G M-p) Go to the previous summary line of an unread article.
 \end{keys}
 
 \subsection*{Article Buffer Commands}
-\begin{keys}
+\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 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.\\
+A w     & (w) Remove page breaks (^L) from this article.\\
 \end{keys}
 
 \subsection*{Mail-Group Commands}
-These commands (except the first one) are only valid in a mail group.\\*
-\begin{keys}
+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]\\
@@ -242,8 +251,8 @@ B M-C-e & Expunge (delete from disk) all expirable articles in this group
 
 \subsection*{Select Articles}
 These commands select the target article. They do not understand the prefix.\\*
-\begin{keys}
-G b     & (,) Go to the best article (the one with the highest score).\\
+\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.\\
@@ -256,17 +265,17 @@ G C-p   & (M-C-p) Go to the previous article with the same subject.\\
 \end{keys}
 
 \subsection*{Help Commands}
-\begin{keys}
+\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 info node.\\
+H i     & (C-c C-i) Go to the Gnus online info.\\
 H v     & Display the Gnus version number.\\
 \end{keys}
 
-\subsection*{Article Thread Commands}
-\begin{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.\\
@@ -276,22 +285,21 @@ 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     & Expose the thread hidden under this article, if any.\\
+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     & Expose all hidden threads.\\
+T S     & Show all hidden threads.\\
 T T     & (M-C-t) Toggle threading.\\
 \end{keys}
 
 \subsection*{Mark Articles}
-\begin{keys}
+\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) Mark this article as interesting (tick it) and move
+u       & (!, M !, M t) Tick this article (mark it as interesting) and move
 to the next one. [scope]\\
-U       & Mark this article as interesting and move to the previous 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.
@@ -311,7 +319,7 @@ 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 (deleted) articles from the summary buffer.\\
+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}
@@ -320,7 +328,7 @@ M M-C-r & Expunge all articles having a given 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}
+\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.\\
@@ -333,7 +341,7 @@ M p U   & Unmark all articles.\\
 \end{keys}
 
 \subsubsection*{Mark Based on Score}
-\begin{keys}
+\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]\\
@@ -341,21 +349,21 @@ M s u   & Mark all high-scored articles as interesting (tick them). [score]\\
 \end{keys}
 
 \subsection*{Output Articles}
-\begin{keys}
+\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     & (\Bar) Pipe this article to a shell command. [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 a     & Hide unwanted parts of the article. Calls W h, W C-c, W s.\\
-W b     & Make external references in the article (Message-Ids and URLs) to
-buttons.\\ 
+\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.\\
@@ -365,21 +373,22 @@ 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 H, W C, W S, W b.\\
+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 it was sent.\\
+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*{Followup, Reply, Forward, Cancel}
+\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 b     & Post a followup to this article and send a reply.\\
+\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.\\
@@ -400,35 +409,35 @@ 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 will recognize when 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 will process the series accordingly. You can mark more
-than one series. If the posting contains any archives, they are expanded
-and gathered in a new group.\\*
-\begin{keys}
+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}output these series (no decoding). [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}
+\begin{keys}{X v \bf Z}
 X   \bf z & Decode these series. [p/p]\\
-X v \bf z & Decode and view 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} identifies the decoding method (b, o ,p ,s, u).
+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}
+\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}
+\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.\\
@@ -442,7 +451,7 @@ Z Z     & (q, Z Q) Exit this group.\\
 \end{keys}
 
 \subsection*{Various Group Commands}
-\begin{keys}
+\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
@@ -450,7 +459,7 @@ 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     & Undigestify this article into a separate group.\\
+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.\\
@@ -458,7 +467,7 @@ V C-s   & Search through all subsequent articles for a regexp.\\
 \end{keys}
 
 \subsubsection*{Sort the Summary Buffer}
-\begin{keys}
+\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.\\
@@ -466,9 +475,10 @@ 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*{Article Score Commands}
+\subsubsection*{Score Commands}
+Read about Adaptive Scoring in the online info.
 \newcommand{\B}[1]{{\bf#1})}    % bold l)etter
-\begin{keys}
+\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.\\
@@ -477,7 +487,7 @@ 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   & gnus-score-customize: not documented.\\
+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}
@@ -499,7 +509,7 @@ 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}
+\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}
@@ -509,41 +519,44 @@ C-c C-d & Insert the current date as number of days.\\
 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 ^   & Get the article with the Message-Id near point.\\
+\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     & Browse this server.\\
-q       & Return to the group buffer.\\
-l       & List all servers.\\
-k       & Kill this server. [scope]\\
-y       & Yank the previously killed server.\\
-c       & Copy this server.\\
+\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}
 
 \section*{Browse Server Mode}
 To enter this mode, press `B' while in Group mode.\\*
-\begin{keys}
+\begin{keys}{RET}
 RET     & Enter the current group.\\
 SPC     & Enter the current group and display the first article.\\
 ?       & Give a very short help message.\\
-l       & Exit browse mode.\\
 n       & Go to the next group. [distance]\\
 p       & Go to the previous group. [distance]\\
-q       & Exit browse mode.\\
+q       & (l) Exit browse mode.\\
 u       & Subscribe to the current group. [scope]\\
 \end{keys}
 
-\begin{center}\samepage
+\vfill\samepage
+\begin{center}
 Copyright \copyright\ 1987 Free Software Foundation, Inc.\\*
-Copyright \copyright\ 1995 Vladimir Alexiev $<$vladimir@cs.ualberta.ca$>$.\\*
+Copyright \copyright\ 1995 \author.\\*
 Created from the Gnus manual Copyright \copyright\ 1994 Lars Magne
 Ingebrigtsen.\\*
 and the Emacs Help Bindings feature (C-h b).\\*
@@ -553,7 +566,7 @@ 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. \hfill 26 July 1995
+address. Refcard version \refver. \hfill \date
 \end{document}