Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

*** empty log message ***

  • Loading branch information...
commit 00e58ae439d91f37995d446bc6c743cc4b11343e 1 parent 842a981
Lars Ingebrigtsen authored
102  lisp/ChangeLog
... ...
@@ -1,3 +1,105 @@
  1
+Fri Jan 24 05:05:38 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  2
+
  3
+	* gnus.el (gnus-article-display-hook): Removed emphasize.
  4
+
  5
+	* gnus-score.el (gnus-score-edit-current-scores): Set global
  6
+	vars. 
  7
+
  8
+	* nnml.el (nnml-possibly-change-directory): Return nil when the
  9
+	group can't be selected.
  10
+
  11
+	* gnus-art.el (gnus-emphasis-alist): Don't underline
  12
+	all-underscore words.
  13
+
  14
+	* gnus-topic.el (gnus-topic-unindent): Give the right number of
  15
+	unread articles.
  16
+	(gnus-topic-indent): Ditto.
  17
+
  18
+	* gnus-msg.el (gnus-summary-wide-reply-with-original): New command
  19
+	and keystroke.
  20
+	(gnus-summary-wide-reply): Ditto.
  21
+
  22
+Fri Jan 24 04:57:07 1997  Joe Wells  <jbw@cs.bu.edu>
  23
+
  24
+	* gnus-uu.el (gnus-quote-arg-for-sh-or-csh): New function.
  25
+	(gnus-uu-command): Use it.
  26
+
  27
+Fri Jan 24 04:55:10 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  28
+
  29
+	* gnus-topic.el (gnus-topic-mark-topic): Also bound to `#'.
  30
+
  31
+Fri Jan 24 04:44:10 1997  Greg Klanderman  <greg@alphatech.com>
  32
+
  33
+	* message.el (message-do-send-housekeeping): Check for nil
  34
+	message-buffer-list. 
  35
+
  36
+Fri Jan 24 02:55:33 1997  Kurt Swanson  <kurt@dna.lth.se>
  37
+
  38
+	* gnus-util.el (gnus-eval-in-buffer-window): Set buffer.
  39
+
  40
+Thu Jan 23 03:39:48 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  41
+
  42
+	* nnsoup.el (nnsoup-file-name): New function.
  43
+	(nnsoup-read-areas): Use it.
  44
+	(nnsoup-dissect-buffer): New function.
  45
+	(nnsoup-number-of-articles): Use it.
  46
+	(nnsoup-narrow-to-article): Ditto.
  47
+	(nnsoup-header): Removed.
  48
+
  49
+	* gnus.el (gnus-check-backend-function): Doc fix.
  50
+
  51
+	* gnus-art.el (gnus-article-goto-prev-page): Went to next article,
  52
+	not prev.
  53
+
  54
+	* gnus-group.el (gnus-group-insert-group-line-info): Display "*"
  55
+	on unknown groups.
  56
+
  57
+	* gnus-art.el (article-hide-boring-headers): Ignore errors in
  58
+	`mail-extract-address-components'. 
  59
+
  60
+	* nnmail.el (nnmail-date-to-time): Parse zone correctly.
  61
+	(nnmail-date-to-time): Seconds, dammit, seconds!
  62
+
  63
+Tue Jan 21 09:31:55 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  64
+
  65
+	* gnus-art.el (gnus-url-mailto): Didn't accept mailto links. 
  66
+
  67
+	* gnus-score.el (gnus-summary-score-effect): Doc fix.
  68
+
  69
+	* nnmail.el (nnmail-move-inbox): Don't prin1 password.
  70
+
  71
+Mon Jan 20 18:06:19 1997  Paul Franklin  <paul@cs.washington.edu>
  72
+
  73
+	* gnus-sum.el (gnus-simplify-buffer-fuzzy-step): New function.
  74
+	(gnus-simplify-buffer-fuzzy): Use it.
  75
+
  76
+	* gnus-sum.el (gnus-simplify-buffer-fuzzy): Fix while condition.
  77
+	Add self-discipline tags.
  78
+
  79
+Tue Jan 21 05:28:05 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  80
+
  81
+	* gnus-sum.el (gnus-get-newsgroup-headers-xover): Would return
  82
+	nil from NoCeM.
  83
+
  84
+Mon Jan 20 04:59:53 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  85
+
  86
+	* gnus-art.el (gnus-button-alist): Only on word boundaries.
  87
+
  88
+	* message.el (message-check-news-header-syntax): Don't prompt when
  89
+	not read active file.
  90
+
  91
+	* gnus-msg.el (gnus-setup-message): Always set actions.
  92
+
  93
+Sat Jan 18 07:23:41 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  94
+
  95
+	* nntp.el (nntp-have-messaged): New variable.
  96
+	(nntp-accept-process-output): Use it.
  97
+	(nntp-wait-for): Ditto.
  98
+
  99
+Sat Jan 18 02:44:53 1997  Lars Magne Ingebrigtsen  <menja.larsi@ifi.uio.no>
  100
+
  101
+	* gnus.el: Red Gnus v0.82 is released.
  102
+
1 103
 Fri Jan 17 00:04:47 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
2 104
 
3 105
 	* nnheader.el (nnheader-find-nov-line): Do the right thing with
20  lisp/gnus-art.el
@@ -131,7 +131,7 @@ asynchronously.	 The compressed face will be piped to this command."
131 131
 	   ("_\\*" "\\*_" underline-bold)
132 132
 	   ("\\*/" "/\\*" bold-italic)
133 133
 	   ("_\\*/" "/\\*_" underline-bold-italic))))
134  
-    `(("\\(\\s-\\|^\\)\\(_\\(\\(\\w\\|_\\)+\\)_\\)\\(\\s-\\|[?!.,;]\\)"
  134
+    `(("\\(\\s-\\|^\\)\\(_\\(\\(\\w\\|_[^_]\\)+\\)_\\)\\(\\s-\\|[?!.,;]\\)"
135 135
        2 3 gnus-emphasis-underline)
136 136
       ,@(mapcar
137 137
 	 (lambda (spec)
@@ -655,9 +655,10 @@ always hide."
655 655
 		    (reply-to (message-fetch-field "reply-to")))
656 656
 		(when (and
657 657
 		       from reply-to
658  
-		       (equal 
659  
-			(nth 1 (mail-extract-address-components from))
660  
-			(nth 1 (mail-extract-address-components reply-to))))
  658
+		       (ignore-errors
  659
+			 (equal 
  660
+			  (nth 1 (mail-extract-address-components from))
  661
+			  (nth 1 (mail-extract-address-components reply-to)))))
661 662
 		  (gnus-article-hide-header "reply-to"))))
