+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
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
(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)))
"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.
(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.
(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
(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))
(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))
("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)
"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
("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
(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))
(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
(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."
(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)))
"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
(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.
(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."
(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))))
(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."
t)
(condition-case ()
(gnus-request-group group)
- (error nil)
+ ; (error nil)
(quit nil))
(save-excursion
(set-buffer nntp-server-buffer)
(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))
(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.
(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)
;;; 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))
(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)
(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)
(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)
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)
(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)
;;; Code:
(require 'mail-utils)
+(require 'sendmail)
(eval-when-compile (require 'cl))
(defvar nnheader-max-head-length 4096
+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.
--- /dev/null
+% 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}
+}}
-% 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}
-
-