*** empty log message ***
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 08:12:43 +0000 (08:12 +0000)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Tue, 4 Mar 1997 08:12:43 +0000 (08:12 +0000)
17 files changed:
lisp/ChangeLog
lisp/gnus-cache.el
lisp/gnus-demon.el
lisp/gnus-gl.el
lisp/gnus-msg.el
lisp/gnus-nocem.el
lisp/gnus-score.el
lisp/gnus-soup.el
lisp/gnus-topic.el
lisp/gnus-vis.el
lisp/gnus.el
lisp/nnmail.el
lisp/nnml.el
lisp/nntp.el
lisp/nnvirtual.el
texi/ChangeLog
texi/gnus.texi

index 8d1dbcd..0ed0b0f 100644 (file)
@@ -1,5 +1,90 @@
+Tue Mar 12 01:42:11 1996  Lars Magne Ingebrigtsen  <larsi@eistla.ifi.uio.no>
+
+       * gnus.el (gnus-article-strip-leading-blank-lines): New command. 
+
+       * gnus-score.el (gnus-score-score-files-1): Message.
+       (gnus-score-score-files-1): Make sure this doesn't return a nil
+       value. 
+
+       * gnus-vis.el (gnus-article-add-button): Would make all buttons
+       visible. 
+
+Mon Mar 11 03:04:15 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus-soup.el (gnus-soup-group-brew): Might lose articles?
+
+       * gnus.el (gnus-request-article-this-buffer): Would set
+       `gnus-original-article' wrong.
+
+       * nnmail.el (nnmail-search-unix-mail-delim): Secondary ">From "
+       lines would make messages stick.
+       (nnmail-check-duplication): Changed warning message
+
+       * gnus-msg.el (gnus-inews-reject-message): Would prin1 to the echo
+       area.
+
+       * gnus.el (gnus-no-server): Would make variable buffer-local to
+       the wrong buffer.
+
+       * nnmail.el (nnmail-process-unix-mail-format): Doubled code.
+
+       * nnvirtual.el (nnvirtual-retrieve-headers): Don't propagate
+       `fetch-old'. 
+
+       * gnus-msg.el (gnus-inews-cleanup-headers): Put "poster" in the
+       list of possible prompts.
+
+Sun Mar 10 00:13:48 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus-score.el (gnus-score-headers): Wouldn't score anything if
+       `gnus-save-score'. 
+
+       * gnus-cache.el (gnus-cache-remove-article): Change buffer.
+
+       * gnus.el (gnus-add-shutdown, gnus-shutdown): New functions.
+       (gnus-clear-system): Nix out more variables.
+
+       * gnus-*.el: Use the functions.
+
+Sat Mar  9 08:03:00 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus.el (gnus-group-delete-group): Remove the group from the
+       active hashtb. 
+
+       * gnus-topic.el (gnus-topic-yank-group): Yank sub-topics as well.
+       (gnus-topic-remove-group): New implementation.
+
+       * gnus.el (gnus-gnus-to-newsrc-format): princ instead of
+       int-to-string. 
+
+Sat Mar  9 07:36:22 1996  Thor Kristoffersen  <thor@unik.no>
+
+       * nntp.el (nntp-request-article): New wait-for regexp to work with
+       rlogin.
+
+Sat Mar  9 07:21:57 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus.el (gnus-request-article-this-buffer): Would bug out when
+       no summary buffer.
+
+       * gnus-topic.el (gnus-topic-mark-topic): Mark hidden groups in the
+       topic.
+
+       * gnus-msg.el (gnus-summary-resend-message): Would bug out.
+
+Sat Mar  9 06:57:13 1996  Michael Cook  <mcook@cognex.com>
+
+       * nnmail.el (nnmail-split-fancy-syntax-table): New variable. 
+
+Fri Mar  8 12:58:37 1996  Wes Hardaker  <hardaker@ece.ucdavis.edu>
+        * gnus.el (gnus-summary-go-to-next-thread): Would always jump to
+        the next dummy-root if called on a dummy-root.
 Sat Mar  9 01:58:10 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
 
+       * gnus.el: 0.51 is released.
+
        * gnus-msg.el (gnus-tokenize-header): Wouldn't do the right thing
        under XEmacs.
 
@@ -35,6 +120,8 @@ Fri Mar  8 19:18:29 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
 
 Fri Mar  8 00:03:14 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
 
+       * gnus.el: 0.50 is released.
+
        * gnus.el (gnus-group-yank-group): Would bug out on groups with
        scores. 
        (gnus-summary-go-to-next-thread): Do dummies properly.
index 2a00c4b..b5c7aaa 100644 (file)
@@ -68,6 +68,8 @@ variable to \"^nnml\".")
   "Initialize the cache."
   (gnus-cache-read-active))
 
+(gnus-add-shutdown 'gnus-cache-close 'gnus)
+
 (defun gnus-cache-close ()
   "Shut down the cache."
   (gnus-cache-write-active)
@@ -303,6 +305,7 @@ If not given a prefix, use the process marked articles instead.
 Returns the list of articles removed."
   (interactive "P")
   (gnus-set-global-variables)
+  (gnus-cache-change-buffer gnus-newsgroup-name)
   (let ((articles (gnus-summary-work-articles n))
        article out)
     (while articles
index 548d7d7..36d8aac 100644 (file)
@@ -99,6 +99,8 @@ time Emacs has been idle for IDLE `gnus-demon-timestep's.")
     (setq gnus-demon-idle-has-been-called nil)
     (setq gnus-use-demon t)))
 