662 663
 	     ((eq elem 'date)
663 664
 	      (let ((date (message-fetch-field "date")))
@@ -2005,7 +2006,7 @@ If given a numerical ARG, move forward ARG pages."
2005 2006
 (defun gnus-article-goto-prev-page ()
2006 2007
   "Show the next page of the article."
2007 2008
   (interactive)
2008  
-  (if (bobp) (gnus-article-read-summary-keys nil (gnus-character-to-event ?n))
  2009
+  (if (bobp) (gnus-article-read-summary-keys nil (gnus-character-to-event ?p))
2009 2010
     (gnus-article-prev-page nil)))
2010 2011
 
2011 2012
 (defun gnus-article-next-page (&optional lines)
@@ -2444,9 +2445,9 @@ groups."
2444 2445
   :type 'regexp)
2445 2446
 
2446 2447
 (defcustom gnus-button-alist 
2447  
-  `(("\\(<?\\(url: ?\\)?news:\\([^>\n\t ]*\\)>?\\)" 1 t
  2448
+  `(("\\(\\b<?\\(url: ?\\)?news:\\([^>\n\t ]*\\)>?\\)" 1 t
2448 2449
      gnus-button-message-id 3)
2449  
-    ("\\(<?\\(url: ?\\)?news:\\(//\\)?\\([^>\n\t ]*\\)>?\\)" 1 t
  2450
+    ("\\(\\b<?\\(url: ?\\)?news:\\(//\\)?\\([^>\n\t ]*\\)>?\\)" 1 t
2450 2451
      gnus-button-fetch-group 4)
2451 2452
     ("\\bin\\( +article\\)? +\\(<\\([^\n @<>]+@[^\n @<>]+\\)>\\)" 2 
2452 2453
      t gnus-button-message-id 3)
@@ -2868,9 +2869,8 @@ forbidden in URL encoding."
2868 2869
  
2869 2870
 (defun gnus-url-mailto (url)
2870 2871
   ;; Send mail to someone
2871  
-  (if (not (string-match "mailto:/*\\(.*\\)" url))
2872  
-      (error "Malformed mailto link: %s" url))
2873  
-  (setq url (substring url (match-beginning 1) nil))
  2872
+  (when (string-match "mailto:/*\\(.*\\)" url)
  2873
+    (setq url (substring url (match-beginning 1) nil)))
2874 2874
   (let (to args source-url subject func)
2875 2875
     (if (string-match (regexp-quote "?") url)
2876 2876
         (setq to (gnus-url-unhex-string (substring url 0 (match-beginning 0)))
2  lisp/gnus-group.el
@@ -1001,7 +1001,7 @@ If REGEXP, only list groups matching REGEXP."
1001 1001
 	   (if (zerop (cdr active))
1002 1002
 	       0
1003 1003
 	     (- (1+ (cdr active)) (car active)))
1004  
-	 0)
  1004
+	 nil)
1005 1005
        nil))))
1006 1006
 
1007 1007
 (defun gnus-group-insert-group-line (gnus-tmp-group gnus-tmp-level 
43  lisp/gnus-msg.el
@@ -132,6 +132,8 @@ Thank you for your help in stamping out bugs.
132 132
   "s" gnus-summary-supersede-article
133 133
   "r" gnus-summary-reply
134 134
   "R" gnus-summary-reply-with-original
  135
+  "w" gnus-summary-wide-reply
  136
+  "W" gnus-summary-wide-reply-with-original
135 137
   "n" gnus-summary-followup-to-mail
136 138
   "N" gnus-summary-followup-to-mail-with-original
137 139
   "m" gnus-summary-mail-other-window
@@ -161,10 +163,11 @@ Thank you for your help in stamping out bugs.
161 163
 	    (copy-sequence message-header-setup-hook)))
162 164
        (add-hook 'message-header-setup-hook 'gnus-inews-insert-gcc)
163 165
        (add-hook 'message-header-setup-hook 'gnus-inews-insert-archive-gcc)
164  
-       ,@forms
165  
-       (gnus-inews-add-send-actions ,winconf ,buffer ,article)
166  
-       (setq gnus-message-buffer (current-buffer))
167  
-       (make-local-variable 'gnus-newsgroup-name)
  166
+       (unwind-protect
  167
+	   ,@forms
  168
+	 (gnus-inews-add-send-actions ,winconf ,buffer ,article)
  169
+	 (setq gnus-message-buffer (current-buffer))
  170
+	 (make-local-variable 'gnus-newsgroup-name))
168 171
        (gnus-configure-windows ,config t))))
169 172
     
170 173
 (defun gnus-inews-add-send-actions (winconf buffer article)
@@ -556,13 +559,13 @@ If SILENT, don't prompt the user."
556 559
 
557 560
 ;;; Mail reply commands of Gnus summary mode
558 561
 
559  
-(defun gnus-summary-reply (&optional yank)
560  
-  "Reply mail to news author.
561  
-If prefix argument YANK is non-nil, original article is yanked automatically."
  562
+(defun gnus-summary-reply (&optional yank wide)
  563
+  "Start composing a reply mail to the current message.
  564
+If prefix argument YANK is non-nil, the original article is yanked 
  565
+automatically."
562 566
   (interactive 
563 567
    (list (and current-prefix-arg 
564 568
 	      (gnus-summary-work-articles 1))))
565  
-  ;; Bug fix by jbw@bigbird.bu.edu (Joe Wells)
566 569
   ;; Stripping headers should be specified with mail-yank-ignored-headers.
567 570
   (gnus-set-global-variables)
568 571
   (when yank 
@@ -571,16 +574,32 @@ If prefix argument YANK is non-nil, original article is yanked automatically."
571 574
     (gnus-setup-message (if yank 'reply-yank 'reply)
572 575
       (gnus-summary-select-article)
573 576
       (set-buffer (gnus-copy-article-buffer))
574  
-      (message-reply nil nil (gnus-group-find-parameter
575  
-			      gnus-newsgroup-name 'broken-reply-to))
  577
+      (message-reply nil wide (gnus-group-find-parameter
  578
+			       gnus-newsgroup-name 'broken-reply-to))
576 579
       (when yank
577 580
 	(gnus-inews-yank-articles yank)))))
578 581
 
579  
-(defun gnus-summary-reply-with-original (n)
580  
-  "Reply mail to news author with original article."
  582
+(defun gnus-summary-reply-with-original (n &optional wide)
  583
+  "Start composing a reply mail to the current message.
  584
+The original article will be yanked."
581 585
   (interactive "P")
582 586
   (gnus-summary-reply (gnus-summary-work-articles n)))
583 587
 
  588
+(defun gnus-summary-wide-reply (&optional yank)
  589
+  "Start composing a wide reply mail to the current message.
  590
+If prefix argument YANK is non-nil, the original article is yanked 
  591
+automatically."
  592
+  (interactive 
  593
+   (list (and current-prefix-arg 
  594
+	      (gnus-summary-work-articles 1))))
  595
+  (gnus-summary-reply yank t))
  596
+
  597
+(defun gnus-summary-wide-reply-with-original (n)
  598
+  "Start composing a wide reply mail to the current message.
  599
+The original article will be yanked."
  600
+  (interactive "P")
  601
+  (gnus-summary-reply-with-original n t))
  602
+
584 603
 (defun gnus-summary-mail-forward (&optional full-headers post)
585 604
   "Forward the current message to another user.
586 605
 If FULL-HEADERS (the prefix), include full headers when forwarding."
3  lisp/gnus-score.el
@@ -799,7 +799,7 @@ If optional argument `SILENT' is nil, show effect of score entry."
799 799
   "Simulate the effect of a score file entry.
800 800
 HEADER is the header being scored.
801 801
 MATCH is the string we are looking for.
802  
-TYPE is a flag indicating if it is a regexp or substring.
  802
+TYPE is the score type.
803 803
 SCORE is the score to add."
804 804
   (interactive (list (completing-read "Header: "
805 805
 				      gnus-header-index
@@ -991,6 +991,7 @@ SCORE is the score to add."
991 991
 (defun gnus-score-edit-current-scores (file)
992 992
   "Edit the current score alist."
993 993
   (interactive (list gnus-current-score-file))
  994
+  (gnus-set-global-variables)
994 995
   (let ((winconf (current-window-configuration)))
995 996
     (when (buffer-name gnus-summary-buffer)
996 997
       (gnus-score-save))
1  lisp/gnus-start.el
@@ -1661,7 +1661,6 @@ newsgroup."
1661 1661
 		       (progn (insert prefix)
1662 1662
 			      (zerop (forward-line 1)))))))
1663 1663
     ;; Store the active file in a hash table.
1664  
-    ;; dmoore@ucsd.edu 31.10.1996 - use same method for moderation or not
1665 1664
     (goto-char (point-min))
1666 1665
     (let (group max min)
1667 1666
       (while (not (eobp))
99  lisp/gnus-sum.el
@@ -1052,52 +1052,43 @@ If RE-ONLY is non-nil, strip leading `Re:'s only."
1052 1052
 
1053 1053
 ;; Remove any leading "re:"s, any trailing paren phrases, and simplify
1054 1054
 ;; all whitespace.
1055  
-;; Written by Stainless Steel Rat <ratinox@ccs.neu.edu>.
  1055
+(defsubst gnus-simplify-buffer-fuzzy-step (regexp &optional newtext)
  1056
+  (goto-char (point-min))
  1057
+  (while (re-search-forward regexp nil t)
  1058
+      (replace-match (or newtext ""))))
  1059
+
1056 1060
 (defun gnus-simplify-buffer-fuzzy ()
1057  
-  (let ((case-fold-search t))
1058  
-    (goto-char (point-min))
1059  
-    (while (search-forward "\t" nil t)
1060  
-      (replace-match " " t t))
1061  
-    (goto-char (point-min))
1062  
-    (re-search-forward "^ *\\(re\\|fwd\\)[[{(^0-9]*[])}]?[:;] *" nil t)
1063  
-    (goto-char (match-beginning 0))
1064  
-    (while (or
1065  
-	    (and 
1066  
-	     gnus-simplify-subject-fuzzy-regexp
1067  
-	     (looking-at gnus-simplify-subject-fuzzy-regexp))
1068  
-	    (looking-at "^ *\\(re\\|fwd\\)[[{(^0-9]*[])}]?[:;] *")
1069  
-	    (looking-at "^[[].*: .*[]]$"))
1070  
-      (goto-char (point-min))
1071  
-      (when gnus-simplify-subject-fuzzy-regexp
1072  
-	(while (re-search-forward gnus-simplify-subject-fuzzy-regexp
1073  
-				  nil t)
1074  
-	  (replace-match "" t t)))
1075  
-      (goto-char (point-min))
1076  
-      (while (re-search-forward "^ *\\(re\\|fw\\|fwd\\)[[{(^0-9]*[])}]?[:;] *"
1077  
-				nil t)
1078  
-	(replace-match "" t t))
1079  
-      (goto-char (point-min))
1080  
-      (while (re-search-forward "^[[].*: .*[]]$" nil t)
1081  
-	(goto-char (match-end 0))
1082  
-	(delete-char -1)
1083  
-	(delete-region
1084  
-	 (progn (goto-char (match-beginning 0)))
1085  
-	 (re-search-forward ":"))))
1086  
-    (goto-char (point-min))
1087  
-    (while (re-search-forward " *[[{(][^()\n]*[]})] *$" nil t)
1088  
-      (replace-match "" t t))
1089  
-    (goto-char (point-min))
1090  
-    (while (re-search-forward "  +" nil t)
1091  
-      (replace-match " " t t))
1092  
-    (goto-char (point-min))
1093  
-    (while (re-search-forward " $" nil t)
1094  
-      (replace-match "" t t))
1095  
-    (goto-char (point-min))
1096  
-    (while (re-search-forward "^ +" nil t)
1097  
-      (replace-match "" t t))))
  1061
+  "Simplify string in the buffer fuzzily.
  1062
+The string in the accessible portion of the current buffer is simplified.
  1063
+It is assumed to be a single-line subject.
  1064
+Whitespace is generally cleaned up, and miscellaneous leading/trailing
  1065
+matter is removed.  Additional things can be deleted by setting
  1066
+gnus-simplify-subject-fuzzy-regexp."
  1067
+  (let ((case-fold-search t)
  1068
+	(modified-tick))
  1069
+    (gnus-simplify-buffer-fuzzy-step "\t" " ")
  1070
+
  1071
+    (while (not (eq modified-tick (buffer-modified-tick)))
  1072
+      (setq modified-tick (buffer-modified-tick))
  1073
+      (cond
  1074
+       ((listp gnus-simplify-subject-fuzzy-regexp)
  1075
+	(mapcar 'gnus-simplify-buffer-fuzzy-step
  1076
+		gnus-simplify-subject-fuzzy-regexp))
  1077
+       (gnus-simplify-subject-fuzzy-regexp
  1078
+	(gnus-simplify-buffer-fuzzy-step gnus-simplify-subject-fuzzy-regexp)))
  1079
+      (gnus-simplify-buffer-fuzzy-step "^ *\\[[-+?*!][-+?*!]\\] *")
  1080
+      (gnus-simplify-buffer-fuzzy-step
  1081
+       "^ *\\(re\\|fw\\|fwd\\)[[{(^0-9]*[])}]?[:;] *")
  1082
+      (gnus-simplify-buffer-fuzzy-step "^[[].*:\\( .*\\)[]]$" "\\1"))
  1083
+
  1084
+    (gnus-simplify-buffer-fuzzy-step " *[[{(][^()\n]*[]})] *$")
  1085
+    (gnus-simplify-buffer-fuzzy-step "  +" " ")
  1086
+    (gnus-simplify-buffer-fuzzy-step " $")
  1087
+    (gnus-simplify-buffer-fuzzy-step "^ +")))
1098 1088
 
1099 1089
 (defun gnus-simplify-subject-fuzzy (subject)
1100  
-  "Simplify a subject string fuzzily."
  1090
+  "Simplify a subject string fuzzily.
  1091
+See gnus-simplify-buffer-fuzzy for details."
1101 1092
   (save-excursion
1102 1093
     (gnus-set-work-buffer)
1103 1094
     (let ((case-fold-search t))
@@ -1106,7 +1097,7 @@ If RE-ONLY is non-nil, strip leading `Re:'s only."
1106 1097
       (buffer-string))))
1107 1098
 
1108 1099
 (defsubst gnus-simplify-subject-fully (subject)
1109  
-  "Simplify a subject string according to the user's wishes."
  1100
+  "Simplify a subject string according to gnus-summary-gather-subject-limit."
1110 1101
   (cond
1111 1102
    ((null gnus-summary-gather-subject-limit)
1112 1103
     (gnus-simplify-subject-re subject))
@@ -1724,6 +1715,8 @@ increase the score of each group you read."
1724 1715
        ["Cancel article" gnus-summary-cancel-article t]
1725 1716
        ["Reply" gnus-summary-reply t]
1726 1717
        ["Reply and yank" gnus-summary-reply-with-original t]
  1718
+       ["Wide reply" gnus-summary-wide-reply t]
  1719
+       ["Wide reply and yank" gnus-summary-wide-reply-with-original t]
1727 1720
        ["Mail forward" gnus-summary-mail-forward t]
1728 1721
        ["Post forward" gnus-summary-post-forward t]
1729 1722
        ["Digest and mail" gnus-uu-digest-mail-forward t]
@@ -4399,15 +4392,15 @@ list of headers that match SEQUENCE (see `nntp-retrieve-headers')."
4399 4392
       ;; article may not have been generated yet, so this may fail.
4400 4393
       ;; We work around this problem by retrieving the last few
4401 4394
       ;; headers using HEAD.
4402  
-      (when also-fetch-heads
4403  
-	(if (not sequence)
4404  
-	    (nreverse headers)
4405  
-	  (let ((gnus-nov-is-evil t)
4406  
-		(nntp-nov-is-evil t))
4407  
-	    (nconc
4408  
-	     (nreverse headers)
4409  
-	     (when (gnus-retrieve-headers sequence group)
4410  
-	       (gnus-get-newsgroup-headers)))))))))
  4395
+      (if (or (not also-fetch-heads)
  4396
+	      (not sequence))
  4397
+	  (nreverse headers)
  4398
+	(let ((gnus-nov-is-evil t)
  4399
+	      (nntp-nov-is-evil t))
  4400
+	  (nconc
  4401
+	   (nreverse headers)
  4402
+	   (when (gnus-retrieve-headers sequence group)
  4403
+	     (gnus-get-newsgroup-headers))))))))
4411 4404
 
4412 4405
 (defun gnus-article-get-xrefs ()
4413 4406
   "Fill in the Xref value in `gnus-current-headers', if necessary.
25  lisp/gnus-topic.el
@@ -836,6 +836,8 @@ articles in the topic and its subtopics."
836 836
     "\M-g" gnus-topic-get-new-news-this-topic
837 837
     "AT" gnus-topic-list-active
838 838
     "Gp" gnus-topic-edit-parameters
  839
+    "#" gnus-topic-mark-topic
  840
+    "\M-#" gnus-topic-unmark-topic
839 841
     gnus-mouse-2 gnus-mouse-pick-topic)
840 842
 
841 843
   ;; Define a new submap.
@@ -1128,16 +1130,20 @@ If COPYP, copy the groups instead."
1128 1130
 (defun gnus-topic-mark-topic (topic &optional unmark)
1129 1131
   "Mark all groups in the topic with the process mark."
1130 1132
   (interactive (list (gnus-current-topic)))
1131  
-  (save-excursion
1132  
-    (let ((groups (gnus-topic-find-groups topic 9 t)))
1133  
-      (while groups
1134  
-	(funcall (if unmark 'gnus-group-remove-mark 'gnus-group-set-mark)
1135  
-		 (gnus-info-group (nth 2 (pop groups))))))))
  1133
+  (if (not topic)
  1134
+      (call-interactively 'gnus-group-mark-group)
  1135
+    (save-excursion
  1136
+      (let ((groups (gnus-topic-find-groups topic 9 t)))
  1137
+	(while groups
  1138
+	  (funcall (if unmark 'gnus-group-remove-mark 'gnus-group-set-mark)
  1139
+		   (gnus-info-group (nth 2 (pop groups)))))))))
1136 1140
 
1137 1141
 (defun gnus-topic-unmark-topic (topic &optional unmark)
1138 1142
   "Remove the process mark from all groups in the topic."
1139 1143
   (interactive (list (gnus-current-topic)))
1140  
-  (gnus-topic-mark-topic topic t))
  1144
+  (if (not topic)
  1145
+      (call-interactively 'gnus-group-mark-group)
  1146
+    (gnus-topic-mark-topic topic t)))
1141 1147
 
1142 1148
 (defun gnus-topic-get-new-news-this-topic (&optional n)
1143 1149
   "Check for new news in the current topic."
@@ -1208,15 +1214,16 @@ If UNINDENT, remove an indentation."
1208 1214
   (if unindent
1209 1215
       (gnus-topic-unindent)
1210 1216
     (let* ((topic (gnus-current-topic))
1211  
-	   (parent (gnus-topic-previous-topic topic)))
  1217
+	   (parent (gnus-topic-previous-topic topic))
  1218
+	   (buffer-read-only nil))
1212 1219
       (unless parent
1213 1220
 	(error "Nothing to indent %s into" topic))
1214 1221
       (when topic
1215 1222
 	(gnus-topic-goto-topic topic)
1216 1223
 	(gnus-topic-kill-group)
  1224
+	(push (cdar gnus-topic-killed-topics) gnus-topic-alist)
1217 1225
 	(gnus-topic-create-topic
1218 1226
 	 topic parent nil (cdaar gnus-topic-killed-topics))
1219  
-	(push (cdar gnus-topic-killed-topics) gnus-topic-alist)
1220 1227
 	(pop gnus-topic-killed-topics)
1221 1228
 	(or (gnus-topic-goto-topic topic)
1222 1229
 	    (gnus-topic-goto-topic parent))))))
@@ -1232,10 +1239,10 @@ If UNINDENT, remove an indentation."
1232 1239
     (when topic
1233 1240
       (gnus-topic-goto-topic topic)
1234 1241
       (gnus-topic-kill-group)
  1242
+      (push (cdar gnus-topic-killed-topics) gnus-topic-alist)
1235 1243
       (gnus-topic-create-topic
1236 1244
        topic grandparent (gnus-topic-next-topic parent)
1237 1245
        (cdaar gnus-topic-killed-topics))
1238  
-      (push (cdar gnus-topic-killed-topics) gnus-topic-alist)
1239 1246
       (pop gnus-topic-killed-topics)
1240 1247
       (gnus-topic-goto-topic topic))))
1241 1248
 
22  lisp/gnus-util.el
@@ -44,18 +44,20 @@
44 44
 (defmacro gnus-eval-in-buffer-window (buffer &rest forms)
45 45
   "Pop to BUFFER, evaluate FORMS, and then return to the original window."
46 46
   (let ((tempvar (make-symbol "GnusStartBufferWindow"))
47  
-	(w (make-symbol "w"))
48  
-	(buf (make-symbol "buf")))
  47
+        (w (make-symbol "w"))
  48
+        (buf (make-symbol "buf")))
49 49
     `(let* ((,tempvar (selected-window))
50  
-	    (,buf ,buffer)
51  
-	    (,w (get-buffer-window ,buf 'visible)))
  50
+            (,buf ,buffer)
  51
+            (,w (get-buffer-window ,buf 'visible)))
52 52
        (unwind-protect
53  
-	   (progn
54  
-	     (if ,w
55  
-		 (select-window ,w)
56  
-	       (pop-to-buffer ,buf))
57  
-	     ,@forms)
58  
-	 (select-window ,tempvar)))))
  53
+           (progn
  54
+             (if ,w
  55
+                 (progn
  56
+                   (select-window ,w)
  57
+                   (set-buffer (window-buffer ,w)))
  58
+               (pop-to-buffer ,buf))
  59
+             ,@forms)
  60
+         (select-window ,tempvar)))))
59 61
 
60 62
 (put 'gnus-eval-in-buffer-window 'lisp-indent-function 1)
61 63
 (put 'gnus-eval-in-buffer-window 'edebug-form-spec '(form body))
30  lisp/gnus-uu.el
@@ -1678,20 +1678,26 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
1678 1678
     (when (setq buf (get-buffer gnus-uu-output-buffer-name))
1679 1679
       (kill-buffer buf))))
1680 1680
 
1681  
-;; Inputs an action and a file and returns a full command, putting
1682  
-;; quotes round the file name and escaping any quotes in the file name.
  1681
+(defun gnus-quote-arg-for-sh-or-csh (arg)
  1682
+  (let ((pos 0) new-pos accum)
  1683
+    ;; *** bug: we don't handle newline characters properly
  1684
+    (while (setq new-pos (string-match "[!`\"$\\& \t]" arg pos))
  1685
+      (push (substring arg pos new-pos) accum)
  1686
+      (push "\\" accum)
  1687
+      (push (list (aref arg new-pos)) accum)
  1688
+      (setq pos (1+ new-pos)))
  1689
+    (if (= pos 0)
  1690
+        arg
  1691
+      (apply 'concat (nconc (nreverse accum) (list (substring arg pos)))))))
  1692
+
  1693
+;; Inputs an action and a filename and returns a full command, making sure
  1694
+;; that the filename will be treated as a single argument when the shell
  1695
+;; executes the command.
1683 1696
 (defun gnus-uu-command (action file)
1684  
-  (let ((ofile ""))
1685  
-    (while (string-match "!\\|`\\|\"\\|\\$\\|\\\\\\|&" file)
1686  
-      (progn
1687  
-	(setq ofile
1688  
-	      (concat ofile (substring file 0 (match-beginning 0)) "\\"
1689  
-		      (substring file (match-beginning 0) (match-end 0))))
1690  
-	(setq file (substring file (1+ (match-beginning 0))))))
1691  
-    (setq ofile (concat "\"" ofile file "\""))
  1697
+  (let ((quoted-file (gnus-quote-arg-for-sh-or-csh file)))
1692 1698
     (if (string-match "%s" action)
1693  
-	(format action ofile)
1694  
-      (concat action " " ofile))))
  1699
+	(format action quoted-file)
  1700
+      (concat action " " quoted-file))))
1695 1701
 
1696 1702
 (defun gnus-uu-delete-work-dir (&optional dir)
1697 1703
   "Delete recursively all files and directories under `gnus-uu-work-dir'."
12  lisp/gnus.el
@@ -43,7 +43,7 @@
43 43
   "Score and kill file handling."
44 44
   :group 'gnus )
45 45
 
46  
-(defconst gnus-version-number "0.82"
  46
+(defconst gnus-version-number "0.83"
47 47
   "Version number for this version of Gnus.")
48 48
 
49 49
 (defconst gnus-version (format "Red Gnus v%s" gnus-version-number)
@@ -1141,12 +1141,10 @@ face."
1141 1141
 	gnus-article-hide-boring-headers
1142 1142
 	gnus-article-treat-overstrike
1143 1143
 	gnus-article-maybe-highlight
1144  
-	gnus-article-emphasize
1145 1144
 	gnus-article-display-x-face)
1146 1145
     '(gnus-article-hide-headers-if-wanted
1147 1146
       gnus-article-hide-boring-headers
1148 1147
       gnus-article-treat-overstrike
1149  
-      gnus-article-emphasize
1150 1148
       gnus-article-maybe-highlight))
1151 1149
   "Controls how the article buffer will look.
1152 1150
 
@@ -1980,7 +1978,8 @@ that that variable is buffer-local to the summary buffers."
1980 1978
     ""))
1981 1979
 
1982 1980
 (defun gnus-group-method (group)
1983  
-  "Return the server or method used for selecting GROUP."
  1981
+  "Return the server or method used for selecting GROUP.
  1982
+You should probably use `gnus-find-method-for-group' instead."
1984 1983
   (let ((prefix (gnus-group-real-prefix group)))
1985 1984
     (if (equal prefix "")
1986 1985
 	gnus-select-method
@@ -2202,7 +2201,7 @@ If NEWSGROUP is nil, return the global kill file name instead."
2202 2201
   (nth 1 (assoc method gnus-opened-servers)))
2203 2202
 
2204 2203
 (defun gnus-group-name-to-method (group)
2205  
-  "Return a select method suitable for GROUP."
  2204
+  "Guess a select method based on GROUP."
2206 2205
   (if (string-match ":" group)
2207 2206
       (let ((server (substring group 0 (match-beginning 0))))
2208 2207
 	(if (string-match "\\+" server)
@@ -2237,7 +2236,8 @@ If NEWSGROUP is nil, return the global kill file name instead."
2237 2236
 		 (gnus-server-add-address method)))))))
2238 2237
 
2239 2238
 (defun gnus-check-backend-function (func group)
2240  
-  "Check whether GROUP supports function FUNC."
  2239
+  "Check whether GROUP supports function FUNC.
  2240
+GROUP can either be a string (a group name) or a select method."
2241 2241
   (ignore-errors
2242 2242
     (let ((method (if (stringp group)
2243 2243
 		      (car (gnus-find-method-for-group group))
7  lisp/message.el
@@ -650,6 +650,7 @@ The cdr of ech entry is a function for applying the face to a region.")
650 650
 
651 651
 ;; Byte-compiler warning
652 652
 (defvar gnus-active-hashtb)
  653
+(defvar gnus-read-active-file)
653 654
 
654 655
 ;;; Regexp matching the delimiter of messages in UNIX mail format
655 656
 ;;; (UNIX From lines), minus the initial ^.  
@@ -1954,7 +1955,10 @@ to find out how to use this."
1954 1955
 	    (hashtb (and (boundp 'gnus-active-hashtb)
1955 1956
 			 gnus-active-hashtb))
1956 1957
 	    errors)
1957  
-       (if (not hashtb)
  1958
+       (if (or (not hashtb)
  1959
+	       (not (boundp 'gnus-read-active-file))
  1960
+	       (not gnus-read-active-file)
  1961
+	       (eq gnus-read-active-file 'some))
1958 1962
 	   t
1959 1963
 	 (while groups
1960 1964
 	   (when (and (not (boundp (intern (car groups) hashtb)))
@@ -2657,6 +2661,7 @@ Headers already prepared in the buffer are not modified."
2657 2661
   ;; list of buffers.
2658 2662
   (setq message-buffer-list (delq (current-buffer) message-buffer-list))
2659 2663
   (while (and message-max-buffers
  2664
+              message-buffer-list
2660 2665
 	      (>= (length message-buffer-list) message-max-buffers))
2661 2666
     ;; Kill the oldest buffer -- unless it has been changed.
2662 2667
     (let ((buffer (pop message-buffer-list)))
11  lisp/nnmail.el
@@ -438,7 +438,7 @@ parameter.  It should return nil, `warn' or `delete'."
438 438
        ;; If not, we translate dots into slashes.
439 439
        (concat dir (nnheader-replace-chars-in-string group ?. ?/) "/")))
440 440
    (or file "")))
