*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 02:03:17 +0000 (02:03 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 02:03:17 +0000 (02:03 +0000)
14 files changed:
Makefile
lisp/ChangeLog
lisp/gnus-score.el
lisp/gnus-uu.el
lisp/gnus-vis.el
lisp/gnus.el
lisp/nnbabyl.el
lisp/nndigest.el
lisp/nnfolder.el
lisp/nnmail.el
lisp/nnmbox.el
lisp/nnml.el
lisp/nntp.el
texi/gnus.texi

index 7c14d05..6811b9d 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ EMACS=emacs
 all: elc info
 
 elc:
-       cd lisp; make EMACS=$(EMACS) elc
+       cd lisp; $(MAKE) EMACS=$(EMACS) elc
 
 info:
        cd texi; makeinfo -o gnus gnus.texi
index 97d4c68..76d4347 100644 (file)
@@ -1,3 +1,60 @@
+Sun Apr 30 04:11:31 1995  Lars Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus.el (gnus-sorted-complement): Would reverse the result given
+       a nil list.
+       (gnus-summary-refer-article): Would not let you refer expunged
+       articles. 
+       (gnus-summary-goto-article): Give a return value.
+
+       * gnus.el: Changes here and there to use the cache.
+
+       * gnus-cache.el: New file.
+
+       * gnus.el (gnus-article-de-quoted-unreadable): Have interactive
+       calls force un-quoting.
+       (gnus-article-date-ut): Would choke on distant dates.
+       (gnus-summary-respool-article): Use the current backend as a
+       default prompt.
+       (gnus-summary-respool-article): Behave grafully on nil input.
+       (gnus-get-unread-articles): Would barf on virtual servers.
+       (gnus-use-cache): New variable.
+
+Sun Apr 30 01:29:34 1995  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+
+       * gnus.el (gnus-summary-raise-thread): Would incorrectly not stay
+       on the same line when that was required.
+       (gnus-article-date-ut): Required arguments.
+
+       * gnus-score.el (gnus-score-load-file): Would reset
+       gnus-adaptive-score-alist. 
+
+Sat Apr 29 22:27:46 1995  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
+
+       * gnus-uu.el (gnus-uu-post-news): Work in mail buffers as
+       well. General cleanup.
+
+       * nntp.el (nntp-default-sentinel): Ignore servers that do not
+       exist. 
+
+       * gnus-score.el (gnus-score-add-followups): Used exact match
+       instead of substring.
+
+Sat Apr 29 17:58:42 1995  Lars Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus.el (gnus-gnus-to-quick-newsrc-format): Inhibit quitting in
+       a particularly tricky spot.
+       (gnus-read-newsrc-el-file): The same.
+       (gnus-server-edit-server): New layout.
+       (gnus-server-read-server): Wrong interactive spec and returned to
+       the wrong buffer.
+       (gnus-group-browse-foreign-server): Also allow browsing of
+       servers. 
+
+       * nnml.el (nnml-request-list): Did not set nnml-group-alist. 
+
+       * gnus.el (gnus-summary-respool-article): Would not let you
+       respool. 
+
 Sat Apr 29 00:35:17 1995  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
        * gnus-score.el (gnus-score-add-followups): Did not work.
@@ -6,6 +63,8 @@ Sat Apr 29 00:35:17 1995  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
        async-fetched.
        (nntp-async-fetch-articles): Would re-fetch the first article.
 
+       * gnus.el: 0.62 is released
+
 Fri Apr 28 00:24:34 1995  Lars Magne Ingebrigtsen  <larsi@menja.ifi.uio.no>
 
        * gnus.el (gnus-set-mode-line): Would bug out on nil max-lens. 
index 563b6ed..a512cec 100644 (file)
@@ -671,7 +671,9 @@ See `gnus-score-expiry-days'."
                  ((equal adapt '(ignore))
                   nil)
                  ((consp adapt)
-                  adapt)))
+                  adapt)
+                 (t
+                  gnus-default-adaptive-score-alist)))
       (setq gnus-summary-mark-below 
            (or mark mark-and-expunge gnus-summary-mark-below))
       (setq gnus-summary-expunge-below 
@@ -1219,7 +1221,7 @@ See `gnus-score-expiry-days'."
   (save-excursion
     (set-buffer gnus-summary-buffer)
     (gnus-summary-score-entry 
-     "references" (header-id header) 'e score 
+     "references" (header-id header) 's score 
      (current-time-string) nil t)))
 
 