+(gnus-add-shutdown 'gnus-demon-cancel 'gnus)
+
 (defun gnus-demon-cancel ()
   "Cancel any Gnus daemons."
   (interactive)
index 4717261..baf0e67 100644 (file)
@@ -304,6 +304,8 @@ The scale factor is applied after the offset.")
     (if (looking-at "[0-9]+")
        (buffer-substring token-pos (match-end 0)))))
 
+(gnus-add-shutdown 'bbb-logout 'gnus)
+
 (defun bbb-logout ()
   "logout of bbb session"
   (let ((bbb-process 
index a105191..78969f2 100644 (file)
@@ -1017,7 +1017,8 @@ called."
                                  gnus-inews-sent-ids))
            (setcdr end nil))
          (nnheader-temp-write gnus-sent-message-ids-file
-           (prin1 `(setq gnus-inews-sent-ids ',gnus-inews-sent-ids)))
+           (prin1 `(setq gnus-inews-sent-ids ',gnus-inews-sent-ids)
+                  (current-buffer)))
          nil)))))
 
 (defun gnus-tokenize-header (header &optional separator)
@@ -1227,62 +1228,61 @@ This function can be used in `mail-citation-hook', for instance."
   ;; Correct newsgroups field: change sequence of spaces to comma and 
   ;; eliminate spaces around commas.  Eliminate imbedded line breaks.
   (goto-char (point-min))
-  (if (re-search-forward "^Newsgroups: +" nil t)
-      (save-restriction
-       (narrow-to-region
-        (point)
-        (if (re-search-forward "^[^ \t]" nil t)
-            (match-beginning 0)
-          (forward-line 1)
-          (point)))
-       (goto-char (point-min))
-       (while (re-search-forward "\n[ \t]+" nil t)
-         (replace-match " " t t))      ;No line breaks (too confusing)
-       (goto-char (point-min))
-       (while (re-search-forward "[ \t\n]*,[ \t\n]*\\|[ \t]+" nil t)
-         (replace-match "," t t))
-       (goto-char (point-min))
-       ;; Remove a trailing comma.
-       (if (re-search-forward ",$" nil t)
-           (replace-match "" t t))))
-
+  (when (re-search-forward "^Newsgroups: +" nil t)
+    (save-restriction
+      (narrow-to-region
+       (point)
+       (if (re-search-forward "^[^ \t]" nil t)
+          (match-beginning 0)
+        (forward-line 1)
+        (point)))
+      (goto-char (point-min))
+      (while (re-search-forward "\n[ \t]+" nil t)
+       (replace-match " " t t))        ;No line breaks (too confusing)
+      (goto-char (point-min))
+      (while (re-search-forward "[ \t\n]*,[ \t\n]*\\|[ \t]+" nil t)
+       (replace-match "," t t))
+      (goto-char (point-min))
+      ;; Remove trailing commas.
+      (when (re-search-forward ",+$" nil t)
+       (replace-match "" t t))))
   ;; Added by Per Abrahamsen <abraham@iesd.auc.dk>.
   ;; Help save the the world!
-  (or 
-   gnus-expert-user
-   (let ((newsgroups (mail-fetch-field "newsgroups"))
-        (followup-to (mail-fetch-field "followup-to"))
-        groups to)
-     (if (and newsgroups
-             (string-match "," newsgroups) (not followup-to))
-        (progn
-          (while (string-match "," newsgroups)
-            (setq groups
-                  (cons (list (substring newsgroups 0 (match-beginning 0)))
-                        groups))
-            (setq newsgroups (substring newsgroups (match-end 0))))
-          (setq groups (nreverse (cons (list newsgroups) groups)))
-
-          (setq to (completing-read 
-                    "Followups to: (default all groups) " groups))
-          (if (> (length to) 0)
-              (progn
-                (goto-char (point-min))
-                (insert "Followup-To: " to "\n")))))))
+  (unless gnus-expert-user
+    (let ((newsgroups (mail-fetch-field "newsgroups"))
+         (followup-to (mail-fetch-field "followup-to"))
+         to)
+      (when (and newsgroups (string-match "," newsgroups)
+                (not followup-to)
+                (not
+                 (zerop
+                  (length
+                   (setq to (completing-read 
+                             "Followups to: (default all groups) " 
+                             (mapcar (lambda (g) (list g))
+                                     (cons "poster" 
+                                           (gnus-tokenize-header 
+                                            newsgroups)))))))))
+       (goto-char (point-min))
+       (insert "Followup-To: " to "\n"))))
 
   ;; Cleanup Followup-To.
   (goto-char (point-min))
-  (if (search-forward-regexp "^Followup-To: +" nil t)
-      (save-restriction
-       (narrow-to-region
-        (point)
-        (if (re-search-forward "^[^ \t]" nil 'end)
-            (match-beginning 0)
-          (point-max)))
-       (goto-char (point-min))
-       (replace-regexp "\n[ \t]+" " ") ;No line breaks (too confusing)
-       (goto-char (point-min))
-       (replace-regexp "[ \t\n]*,[ \t\n]*\\|[ \t]+" ","))))
+  (when (search-forward-regexp "^Followup-To: +" nil t)
+    (save-restriction
+      (narrow-to-region
+       (point)
+       (if (re-search-forward "^[^ \t]" nil 'end)
+          (match-beginning 0)
+        (point-max)))
+      (goto-char (point-min))
+      ;; No line breaks (too confusing)
+      (while (re-search-forward "\n[ \t]+" nil t )
+       (replace-match " " t ))
+      (goto-char (point-min))
+      (while (re-search-forward "[ \t\n]*,[ \t\n]*\\|[ \t]+" nil t)
+       (replace-match "," t t)))))
 
 (defun gnus-inews-remove-headers ()
   (let ((case-fold-search t)
@@ -1812,7 +1812,8 @@ Customize the variable gnus-mail-forward-method to use another mailer."
       (forward-char -1)
       (save-restriction
        (narrow-to-region beg (point))
-       (nnheader-remove-header gnus-ignored-resent-headers t))
+       (nnheader-remove-header gnus-ignored-resent-headers t)
+       (goto-char (point-max)))
       (insert mail-header-separator)
       ;; Rename all old ("Also-")Resent headers.
       (while (re-search-backward "^\\(Also-\\)?Resent-" beg t)
@@ -3056,6 +3057,11 @@ Headers will be generated before sending."
     (unless (looking-at "$")
       (forward-line 2)))
    (sit-for 0)))
+
+(gnus-add-shutdown 'gnus-inews-close 'gnus)
+
+(defun gnus-inews-close ()
+  (setq gnus-inews-sent-ids nil))
   
 ;;; Allow redefinition of functions.
 
index 312f3cb..0d18575 100644 (file)
          (setq entry (cdr entry))))
       (setq alist (cdr alist)))))
 
+(gnus-add-shutdown 'gnus-nocem-close 'gnus)
+
 (defun gnus-nocem-close ()
   "Clear internal NoCeM variables."
   (setq gnus-nocem-alist nil
index dcc5019..d7a2655 100644 (file)
@@ -1046,9 +1046,7 @@ SCORE is the score to add."
       (setq scores news
            news nil)
       (when (and gnus-summary-default-score
-                scores
-                (> (length gnus-newsgroup-headers)
-                   (length gnus-newsgroup-scored)))
+                scores)
        (let* ((entries gnus-header-index)
               (now (gnus-day-number (current-time-string)))
               (expire (and gnus-score-expiry-days
@@ -1896,10 +1894,14 @@ This mode is an extended emacs-lisp mode.
        gnus-short-name-score-file-cache nil)
   (gnus-message 6 "The score cache is now flushed"))
 
+(gnus-add-shutdown 'gnus-score-close 'gnus)
+
 (defun gnus-score-close ()
   "Clear all internal score variables."
   (setq gnus-score-cache nil
-       gnus-internal-global-score-files nil))
+       gnus-internal-global-score-files nil
+       gnus-score-file-list nil
+       gnus-score-file-alist-cache nil))
 
 ;; Summary score marking commands.
 
@@ -1980,9 +1982,12 @@ This mode is an extended emacs-lisp mode.
        (setq gnus-score-file-list 
              (cons nil 
                    (or gnus-short-name-score-file-cache
-                       (setq gnus-short-name-score-file-cache
-                             (gnus-score-score-files-1
-                              gnus-kill-files-directory)))))
+                       (prog2
+                           (gnus-message 6 "Finding all score files...")
+                           (setq gnus-short-name-score-file-cache
+                                 (gnus-score-score-files-1
+                                  gnus-kill-files-directory))
+                         (gnus-message 6 "Finding all score files...done")))))
       ;; We want long file names.
       (when (or (not gnus-score-file-list)
                (not (car gnus-score-file-list))
@@ -2012,7 +2017,9 @@ This mode is an extended emacs-lisp mode.
        ;; Add files to the list of score files.
        ((string-match regexp file)
        (push file out))))
-    out))
+    (or out
+       ;; Return a dummy value.
+       (list "~/News/this.file.does.not.exist.SCORE"))))
        
 (defun gnus-score-file-regexp ()
   "Return a regexp that match all score files."
index 0acb1f2..fa7c8d5 100644 (file)
@@ -271,12 +271,12 @@ If NOT-ALL, don't pack ticked articles."
                   (gnus-range-length (cdr (assq 'tick (gnus-info-marks 
                                                        (nth 2 entry)))))))
       (when (gnus-summary-read-group group nil t)
-       (let ((gnus-newsgroup-processable
+       (setq gnus-newsgroup-processable
+             (reverse
               (if (not not-all)
-                  (reverse (append gnus-newsgroup-marked
-                                   gnus-newsgroup-unreads))
-                (reverse gnus-newsgroup-unreads))))
-         (gnus-soup-add-article nil))
+                  (append gnus-newsgroup-marked gnus-newsgroup-unreads)
+                gnus-newsgroup-unreads)))
+       (gnus-soup-add-article nil)
        (gnus-summary-exit)))))
 
 (defun gnus-soup-insert-idx (offset header)
index 67e2191..1cfb9c4 100644 (file)
@@ -56,6 +56,9 @@ with some simple extensions.
 
 ;; Internal variables.
 
+(defvar gnus-topic-active-topology nil)
+(defvar gnus-topic-active-alist nil)
+
 (defvar gnus-topic-killed-topics nil)
 (defvar gnus-topic-inhibit-change-level nil)
 (defvar gnus-topic-tallied-groups nil)
@@ -337,6 +340,14 @@ articles in the topic and its subtopics."
        (setq topology (cdr topology)))
       result)))
 
+(gnus-add-shutdown 'gnus-topic-close 'gnus)
+
+(defun gnus-topic-close ()
+  (setq gnus-topic-active-topology nil
+       gnus-topic-active-alist nil
+       gnus-topic-killed-topics nil
+       gnus-topic-tallied-groups nil))
+
 (defun gnus-topic-check-topology ()  
   ;; The first time we set the topology to whatever we have
   ;; gotten here, which can be rather random.
@@ -670,7 +681,7 @@ group."
        (gnus-topic-fold all))
     (gnus-group-read-group all no-article group)))
 
-(defun gnus-topic-create-topic (topic parent &optional previous)
+(defun gnus-topic-create-topic (topic parent &optional previous full-topic)
   (interactive 
    (list
     (read-string "Create topic: ")
@@ -681,7 +692,8 @@ group."
     (error "Topic aleady exists"))
   (unless parent
     (setq parent (caar gnus-topic-topology)))
-  (let ((top (cdr (gnus-topic-find-topology parent))))
+  (let ((top (cdr (gnus-topic-find-topology parent)))
+       (full-topic (or full-topic `((,topic visible)))))
     (unless top
       (error "No such parent topic: %s" parent))
     (if previous
@@ -689,8 +701,8 @@ group."
          (while (and (cdr top)
                      (not (equal (caaadr top) previous)))
            (setq top (cdr top)))
-         (setcdr top (cons (list (list topic 'visible)) (cdr top))))
-      (nconc top (list (list (list topic 'visible)))))
+         (setcdr top (cons full-topic (cdr top))))
+      (nconc top (list full-topic)))
     (unless (assoc topic gnus-topic-alist)
       (push (list topic) gnus-topic-alist)))
   (gnus-topic-enter-dribble)
@@ -717,10 +729,16 @@ group."
   (gnus-topic-enter-dribble)
   (gnus-group-list-groups))
 
-(defun gnus-topic-remove-group (n)
-  "Remove the current group the topic."
-  (interactive "P")
-  (gnus-topic-move-group n nil))
+(defun gnus-topic-remove-group ()
+  "Remove the current group from the topic."
+  (interactive)
+  (let ((topicl (assoc (gnus-group-parent-topic) gnus-topic-alist))
+       (group (gnus-group-group-name))
+       (buffer-read-only nil))
+    (when (and topicl group)
+      (gnus-delete-line)
+      (delq (gnus-group-group-name) topicl))
+    (gnus-group-position-point)))
 
 (defun gnus-topic-copy-group (n topic)
   "Copy the current group to a topic."
@@ -820,9 +838,10 @@ group."
   (interactive "p")
   (if gnus-topic-killed-topics
       (let ((previous (gnus-group-parent-topic))
-           (item (nth 1 (pop gnus-topic-killed-topics))))
+           (item (cdr (pop gnus-topic-killed-topics))))
        (gnus-topic-create-topic
-        (car item) (gnus-topic-parent-topic previous) previous))
+        (caar item) (gnus-topic-parent-topic previous) previous
+        item))
     (let* ((prev (gnus-group-group-name))
           (gnus-topic-inhibit-change-level t)
           (gnus-group-indentation
@@ -870,7 +889,7 @@ group."
   "Mark all groups in the topic with the process mark."
   (interactive (list (gnus-group-parent-topic)))
   (save-excursion
-    (let ((groups (gnus-topic-find-groups topic)))
+    (let ((groups (gnus-topic-find-groups topic 9 t)))
       (while groups
        (funcall (if unmark 'gnus-group-remove-mark 'gnus-group-set-mark)
                 (gnus-info-group (nth 2 (pop groups))))))))
index a5aff64..91b3fc1 100644 (file)
@@ -1423,7 +1423,6 @@ specified by `gnus-button-alist'."
    from to
    (nconc (and gnus-article-mouse-face
               (list gnus-mouse-face-prop gnus-article-mouse-face))
-         (list 'invisible nil)
          (list 'gnus-callback fun)
          (and data (list 'gnus-data data)))))
 
index 1b7b3db..8b382b7 100644 (file)
@@ -1349,8 +1349,9 @@ course.)")
   "Property list to use for hiding text.")
 
 (defvar gnus-modtime-botch nil
-  "*Non-nil means .newsrc should be deleted prior to save.  Its use is
-due to the bogus appearance that .newsrc was modified on disc.")
+  "*Non-nil means .newsrc should be deleted prior to save.  
+Its use is due to the bogus appearance that .newsrc was modified on
+disc.")
 
 ;; Hooks.
 
@@ -1551,9 +1552,6 @@ It is called with three parameters -- GROUP, LEVEL and OLDLEVEL.")
 (defvar gnus-server-alist nil
   "List of available servers.")
 
-(defvar gnus-topic-active-topology nil)
-(defvar gnus-topic-active-alist nil)
-
 (defvar gnus-group-indentation-function nil)
 
 (defvar gnus-topic-indentation "") ;; Obsolete variable.
@@ -1717,7 +1715,7 @@ variable (string, integer, character, etc).")
   "gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)"
   "The mail address of the Gnus maintainers.")
 
-(defconst gnus-version "September Gnus v0.51"
+(defconst gnus-version "September Gnus v0.52"
   "Version number for this version of Gnus.")
 
 (defvar gnus-info-nodes
@@ -3104,39 +3102,25 @@ If RE-ONLY is non-nil, strip leading `Re:'s only."
        gnus-active-hashtb nil
        gnus-moderated-list nil
        gnus-description-hashtb nil
+       gnus-current-headers nil
+       gnus-thread-indent-array nil
        gnus-newsgroup-headers nil
        gnus-newsgroup-name nil
        gnus-server-alist nil
        gnus-group-list-mode nil
-       gnus-topic-active-topology nil
-       gnus-topic-active-alist nil
        gnus-opened-servers nil
        gnus-current-select-method nil)
-  ;; Reset any score variables.
-  (when gnus-use-scoring 
-    (gnus-score-close))
+  (gnus-shutdown 'gnus)
   ;; Kill the startup file.
   (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.
-  (when gnus-use-cache 
-    (gnus-cache-save-buffers))
   ;; Clear the dribble buffer.
   (gnus-dribble-clear)
-  ;; Close down NoCeM.
-  (when gnus-use-nocem 
-    (gnus-nocem-close))
-  ;; Shut down the demons.
-  (when gnus-use-demon
-    (gnus-demon-cancel))
   ;; Kill global KILL file buffer.
   (when (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.
-  (when gnus-keep-backlog
-    (gnus-backlog-shutdown))
   ;; Kill Gnus buffers.
   (while gnus-buffer-list
     (gnus-kill-buffer (pop gnus-buffer-list)))
@@ -4180,9 +4164,10 @@ If ARG is non-nil and not a positive number, Gnus will
 prompt the user for the name of an NNTP server to use.
 As opposed to `gnus', this command will not connect to the local server."
   (interactive "P")
+  (let ((gnus-group-use-permanent-levels t))
+    (gnus (or arg (1- gnus-level-default-subscribed)) t slave))
   (make-local-variable 'gnus-group-use-permanent-levels)
-  (setq gnus-group-use-permanent-levels t)
-  (gnus (or arg (1- gnus-level-default-subscribed)) t slave))
+  (setq gnus-group-use-permanent-levels t))
 
 ;;;###autoload
 (defun gnus-slave (&optional arg)
@@ -5415,6 +5400,7 @@ of the Earth\".    There is no undo."
          (gnus-message 6 "Deleting group %s...done" group)
          (gnus-group-goto-group group)
          (gnus-group-kill-group 1 t)
+         (gnus-sethash group nil gnus-active-hashtb)
          t))
     (gnus-group-position-point)))
 
@@ -6536,18 +6522,12 @@ The hook `gnus-exit-gnus-hook' is called before actually exiting."
          gnus-expert-user
          (gnus-y-or-n-p "Are you sure you want to quit reading news? "))
     (run-hooks 'gnus-exit-gnus-hook)
-    ;; Close down GroupLens.
-    (when gnus-use-grouplens
-      (bbb-logout))
     ;; Offer to save data from non-quitted summary buffers.
     (gnus-offer-save-summaries)
     ;; Save the newsrc file(s).
     (gnus-save-newsrc-file)
     ;; Kill-em-all.
     (gnus-close-backends)
-    ;; Shut down the cache.
-    (when gnus-use-cache
-      (gnus-cache-close))
     ;; Reset everything.
     (gnus-clear-system)
     ;; Allow the user to do things after cleaning up.
@@ -6581,9 +6561,6 @@ The hook `gnus-exit-gnus-hook' is called before actually exiting."
       (gnus-remove-some-windows))
     (gnus-dribble-save)
     (gnus-close-backends)
-    ;; Shut down the cache.
-    (when gnus-use-cache
-      (gnus-cache-close))
     (gnus-clear-system)
     ;; Allow the user to do things after cleaning up.
     (run-hooks 'gnus-after-exiting-gnus-hook)))
@@ -12349,7 +12326,9 @@ Return the article number moved to, or nil if moving was impossible."
           (gnus-summary-article-intangible-p))
       (let ((beg (point)))
        (while (and (zerop (forward-line 1))
-                   (not (gnus-summary-article-intangible-p))))
+                   (not (gnus-summary-article-intangible-p))
+                   (not (zerop (save-excursion 
+                                 (gnus-summary-thread-level))))))
        (if (eobp)
            (progn
              (goto-char beg)
@@ -13172,7 +13151,8 @@ The following commands are available:
        ;; message-id and request it by id instead of number.
        (when (and (numberp article)
                   gnus-summary-buffer
-                  (buffer-name gnus-summary-buffer))
+                  (get-buffer gnus-summary-buffer)
+                  (buffer-name (get-buffer gnus-summary-buffer)))
          (save-excursion
            (set-buffer gnus-summary-buffer)
            (let ((header (gnus-summary-article-header article)))
@@ -13234,11 +13214,11 @@ The following commands are available:
 
     ;; Take the article from the original article buffer
     ;; and place it in the buffer it's supposed to be in.
-    (setq gnus-original-article (cons group article))
     (when (and (get-buffer gnus-article-buffer)
               (equal (buffer-name (current-buffer))
                      (buffer-name (get-buffer gnus-article-buffer))))
       (save-excursion
+       (setq gnus-original-article (cons group article))
        (if (get-buffer gnus-original-article-buffer)
            (set-buffer (get-buffer gnus-original-article-buffer))
          (set-buffer (get-buffer-create gnus-original-article-buffer))
@@ -13812,6 +13792,17 @@ always hide."
             (nconc (list 'gnus-type 'signature)
                    gnus-hidden-properties))))))))
 
+(defun gnus-article-strip-leading-blank-lines ()
+  "Remove all blank lines from the beginning of the article."
+  (interactive)
+  (save-excursion
+    (set-buffer gnus-article-buffer)
+    (let (buffer-read-only)
+      (goto-char (point-min))
+      (when (search-forward "\n\n" nil t)
+       (while (looking-at "[ \t]$")
+         (gnus-delete-line))))))
+
 (defun gnus-narrow-to-signature ()
   "Narrow to the signature."
   (widen)
@@ -16218,10 +16209,11 @@ If FORCE is non-nil, the .newsrc file is read."
 
 (defun gnus-gnus-to-newsrc-format ()
   ;; Generate and save the .newsrc file.
-  (let ((newsrc (cdr gnus-newsrc-alist))
-       info ranges range)
-    (save-excursion
-      (set-buffer (create-file-buffer gnus-current-startup-file))
+  (save-excursion
+    (set-buffer (create-file-buffer gnus-current-startup-file))
+    (let ((newsrc (cdr gnus-newsrc-alist))
+         (standard-output (current-buffer))
+         info ranges range)
       (setq buffer-file-name gnus-current-startup-file)
       (buffer-disable-undo (current-buffer))
       (erase-buffer)
@@ -16238,18 +16230,18 @@ If FORCE is non-nil, the .newsrc file is read."
            (insert " ")
            (if (not (listp (cdr ranges)))
                (if (= (car ranges) (cdr ranges))
-                   (insert (int-to-string (car ranges)))
-                 (insert (int-to-string (car ranges)) "-"
-                         (int-to-string (cdr ranges))))
+                   (princ (car ranges))
+                 (princ (car ranges))
+                 (insert "-")
+                 (princ (cdr ranges)))
              (while ranges
                (setq range (car ranges)
                      ranges (cdr ranges))
                (if (or (atom range) (= (car range) (cdr range)))
-                   (insert (int-to-string
-                            (or (and (atom range) range)
-                                (car range))))
-                 (insert (int-to-string (car range)) "-"
-                         (int-to-string (cdr range))))
+                   (princ (or (and (atom range) range) (car range)))
+                 (princ (car range))
+                 (insert "-")
+                 (princ (cdr range)))
                (if ranges (insert ",")))))
          (insert "\n")))
       (make-local-variable 'version-control)
@@ -16401,6 +16393,25 @@ If FORCE is non-nil, the .newsrc file is read."
       (when (looking-at "[^ \t]+[ \t]+\\(.*\\)")
        (match-string 1)))))
 
+\f
+;;;
+;;; Shutdown
+;;;
+
+(defvar gnus-shutdown-alist nil)
+
+(defun gnus-add-shutdown (function &rest symbols)
+  "Run FUNCTION whenever one of SYMBOLS is shut down."
+  (push (cons function symbols) gnus-shutdown-alist))
+
+(defun gnus-shutdown (symbol)
+  "Shut down everything that waits for SYMBOL."
+  (let ((alist gnus-shutdown-alist)
+       entry)
+    (while (setq entry (pop alist))
+      (when (memq symbol (cdr entry))
+       (funcall (car entry))))))
+
 \f
 ;;;
 ;;; Buffering of read articles.
@@ -16425,6 +16436,8 @@ If FORCE is non-nil, the .newsrc file is read."
   (unless gnus-backlog-hashtb
     (setq gnus-backlog-hashtb (make-vector 1023 0))))
 
+(gnus-add-shutdown 'gnus-backlog-shutdown 'gnus)
+
 (defun gnus-backlog-shutdown ()
   "Clear all backlog variables and buffers."
   (when (get-buffer gnus-backlog-buffer)
index a4a1335..0bea648 100644 (file)
@@ -204,8 +204,8 @@ GROUP: Mail will be stored in GROUP (a string).
 \(& SPLIT...): Process each SPLIT expression.
 
 FIELD must match a complete field name.  VALUE must match a complete
-word according to the fundamental mode syntax table.  You can use .*
-in the regexps to match partial field names or words.
+word according to the `nnmail-split-fancy-syntax-table' syntax table.
+You can use .* in the regexps to match partial field names or words.
 
 FIELD and VALUE can also be lisp symbols, in that case they are expanded
 as specified in `nnmail-split-abbrev-alist'.
@@ -261,6 +261,10 @@ parameter.  It should return nil, `warn' or `delete'.")
 
 ;;; Internal variables.
 
+(defvar nnmail-split-fancy-syntax-table
+  (copy-syntax-table (standard-syntax-table))
+  "Syntax table used by `nnmail-split-fancy'.")
+
 \f
 
 (defconst nnmail-version "nnmail 1.0"
@@ -531,7 +535,7 @@ nn*-request-list should have been called before calling this function."
       (if (re-search-forward delim nil t)
          (when (or (looking-at "[^\n :]+ *:")
                    (looking-at delim)
-                   (looking-at (concat ">" delim)))
+                   (looking-at (concat ">" rmail-unix-mail-delimiter)))
            (forward-line -1)
            (setq found 'yes))
        (setq found 'no)))
@@ -593,17 +597,6 @@ nn*-request-list should have been called before calling this function."
        ;; message separator or a blank line followed by the separator.
        ;; The blank line should probably be deleted.  If neither of the
        ;; three is met, the content-length header is probably invalid.
-       (when content-length
-         (forward-line 1)
-         (setq skip (+ (point) content-length))
-         (when (or (= skip (point-max))
-                   (and (< skip (point-max))
-                        (goto-char skip)
-                        (or (looking-at delim)
-                            (and (looking-at 
-                                  (concat "[ \t]*\n\\(" delim "\\)"))
-                                 (setq skip (match-beginning 1))))))
-           (setq end skip)))
        (when content-length
          (forward-line 1)
          (setq skip (+ (point) content-length))
@@ -830,7 +823,12 @@ Return the number of characters in the body."
 (defun nnmail-split-fancy ()
   "Fancy splitting method.
 See the documentation for the variable `nnmail-split-fancy' for documentation."
-  (nnmail-split-it nnmail-split-fancy))
+  (let ((syntab (syntax-table)))
+    (unwind-protect
+       (progn
+         (set-syntax-table nnmail-split-fancy-syntax-table)
+         (nnmail-split-it nnmail-split-fancy))
+      (set-syntax-table syntab))))
 
 (defvar nnmail-split-cache nil)
 ;; Alist of split expressions their equivalent regexps.
@@ -1058,9 +1056,9 @@ See the documentation for the variable `nnmail-split-fancy' for documentation."
          (beginning-of-line)
          (insert "Original-"))
        (beginning-of-line)
-       (insert "Message-ID: " newid "\n")
-       (insert "Gnus-Warning: This is a duplication of message "
-               message-id "\n")
+       (insert 
+        "Message-ID: " newid "\n"
+        "Gnus-Warning: This is a duplicate of message " message-id "\n")
        (nnmail-cache-insert newid)
        (funcall func)))
      (t
index 18cacfe..c2a0c29 100644 (file)
 (defvar nnml-directory "~/Mail/"
   "Mail spool directory.")
 
-(defvar nnml-active-file (concat nnml-directory "active")
+(defvar nnml-active-file 
+  (concat (file-name-as-directory nnml-directory) "active")
   "Mail active file.")
 
-(defvar nnml-newsgroups-file (concat nnml-directory "newsgroups")
+(defvar nnml-newsgroups-file 
+  (concat (file-name-as-directory nnml-directory) "newsgroups")
   "Mail newsgroups description file.")
 
 (defvar nnml-get-new-mail t
index 5665626..7afd915 100644 (file)
@@ -503,7 +503,9 @@ servers."
            (let ((nntp-server-buffer (or buffer nntp-server-buffer))
                  (art (or (and (numberp id) (int-to-string id)) id)))
              (prog1
-                 (and (nntp-send-command "^\\.\r?\n" "ARTICLE" art)
+                 (and (nntp-send-command 
+                       ;; A bit odd regexp to ensure working over rlogin.
+                       "^\\.\\(\r?\n\\|\r$\\)" "ARTICLE" art)
                       (if (numberp id) 
                           (cons nntp-current-group id)
                         ;; We find out what the article number was.
@@ -882,7 +884,7 @@ It will prompt for a password."
        (setq wait t)
        (while wait
          (goto-char (point-max))
-         (forward-line -1)
+         (if (bolp) (forward-line -1) (beginning-of-line))
          (if (looking-at regexp)
              (setq wait nil)
            (when nntp-debug-read
index 49d223e..67e37ac 100644 (file)
@@ -80,7 +80,7 @@ virtual group.")
                       (gnus-request-group cgroup t))
              (setq prefix (gnus-group-real-prefix cgroup))
              (when (setq result (gnus-retrieve-headers 
-                                 (list (caddr article)) cgroup fetch-old))
+                                 (list (caddr article)) cgroup nil))
                (set-buffer nntp-server-buffer)
                (if (zerop (buffer-size))
                    (nconc (assq cgroup unfetched) (list (caddr article)))
index e94f272..1121b36 100644 (file)
@@ -1,3 +1,7 @@
+Sat Mar  9 07:00:48 1996  Lars Magne Ingebrigtsen  <lars@eyesore.no>
+
+       * gnus.texi (Fancy Mail Splitting): Addition.
+
 Sat Mar  9 00:32:23 1996  Lars Magne Ingebrigtsen  <larsi@ylfing.ifi.uio.no>
 
        * gnus.texi (Summary Buffer Lines): Change.
index 50417a2..02d3fcb 100644 (file)
@@ -8295,6 +8295,10 @@ as specified by the variable @code{nnmail-split-abbrev-alist}.  This is
 an alist of cons cells, where the car of the cells contains the key, and
 the cdr contains a string.
 
+@vindex nnmail-split-fancy-syntax-table
+@code{nnmail-split-fancy-syntax-table} is the syntax table in effect
+when all this splitting is performed.
+
 
 @node Mail and Procmail
 @subsection Mail and Procmail
@@ -10044,6 +10048,9 @@ Type @kbd{M-x gnus-score-mode} to use this mode.
 @vindex gnus-score-mode-hook
 @code{gnus-score-menu-hook} is run in score mode buffers.
 
+In the summary buffer you can use commands like @kbd{V f} and @kbd{V
+e} to begin editing score files.
+
 
 @node Adaptive Scoring
 @section Adaptive Scoring