441  
-  
  441
+
442 442
 (defun nnmail-date-to-time (date)
443 443
   "Convert DATE into time."
444 444
   (condition-case ()
@@ -450,7 +450,8 @@ parameter.  It should return nil, `warn' or `delete'."
450 450
 		       (list
451 451
 			(aref t1 2) (aref t1 1) (aref t1 0)
452 452
 			(aref d1 2) (aref d1 1) (aref d1 0)
453  
-			(aref d1 4)))))
  453
+			(number-to-string
  454
+			 (* 60 (timezone-zone-to-minute (aref d1 4))))))))
454 455
     ;; If we get an error, then we just return a 0 time.
455 456
     (error (list 0 0))))
456 457
 
@@ -546,11 +547,11 @@ parameter.  It should return nil, `warn' or `delete'."
546 547
 		     'call-process
547 548
 		     (append
548 549
 		      (list
549  
-		       (expand-file-name nnmail-movemail-program
550  
-					 exec-directory)
  550
+		       (expand-file-name 
  551
+			nnmail-movemail-program exec-directory)
551 552
 		       nil errors nil inbox tofile)
552 553
 		      (when nnmail-internal-password
553  
-			(list (prin1-to-string nnmail-internal-password)))))))
  554
+			(list nnmail-internal-password))))))
554 555
 		(if (not (buffer-modified-p errors))
555 556
 		    ;; No output => movemail won
556 557
 		    (progn
119  lisp/nnml.el
@@ -90,54 +90,54 @@ all.  This may very well take some time.")
90 90
 
91 91
 (nnoo-define-basics nnml)
92 92
 
93  
-(deffoo nnml-retrieve-headers (sequence &optional newsgroup server fetch-old)
94  
-  (save-excursion
95  
-    (set-buffer nntp-server-buffer)
96  
-    (erase-buffer)
97  
-    (let ((file nil)
98  
-	  (number (length sequence))
99  
-	  (count 0)
100  
-	  beg article)
101  
-      (if (stringp (car sequence))
102  
-	  'headers
103  
-	(nnml-possibly-change-directory newsgroup server)
104  
-	(unless nnml-article-file-alist
105  
-	  (setq nnml-article-file-alist
106  
-		(nnheader-article-to-file-alist nnml-current-directory)))
107  
-	(if (nnml-retrieve-headers-with-nov sequence fetch-old)
108  
-	    'nov
109  
-	  (while sequence
110  
-	    (setq article (car sequence))
111  
-	    (setq file 
112  
-		  (concat nnml-current-directory 
113  
-			  (or (cdr (assq article nnml-article-file-alist))
114  
-			      "")))
115  
-	    (when (and (file-exists-p file)
116  
-		       (not (file-directory-p file)))
117  
-	      (insert (format "221 %d Article retrieved.\n" article))
118  
-	      (setq beg (point))
119  
-	      (nnheader-insert-head file)
120  
-	      (goto-char beg)
121  
-	      (if (search-forward "\n\n" nil t)
122  
-		  (forward-char -1)
123  
-		(goto-char (point-max))
124  
-		(insert "\n\n"))
125  
-	      (insert ".\n")
126  
-	      (delete-region (point) (point-max)))
127  
-	    (setq sequence (cdr sequence))
128  
-	    (setq count (1+ count))
  93
+(deffoo nnml-retrieve-headers (sequence &optional group server fetch-old)
  94
+  (when (nnml-possibly-change-directory group server)
  95
+    (save-excursion
  96
+      (set-buffer nntp-server-buffer)
  97
+      (erase-buffer)
  98
+      (let ((file nil)
  99
+	    (number (length sequence))
  100
+	    (count 0)
  101
+	    beg article)
  102
+	(if (stringp (car sequence))
  103
+	    'headers
  104
+	  (unless nnml-article-file-alist
  105
+	    (setq nnml-article-file-alist
  106
+		  (nnheader-article-to-file-alist nnml-current-directory)))
  107
+	  (if (nnml-retrieve-headers-with-nov sequence fetch-old)
  108
+	      'nov
  109
+	    (while sequence
  110
+	      (setq article (car sequence))
  111
+	      (setq file 
  112
+		    (concat nnml-current-directory 
  113
+			    (or (cdr (assq article nnml-article-file-alist))
  114
+				"")))
  115
+	      (when (and (file-exists-p file)
  116
+			 (not (file-directory-p file)))
  117
+		(insert (format "221 %d Article retrieved.\n" article))
  118
+		(setq beg (point))
  119
+		(nnheader-insert-head file)
  120
+		(goto-char beg)
  121
+		(if (search-forward "\n\n" nil t)
  122
+		    (forward-char -1)
  123
+		  (goto-char (point-max))
  124
+		  (insert "\n\n"))
  125
+		(insert ".\n")
  126
+		(delete-region (point) (point-max)))
  127
+	      (setq sequence (cdr sequence))
  128
+	      (setq count (1+ count))
  129
+	      (and (numberp nnmail-large-newsgroup)
  130
+		   (> number nnmail-large-newsgroup)
  131
+		   (zerop (% count 20))
  132
+		   (nnheader-message 6 "nnml: Receiving headers... %d%%"
  133
+				     (/ (* count 100) number))))
  134
+
129 135
 	    (and (numberp nnmail-large-newsgroup)
130 136
 		 (> number nnmail-large-newsgroup)
131  
-		 (zerop (% count 20))
132  
-		 (nnheader-message 6 "nnml: Receiving headers... %d%%"
133  
-				   (/ (* count 100) number))))
  137
+		 (nnheader-message 6 "nnml: Receiving headers...done"))
134 138
 
135  
-	  (and (numberp nnmail-large-newsgroup)
136  
-	       (> number nnmail-large-newsgroup)
137  
-	       (nnheader-message 6 "nnml: Receiving headers...done"))
138  
-
139  
-	  (nnheader-fold-continuation-lines)
140  
-	  'headers)))))
  139
+	    (nnheader-fold-continuation-lines)
  140
+	    'headers))))))
141 141
 
142 142
 (deffoo nnml-open-server (server &optional defs)
143 143
   (nnoo-change-server 'nnml server defs)
@@ -161,8 +161,8 @@ all.  This may very well take some time.")
161 161
   (nnml-possibly-change-directory nil server)
162 162
   (nnml-generate-nov-databases))
163 163
 
164  
-(deffoo nnml-request-article (id &optional newsgroup server buffer)
165  
-  (nnml-possibly-change-directory newsgroup server)
  164
+(deffoo nnml-request-article (id &optional group server buffer)
  165
+  (nnml-possibly-change-directory group server)
166 166
   (let* ((nntp-server-buffer (or buffer nntp-server-buffer))
167 167
 	 path gpath group-num)
168 168
     (if (stringp id)
@@ -188,7 +188,7 @@ all.  This may very well take some time.")
188 188
      (t
189 189
       (nnheader-report 'nnml "Article %s retrieved" id)
190 190
       ;; We return the article number.
191  
-      (cons newsgroup (string-to-int (file-name-nondirectory path)))))))
  191
+      (cons group (string-to-int (file-name-nondirectory path)))))))
192 192
 
193 193
 (deffoo nnml-request-group (group &optional server dont-check)
194 194
   (cond 
@@ -250,9 +250,9 @@ all.  This may very well take some time.")
250 250
   (save-excursion
251 251
     (nnmail-find-file nnml-newsgroups-file)))
252 252
 
253  
-(deffoo nnml-request-expire-articles (articles newsgroup
  253
+(deffoo nnml-request-expire-articles (articles group
254 254
 					       &optional server force)
255  
-  (nnml-possibly-change-directory newsgroup server)
  255
+  (nnml-possibly-change-directory group server)
256 256
   (let* ((active-articles 
257 257
 	  (nnheader-directory-articles nnml-current-directory))
258 258
 	 (is-old t)
@@ -269,21 +269,21 @@ all.  This may very well take some time.")
269 269
 			nnml-article-file-alist))
270 270
 	(setq article (concat nnml-current-directory (cdr article)))
271 271
 	(when (setq mod-time (nth 5 (file-attributes article)))
272  
-	  (if (and (nnml-deletable-article-p newsgroup number)
  272
+	  (if (and (nnml-deletable-article-p group number)
273 273
 		   (setq is-old 
274  
-			 (nnmail-expired-article-p newsgroup mod-time force
  274
+			 (nnmail-expired-article-p group mod-time force
275 275
 						   nnml-inhibit-expiry)))
276 276
 	      (progn
277 277
 		(nnheader-message 5 "Deleting article %s in %s"
278  
-				  article newsgroup)
  278
+				  article group)
279 279
 		(condition-case ()
280 280
 		    (funcall nnmail-delete-file-function article)
281 281
 		  (file-error
282 282
 		   (push number rest)))
283 283
 		(setq active-articles (delq number active-articles))
284  
-		(nnml-nov-delete-article newsgroup number))
  284
+		(nnml-nov-delete-article group number))
285 285
 	    (push number rest)))))
286  
-    (let ((active (nth 1 (assoc newsgroup nnml-group-alist))))
  286
+    (let ((active (nth 1 (assoc group nnml-group-alist))))
287 287
       (when active
288 288
 	(setcar active (or (and active-articles
289 289
 				(apply 'min active-articles))
@@ -545,13 +545,14 @@ all.  This may very well take some time.")
545 545
   (when (and server
546 546
 	     (not (nnml-server-opened server)))
547 547
     (nnml-open-server server))
548  
-  (when group
  548
+  (if (not group)
  549
+      t
549 550
     (let ((pathname (nnmail-group-pathname group nnml-directory)))
550 551
       (when (not (equal pathname nnml-current-directory))
551 552
 	(setq nnml-current-directory pathname
552 553
 	      nnml-current-group group
553  
-	      nnml-article-file-alist nil))))
554  
-  t)
  554
+	      nnml-article-file-alist nil))
  555
+      (file-exists-p nnml-current-directory))))
555 556
 
556 557
 (defun nnml-possibly-create-directory (group)
557 558
   (let (dir dirs)
@@ -575,7 +576,7 @@ all.  This may very well take some time.")
575 576
     (while (looking-at "From ")
576 577
       (replace-match "X-From-Line: ")
577 578
       (forward-line 1))
578  
-    ;; We save the article in all the newsgroups it belongs in.
  579
+    ;; We save the article in all the groups it belongs in.
579 580
     (let ((ga group-art)
580 581
 	  first)
581 582
       (while ga
2  lisp/nnoo.el
@@ -265,7 +265,7 @@ All functions will return nil and report an error."
265 265
 (defun nnoo-define-skeleton-1 (backend)
266 266
   (let ((functions '(retrieve-headers
267 267
 		     request-close request-article
268  
-		     open-group request-group close-group
  268
+		     request-group close-group
269 269
 		     request-list request-post request-list-newsgroups))
270 270
 	function fun)
271 271
     (while (setq function (pop functions))
189  lisp/nnsoup.el
@@ -81,6 +81,7 @@ The SOUP packet file name will be inserted at the %s.")
81 81
 (defvoo nnsoup-buffers nil)
82 82
 (defvoo nnsoup-current-group nil)
83 83
 (defvoo nnsoup-group-alist-touched nil)
  84
+(defvoo nnsoup-article-alist nil)
84 85
 
85 86
 
86 87
 
@@ -341,9 +342,11 @@ The SOUP packet file name will be inserted at the %s.")
341 342
 ;;; Internal functions
342 343
 
343 344
 (defun nnsoup-possibly-change-group (group &optional force)
344  
-  (if group
345  
-      (setq nnsoup-current-group group)
346  
-    t))
  345
+  (when (and group
  346
+	     (not (equal nnsoup-current-group group)))
  347
+    (setq nnsoup-article-alist nil)
  348
+    (setq nnsoup-current-group group))
  349
+  t)
347 350
 
348 351
 (defun nnsoup-read-active-file ()
349 352
   (setq nnsoup-group-alist nil)
@@ -386,45 +389,51 @@ The SOUP packet file name will be inserted at the %s.")
386 389
     (incf nnsoup-current-prefix)
387 390
     prefix))
388 391
 
  392
+(defun nnsoup-file-name (dir file)
  393
+  "Return the full path of FILE (in any case) in DIR."
  394
+  (let* ((case-fold-search t)
  395
+	 (files (directory-files dir t (concat (regexp-quote file) "$"))))
  396
+    (car files)))
  397
+
389 398
 (defun nnsoup-read-areas ()
390  
-  (when (file-exists-p (concat nnsoup-tmp-directory "AREAS"))
391  
-    (save-excursion
392  
-      (set-buffer nntp-server-buffer)
393  
-      (let ((areas (gnus-soup-parse-areas 
394  
-		    (concat nnsoup-tmp-directory "AREAS")))
395  
-	    entry number area lnum cur-prefix file)
396  
-	;; Go through all areas in the new AREAS file.
397  
-	(while (setq area (pop areas))
398  
-	  ;; Change the name to the permanent name and move the files.
399  
-	  (setq cur-prefix (nnsoup-next-prefix))
400  
-	  (message "Incorporating file %s..." cur-prefix)
401  
-	  (when (file-exists-p 
402  
-		 (setq file (concat nnsoup-tmp-directory
403  
-				    (gnus-soup-area-prefix area) ".IDX")))
404  
-	    (rename-file file (nnsoup-file cur-prefix)))
405  
-	  (when (file-exists-p 
406  
-		 (setq file (concat nnsoup-tmp-directory 
407  
-				    (gnus-soup-area-prefix area) ".MSG")))
408  
-	    (rename-file file (nnsoup-file cur-prefix t))
409  
-	    (gnus-soup-set-area-prefix area cur-prefix)
410  
-	    ;; Find the number of new articles in this area.
411  
-	    (setq number (nnsoup-number-of-articles area))
412  
-	    (if (not (setq entry (assoc (gnus-soup-area-name area)
413  
-					nnsoup-group-alist)))
414  
-		;; If this is a new area (group), we just add this info to
415  
-		;; the group alist. 
416  
-		(push (list (gnus-soup-area-name area)
417  
-			    (cons 1 number)
418  
-			    (list (cons 1 number) area))
419  
-		      nnsoup-group-alist)
420  
-	      ;; There are already articles in this group, so we add this
421  
-	      ;; info to the end of the entry.
422  
-	      (nconc entry (list (list (cons (1+ (setq lnum (cdadr entry)))
423  
-					     (+ lnum number))
424  
-				       area)))
425  
-	      (setcdr (cadr entry) (+ lnum number))))))
426  
-      (nnsoup-write-active-file t)
427  
-      (delete-file (concat nnsoup-tmp-directory "AREAS")))))
  399
+  (let ((areas-file (nnsoup-file-name nnsoup-tmp-directory "areas")))
  400
+    (when areas-file
  401
+      (save-excursion
  402
+	(set-buffer nntp-server-buffer)
  403
+	(let ((areas (gnus-soup-parse-areas areas-file))
  404
+	      entry number area lnum cur-prefix file)
  405
+	  ;; Go through all areas in the new AREAS file.
  406
+	  (while (setq area (pop areas))
  407
+	    ;; Change the name to the permanent name and move the files.
  408
+	    (setq cur-prefix (nnsoup-next-prefix))
  409
+	    (message "Incorporating file %s..." cur-prefix)
  410
+	    (when (file-exists-p 
  411
+		   (setq file (concat nnsoup-tmp-directory
  412
+				      (gnus-soup-area-prefix area) ".IDX")))
  413
+	      (rename-file file (nnsoup-file cur-prefix)))
  414
+	    (when (file-exists-p 
  415
+		   (setq file (concat nnsoup-tmp-directory 
  416
+				      (gnus-soup-area-prefix area) ".MSG")))
  417
+	      (rename-file file (nnsoup-file cur-prefix t))
  418
+	      (gnus-soup-set-area-prefix area cur-prefix)
  419
+	      ;; Find the number of new articles in this area.
  420
+	      (setq number (nnsoup-number-of-articles area))
  421
+	      (if (not (setq entry (assoc (gnus-soup-area-name area)
  422
+					  nnsoup-group-alist)))
  423
+		  ;; If this is a new area (group), we just add this info to
  424
+		  ;; the group alist. 
  425
+		  (push (list (gnus-soup-area-name area)
  426
+			      (cons 1 number)
  427
+			      (list (cons 1 number) area))
  428
+			nnsoup-group-alist)
  429
+		;; There are already articles in this group, so we add this
  430
+		;; info to the end of the entry.
  431
+		(nconc entry (list (list (cons (1+ (setq lnum (cdadr entry)))
  432
+					       (+ lnum number))
  433
+					 area)))
  434
+		(setcdr (cadr entry) (+ lnum number))))))
  435
+	(nnsoup-write-active-file t)
  436
+	(delete-file areas-file)))))
428 437
 
429 438
 (defun nnsoup-number-of-articles (area)
430 439
   (save-excursion
@@ -440,13 +449,68 @@ The SOUP packet file name will be inserted at the %s.")
440 449
      ;; buffer. 
441 450
      (t
442 451
       (set-buffer (nnsoup-message-buffer (gnus-soup-area-prefix area)))
443  
-      (goto-char (point-min))
444  
-      (let ((regexp (nnsoup-header (gnus-soup-encoding-format 
445  
-				    (gnus-soup-area-encoding area))))
446  
-	    (num 0))
447  
-	(while (re-search-forward regexp nil t)
448  
-	  (setq num (1+ num)))
449  
-	num)))))
  452
+      (unless (assoc (gnus-soup-area-prefix area) nnsoup-article-alist)
  453
+	(nnsoup-dissect-buffer area))
  454
+      (length (cdr (assoc (gnus-soup-area-prefix area) 
  455
+			  nnsoup-article-alist)))))))
  456
+
  457
+(defun nnsoup-dissect-buffer (area)
  458
+  (let ((mbox-delim (concat "^" message-unix-mail-delimiter))
  459
+	(format (gnus-soup-encoding-format (gnus-soup-area-encoding area)))
  460
+	(i 0)
  461
+	alist len)
  462
+    (goto-char (point-min))
  463
+    (cond 
  464
+     ;; rnews batch format
  465
+     ((= format ?n)
  466
+      (while (looking-at "^#! *rnews \\(+[0-9]+\\) *$")
  467
+	(forward-line 1)
  468
+	(push (list
  469
+	       (incf i) (point)
  470
+	       (progn
  471
+		 (forward-char (string-to-number (match-string 1)))
  472
+		 (point)))
  473
+	      alist)))
  474
+     ;; Unix mbox format
  475
+     ((= format ?m)
  476
+      (while (looking-at mbox-delim)
  477
+	(forward-line 1)
  478
+	(push (list 
  479
+	       (incf i) (point)
  480
+	       (progn
  481
+		 (if (re-search-forward mbox-delim nil t)
  482
+		     (beginning-of-line)
  483
+		   (goto-char (point-max)))
  484
+		 (point)))
  485
+	      alist)))
  486
+     ;; MMDF format
  487
+     ((= format ?M)
  488
+      (while (looking-at "\^A\^A\^A\^A\n")
  489
+	(forward-line 1)
  490
+	(push (list 
  491
+	       (incf i) (point)
  492
+	       (progn
  493
+		 (if (search-forward "\n\^A\^A\^A\^A\n" nil t)
  494
+		     (beginning-of-line)
  495
+		   (goto-char (point-max)))
  496
+		 (point)))
  497
+	      alist)))
  498
+     ;; Binary format
  499
+     ((or (= format ?B) (= format ?b))
  500
+      (while (not (eobp))
  501
+	(setq len (+ (* (char-after (point)) (expt 2.0 24))
  502
+		     (* (char-after (+ (point) 1)) (expt 2 16))
  503
+		     (* (char-after (+ (point) 2)) (expt 2 8))
  504
+		     (char-after (+ (point) 3))))
  505
+	(push (list
  506
+	       (incf i) (+ (point) 4)
  507
+	       (progn
  508
+		 (forward-char (floor (+ len 4)))
  509
+		 (point)))
  510
+	      alist)))
  511
+     (t
  512
+      (error "Unknown format: %c" format)))
  513
+    (push (cons (gnus-soup-area-prefix area) alist) nnsoup-article-alist)))
450 514
 
451 515
 (defun nnsoup-index-buffer (prefix &optional message)
452 516
   (let* ((file (concat prefix (if message ".MSG" ".IDX")))
@@ -520,16 +584,14 @@ The SOUP packet file name will be inserted at the %s.")
520 584
 	 (t
521 585
 	  (set-buffer msg-buf)
522 586
 	  (widen)
523  
-	  (goto-char (point-min))
524  
-	  (let ((header (nnsoup-header 
525  
-			 (gnus-soup-encoding-format 
526  
-			  (gnus-soup-area-encoding (nth 1 area))))))
527  
-	    (re-search-forward header nil t (- article (caar area)))
528  
-	    (narrow-to-region
529  
-	     (match-beginning 0)
530  
-	     (if (re-search-forward header nil t)
531  
-		 (match-beginning 0)
532  
-	       (point-max))))))
  587
+	  (unless (assoc (gnus-soup-area-prefix (nth 1 area))
  588
+			 nnsoup-article-alist)
  589
+	    (nnsoup-dissect-buffer (nth 1 area)))
  590
+	  (let ((entry (assq article (cdr (assoc (gnus-soup-area-prefix
  591
+						  (nth 1 area))
  592
+						 nnsoup-article-alist)))))
  593
+	    (when entry
  594
+	      (narrow-to-region (cadr entry) (caddr entry))))))
533 595
 	(goto-char (point-min))
534 596
 	(if (not head)
535 597
 	    ()
@@ -540,17 +602,6 @@ The SOUP packet file name will be inserted at the %s.")
540 602
 	     (point-max))))
541 603
 	msg-buf))))
542 604
 
543  
-(defun nnsoup-header (format)
544  
-  (cond 
545  
-   ((= format ?n)
546  
-    "^#! *rnews +[0-9]+ *$")
547  
-   ((= format ?m)
548  
-    (concat "^" message-unix-mail-delimiter))
549  
-   ((= format ?M)
550  
-    "^\^A\^A\^A\^A\n")
551  
-   (t
552  
-    (error "Unknown format: %c" format))))
553  
-
554 605
 ;;;###autoload
555 606
 (defun nnsoup-pack-replies ()
556 607
   "Make an outbound package of SOUP replies."
7  lisp/nntp.el
@@ -146,6 +146,8 @@ server there that you can connect to.  See also `nntp-open-connection-function'"
146 146
 
147 147
 ;;; Internal variables.
148 148
 
  149
+(defvar nntp-have-messaged nil)
  150
+
149 151
 (defvar nntp-process-wait-for nil)
150 152
 (defvar nntp-process-to-buffer nil)
151 153
 (defvar nntp-process-callback nil)
@@ -798,7 +800,9 @@ It will prompt for a password."
798 800
 	      (goto-char (point-max))
799 801
 	      (insert-buffer-substring (process-buffer process))
800 802
 	      ;; Nix out "nntp reading...." message.
801  
-	      (message "")
  803
+	      (when nntp-have-messaged
  804
+		(setq nntp-have-messaged nil)
  805
+		(message ""))
802 806
 	      t)))
803 807
       (unless discard
804 808
 	(erase-buffer)))))
@@ -818,6 +822,7 @@ It will prompt for a password."
818 822
 		    nntp-server-buffer))
819 823
     (let ((len (/ (point-max) 1024)))
820 824
       (unless (< len 10)
  825
+	(setq nntp-have-messaged t)
821 826
 	(message "nntp read: %dk" len)))
822 827
     (accept-process-output process 1)))
823 828
 
9  texi/ChangeLog
... ...
@@ -1,3 +1,12 @@
  1
+Fri Jan 24 05:07:28 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  2
+
  3
+	* gnus.texi (Summary Mail Commands): Addition.
  4
+	(Required Backend Functions): Deletia.
  5
+
  6
+Mon Jan 20 22:19:40 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  7
+
  8
+	* gnus.texi (Followups To Yourself): Fix.
  9
+
1 10
 Fri Jan 17 00:55:51 1997  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
2 11
 
3 12
 	* gnus.texi (NoCeM): Update.
38  texi/gnus.texi
... ...
@@ -1,7 +1,7 @@
1 1
 \input texinfo                  @c -*-texinfo-*-
2 2
 
3 3
 @setfilename gnus
4  
-@settitle Red Gnus 0.82 Manual
  4
+@settitle Red Gnus 0.83 Manual
5 5
 @synindex fn cp
6 6
 @synindex vr cp
7 7
 @synindex pg cp
@@ -287,7 +287,7 @@ into another language, under the above conditions for modified versions.
287 287
 @tex
288 288
 
289 289
 @titlepage
290  
-@title Red Gnus 0.82 Manual
  290
+@title Red Gnus 0.83 Manual
291 291
 
292 292
 @author by Lars Magne Ingebrigtsen
293 293
 @page
@@ -323,7 +323,7 @@ can be gotten by any nefarious means you can think of---@sc{nntp}, local
323 323
 spool or your mbox file.  All at the same time, if you want to push your
324 324
 luck.
325 325
 
326  
-This manual corresponds to Red Gnus 0.82
  326
+This manual corresponds to Red Gnus 0.83
327 327
 
328 328
 @end ifinfo
329 329
 
@@ -3556,6 +3556,19 @@ Mail a reply to the author of the current article and include the