@@ -1389,7 +1391,7 @@ See `gnus-score-expiry-days'."
          (while elem
            (gnus-summary-score-entry 
             (nth 1 (car elem)) (funcall (car (car elem)) headers)
-            'e (nth 2 (car elem)) date nil t)
+            's (nth 2 (car elem)) date nil t)
            (setq elem (cdr elem))))
        (forward-line 1)))))
 
index c0bd5e1..439a2d4 100644 (file)
@@ -1457,8 +1457,11 @@ so I simply dropped them.")
 (add-hook 'gnus-exit-group-hook 'gnus-uu-clean-up)
 (add-hook 'gnus-exit-group-hook        'gnus-uu-check-for-generated-files)
 
+\f
 
-;; Major mode for posting encoded articles.
+;;;
+;;; uuencoded posting
+;;;
 
 (require 'sendmail)
 (require 'rnews)
@@ -1504,129 +1507,24 @@ is t.")
 (defvar gnus-uu-post-inserted-file-name nil)
 (defvar gnus-uu-winconf-post-news nil)
 
-;; The following map and mode was taken from rnewspost.el and edited
-;; somewhat.
-(defvar gnus-uu-post-reply-mode-map nil)
-(if gnus-uu-post-reply-mode-map
-    ()
-  (setq gnus-uu-post-reply-mode-map (make-keymap))
-  (define-key gnus-uu-post-reply-mode-map "\C-c?" 'describe-mode)
-  (define-key gnus-uu-post-reply-mode-map "\C-c\C-f\C-d" 
-    'news-reply-distribution)
-  (define-key gnus-uu-post-reply-mode-map "\C-c\C-f\C-k" 
-    'news-reply-keywords)
-  (define-key gnus-uu-post-reply-mode-map "\C-c\C-f\C-n" 
-    'news-reply-newsgroups)
-      
-  (define-key gnus-uu-post-reply-mode-map "\C-c\C-f\C-f" 
-    'news-reply-followup-to)
-  (define-key gnus-uu-post-reply-mode-map "\C-c\C-f\C-s" 'mail-subject)
-  (define-key gnus-uu-post-reply-mode-map "\C-c\C-f\C-a" 
-    'gnus-uu-post-reply-summary)
-  (define-key gnus-uu-post-reply-mode-map "\C-c\C-r" 
-    'news-caesar-buffer-body)
-  (define-key gnus-uu-post-reply-mode-map "\C-c\C-w" 'news-reply-signature)
-  (define-key gnus-uu-post-reply-mode-map "\C-c\C-y" 
-    'news-reply-yank-original)
-  (define-key gnus-uu-post-reply-mode-map "\C-c\C-q" 
-    'mail-fill-yanked-message)
-  (define-key gnus-uu-post-reply-mode-map "\C-c\C-c" 
-    'gnus-uu-post-news-inews)
-  (define-key gnus-uu-post-reply-mode-map "\C-c\C-s" 
-    'gnus-uu-post-news-inews)
-  (define-key gnus-uu-post-reply-mode-map "\C-c\C-i" 
-    'gnus-uu-post-insert-binary-in-article)
-  )
-
-;; This mode was taken from rnewspost.el and modified slightly.
-(defun gnus-uu-post-reply-mode ()
-  "Major mode for editing binary news to be posted on USENET.
-First-time posters are asked to please read the articles in newsgroup:
-                                                     news.announce.newusers .
-
-Like news-reply-mode, which is like Text Mode, but with these
-additional commands:
-
-\\<gnus-uu-post-reply-mode-map>\\[gnus-uu-post-news-inews]  post the message.
-C-c C-f         move to a header field (and create it if there isn't):
-        C-c C-f C-n  move to Newsgroups:       C-c C-f C-s  move to Subj:
-        C-c C-f C-f  move to Followup-To:      C-c C-f C-k  move to Keywords:
-        C-c C-f C-d  move to Distribution:     C-c C-f C-a  move to Summary:
-C-c C-y  news-reply-yank-original (insert current message, in NEWS).
-C-c C-q  mail-fill-yanked-message (fill what was yanked).
-C-c C-r  caesar rotate all letters by 13 places in the article's body (rot13).
-\\[gnus-uu-post-insert-binary-in-article]  encode and include a file in this article.
-
-This mode is almost identical to news-reply-mode, but has some
-additional commands for treating encoded binary articles. In
-particular, \\[gnus-uu-post-news-inews] will ask for a file to include, if
-one hasn't been included already. It will post, first, the message
-composed, and then it will post as many additional articles it takes
-to post the entire encoded files.
-
-   Relevant Variables
-
-   `gnus-uu-post-encode-method' 
-   There are three functions supplied with gnus-uu for encoding files:
-   `gnus-uu-post-encode-uuencode', which does straight uuencoding;
-   `gnus-uu-post-encode-mime', which encodes with base64 and adds MIME 
-   headers; and `gnus-uu-post-encode-mime-uuencode', which encodes with 
-   uuencode and adds MIME headers.
-   `gnus-uu-post-include-before-composing'
-   Non-nil means that gnus-uu will ask for a file to encode before you
-   compose the article.  If this variable is t, you can either include
-   an encoded file with `C-c C-i' or have one included for you when you 
-   post the article.
-
-   `gnus-uu-post-length'
-   Maximum length of an article. The encoded file will be split into how 
-   many articles it takes to post the entire file.
-
-   `gnus-uu-post-separate-description'
-   Non-nil means that the description will be posted in a separate 
-   article. The first article will typically be numbered (0/x). If 
-   this variable is nil, the description the user enters will be 
-   included at the beginning of the first article, which will be 
-   numbered (1/x). Default is t.
-
-   `gnus-uu-post-threaded'
-   Non-nil means that gnus-uu will post the encoded file in a thread.
-   This may not be smart, as no other decoder I have seen are able to
-   follow threads when collecting uuencoded articles. (Well, I have seen
-   one package that does that - gnus-uu, but somehow, I don't think that 
-   counts...) Default is nil.
-"
-  (interactive)
-  ;; require...
-  (or (fboundp 'mail-setup) (load "sendmail"))
-  (kill-all-local-variables)
-  (make-local-variable 'mail-reply-buffer)
-  (setq mail-reply-buffer nil)
-  (set-syntax-table text-mode-syntax-table)
-  (use-local-map gnus-uu-post-reply-mode-map)
-  (setq local-abbrev-table text-mode-abbrev-table)
-  (setq major-mode 'gnus-uu-post-reply-mode)
-  (setq mode-name "Gnus UU News")
-  (make-local-variable 'paragraph-separate)
-  (make-local-variable 'paragraph-start)
-  (setq paragraph-start (concat "^" (regexp-quote mail-header-separator)
-                               "$\\|" paragraph-start))
-  (setq paragraph-separate (concat "^" (regexp-quote mail-header-separator)
-                                  "$\\|" paragraph-separate))
-  (run-hooks 'text-mode-hook 'gnus-uu-post-reply-mode-hook))
-
 (defun gnus-uu-post-news ()
   "Compose an article and post an encoded file."
   (interactive)
   (setq gnus-uu-post-inserted-file-name nil)
   (setq gnus-uu-winconf-post-news (current-window-configuration))
-  (let (news-reply-mode)
-    (fset 'news-reply-mode 'gnus-uu-post-reply-mode)
-    (gnus-summary-post-news)
-    (if gnus-uu-post-include-before-composing
-       (save-excursion (setq gnus-uu-post-inserted-file-name 
-                             (gnus-uu-post-insert-binary))))))
+
+  (gnus-summary-post-news)
+
+  (use-local-map (copy-keymap (current-local-map)))
+  (local-set-key "\C-c\C-c" 'gnus-summary-edit-article-done)
+  (local-set-key "\C-c\C-f\C-a" 'gnus-uu-post-reply-summary)
+  (local-set-key "\C-c\C-c" 'gnus-uu-post-news-inews)
+  (local-set-key "\C-c\C-s" 'gnus-uu-post-news-inews)
+  (local-set-key "\C-c\C-i" 'gnus-uu-post-insert-binary-in-article)
+      
+  (if gnus-uu-post-include-before-composing
+      (save-excursion (setq gnus-uu-post-inserted-file-name 
+                           (gnus-uu-post-insert-binary)))))
 
 (defun gnus-uu-post-insert-binary-in-article ()
   "Inserts an encoded file in the buffer.
index 4398c4d..d8534c4 100644 (file)
@@ -120,6 +120,7 @@ To check for marks, e.g. to underline replied articles, use
    gnus-group-mode-map
    ""
    '("Misc"
+     ["Send a bug report" gnus-bug t]
      ["Check for new news" gnus-group-get-new-news t]     
      ["Delete bogus groups" gnus-group-check-bogus-groups t]
      ["Find new newsgroups" gnus-find-new-newsgroups t]
index 027bd6e..dcc816f 100644 (file)
@@ -356,6 +356,9 @@ you could set this variable to something like:
 (defvar gnus-use-adaptive-scoring nil
   "*If non-nil, use some adaptive scoring scheme.")
 
+(defvar gnus-use-cache nil
+  "*If non-nil, Gnus will cache (some) articles locally.")
+
 (defvar gnus-fetch-old-headers nil
   "*Non-nil means that Gnus will try to build threads by grabbing old headers.
 If an unread article in the group refers to an older, already read (or
@@ -1314,7 +1317,7 @@ variable (string, integer, character, etc).")
 (defconst gnus-maintainer "Lars Magne Ingebrigtsen <larsi@ifi.uio.no>"
   "The mail address of the Gnus maintainer.")
 
-(defconst gnus-version "(ding) Gnus v0.62"
+(defconst gnus-version "(ding) Gnus v0.63"
   "Version number for this version of Gnus.")
 
 (defvar gnus-info-nodes
@@ -1572,6 +1575,14 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
   (autoload 'gnus-execute "gnus-kill")
   (autoload 'gnus-expunge "gnus-kill")
 
+  (autoload 'gnus-cache-possibly-enter-article "gnus-cache")
+  (autoload 'gnus-cache-save-buffers "gnus-cache")
+  (autoload 'gnus-cache-possibly-remove-article "gnus-cache")
+  (autoload 'gnus-cache-request-article "gnus-cache")
+  (autoload 'gnus-cache-retrieve-headers "gnus-cache")
+  (autoload 'gnus-cache-possibly-alter-active "gnus-cache")
+  (autoload 'gnus-jog-cache "gnus-cache" nil t)
+
   (autoload 'pp "pp")
   (autoload 'pp-to-string "pp")
   (autoload 'mail-extract-address-components "mail-extr")
@@ -1718,8 +1729,9 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.")
   "Return the value of the header FIELD of current article."
   (save-excursion
     (save-restriction
-      (gnus-narrow-to-headers)
-      (mail-fetch-field field))))
+      (let ((case-fold-search t))
+       (gnus-narrow-to-headers)
+       (mail-fetch-field field)))))
 
 (defun gnus-goto-colon ()
   (beginning-of-line)
@@ -2211,6 +2223,8 @@ If optional argument RE-ONLY is non-nil, strip `Re:' only."
   (and gnus-current-startup-file
        (get-file-buffer gnus-current-startup-file)
        (kill-buffer (get-file-buffer gnus-current-startup-file)))
+  ;; Save any cache buffers.
+  (and gnus-use-cache (gnus-cache-save-buffers))
   ;; Clear the dribble buffer.
   (gnus-dribble-clear)
   ;; Kill global KILL file buffer.
@@ -2557,17 +2571,19 @@ If nothing is specified, use the variable gnus-overload-functions."
   "Return a list of elements of LIST1 that do not appear in LIST2.
 Both lists have to be sorted over <."
   (let (out)
-    (while (and list1 list2)
-      (cond ((= (car list1) (car list2))
-            (setq list1 (cdr list1)
-                  list2 (cdr list2)))
-           ((< (car list1) (car list2))
-            (setq out (cons (car list1) out))
-            (setq list1 (cdr list1)))
-           (t
-            (setq out (cons (car list2) out))
-            (setq list2 (cdr list2)))))
-    (nreverse (append (or list1 list2) out))))
+    (if (or (null list1) (null list2))
+       (or list1 list2)
+      (while (and list1 list2)
+       (cond ((= (car list1) (car list2))
+              (setq list1 (cdr list1)
+                    list2 (cdr list2)))
+             ((< (car list1) (car list2))
+              (setq out (cons (car list1) out))
+              (setq list1 (cdr list1)))
+             (t
+              (setq out (cons (car list2) out))
+              (setq list2 (cdr list2)))))
+      (nconc (nreverse out) (or list1 list2)))))
 
 (defun gnus-intersection (list1 list2)      
   (let ((result nil))
@@ -2822,6 +2838,7 @@ Note: LIST has to be sorted over `<'."
     (if gnus-xemacs [button2] [mouse-2]) 'gnus-mouse-pick-group)
   (define-key gnus-group-mode-map "<" 'beginning-of-buffer)
   (define-key gnus-group-mode-map ">" 'end-of-buffer)
+  (define-key gnus-group-mode-map "\C-c\C-b" 'gnus-bug)
 
   (define-prefix-command 'gnus-group-make-map)
   (define-key gnus-group-mode-map "M" 'gnus-group-make-map)
@@ -4324,14 +4341,21 @@ If called interactively, this function will ask for a select method
 If not, METHOD should be a list where the first element is the method
 and the second element is the address."
   (interactive
-   (list (list (intern (completing-read 
-                       "Which backend: "
-                       gnus-valid-select-methods nil t "nntp"))
-              ;; Suggested by mapjph@bath.ac.uk.
-              (completing-read 
-               "Address: " 
-               (mapcar (lambda (server) (list server))
-                       gnus-secondary-servers)))))
+   (list (let ((how (completing-read 
+                    "Which backend: "
+                    (append gnus-valid-select-methods gnus-server-alist)
+                    nil t "nntp")))
+          ;; We either got a backend name or a virtual server name.
+          ;; If the first, we also need an address.
+          (if (assoc how gnus-valid-select-methods)
+              (list (intern how)
+                    ;; Suggested by mapjph@bath.ac.uk.
+                    (completing-read 
+                     "Address: " 
+                     (mapcar (lambda (server) (list server))
+                             gnus-secondary-servers)))
+            ;; We got a server name, so we find the method.
+            (gnus-server-to-method how)))))
   (gnus-browse-foreign-server method))
 
 \f
@@ -7188,16 +7212,18 @@ If ALL-HEADERS is non-nil, no header lines are hidden."
       (mapcar (lambda (headers) (list (int-to-string (header-number headers))))
              gnus-newsgroup-headers) 
       nil 'require-match))))
-  (if (gnus-summary-goto-subject article)
-      (gnus-summary-display-article article all-headers))
-  (gnus-summary-position-cursor))
+  (prog1
+      (and (gnus-summary-goto-subject article)
+          (gnus-summary-display-article article all-headers))
+    (gnus-summary-position-cursor)))
 
 (defun gnus-summary-goto-last-article ()
   "Go to the last article."
   (interactive)
-  (if gnus-last-article
-      (gnus-summary-goto-article gnus-last-article))
-  (gnus-summary-position-cursor))
+  (prog1
+      (and gnus-last-article
+          (gnus-summary-goto-article gnus-last-article))
+    (gnus-summary-position-cursor)))
 
 (defun gnus-summary-pop-article (number)
   "Pop one article off the history and go to the previous.
@@ -7248,7 +7274,15 @@ NOTE: This command only works with newsgroup that use NNTP."
     (let ((header (car (gnus-gethash (downcase message-id)
                                     gnus-newsgroup-dependencies))))
       (if header
-         (gnus-summary-goto-article (header-number header))
+         (or (gnus-summary-goto-article (header-number header))
+             ;; The header has been read, but the article had been
+             ;; expunged, so we insert it again.
+             (progn
+               (gnus-summary-insert-line
+                nil header 0 nil gnus-read-mark nil nil
+                (header-subject header))
+               (forward-line -1)
+               (header-number header)))
        (let ((gnus-override-method gnus-refer-article-method))
          (and gnus-refer-article-method
               (or (gnus-server-opened gnus-refer-article-method)
@@ -7541,7 +7575,7 @@ and `request-accept' functions. (Ie. mail newsgroups at present.)"
                         gnus-newsgroup-name))    ; Server
                 (list 'gnus-request-accept-article 
                       (if select-method
-                          (quote select-method)
+                          (list 'quote select-method)
                         to-newsgroup)
                       (not (cdr articles)))     ; Accept form
                 (not (cdr articles))))          ; Only save nov last time
@@ -7603,17 +7637,20 @@ current group into whatever groups they are destined to.  In the
 latter case, they will be copied into the relevant groups."
   (interactive "P")
   (gnus-set-global-variables)
-  (let ((respool-methods (gnus-methods-using 'respool)))
+  (let ((respool-methods (gnus-methods-using 'respool))
+       (methname 
+        (symbol-name (car (gnus-find-method-for-group gnus-newsgroup-name)))))
     (or respool-method
        (setq respool-method
              (completing-read
               "What method do you want to use when respooling? "
-              respool-methods nil t)))
-    (if (assoc (symbol-name
-               (car (gnus-find-method-for-group gnus-newsgroup-name)))
-              respool-methods)
-       (gnus-summary-move-article n nil (intern respool-method)))
-    (gnus-summary-copy-article n nil (intern respool-method))))
+              respool-methods nil t methname)))
+    (or (string= respool-method "")
+       (if (assoc (symbol-name
+                   (car (gnus-find-method-for-group gnus-newsgroup-name)))
+                  respool-methods)
+           (gnus-summary-move-article n nil (intern respool-method))
+         (gnus-summary-copy-article n nil (intern respool-method))))))
 
 ;; Suggested by gregj@unidata.com (Gregory J. Grubbs).
 (defun gnus-summary-copy-article (n &optional to-newsgroup select-method)
@@ -7848,8 +7885,9 @@ This will have permanent effect only in mail groups."
                    (> (gnus-summary-thread-level) level))
          (gnus-summary-raise-score score))
        (setq e (point))))
-    (or (zerop (gnus-summary-next-subject 1 t))
-       (goto-char e)))
+    (let ((gnus-summary-check-current t))
+      (or (zerop (gnus-summary-next-subject 1 t))
+         (goto-char e))))
   (gnus-summary-recenter)
   (gnus-summary-position-cursor)
   (gnus-set-mode-line 'summary))
@@ -8096,16 +8134,26 @@ marked."
                                   (= mark gnus-low-score-mark)
                                   (= mark gnus-read-mark))))
        (setq mark gnus-expirable-mark))
-  (let* ((buffer-read-only nil)
-        (mark (or (and (stringp mark) (aref mark 0)) mark gnus-del-mark))
+  (let* ((mark (or (and (stringp mark) (aref mark 0)) mark gnus-del-mark))
         (article (or article (gnus-summary-article-number))))
     (if (or (= mark gnus-unread-mark) 
            (= mark gnus-ticked-mark) 
            (= mark gnus-dormant-mark))
        (gnus-mark-article-as-unread article mark)
       (gnus-mark-article-as-read article mark))
+
+    ;; See whether the article is to be put in the cache.
+    (and gnus-use-cache
+        (save-excursion
+          (gnus-summary-select-article)
+          (gnus-cache-possibly-enter-article 
+           gnus-newsgroup-name article 
+           (gnus-get-header-by-number article)
+           (= mark gnus-ticked-mark)
+           (= mark gnus-dormant-mark) (= mark gnus-unread-mark))))
+
     (if (gnus-summary-goto-subject article)
-       (progn
+       (let ((buffer-read-only nil))
          (gnus-summary-show-thread)
          (beginning-of-line)
          (and (eq (gnus-summary-article-mark) ?Z)
@@ -9183,7 +9231,7 @@ The following commands are available:
        (gnus-add-current-to-buffer-list)
        (gnus-article-mode))))
 
-(defun gnus-request-article-this-buffer (article &optional group)
+(defun gnus-request-article-this-buffer (article group)
   "Get an article and insert it into this buffer."
   (setq group (or group gnus-newsgroup-name))
   ;; Using `gnus-request-article' directly will insert the article into
@@ -9210,15 +9258,21 @@ The following commands are available:
            ;; It is an extracted pseudo-article.
            (setq article nil)
            (gnus-request-pseudo-article header)))))
-  ;; Get the article and into the article buffer.
-  (if article
-      (progn
-       (erase-buffer)
-       (let ((gnus-override-method 
-             (and (stringp article) gnus-refer-article-method)))
-        (and (gnus-request-article article group (current-buffer))
-             'article)))
-    'pseudo))
+
+  ;; Check the cache.
+  (if (and gnus-use-cache
+          (numberp article)
+          (gnus-cache-request-article article group))
+      'article
+    ;; Get the article and into the article buffer.
+    (if article
+       (progn
+         (erase-buffer)
+         (let ((gnus-override-method 
+                (and (stringp article) gnus-refer-article-method)))
+           (and (gnus-request-article article group (current-buffer))
+                'article)))
+      'pseudo)))
 
 (defun gnus-read-header (id)
   "Read the headers of article ID and enter them into the Gnus system."
@@ -9323,7 +9377,14 @@ If ALL-HEADERS is non-nil, no headers are hidden."
                    ;; Set the global newsgroup variables here.
                    ;; Suggested by Jim Sisolak
                    ;; <sisolak@trans4.neep.wisc.edu>.
-                   (gnus-set-global-variables)))
+                   (gnus-set-global-variables)
+                   (and gnus-use-cache 
+                        (gnus-cache-possibly-enter-article
+                         group article
+                         (gnus-get-header-by-number article)
+                         (memq article gnus-newsgroup-marked)
+                         (memq article gnus-newsgroup-dormant)
+                         (memq article gnus-newsgroup-unreads)))))
              ;; gnus-have-all-headers must be either T or NIL.
              (setq gnus-have-all-headers
                    (not (not (or all-headers gnus-show-all-headers))))
@@ -9552,6 +9613,23 @@ please do mail it to me."
                  (process-send-eof process))
              (error "Couldn't start process"))))))))
              
+(defun gnus-article-de-quoted-unreadable (&optional force)
+  "Do a naïve translation of a quoted-printable-encoded article.
+This is in no way, shape or form meant as a replacement for real MIME
+processing, but is simply a stop-gap measure until MIME support is
+written.
+If FORCE, decode the article whether it is marked as quoted-printable
+or not." 
+  (interactive (list 'force))
+  (save-excursion
+    (set-buffer gnus-article-buffer)
+    (let ((case-fold-search t)
+         (type (gnus-fetch-field "content-transfer-encoding")))
+      (if (or force (and type (string-match "quoted-printable" type)))
+         (progn
+           (goto-char (point-min))
+           (search-forward "\n\n" nil 'move)
+           (gnus-mime-decode-quoted-printable (point) (point-max)))))))
 
 (defun gnus-mime-decode-quoted-printable (from to)
   ;; Decode quoted-printable from region between FROM and TO.
@@ -9568,32 +9646,15 @@ please do mail it to me."
             (delete-char 2))
            ((message "Malformed MIME quoted-printable message"))))))
 
-(defun gnus-article-de-quoted-unreadable ()
-  "Do a naive translation of a quoted-printable-encoded article.
-This is in no way, shape or form meant as a replacement for real MIME
-processing, but is simply a stop-gap measure until MIME support is
-written."
-  ;; Unquote quoted-printable from news articles.
-  (interactive)
-  (save-excursion
-    (set-buffer gnus-article-buffer)
-    (let ((case-fold-search t)
-         (type (gnus-fetch-field "content-transfer-encoding")))
-      (cond ((and (stringp type) (string-match "quoted-printable" type))
-            (goto-char (point-min))
-            (search-forward "\n\n" nil 'move)
-            (message  "MIME Unquoting printable...")
-            (gnus-mime-decode-quoted-printable (point) (point-max))
-            (message  "MIME Unquoting printable...done")))
-      (set-buffer gnus-summary-buffer))))
-
-(defun gnus-article-date-ut (date type)
+
+(defun gnus-article-date-ut (&optional type)
   "Convert DATE date to universal time in the current article.
 If TYPE is `local', convert to local time; if it is `lapsed', output
 how much time has lapsed since DATE."
-  (interactive (list (header-date gnus-current-headers) 'ut))
-  (if (not date)
-      ()
+  (interactive (list 'ut))
+  (let ((date (header-date (or gnus-current-headers 
+                              (gnus-get-header-by-number
+                               (gnus-summary-article-number))))))
     (save-excursion
       (set-buffer gnus-article-buffer)
       (let ((buffer-read-only nil))
@@ -9612,7 +9673,7 @@ how much time has lapsed since DATE."
          ((eq type 'lapsed)
           (let* ((sec (- (gnus-seconds-since-epoch (current-time-string))
                          (gnus-seconds-since-epoch date)))
-                 (units (list (cons 'year (* 1.0 365 24 60 60))
+                 (units (list (cons 'year (* 365.25 24 60 60))
                               (cons 'week (* 7 24 60 60))
                               (cons 'day (* 24 60 60))
                               (cons 'hour (* 60 60))
@@ -9623,11 +9684,11 @@ how much time has lapsed since DATE."
              "X-Sent: "
              (mapconcat 
               (lambda (unit)
-                (if (zerop (setq num (floor (/ sec (cdr unit)))))
+                (if (zerop (setq num (ffloor (/ sec (cdr unit)))))
                     ""
                   (setq sec (- sec (* num (cdr unit))))
                   (prog1
-                      (concat (if prev ", " "") (int-to-string num)
+                      (concat (if prev ", " "") (int-to-string (floor num))
                               " " (symbol-name (car unit))
                               (if (> num 1) "s" ""))
                     (setq prev t))))
@@ -9636,15 +9697,15 @@ how much time has lapsed since DATE."
          (t
           (error "Unknown conversion type: %s" type))))))))
 
-(defun gnus-article-date-local (date)
+(defun gnus-article-date-local ()
   "Convert the current article date to the local timezone."
-  (interactive (list (header-date gnus-current-headers)))
-  (gnus-article-date-ut date 'local))
+  (interactive)
+  (gnus-article-date-ut 'local))
 
-(defun gnus-article-date-lapsed (date)
+(defun gnus-article-date-lapsed ()
   "Convert the current article date to time lapsed since it was sent."
-  (interactive (list (header-date gnus-current-headers)))
-  (gnus-article-date-ut date 'lapsed))
+  (interactive)
+  (gnus-article-date-ut 'lapsed))
 
 
 ;; Article savers.
@@ -10401,8 +10462,10 @@ is returned insted of the status string."
 
 (defun gnus-retrieve-headers (articles group)
   (let ((method (gnus-find-method-for-group group)))
-    (funcall (gnus-get-function method 'retrieve-headers) 
-            articles (gnus-group-real-name group) (nth 1 method))))
+    (if gnus-use-cache
+       (gnus-cache-retrieve-headers articles group)
+      (funcall (gnus-get-function method 'retrieve-headers) 
+              articles (gnus-group-real-name group) (nth 1 method)))))
 
 (defun gnus-retrieve-groups (groups method)
   (funcall (gnus-get-function method 'retrieve-groups) groups (nth 1 method)))
@@ -10739,7 +10802,7 @@ The `-n' option line from .newsrc is respected."
          (setq groups (cdr groups)))
        (gnus-group-make-help-group)
        (and gnus-novice-user
-            (message (substitute-command-keys "\\<gnus-group-mode-map>\\[gnus-group-list-killed] to list killed groups")))))))
+            (message "`G k' to list killed groups"))))))
 
 ;; `gnus-group-change-level' is the fundamental function for changing
 ;; subscription levels of newsgroups. This might mean just changing
@@ -10905,7 +10968,7 @@ newsgroup."
 (defun gnus-get-unread-articles (&optional level)
   (let ((newsrc (cdr gnus-newsrc-alist))
        (level (or level (1+ gnus-level-subscribed)))
-       info group active virtuals)
+       info group active virtuals method)
     (message "Checking new news...")
     (while newsrc
       (setq info (car newsrc))
@@ -10917,13 +10980,15 @@ newsgroup."
       ;; be reached) we just set the number of unread articles in this
       ;; newsgroup to t. This means that Gnus thinks that there are
       ;; unread articles, but it has no idea how many.
-      (if (nth 4 info)
+      (if (setq method (nth 4 info))
          (if (or (and gnus-activate-foreign-newsgroups 
                       (not (numberp gnus-activate-foreign-newsgroups)))
                  (and (numberp gnus-activate-foreign-newsgroups)
                       (<= (nth 1 info) gnus-activate-foreign-newsgroups)
                       (<= (nth 1 info) level)))
-             (if (eq (car (nth 4 info)) 'nnvirtual)
+             (if (eq (car (if (stringp method) 
+                              (gnus-server-to-method method)
+                            (nth 4 info))) 'nnvirtual)
                  (setq virtuals (cons info virtuals))
                (setq active (gnus-activate-newsgroup (car info)))))
        (if (and (not gnus-read-active-file)
@@ -10983,6 +11048,9 @@ newsgroup."
         (num 0)
         (marked (nth 3 info))
         srange lowest group highest)
+    ;; If a cache is present, we may have to alter the active info.
+    (and gnus-use-cache
+        (gnus-cache-possibly-alter-active (car info) active))
     ;; Modify the list of read articles according to what articles 
     ;; are available; then tally the unread articles and add the
     ;; number to the group hash table entry.
@@ -11359,7 +11427,8 @@ If FORCE is non-nil, the .newsrc file is read."
          (load ding-file t t t)
        (error nil))
       (and gnus-newsrc-assoc (setq gnus-newsrc-alist gnus-newsrc-assoc)))
-    (gnus-uncompress-newsrc-assoc)
+    (let ((inhibit-quit t))
+      (gnus-uncompress-newsrc-assoc))
     (gnus-make-hashtable-from-newsrc-alist)
     (if (not (file-newer-than-file-p file ding-file))
        ()
@@ -11710,6 +11779,7 @@ If FORCE is non-nil, the .newsrc file is read."
   (insert ";; Never delete this file - touch .newsrc instead to force Gnus\n")
   (insert ";; to read .newsrc.\n")
   (let ((variables gnus-variable-list)
+       (inhibit-quit t)
        (gnus-newsrc-alist (cdr gnus-newsrc-alist))
        variable)
     ;; insert lisp expressions.
@@ -11844,6 +11914,7 @@ with some simple extensions.")
   (setq gnus-server-mode-map (make-sparse-keymap))
   (suppress-keymap gnus-server-mode-map)
   (define-key gnus-server-mode-map " " 'gnus-server-read-server)
+  (define-key gnus-server-mode-map "\r" 'gnus-server-read-server)
   (define-key gnus-server-mode-map "q" 'gnus-server-exit)
   (define-key gnus-server-mode-map "l" 'gnus-server-list-servers)
   (define-key gnus-server-mode-map "k" 'gnus-server-kill-server)
@@ -11944,10 +12015,10 @@ The following commands are available:
          (gnus-server-insert-server-line nil (car entry) (cdr entry))
          (gnus-server-position-cursor))))))
 
-(defun gnus-server-set-info (info)
+(defun gnus-server-set-info (server info)
   ;; Enter a select method into the virtual server alist.
   (gnus-dribble-enter 
-   (concat "(gnus-server-set-info '"
+   (concat "(gnus-server-set-info \"" server "\" '"
           (prin1-to-string info) ")"))
   (let* ((server (nth 1 info))
         (entry (assoc server gnus-server-alist)))
@@ -12099,17 +12170,22 @@ The following commands are available:
   (gnus-add-current-to-buffer-list)
   (emacs-lisp-mode)
   (use-local-map (copy-keymap (current-local-map)))
-  (local-set-key "\C-c\C-c" 'gnus-server-edit-server-done)
+  (let ((done-func '(lambda () 
+                     "Exit editing mode and update the information."
+                     (interactive)
+                     (gnus-server-edit-server-done 'group))))
+    (setcar (cdr (nth 4 done-func)) server)
+    (local-set-key "\C-c\C-c" done-func))
   (erase-buffer)
   (insert ";; Type `C-c C-c' after you have edited the server.\n\n")
-  (insert "(gnus-server-set-info \n  "
-         (pp-to-string (list 'quote (cdr (assoc server gnus-server-alist))))
-         "  )\n"))
+  (insert (pp-to-string (cdr (assoc server gnus-server-alist)))))
 
-(defun gnus-server-edit-server-done ()
+(defun gnus-server-edit-server-done (server)
   (interactive)
   (set-buffer (get-buffer-create gnus-server-edit-buffer))
-  (eval-current-buffer)
+  (goto-char (point-min))
+  (let ((form (read (current-buffer))))
+    (gnus-server-set-info server form))
   (kill-buffer (current-buffer))
   (and gnus-winconf-edit-server
        (set-window-configuration gnus-winconf-edit-server))
@@ -12120,8 +12196,8 @@ The following commands are available:
 
 (defun gnus-server-read-server (server)
   "Browse a server."
-  (interactive (gnus-server-server-name))
-  (gnus-browse-foreign-server (gnus-server-to-method server)))
+  (interactive (list (gnus-server-server-name)))
+  (gnus-browse-foreign-server (gnus-server-to-method server) (current-buffer)))
 
 ;;; Gnus score functions.
 
index 1f14598..ee3ee7b 100644 (file)
 
 (defun nnbabyl-request-list (&optional server)
   (if server (nnbabyl-get-new-mail))
-  (nnmail-find-file nnbabyl-active-file))
+  (save-excursion
+    (or (nnmail-find-file nnbabyl-active-file)
+       (progn
+         (setq nnbabyl-group-alist (nnmail-get-active))
+         (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file)
+         (nnmail-find-file nnbabyl-active-file)))))
 
 (defun nnbabyl-request-newgroups (date &optional server)
   (nnbabyl-request-list server))
index a77b391..3914814 100644 (file)
 
 (defvar nndigest-group-alist nil)
 
-(defconst nndigest-separator "------------------------------[\n \t]*\n[^ ]+: ")
+(defconst nndigest-separator 
+  "^------------------------------[\n \t]*\n[^ ]+: ")
 
 \f
 
 ;;; Interface functions.
 
 (defun nndigest-retrieve-headers (sequence &optional newsgroup server)
-  "Retrieve the headers for the articles in SEQUENCE.
-Newsgroup must be selected before calling this function."
   (save-excursion
     (set-buffer nntp-server-buffer)
     (erase-buffer)
@@ -81,25 +80,20 @@ Newsgroup must be selected before calling this function."
       'headers)))
 
 (defun nndigest-open-server (host &optional service)
-  "Open news server on HOST."
   (setq nndigest-status-string "")
   (nnheader-init-server-buffer))
 
 (defun nndigest-close-server (&optional server)
-  "Close news server."
   t)
 
 (defun nndigest-server-opened (&optional server)
-  "Return server process status, T or NIL."
   (and nntp-server-buffer
        (get-buffer nntp-server-buffer)))
 
 (defun nndigest-status-message ()
-  "Return server status response as string."
   nndigest-status-string)
 
 (defun nndigest-request-article (id &optional newsgroup server buffer)
-  "Select article by message ID (or number)."
   (nndigest-possibly-change-buffer newsgroup)
   (let ((range (nndigest-narrow-to-article id)))
     (and range
@@ -111,7 +105,6 @@ Newsgroup must be selected before calling this function."
           t))))
 
 (defun nndigest-request-group (group &optional server dont-check)
-  "Select news GROUP."
   (let ((entry (assoc group nndigest-group-alist)))
     (and entry (setq nndigest-group-alist (delq entry nndigest-group-alist))))
   (let ((buffer (get-buffer-create (concat " *nndigest " group "*"))))
@@ -143,28 +136,24 @@ Newsgroup must be selected before calling this function."
   t)
 
 (defun nndigest-request-list (&optional server)
-  "List active newsgoups."
   (save-excursion
     (set-buffer nntp-server-buffer)
     (erase-buffer)
     t))
 
 (defun nndigest-request-newgroups (date &optional server)
-  "List groups created after DATE."
   (save-excursion
     (set-buffer nntp-server-buffer)
     (erase-buffer)
     t))
 
 (defun nndigest-request-list-newsgroups (&optional server)
-  "List newsgroups (defined in NNTP2)."
   (save-excursion
     (set-buffer nntp-server-buffer)
     (erase-buffer)
     t))
 
 (defun nndigest-request-post (&optional server)
-  "Post a new news in current buffer."
   (mail-send-and-exit nil))
 
 (fset 'nndigest-request-post-buffer 'nnmail-request-post-buffer)
index a8db42d..e8b73bc 100644 (file)
@@ -256,18 +256,20 @@ such things as moving mail.  All buffers always get killed upon server close.")
 
 (defun nnfolder-request-list (&optional server)
   (if server (nnfolder-get-new-mail))
-  (or nnfolder-group-alist
-      (nnmail-find-file nnfolder-active-file)
-      (progn
-       (setq nnfolder-group-alist (nnmail-get-active))
-       (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
-       (nnmail-find-file nnfolder-active-file))))
+  (save-excursion
+    (or nnfolder-group-alist
+       (nnmail-find-file nnfolder-active-file)
+       (progn
+         (setq nnfolder-group-alist (nnmail-get-active))
+         (nnmail-save-active nnfolder-group-alist nnfolder-active-file)
+         (nnmail-find-file nnfolder-active-file)))))
 
 (defun nnfolder-request-newgroups (date &optional server)
   (nnfolder-request-list server))
 
 (defun nnfolder-request-list-newsgroups (&optional server)
-  (nnmail-find-file nnfolder-newsgroups-file))
+  (save-excursion
+    (nnmail-find-file nnfolder-newsgroups-file)))
 
 (defun nnfolder-request-post (&optional server)
   (mail-send-and-exit nil))
index 20d2f24..164090f 100644 (file)
@@ -129,7 +129,7 @@ messages will be shown to indicate the current status.")
 (defun nnmail-request-post-buffer (post group subject header article-buffer
                                        info follow-to respect-poster)
   (let ((method-address (cdr (assq 'to-address (nth 5 info))))
-       from subject date to reply-to message-of
+       from date to reply-to message-of
        references message-id sender cc sendto elt)
     (setq method-address
          (if (and (stringp method-address) 
index 822edfb..839c376 100644 (file)
 
 (defun nnmbox-request-list (&optional server)
   (if server (nnmbox-get-new-mail))
-  (or (nnmail-find-file nnmbox-active-file)
-      (progn
-       (setq nnmbox-group-alist (nnmail-get-active))
-       (nnmail-save-active nnmbox-group-alist nnmbox-active-file)
-       (nnmail-find-file nnmbox-active-file))))
+  (save-excursion
+    (or (nnmail-find-file nnmbox-active-file)
+       (progn
+         (setq nnmbox-group-alist (nnmail-get-active))
+         (nnmail-save-active nnmbox-group-alist nnmbox-active-file)
+         (nnmail-find-file nnmbox-active-file)))))
 
 (defun nnmbox-request-newgroups (date &optional server)
   (nnmbox-request-list server))
index dc69574..7c914a4 100644 (file)
@@ -208,6 +208,11 @@ all. This may very well take some time.")
 (defun nnml-close-group (group &optional server)
   t)
 
+(defun nnml-request-close ()
+  (setq nnml-current-server nil)
+  (setq nnml-server-alist nil)
+  t)
+
 (defun nnml-request-create-group (group &optional server) 
   (nnml-request-list)
   (setq nnml-group-alist (nnmail-get-active))
@@ -232,7 +237,8 @@ all. This may very well take some time.")
 (defun nnml-request-list (&optional server)
   (if server (nnml-get-new-mail))
   (save-excursion
-    (nnmail-find-file nnml-active-file)))
+    (nnmail-find-file nnml-active-file)
+    (setq nnml-group-alist (nnmail-get-active))))
 
 (defun nnml-request-newgroups (date &optional server)
   (nnml-request-list server))
@@ -592,7 +598,7 @@ all. This may very well take some time.")
    (progn   
      (setq nnml-group-alist nil)
      (list nnml-directory)))
-  (nnml-open-server (system-name))
+  (nnml-open-server (or nnml-current-server ""))
   (let ((dirs (directory-files dir t nil t)))
     (while dirs 
       (if (and (not (string-match "/\\.\\.$" (car dirs)))
index 77afb63..2af1f44 100644 (file)
@@ -684,8 +684,10 @@ It will prompt for a password."
                                                (car servers))))))
        (setq servers (cdr servers)))
       (setq server (car (car servers))))
-    (message "nntp: Connection closed to server %s" (or server "(none)"))
-    (ding)))
+    (and server
+        (progn
+          (message "nntp: Connection closed to server %s" server)
+          (ding)))))
 
 (defun nntp-kill-connection (server)
   (let ((proc (nth 1 (assq 'nntp-server-process 
index 0b2a467..60ea3b1 100644 (file)
@@ -330,15 +330,6 @@ Native @sc{mime} support is something that should be done.  I was hoping
 I could steal code from @code{Mew}, the @sc{mime} mail reader for Emacs,
 but I'm not quite sure what the status of that project is.  (ding) might
 support @sc{mime} quite soon, and it might not.
-@item 
-Some form of caching would come in handy.  Not only for those with
-extremely slow @sc{nntp} connections, but as a more general way of
-saving articles in a simple fashion.  (You'd basically just mark an
-article as @dfn{cached}.  Gnus would put it in some local directory, and
-each time you request that article from that group, Gnus would fetch the
-local copy instead.)  Lots of quite interesting stuff to be considered
-(caching @sc{nov} headers or not?) before jumping into it.  It would
-require much twiddling of Gnus internals to make it work transparently.
 @item
 When the user references the parent of an article, some sort of
 re-threading should be done to build a proper tree.  The same goes for
@@ -2341,6 +2332,7 @@ move around, read articles, post articles and reply to articles.
 * Ticking and Marking::         Marking articles as read, expirable, etc.
 * Threading::                   How threads are made.
 * Asynchronous Fetching::       Gnus might be able to pre-fetch articles.
+* Article Caching::             You may store articles in a cache.
 * Exiting the Summary Buffer::  Returning to the Group buffer.
 * Process/Prefix::              A convention used by many treatment commands.
 * Saving Articles::             Ways of customizing article saving.
@@ -3734,6 +3726,56 @@ alist where the keys are the article numbers.  Your function should
 return an alist where the articles you are not interested in have been
 removed.  You could also do sorting on article score and the like. 
 
+@node Article Caching
+@section Article Caching
+@cindex article caching
+@cindex caching
+
+If you have an @emph{extremely} slow @sc{nntp} connection, you may
+consider turning article caching on.  Each article will then be stored
+locally under your home directory.  As you may surmise, this could
+potentially use @emph{huge} amounts of disk space, as well as eat up all
+your inodes so fast it will make your head swim.  In vodka.
+
+Used carefully, though, it could be just an easier way to save articles.
+
+@vindex gnus-use-long-file-name
+@vindex gnus-cache-directory
+@vindex gnus-use-cache
+To turn caching on, set @code{gnus-use-cache} to @code{t}.  By default,
+all articles that are ticked or marked as dormant will then be copied
+over to your local cache (@code{gnus-cache-directory}).  Whether this
+cache is flat or hierarchal is controlled by the
+@code{gnus-use-long-file-name} variable, as usual.
+
+When re-select a ticked or dormant article, it will be fetched from the
+cache instead of from the server.  As articles in your cache will never
+expire, this might serve as a method of saving articles while still
+keeping them where they belong.  Just mark all articles you want to save
+as dormant, and don't worry.
+
+When an article is marked as read, is it removed from the cache.
+
+@vindex gnus-cache-remove-articles
+@vindex gnus-cache-enter-articles
+The entering/removal of articles from the cache is controlled by the
+@code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles}
+variables.  Both are lists of symbols.  The first is @code{(ticked
+dormant)} by default, meaning that ticked and dormant articles will be
+put in the cache.  The latter is @code{(read)} by default, meaning that
+articles that are marked as read are removed from the cache.  Possibly
+symbols in these two lists are @code{ticked}, @code{dormant},
+@code{unread} and @code{read}.
+
+@findex gnus-jog-cache
+So where does the massive article-fetching and storing come into the
+picture?  The @code{gnus-jog-cache} command will go through all
+subscribed newsgroups, request all unread articles, and store them in
+the cache.  You should only ever, ever ever ever, use this command if 1)
+your connetion to the @sc{nntp} server is really, really, really slow
+and 2) you have a really, really, really huge disk.  Seriously.
+
+
 @node Exiting the Summary Buffer
 @section Exiting the Summary Buffer
 @cindex summary exit