changeset 79022:65ad63ddd4f6

Merge from gnus--rel--5.10 Revision: emacs@sv.gnu.org/emacs--rel--22--patch-115
author Miles Bader <miles@gnu.org>
date Tue, 09 Oct 2007 08:55:58 +0000
parents e85dfffee7c6
children a1576b4ab168 5039706521c9
files etc/gnus-logo.eps lisp/gnus/ChangeLog lisp/gnus/gnus-agent.el lisp/gnus/gnus-cus.el lisp/gnus/gnus-sum.el lisp/gnus/gnus.el lisp/gnus/mm-util.el lisp/gnus/nnmbox.el man/gnus.texi
diffstat 9 files changed, 298 insertions(+), 101 deletions(-) [+]
line wrap: on
line diff
--- a/etc/gnus-logo.eps	Tue Oct 09 08:39:33 2007 +0000
+++ b/etc/gnus-logo.eps	Tue Oct 09 08:55:58 2007 +0000
@@ -1,4 +1,26 @@
 %!PS-Adobe-2.0 EPSF-2.0
+% Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+%   Free Software Foundation, Inc.
+%
+% Author: Luis Fernandes <elf@ee.ryerson.ca>
+%
+% This file is part of GNU Emacs.
+%
+% GNU Emacs is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 3, or (at your option)
+% any later version.
+%
+% GNU Emacs is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with GNU Emacs; see the file COPYING.  If not, write to the
+% Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+% Boston, MA 02110-1301, USA.
+%
 %%Title: gnuslogo1.ps
 %%Creator: XV Version 3.00  Rev: 3/30/93  -  by John Bradley
 %%BoundingBox: 0 0 493 505
--- a/lisp/gnus/ChangeLog	Tue Oct 09 08:39:33 2007 +0000
+++ b/lisp/gnus/ChangeLog	Tue Oct 09 08:55:58 2007 +0000
@@ -1,3 +1,48 @@
+2007-10-08  Reiner Steib  <Reiner.Steib@gmx.de>
+
+	* mm-util.el (mm-charset-synonym-alist): Alias gbk to cp936.
+
+2007-10-04  Reiner Steib  <Reiner.Steib@gmx.de>
+
+        * Relicense "GPLv2 or later" files to "GPLv3 or later".
+
+2007-09-13  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* gnus-sum.el (gnus-newsgroup-maximum-articles): Move from gnus.el.
+	Suggested by Leo <sdl.web@gmail.com>.
+
+	* gnus.el: Do.
+
+2007-09-13  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* gnus.el (gnus-newsgroup-maximum-articles): Rename from
+	gnus-maximum-newsgroup.  Suggested by Leo <sdl.web@gmail.com>.
+
+	* gnus-agent.el (gnus-agent-fetch-headers): Do.
+
+	* gnus-sum.el (gnus-articles-to-read, gnus-list-of-unread-articles)
+	(gnus-list-of-read-articles, gnus-sequence-of-unread-articles): Do.
+
+2007-09-13  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* nnmbox.el (nnmbox-request-article): Don't assume delim regexp matches
+	newline.
+	(nnmbox-request-accept-article): Don't change article in source buffer;
+	narrow to header to use message-fetch-field rather than
+	nnmail-fetch-field; use with-current-buffer instead of save-excursion.
+	(nnmbox-request-replace-article): Quote lines that'll be misidentified
+	as delimiters; make sure article ends with newline.
+	(nnmbox-delete-mail): Correct last position of article to be deleted;
+	ignore X-Gnus-Newsgroup header in article body.
+	(nnmbox-save-mail): Quote lines looking like delimiters at the right
+	positions; make sure article ends with newline.
+
+2007-09-05  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+	* gnus-cus.el (gnus-score-extra): New widget.
+	(gnus-score-extra-convert): New function.
+	(gnus-score-customize): Use it for Extra.
+
 2007-08-23  Katsumi Yamaoka  <yamaoka@jpl.org>
 
 	* mml.el (mml-generate-mime): Make sure it uses multibyte temp buffer.
