*** pub/sgnus/lisp/gnus-cache.el Sat Dec 9 11:08:22 1995 --- sgnus/lisp/gnus-cache.el Sun Dec 10 10:25:16 1995 *************** *** 446,475 **** (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)) (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)) ?/ ?.))) 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) (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) ;; Go through all the other files. (while alphs ! (when (file-directory-p (car alphs)) ;; We descend directories. (gnus-cache-generate-active (car alphs))) (setq alphs (cdr alphs))) --- 446,477 ---- (defun gnus-cache-generate-active (&optional directory) "Generate the cache active file." (let* ((top (null 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 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]+$" (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 '<)) ! (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 (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))) *** pub/sgnus/lisp/gnus-msg.el Sat Dec 9 11:08:24 1995 --- sgnus/lisp/gnus-msg.el Sun Dec 10 11:16:23 1995 *************** *** 424,437 **** "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))))) (defun gnus-summary-supersede-article () "Compose an article that will supersede a previous article. --- 424,438 ---- "Cancel an article you posted." (interactive "P") (gnus-set-global-variables) ! (let ((articles (gnus-summary-work-articles n)) ! article) ! (while (setq article (pop articles)) ! (when (gnus-summary-select-article t nil nil article) ! (when (gnus-eval-in-buffer-window ! gnus-original-article-buffer (gnus-cancel-news)) ! (gnus-summary-mark-as-read article gnus-canceled-mark)) ! (gnus-article-hide-headers-if-wanted)) ! (gnus-summary-remove-process-mark article)))) (defun gnus-summary-supersede-article () "Compose an article that will supersede a previous article. *************** *** 2546,2562 **** (erase-buffer) ;; Set proper mode. (funcall (car type)) ! (and (eq major-mode 'mail-mode) ! (gnus-inews-modify-mail-mode-map)) ;; Arrange for deletion of the draft after successful sending. (make-local-variable 'gnus-message-sent-hook) (setq gnus-message-sent-hook (list ! (` ! (lambda () (gnus-request-expire-articles ! (quote (, (list (cdr gnus-article-current)))) ! (, gnus-newsgroup-name) t))))) ;; Insert the draft. (insert-buffer-substring gnus-article-buffer) ;; Insert the separator. --- 2547,2568 ---- (erase-buffer) ;; Set proper mode. (funcall (car type)) ! (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 () (gnus-request-expire-articles ! (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. *** pub/sgnus/lisp/gnus-setup.el Sat Dec 9 11:08:25 1995 --- sgnus/lisp/gnus-setup.el Sun Dec 10 10:02:45 1995 *************** *** 148,154 **** (autoload 'bbdb-insinuate-gnus "bbdb-gnus" "Hook BBDB into Gnus" t) ! (add-hook gnus-startup-hook 'bbdb-insinuate-gnus) (if gnus-use-sendmail (progn --- 148,154 ---- (autoload 'bbdb-insinuate-gnus "bbdb-gnus" "Hook BBDB into Gnus" t) ! (add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus) (if gnus-use-sendmail (progn *** pub/sgnus/lisp/gnus-uu.el Sat Dec 9 11:08:27 1995 --- sgnus/lisp/gnus-uu.el Sun Dec 10 09:54:30 1995 *************** *** 700,705 **** --- 700,706 ---- (mail-header-subject header)) gnus-uu-digest-from-subject))) (let ((name (file-name-nondirectory gnus-uu-saved-article-name)) + (delim (concat "^" (make-string 30 ?-) "$")) beg subj headers headline sorthead body end-string state) (if (or (eq in-state 'first) (eq in-state 'first-and-last)) *************** *** 728,737 **** (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. (save-excursion ! (while (re-search-forward "^-" nil t) ! (replace-match "- -"))) (setq body (buffer-substring (1- (point)) (point-max))) (narrow-to-region (point-min) (point)) (if (not (setq headers gnus-uu-digest-headers)) --- 729,740 ---- (put-text-property (point-min) (point-max) 'intangible nil)) (goto-char (point-min)) (re-search-forward "\n\n") ! ;; Quote all 30-dash lines. (save-excursion ! (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)) *** pub/sgnus/lisp/gnus.el Sat Dec 9 11:08:28 1995 --- sgnus/lisp/gnus.el Sun Dec 10 11:29:28 1995 *************** *** 1039,1045 **** ("nnmbox" mail respool) ("nnml" mail respool) ("nnmh" mail respool) ! ("nndir" none prompt-address address) ("nneething" none prompt-address) ("nndoc" none prompt-address) ("nnbabyl" mail respool) --- 1039,1045 ---- ("nnmbox" mail respool) ("nnml" mail respool) ("nnmh" mail respool) ! ("nndir" post-mail prompt-address address) ("nneething" none prompt-address) ("nndoc" none prompt-address) ("nnbabyl" mail respool) *************** *** 1439,1445 **** "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)" "The mail address of the Gnus maintainers.") ! (defconst gnus-version "September Gnus v0.20" "Version number for this version of Gnus.") (defvar gnus-info-nodes --- 1439,1445 ---- "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)" "The mail address of the Gnus maintainers.") ! (defconst gnus-version "September Gnus v0.21" "Version number for this version of Gnus.") (defvar gnus-info-nodes *************** *** 1771,1777 **** ("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-msg" :interactive t gnus-group-post-news gnus-group-mail gnus-summary-post-news gnus-summary-followup gnus-summary-followup-with-original --- 1771,1777 ---- ("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-news-mail gnus-mail-reply) ("gnus-msg" :interactive t gnus-group-post-news gnus-group-mail gnus-summary-post-news gnus-summary-followup gnus-summary-followup-with-original *************** *** 2807,2812 **** --- 2807,2814 ---- (if (get-file-buffer (gnus-newsgroup-kill-file nil)) (kill-buffer (get-file-buffer (gnus-newsgroup-kill-file nil)))) (gnus-kill-buffer nntp-server-buffer) + ;; Backlog. + (and gnus-keep-backlog (gnus-backlog-shutdown)) ;; Kill Gnus buffers. (while gnus-buffer-list (gnus-kill-buffer (car gnus-buffer-list)) *************** *** 4645,4651 **** (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-sethash group (list t nil (list group gnus-level-default-subscribed nil nil --- 4647,4654 ---- (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))) ! (cur (current-buffer))) (gnus-sethash group (list t nil (list group gnus-level-default-subscribed nil nil *************** *** 4664,4670 **** (gnus-group-read-group t t group) (error nil) (quit nil)) ! (not (equal major-mode 'gnus-group-mode)))) (defun gnus-group-jump-to-group (group) "Jump to newsgroup GROUP." --- 4667,4674 ---- (gnus-group-read-group t t group) (error nil) (quit nil)) ! ; (debug (current-buffer)) ! (not (equal (current-buffer) cur)))) (defun gnus-group-jump-to-group (group) "Jump to newsgroup GROUP." *************** *** 6859,6864 **** --- 6863,6869 ---- (if (get-buffer buffer) (progn (set-buffer buffer) + (setq gnus-summary-buffer (current-buffer)) (not gnus-newsgroup-prepared)) ;; Fix by Sudish Joseph (setq gnus-summary-buffer (set-buffer (get-buffer-create buffer))) *************** *** 8083,8089 **** "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)) (xref-hashtb (make-vector 63 0)) start group entry number xrefs header) (while headers --- 8088,8098 ---- "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)) ! (virtual (memq 'virtual ! (assoc (symbol-name (car (gnus-find-method-for-group ! from-newsgroup))) ! gnus-valid-select-methods))) ! (prefix (if virtual "" (gnus-group-real-prefix from-newsgroup))) (xref-hashtb (make-vector 63 0)) start group entry number xrefs header) (while headers *************** *** 9796,9820 **** (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?")))) (defun gnus-summary-isearch-article (&optional regexp-p) "Do incremental search forward on the current article. --- 9805,9837 ---- (interactive "P") (gnus-set-global-variables) (gnus-summary-select-article) (let ((name (format "%s-%d" (gnus-group-prefixed-name gnus-newsgroup-name (list 'nndoc "")) gnus-current-article)) (ogroup gnus-newsgroup-name) (buf (current-buffer))) ! (save-excursion ! (set-buffer gnus-original-article-buffer) ! (goto-char (point-min)) ! (search-forward "\n\n" nil t) ! (narrow-to-region (point) (point-max))) ! (unwind-protect ! (if (gnus-group-read-ephemeral-group ! name `(nndoc ,name (nndoc-address ! ,(get-buffer gnus-original-article-buffer)) ! (nndoc-article-type ,(if force 'digest 'guess))) t) ! ;; Make all postings to this group go to the parent group. ! (setcdr (nthcdr 4 (gnus-get-info name)) ! (list (list (cons 'to-group ogroup)))) ! ;; Couldn't select this doc group. ! (switch-to-buffer buf) ! (gnus-set-global-variables) ! (gnus-configure-windows 'summary) ! (gnus-message 3 "Article couldn't be entered?")) ! (save-excursion ! (set-buffer gnus-original-article-buffer) ! (widen))))) (defun gnus-summary-isearch-article (&optional regexp-p) "Do incremental search forward on the current article. *************** *** 10844,10851 **** (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). 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." --- 10861,10868 ---- (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). If MARK is nil, then the default character `?D' is used. If ARTICLE is nil, then the article on the current line will be marked." *************** *** 13427,13436 **** (force-group-method group-method) ;; Override normal method. ((and gnus-post-method ! (gnus-method-option-p group-method 'post)) gnus-post-method) ;; Perhaps this is a mail group? ! ((not (gnus-member-of-valid 'post group)) group-method) ;; Use the normal select method. (t gnus-select-method)))) --- 13444,13455 ---- (force-group-method group-method) ;; Override normal method. ((and gnus-post-method ! (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? ! ((and (not (gnus-member-of-valid 'post group)) ! (not (gnus-method-option-p group-method 'post-mail))) group-method) ;; Use the normal select method. (t gnus-select-method)))) *************** *** 13443,13450 **** (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))) (defmacro gnus-server-equal (ss1 ss2) "Say whether two servers are equal." --- 13462,13469 ---- (defun gnus-method-option-p (method option) "Return non-nil if select METHOD has OPTION as a parameter." ! (memq option (assoc (format "%s" (car method)) ! gnus-valid-select-methods))) (defmacro gnus-server-equal (ss1 ss2) "Say whether two servers are equal." *************** *** 14145,14151 **** t) (condition-case () (gnus-request-group group) ! (error nil) (quit nil)) (save-excursion (set-buffer nntp-server-buffer) --- 14164,14170 ---- t) (condition-case () (gnus-request-group group) ! ; (error nil) (quit nil)) (save-excursion (set-buffer nntp-server-buffer) *************** *** 15077,15089 **** (set-buffer (get-buffer-create gnus-backlog-buffer)) (buffer-disable-undo (current-buffer)) (setq buffer-read-only t) ! (gnus-add-current-to-buffer-list)))) (defun gnus-backlog-setup () "Initialize backlog variables." (unless gnus-backlog-hashtb (setq gnus-backlog-hashtb (make-vector 1023 0)))) (defun gnus-backlog-enter-article (group number buffer) (gnus-backlog-setup) (let ((ident (intern (concat group ":" (int-to-string number)) --- 15096,15116 ---- (set-buffer (get-buffer-create gnus-backlog-buffer)) (buffer-disable-undo (current-buffer)) (setq buffer-read-only t) ! (gnus-add-current-to-buffer-list) ! (get-buffer gnus-backlog-buffer)))) (defun gnus-backlog-setup () "Initialize backlog variables." (unless gnus-backlog-hashtb (setq gnus-backlog-hashtb (make-vector 1023 0)))) + (defun gnus-backlog-shutdown () + "Clear all backlog variables and buffers." + (when (get-buffer gnus-backlog-buffer) + (kill-buffer gnus-backlog-buffer)) + (setq gnus-backlog-hashtb nil + gnus-backlog-articles nil)) + (defun gnus-backlog-enter-article (group number buffer) (gnus-backlog-setup) (let ((ident (intern (concat group ":" (int-to-string number)) *************** *** 15145,15151 **** (1+ beg) 'gnus-backlog (current-buffer) (point-max))))) (let ((buffer-read-only nil)) (erase-buffer) ! (insert-buffer-substring gnus-backlog-buffer beg end))))) ;; Allow redefinition of Gnus functions. --- 15172,15179 ---- (1+ beg) 'gnus-backlog (current-buffer) (point-max))))) (let ((buffer-read-only nil)) (erase-buffer) ! (insert-buffer-substring gnus-backlog-buffer beg end) ! t)))) ;; Allow redefinition of Gnus functions. *** pub/sgnus/lisp/nndoc.el Sat Dec 9 11:08:28 1995 --- sgnus/lisp/nndoc.el Sun Dec 10 10:02:41 1995 *************** *** 30,78 **** (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) (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.") ! ! (defvar nndoc-article-begin nil) (defvar nndoc-article-end nil) (defvar nndoc-head-begin nil) (defvar nndoc-head-end nil) ! (defvar nndoc-first-article nil) ! (defvar nndoc-end-of-file nil) (defvar nndoc-body-begin nil) (defvar nndoc-current-server nil) (defvar nndoc-server-alist nil) --- 30,99 ---- (require 'nnmail) (defvar nndoc-article-type 'mbox ! "*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 ! (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)) ! )) ! (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-file-end nil) (defvar nndoc-body-begin nil) + (defvar nndoc-body-end-function nil) + (defvar nndoc-body-end nil) + (defvar nndoc-dissection-alist nil) + (defvar nndoc-prepare-body nil) (defvar nndoc-current-server nil) (defvar nndoc-server-alist nil) *************** *** 106,159 **** ;;; Interface functions ! (defun nndoc-retrieve-headers (sequence &optional newsgroup server fetch-old) (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)) '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))) ;; 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)) --- 127,152 ---- ;;; Interface functions ! (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 (article entry) ! (if (stringp (car articles)) 'headers ! (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. (goto-char (point-min)) (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) (replace-match " " t t)) *************** *** 175,182 **** (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) --- 168,173 ---- *************** *** 193,224 **** (defun nndoc-request-article (article &optional newsgroup server buffer) (nndoc-possibly-change-buffer newsgroup server) (save-excursion ! (let ((buffer (or buffer nntp-server-buffer))) (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"))) t)))) (defun nndoc-request-group (group &optional server dont-check) --- 184,205 ---- (defun nndoc-request-article (article &optional newsgroup server buffer) (nndoc-possibly-change-buffer newsgroup server) (save-excursion ! (let ((buffer (or buffer nntp-server-buffer)) ! (entry (cdr (assq article nndoc-dissection-alist))) ! beg) (set-buffer buffer) (erase-buffer) (if (stringp article) nil ! (insert-buffer-substring ! nndoc-current-buffer (car entry) (nth 1 entry)) ! (insert "\n") ! (setq beg (point)) ! (insert-buffer-substring ! nndoc-current-buffer (nth 2 entry) (nth 3 entry)) ! (goto-char beg) ! (when nndoc-prepare-body ! (funcall nndoc-prepare-body)) t)))) (defun nndoc-request-group (group &optional server dont-check) *************** *** 228,240 **** (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))) (if (zerop number) (progn (nndoc-close-group group) --- 209,220 ---- (progn (setq nndoc-status-string "No such file or buffer") nil) (if dont-check t (save-excursion (set-buffer nntp-server-buffer) (erase-buffer) ! (let ((number (length nndoc-dissection-alist))) (if (zerop number) (progn (nndoc-close-group group) *************** *** 251,256 **** --- 231,237 ---- nndoc-group-alist)) (setq nndoc-current-buffer nil) (setq nndoc-current-server nil) + (setq nndoc-dissection-alist nil) t) (defun nndoc-request-list (&optional server) *************** *** 295,436 **** (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))) t)) ;; MIME (RFC 1341) digest hack by Ulrik Dickow . ! (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) (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." (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))) 'forward) ((re-search-forward "\^_\^L *\n" nil t) 'babyl) (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)))) (provide 'nndoc) --- 276,434 ---- (erase-buffer) (if (stringp nndoc-address) (insert-file-contents nndoc-address) (insert-buffer-substring nndoc-address))))) ! (save-excursion ! (set-buffer nndoc-current-buffer) ! (nndoc-set-delims) ! (nndoc-dissect-buffer)) t)) ;; MIME (RFC 1341) digest hack by Ulrik Dickow . ! (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)) ! (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) ! ((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 ((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) *** pub/sgnus/lisp/nnheader.el Sat Dec 9 11:08:29 1995 --- sgnus/lisp/nnheader.el Sun Dec 10 10:02:41 1995 *************** *** 37,42 **** --- 37,43 ---- ;;; Code: (require 'mail-utils) + (require 'sendmail) (eval-when-compile (require 'cl)) (defvar nnheader-max-head-length 4096 *** pub/sgnus/lisp/ChangeLog Sat Dec 9 11:08:36 1995 --- sgnus/lisp/ChangeLog Sun Dec 10 11:29:29 1995 *************** *** 1,8 **** --- 1,44 ---- + Sun Dec 10 10:38:47 1995 Lars Magne Ingebrigtsen + + * 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 + + * gnus-cache.el (gnus-cache-generate-active): Didn't work. + + Sun Dec 10 10:01:06 1995 Lars Magne Ingebrigtsen + + * gnus-setup.el (gnus-use-bbdb): `gnus-startup-hook' wasn't + quoted. + + Sun Dec 10 06:37:45 1995 Lars Ingebrigtsen + + * nndoc.el: Reimplemented most of this file. + + Sat Dec 9 16:35:54 1995 Lars Ingebrigtsen + + * 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 * 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 *** pub/sgnus/lisp/Makefile Sat Dec 9 11:08:36 1995 --- sgnus/lisp/Makefile Sun Dec 10 09:58:45 1995 *************** *** 12,15 **** 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 --- 12,15 ---- etags *.el separately: ! rm -f *.elc ; for i in *.el; do $(EMACS) $(FLAGS) -f batch-byte-compile $$i; done *** pub/sgnus/texi/gnus.texi Sat Dec 9 11:08:37 1995 --- sgnus/texi/gnus.texi Sun Dec 10 10:24:17 1995 *************** *** 1721,1728 **** (@code{gnus-group-make-doc-group}). If you give a prefix to this command, you will be prompted for a file name and a file type. Currently supported types are @code{babyl}, @code{mbox}, @code{digest}, ! @code{mmdf}, and @code{forward}. If you run this command without a ! prefix, Gnus will guess at the file type. @item G DEL @kindex G DEL (Group) --- 1721,1728 ---- (@code{gnus-group-make-doc-group}). If you give a prefix to this command, you will be prompted for a file name and a file type. Currently supported types are @code{babyl}, @code{mbox}, @code{digest}, ! @code{mmdf}, @code{news}, @code{rnews}, and @code{forward}. If you run ! this command without a prefix, Gnus will guess at the file type. @item G DEL @kindex G DEL (Group) *************** *** 2161,2172 **** @cindex help group @code{nndoc} is a cute little thing that will let you read a single file ! as a newsgroup. Currently supported file types are @code{babyl} (the ! RMAIL file type), @code{mbox} (standard Unix mbox files), @code{digest} ! (various digests, MIME and otherwise), @code{mmdf} (the MMDF mail box ! format), and @code{forward} (a single forwarded mail). You can also use ! the special "file type" @code{guess}, which means that @code{nndoc} will ! try to guess what file type it is looking at. @code{nndoc} will not try to change the file or insert any extra headers into it---it will simply, like, let you use the file as the basis for a --- 2161,2205 ---- @cindex help group @code{nndoc} is a cute little thing that will let you read a single file ! as a newsgroup. Several files types are supported: ! ! @table @code ! @cindex babyl ! @cindex rmail mbox ! @item babyl ! The babyl (rmail) mail box. ! @cindex mbox ! @cindex Unix mbox ! @item mbox ! The standard Unix mbox file. ! @cindex MMDF mail box ! @item mmdf ! The MMDF mail box format. ! @item news ! Several news articles appended into a file. ! @item rnews ! @cindex rnews batch files ! The rnews batch transport format. ! @cindex forwarded messages ! @item forward ! Forwarded articles. ! @item mime-digest ! @cindex digest ! @cindex MIME digest ! @cindex 1153 digest ! @cindex RFC 1153 digest ! @cindex RFC 341 digest ! MIME (RFC 1341) digest format. ! @item standard-digest ! The standard (RFC 1153) digest format. ! @item slack-digest ! Non-standard digest format---matches most things, but does it badly. ! @end table ! ! You can also use the special "file type" @code{guess}, which means that ! @code{nndoc} will try to guess what file type it is looking at. ! @code{digest} means that @code{nndoc} should guess what digest type the ! file is. @code{nndoc} will not try to change the file or insert any extra headers into it---it will simply, like, let you use the file as the basis for a *************** *** 7194,7204 **** @item A D @kindex A D (Summary) @findex gnus-summary-enter-digest-group ! If the current article is a digest, you might use this command to enter ! a group based on the current digest ! (@code{gnus-summary-enter-digest-group}). Gnus will try to guess what ! article type is currently displayed unless you give a prefix to this ! command, which forces a "digest" interpretation. @item C-t @kindex C-t (Summary) --- 7227,7240 ---- @item A D @kindex A D (Summary) @findex gnus-summary-enter-digest-group ! If the current article is a collection of other articles (for instance, ! a digest), you might use this command to enter a group based on the that ! article (@code{gnus-summary-enter-digest-group}). Gnus will try to ! guess what article type is currently displayed unless you give a prefix ! to this command, which forces a "digest" interpretation. Basically, ! whenever you see a message that is a collection of other messages on ! some format, you @kbd{A D} and read these messages in a more convenient ! fashion. @item C-t @kindex C-t (Summary) *** pub/sgnus/texi/refcard.tex Sat Dec 9 11:08:36 1995 --- sgnus/texi/refcard.tex Sun Dec 10 10:21:56 1995 *************** *** 1,572 **** ! % 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 % 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} ! \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} \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} ! \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} ! \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} ! \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} - 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} - - --- 1,65 ---- ! % Reference Card for (ding) Gnus, 3 twocolumn pages. % To be processed with latex 2.09 ! \def\Guide{Card}\def\guide{card} ! \def\logoscale{0.25} ! \def\sec{\section*} ! \def\subsec{\subsection*} ! \def\subsubsec{\subsubsection*} \documentstyle{article} ! \textwidth 7.26in \textheight 10in \topmargin -1.0in % the same settings work for A4, although there is a bit of space at the ! % top and bottom of the page. \oddsidemargin -0.5in \evensidemargin -0.5in \begin{document} \twocolumn\scriptsize\pagestyle{empty} ! \input{gnusref} + % page 1, left column + \Title + \par + \vspace{0.5\baselineskip} + \Logo{refcard} + \vspace*{\fill} + \GroupLevels + \GroupMode \pagebreak ! % page 1, right column ! \Notes ! \vspace*{\fill} ! \GroupCommands \pagebreak ! % page 2, left column ! \SummaryMode ! \Asubmap ! \Bsubmap ! \Gsubmap ! \Hsubmap ! \Tsubmap ! \pagebreak ! % page 2, right column ! \Msubmap ! \Marks ! \pagebreak ! % page 3 ! \Osubmap ! \Ssubmap ! \Xsubmap ! \Vsubmap ! \SortSummary ! \Wsubmap ! \Zsubmap ! \ArticleMode ! \ServerMode ! % page 4 ! \BrowseServer ! \pagebreak ! \onecolumn ! \vspace*{\fill} ! \CopyRight \end{document} *** pub/sgnus/texi/ChangeLog Sat Dec 9 11:08:36 1995 --- sgnus/texi/ChangeLog Sat Dec 9 16:57:21 1995 *************** *** 1,3 **** --- 1,7 ---- + Sat Dec 9 16:55:29 1995 Lars Ingebrigtsen + + * gnus.texi (nndoc): Change. + Fri Dec 8 06:25:29 1995 Lars Ingebrigtsen * gnus.texi (Group Buffer Format): Addition.