--- a/lisp/gnus/gnus-agent.el	Tue Oct 09 08:39:33 2007 +0000
+++ b/lisp/gnus/gnus-agent.el	Tue Oct 09 08:55:58 2007 +0000
@@ -1765,12 +1765,13 @@
                                (gnus-agent-find-parameter group
                                                           'agent-predicate)))))
          (articles (if fetch-all
-		       (if gnus-maximum-newsgroup
+		       (if gnus-newsgroup-maximum-articles
 			   (let ((active (gnus-active group)))
 			     (gnus-uncompress-range
 			      (cons (max (car active)
 					 (- (cdr active)
-					    gnus-maximum-newsgroup -1))
+					    gnus-newsgroup-maximum-articles
+					    -1))
 				    (cdr active))))
 			 (gnus-uncompress-range (gnus-active group)))
                      (gnus-list-of-unread-articles group)))
--- a/lisp/gnus/gnus-cus.el	Tue Oct 09 08:39:33 2007 +0000
+++ b/lisp/gnus/gnus-cus.el	Tue Oct 09 08:55:58 2007 +0000
@@ -766,6 +766,67 @@
 				       ,group))))
   widget)
 
+(define-widget 'gnus-score-extra 'group
+  "Edit score entries for extra headers."
+  :convert-widget 'gnus-score-extra-convert)
+
+(defun gnus-score-extra-convert (widget)
+  ;; Set args appropriately.
+  (let* ((tag (widget-get widget :tag))
+	 (item `(const :format "" :value ,(downcase tag)))
+	 (match '(string :tag "Match"))
+	 (score '(choice :tag "Score"
+			 (const :tag "default" nil)
+			 (integer :format "%v"
+				  :hide-front-space t)))
+	 (expire '(choice :tag "Expire"
+			  (const :tag "off" nil)
+			  (integer :format "%v"
+				   :hide-front-space t)))
+	 (type '(choice :tag "Type"
+			:value s
+			;; I should really create a forgiving :match
+			;; function for each type below, that only
+			;; looked at the first letter.
+			(const :tag "Regexp" r)
+			(const :tag "Regexp (fixed case)" R)
+			(const :tag "Substring" s)
+			(const :tag "Substring (fixed case)" S)
+			(const :tag "Exact" e)
+			(const :tag "Exact (fixed case)" E)
+			(const :tag "Word" w)
+			(const :tag "Word (fixed case)" W)
+			(const :tag "default" nil)))
+	 (header (if gnus-extra-headers
+		     (let (name)
+		       `(choice :tag "Header"
+				,@(mapcar (lambda (h)
+					    (setq name (symbol-name h))
+					    (list 'const :tag name name))
+					  gnus-extra-headers)
+				(string :tag "Other" :format "%v")))
+		   '(string :tag "Header")))
+	 (group `(group ,match ,score ,expire ,type ,header))
+	 (doc (concat (or (widget-get widget :doc)
+			  (concat "Change score based on the " tag
+				  " header.\n")))))
+    (widget-put
+     widget :args
+     `(,item
+       (repeat :inline t
+	       :indent 0
+	       :tag ,tag
+	       :doc ,doc
+	       :format "%t:\n%h%v%i\n\n"
+	       (choice :format "%v"
+		       :value ("" nil nil s
+			       ,(if gnus-extra-headers
+				    (symbol-name (car gnus-extra-headers))
+				  ""))
+		       ,group
+		       sexp)))))
+  widget)
+
 (defvar gnus-custom-scores)
 (defvar gnus-custom-score-alist)
 
@@ -822,7 +883,7 @@
 				     (gnus-score-string :tag "Subject")
 				     (gnus-score-string :tag "References")
 				     (gnus-score-string :tag "Xref")
-				     (gnus-score-string :tag "Extra")
+				     (gnus-score-extra :tag "Extra")
 				     (gnus-score-string :tag "Message-ID")
 				     (gnus-score-integer :tag "Lines")
 				     (gnus-score-integer :tag "Chars")
--- a/lisp/gnus/gnus-sum.el	Tue Oct 09 08:39:33 2007 +0000
+++ b/lisp/gnus/gnus-sum.el	Tue Oct 09 08:55:58 2007 +0000
@@ -1029,6 +1029,17 @@
   :type '(repeat symbol)
   :group 'gnus-charset)
 
+(defcustom gnus-newsgroup-maximum-articles nil
+  "The maximum number of articles a newsgroup.
+If this is a number, old articles in a newsgroup exceeding this number
+are silently ignored.  If it is nil, no article is ignored.  Note that
+setting this variable to a number might prevent you from reading very
+old articles."
+  :group 'gnus-group-select
+  :version "22.2"
+  :type '(choice (const :tag "No limit" nil)
+		 integer))
+
 (gnus-define-group-parameter
  ignored-charsets
  :type list
@@ -5472,11 +5483,13 @@
 	      ;; articles in the group, or (if that's nil), the
 	      ;; articles in the cache.
 	      (or
-	       (if gnus-maximum-newsgroup
+	       (if gnus-newsgroup-maximum-articles
 		   (let ((active (gnus-active group)))
 		     (gnus-uncompress-range
 		      (cons (max (car active)
-				 (- (cdr active) gnus-maximum-newsgroup -1))
+				 (- (cdr active)
+				    gnus-newsgroup-maximum-articles
+				    -1))
 			    (cdr active))))
 		 (gnus-uncompress-range (gnus-active group)))
 	       (gnus-cache-articles-in-group group))
@@ -6540,8 +6553,9 @@
   (let* ((read (gnus-info-read (gnus-get-info group)))
 	 (active (or (gnus-active group) (gnus-activate-group group)))
 	 (last (cdr active))
-	 (bottom (if gnus-maximum-newsgroup
-		     (max (car active) (- last gnus-maximum-newsgroup -1))
+	 (bottom (if gnus-newsgroup-maximum-articles
+		     (max (car active)
+			  (- last gnus-newsgroup-maximum-articles -1))
 		   (car active)))
 	 first nlast unread)
     ;; If none are read, then all are unread.
@@ -6585,9 +6599,11 @@
 	  (gnus-list-range-difference
 	   (gnus-sorted-complement
 	    (gnus-uncompress-range
-	     (if gnus-maximum-newsgroup
+	     (if gnus-newsgroup-maximum-articles
 		 (cons (max (car active)
-			    (- (cdr active) gnus-maximum-newsgroup -1))
+			    (- (cdr active)
+			       gnus-newsgroup-maximum-articles
+			       -1))
 		       (cdr active))
 	       active))
 	    (gnus-list-of-unread-articles group))
@@ -6601,8 +6617,9 @@
   (let* ((read (gnus-info-read (gnus-get-info group)))
 	 (active (or (gnus-active group) (gnus-activate-group group)))
 	 (last (cdr active))
-	 (bottom (if gnus-maximum-newsgroup
-		     (max (car active) (- last gnus-maximum-newsgroup -1))
+	 (bottom (if gnus-newsgroup-maximum-articles
+		     (max (car active)
+			  (- last gnus-newsgroup-maximum-articles -1))
 		   (car active)))
 	 first nlast unread)
     ;; If none are read, then all are unread.
--- a/lisp/gnus/gnus.el	Tue Oct 09 08:39:33 2007 +0000
+++ b/lisp/gnus/gnus.el	Tue Oct 09 08:55:58 2007 +0000
@@ -1501,17 +1501,6 @@
   :type '(choice (const :tag "No limit" nil)
 		 integer))
 
-(defcustom gnus-maximum-newsgroup nil
-  "The maximum number of articles a newsgroup.
-If this is a number, old articles in a newsgroup exceeding this number
-are silently ignored.  If it is nil, no article is ignored.  Note that
-setting this variable to a number might prevent you from reading very
-old articles."
-  :group 'gnus-group-select
-  :version "22.2"
-  :type '(choice (const :tag "No limit" nil)
-		 integer))
-
 (defcustom gnus-use-long-file-name (not (memq system-type '(usg-unix-v xenix)))
   "*Non-nil means that the default name of a file to save articles in is the group name.
 If it's nil, the directory form of the group name is used instead.
--- a/lisp/gnus/mm-util.el	Tue Oct 09 08:39:33 2007 +0000
+++ b/lisp/gnus/mm-util.el	Tue Oct 09 08:55:58 2007 +0000
@@ -256,6 +256,12 @@
     ,@(when (and (not (mm-coding-system-p 'windows-31j))
 		 (mm-coding-system-p 'cp932))
 	'((windows-31j . cp932)))
+    ;; Charset name: GBK, Charset aliases: CP936, MS936, windows-936
+    ;; http://www.iana.org/assignments/charset-reg/GBK
+    ;; Emacs 22.1 has cp936, but not gbk, so we alias it:
+    ,@(when (and (not (mm-coding-system-p 'gbk))
+		 (mm-coding-system-p 'cp936))
+	'((gbk . cp936)))
     )
   "A mapping from unknown or invalid charset names to the real charset names.
 
--- a/lisp/gnus/nnmbox.el	Tue Oct 09 08:39:33 2007 +0000
+++ b/lisp/gnus/nnmbox.el	Tue Oct 09 08:55:58 2007 +0000
@@ -153,11 +153,11 @@
 	(re-search-backward (concat "^" message-unix-mail-delimiter) nil t)
 	(setq start (point))
 	(forward-line 1)
-	(or (and (re-search-forward
-		  (concat "^" message-unix-mail-delimiter) nil t)
-		 (forward-line -1))
-	    (goto-char (point-max)))
-	(setq stop (point))
+	(setq stop (if (re-search-forward (concat "^"
+						  message-unix-mail-delimiter)
+					  nil 'move)
+		       (match-beginning 0)
+		     (point)))
 	(let ((nntp-server-buffer (or buffer nntp-server-buffer)))
 	  (set-buffer nntp-server-buffer)
 	  (erase-buffer)
@@ -313,39 +313,45 @@
   (nnmbox-possibly-change-newsgroup group server)
   (nnmail-check-syntax)
   (let ((buf (current-buffer))
-	result)
-    (goto-char (point-min))
-    ;; The From line may have been quoted by movemail.
-    (when (looking-at (concat ">" message-unix-mail-delimiter))
-      (delete-char 1))
-    (if (looking-at "X-From-Line: ")
-	(replace-match "From ")
-      (insert "From nobody " (current-time-string) "\n"))
+	result cont)
     (and
      (nnmail-activate 'nnmbox)
-     (progn
-       (set-buffer buf)
+     (with-temp-buffer
+       (insert-buffer-substring buf)
        (goto-char (point-min))
-       (search-forward "\n\n" nil t)
-       (forward-line -1)
+       (cond (;; The From line may have been quoted by movemail.
+	      (looking-at (concat ">" message-unix-mail-delimiter))
+	      (delete-char 1)
+	      (forward-line 1))
+	     ((looking-at "X-From-Line: ")
+	      (replace-match "From ")
+	      (forward-line 1))
+	     (t
+	      (insert "From nobody " (current-time-string) "\n")))
+       (narrow-to-region (point)
+			 (if (search-forward "\n\n" nil 'move)
+			     (1- (point))
+			   (point)))
        (while (re-search-backward "^X-Gnus-Newsgroup: " nil t)
 	 (delete-region (point) (progn (forward-line 1) (point))))
        (when nnmail-cache-accepted-message-ids
-	 (nnmail-cache-insert (nnmail-fetch-field "message-id") 
+	 (nnmail-cache-insert (message-fetch-field "message-id")
 			      group
-			      (nnmail-fetch-field "subject")
-			      (nnmail-fetch-field "from")))
+			      (message-fetch-field "subject")
+			      (message-fetch-field "from")))
+       (widen)
        (setq result (if (stringp group)
 			(list (cons group (nnmbox-active-number group)))
 		      (nnmail-article-group 'nnmbox-active-number)))
-       (if (and (null result)
-		(yes-or-no-p "Moved to `junk' group; delete article? "))
-	   (setq result 'junk)
-	 (setq result (car (nnmbox-save-mail result)))))
-     (save-excursion
-       (set-buffer nnmbox-mbox-buffer)
+       (prog1
+	   (if (and (null result)
+		    (yes-or-no-p "Moved to `junk' group; delete article? "))
+	       (setq result 'junk)
+	     (setq result (car (nnmbox-save-mail result))))
+	 (setq cont (buffer-string))))
+     (with-current-buffer nnmbox-mbox-buffer
        (goto-char (point-max))
-       (insert-buffer-substring buf)
+       (insert cont)
        (when last
 	 (when nnmail-cache-accepted-message-ids
 	   (nnmail-cache-close))
@@ -360,7 +366,20 @@
     (if (not (nnmbox-find-article article))
 	nil
       (nnmbox-delete-mail t t)
-      (insert-buffer-substring buffer)
+      (insert
+       (with-temp-buffer
+	 (insert-buffer-substring buffer)
+	 (goto-char (point-min))
+	 (when (looking-at "X-From-Line:")
+	   (delete-region (point) (progn (forward-line 1) (point))))
+	 (while (re-search-forward (concat "^" message-unix-mail-delimiter)
+				   nil t)
+	   (goto-char (match-beginning 0))
+	   (insert ">"))
+	 (goto-char (point-max))
+	 (unless (bolp)
+	   (insert "\n"))
+	 (buffer-string)))
       (nnmbox-save-buffer)
       t)))
 
@@ -430,21 +449,20 @@
   (save-excursion
     (save-restriction
       (narrow-to-region
-       (save-excursion
-	 (re-search-backward (concat "^" message-unix-mail-delimiter) nil t)
-	 (if leave-delim (progn (forward-line 1) (point))
-	   (match-beginning 0)))
-       (progn
-	 (forward-line 1)
-	 (or (and (re-search-forward (concat "^" message-unix-mail-delimiter)
-				     nil t)
-		  (if (and (not (bobp)) leave-delim)
-		      (progn (forward-line -2) (point))
-		    (match-beginning 0)))
-	     (point-max))))
+       (prog2
+	   (re-search-backward (concat "^" message-unix-mail-delimiter) nil t)
+	   (if leave-delim (progn (forward-line 1) (point))
+	     (match-beginning 0))
+	 (forward-line 1))
+       (or (and (re-search-forward (concat "^" message-unix-mail-delimiter)
+				   nil t)
+		(match-beginning 0))
+	   (point-max)))
       (goto-char (point-min))
       ;; Only delete the article if no other group owns it as well.
-      (when (or force (not (re-search-forward "^X-Gnus-Newsgroup: " nil t)))
+      (when (or force
+		(not (re-search-forward "^X-Gnus-Newsgroup: " nil t))
+		(search-backward "\n\n" nil t))
 	(delete-region (point-min) (point-max))))))
 
 (defun nnmbox-possibly-change-newsgroup (newsgroup &optional server)
@@ -552,24 +570,26 @@
   (let ((delim (concat "^" message-unix-mail-delimiter)))
     (goto-char (point-min))
     ;; This might come from somewhere else.
-    (unless (looking-at delim)
-      (insert "From nobody " (current-time-string) "\n")
-      (goto-char (point-min)))
+    (if (looking-at delim)
+	(forward-line 1)
+      (insert "From nobody " (current-time-string) "\n"))
     ;; Quote all "From " lines in the article.
-    (forward-line 1)
     (while (re-search-forward delim nil t)
-      (beginning-of-line)
-      (insert "> "))
-    (nnmail-insert-lines)
-    (nnmail-insert-xref group-art)
-    (nnmbox-insert-newsgroup-line group-art)
-    (let ((alist group-art))
-      (while alist
-	(nnmbox-record-active-article (car alist))
-	(setq alist (cdr alist))))
-    (run-hooks 'nnmail-prepare-save-mail-hook)
-    (run-hooks 'nnmbox-prepare-save-mail-hook)
-    group-art))
+      (goto-char (match-beginning 0))
+      (insert ">")))
+  (goto-char (point-max))
+  (unless (bolp)
+    (insert "\n"))
+  (nnmail-insert-lines)
+  (nnmail-insert-xref group-art)
+  (nnmbox-insert-newsgroup-line group-art)
+  (let ((alist group-art))
+    (while alist
+      (nnmbox-record-active-article (car alist))
+      (setq alist (cdr alist))))
+  (run-hooks 'nnmail-prepare-save-mail-hook)
+  (run-hooks 'nnmbox-prepare-save-mail-hook)
+  group-art)
 
 (defun nnmbox-insert-newsgroup-line (group-art)
   (save-excursion
--- a/man/gnus.texi	Tue Oct 09 08:39:33 2007 +0000
+++ b/man/gnus.texi	Tue Oct 09 08:55:58 2007 +0000
@@ -2153,7 +2153,7 @@
 @code{gnus-large-newsgroup}, but is only used for ephemeral
 newsgroups.
 
-@vindex gnus-maximum-newsgroup
+@vindex gnus-newsgroup-maximum-articles
 In groups in some news servers, there might be a big gap between a few
 very old articles that will never be expired and the recent ones.  In
 such a case, the server will return the data like @code{(1 . 30000000)}
@@ -2162,14 +2162,14 @@
 know it at first and prepares for getting 30000000 articles.  However,
 it will consume hundreds megabytes of memories and might make Emacs get
 stuck as the case may be.  If you use such news servers, set the
-variable @code{gnus-maximum-newsgroup} to a positive number.  The value
-means that Gnus ignores articles other than this number of the latest
-ones in every group.  For instance, the value 10000 makes Gnus get only
-the articles 29990001-30000000 (if the latest article number is 30000000
-in a group).  Note that setting this variable to a number might prevent
-you from reading very old articles.  The default value of the variable
-@code{gnus-maximum-newsgroup} is @code{nil}, which means Gnus never
-ignores old articles.
+variable @code{gnus-newsgroup-maximum-articles} to a positive number.
+The value means that Gnus ignores articles other than this number of the
+latest ones in every group.  For instance, the value 10000 makes Gnus
+get only the articles 29990001-30000000 (if the latest article number is
+30000000 in a group).  Note that setting this variable to a number might
+prevent you from reading very old articles.  The default value of the
+variable @code{gnus-newsgroup-maximum-articles} is @code{nil}, which
+means Gnus never ignores old articles.
 
 @vindex gnus-select-group-hook
 @vindex gnus-auto-select-first
@@ -10676,10 +10676,9 @@
 your news admin until she includes the @code{Xref} header in the
 overview files.
 
-@vindex gnus-nov-is-evil
 If you want Gnus to get the @code{Xref}s right all the time, you have to
-set @code{gnus-nov-is-evil} to @code{t}, which slows things down
-considerably.
+set @code{nntp-nov-is-evil} to @code{t}, which slows things down
+considerably.  Also @pxref{Slow/Expensive Connection}.
 
 C'est la vie.
 
@@ -22768,7 +22767,7 @@
 @c @anchor{X-Face}
 
 Viewing an @code{X-Face} header either requires an Emacs that has
-@samp{compface} support (which most XEmacs versions has), or that you
+@samp{compface} support (which most XEmacs versions have), or that you
 have suitable conversion or display programs installed.  If your Emacs
 has image support the default action is to display the face before the
 @code{From} header.  If there's no native @code{X-Face} support, Gnus
@@ -27398,8 +27397,8 @@
 implementing something, I write the manual entry for that something
 straight away.  I then see that it's difficult to explain the
 functionality, so I write how it's supposed to be, and then I change the
-implementation.  Writing the documentation and writing the code goes
-hand in hand.
+implementation.  Writing the documentation and writing the code go hand
+in hand.
 
 This, of course, means that this manual has no, or little, flow.  It
 documents absolutely everything in Gnus, but often not where you're
@@ -27407,7 +27406,7 @@
 started with Gnus.
 
 That would be a totally different book, that should be written using the
-reference manual as source material.  It would look quite differently.
+reference manual as source material.  It would look quite different.
 
 
 @page
@@ -27519,11 +27518,32 @@
 
 @item @acronym{NOV}
 @cindex @acronym{NOV}
+@acronym{NOV} stands for News OverView, which is a type of news server
+header which provide datas containing the condensed header information
+of articles.  They are produced by the server itself; in the @code{nntp}
+back end Gnus uses the ones that the @acronym{NNTP} server makes, but
+Gnus makes them by itself for some backends (in particular, @code{nnml}).
+
 When Gnus enters a group, it asks the back end for the headers of all
 unread articles in the group.  Most servers support the News OverView
 format, which is more compact and much faster to read and parse than the
 normal @sc{head} format.
 
+The @acronym{NOV} data consist of one or more text lines (@pxref{Text
+Lines, ,Motion by Text Lines, elisp, The Emacs Lisp Reference Manual})
+where each line has the header information of one article.  The header
+information is a tab-separated series of the header's contents including
+an article number, a subject, an author, a date, a message-id,
+references, etc.
+
+Those data enable Gnus to generate summary lines quickly.  However, if
+the server does not support @acronym{NOV} or you disable it purposely or
+for some reason, Gnus will try to generate the header information by
+parsing each article's headers one by one.  It will take time.
+Therefore, it is not usually a good idea to set nn*-nov-is-evil
+(@pxref{Slow/Expensive Connection}) to a non-@code{nil} value unless you
+know that the server makes wrong @acronym{NOV} data.
+
 @item level
 @cindex levels
 Each group is subscribed at some @dfn{level} or other (1-9).  The ones
@@ -27656,11 +27676,11 @@
 
 
 @node Slow/Expensive Connection
-@subsection Slow/Expensive NNTP Connection
+@subsection Slow/Expensive Connection
 
 If you run Emacs on a machine locally, and get your news from a machine
 over some very thin strings, you want to cut down on the amount of data
-Gnus has to get from the @acronym{NNTP} server.
+Gnus has to get from the server.
 
 @table @code
 
@@ -27672,9 +27692,25 @@
 doesn't suddenly decide to fetch the active file anyway.
 
 @item gnus-nov-is-evil
-This one has to be @code{nil}.  If not, grabbing article headers from
-the @acronym{NNTP} server will not be very fast.  Not all @acronym{NNTP} servers
-support @sc{xover}; Gnus will detect this by itself.
+@vindex gnus-nov-is-evil
+Usually this one must @emph{always} be @code{nil} (which is the
+default).  If, for example, you wish to not use @acronym{NOV}
+(@pxref{Terminology}) with the @code{nntp} back end (@pxref{Crosspost
+Handling}), set @code{nntp-nov-is-evil} to a non-@code{nil} value
+instead of setting this.  But you normally do not need to set
+@code{nntp-nov-is-evil} since Gnus by itself will detect whether the
+@acronym{NNTP} server supports @acronym{NOV}.  Anyway, grabbing article
+headers from the @acronym{NNTP} server will not be very fast if you tell
+Gnus not to use @acronym{NOV}.
+
+As the variables for the other back ends, there are
+@code{nndiary-nov-is-evil}, @code{nndir-nov-is-evil},
+@code{nnfolder-nov-is-evil}, @code{nnimap-nov-is-evil},
+@code{nnml-nov-is-evil}, @code{nnspool-nov-is-evil}, and
+@code{nnwarchive-nov-is-evil}.  Note that a non-@code{nil} value for
+@code{gnus-nov-is-evil} overrides all those variables.@footnote{Although
+the back ends @code{nnkiboze}, @code{nnslashdot}, @code{nnultimate}, and
+@code{nnwfm} don't have their own nn*-nov-is-evil.}
 @end table
 
 
@@ -27765,7 +27801,7 @@
 
 Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and
 @code{gnus-nov-is-evil} to @code{nil} to make entering and exiting the
-summary buffer faster.
+summary buffer faster.  Also @pxref{Slow/Expensive Connection}.
 
 
 @page