]> git.eshelyaron.com Git - emacs.git/commitdiff
Merge from gnus--rel--5.10
authorMiles Bader <miles@gnu.org>
Tue, 9 Oct 2007 08:55:58 +0000 (08:55 +0000)
committerMiles Bader <miles@gnu.org>
Tue, 9 Oct 2007 08:55:58 +0000 (08:55 +0000)
Revision: emacs@sv.gnu.org/emacs--rel--22--patch-115

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

index 95408ba9af6fb53534c75aa8d878544eab076585..861414e52ee62ea9a1be6b2ec9a25427c38c240c 100644 (file)
@@ -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
index 0cf879fd264580a9dde76015104f874f89f6d8d1..1def50da1e37bf04efe21d4f46746f96205661e5 100644 (file)
@@ -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.
index 347b57983e65ec3e1190bb7e42aec82a8da52aa2..21b442aebbb324b6f8c093fb447be35aa7b2a769 100644 (file)
@@ -1765,12 +1765,13 @@ article numbers will be returned."
                                (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)))
index f1719eb04f4747b1f4d7a16cb612c501b905286c..1470f0cbac1cb66081e7147cff676db4bd8fc8d4 100644 (file)
@@ -766,6 +766,67 @@ eh?")))
                                       ,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 @@ if you do all your changes will be lost.  ")
                                     (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")
index 851ec88c96f1f4d191ac5ff1e335d3466250a035..36e93796a63cef11d32fd256685ca0d95421e28d 100644 (file)
@@ -1029,6 +1029,17 @@ default charset will be used instead."
   :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 @@ If SELECT-ARTICLES, only select those articles from GROUP."
              ;; 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 @@ displayed, no centering will be performed."
   (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 @@ displayed, no centering will be performed."
          (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 @@ displayed, no centering will be performed."
   (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.
index 3f75bba6d1ccd610614a0ce36c995cd25af239a4..0e8e9908cf4f80d2eb31f8d4605fb4f0023ea648 100644 (file)
@@ -1501,17 +1501,6 @@ If it is nil, no confirmation is required."
   :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.
index 76b1f2779c99b271f6ef58abc2a9e7af54e29049..04a600abf2551c8fd43d0947ac4612b3691db77c 100644 (file)
@@ -256,6 +256,12 @@ the alias.  Else windows-NUMBER is used."
     ,@(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.
 
index 6127974d24a41af433e792913a06077b946c568b..fd8ec27d2256c077bc9b291900e5e235889337b2 100644 (file)
        (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)
   (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))
     (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)))
 
   (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)
   (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
index 7cabf6741029119ba607e12fa370be7476318bcb..0c9765d92b6a10cc1fc47598174f1a9737c7e1f8 100644 (file)
@@ -2153,7 +2153,7 @@ most recently will be fetched.
 @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 @@ are actually only the articles 1-10 and 29999900-30000000, Gnus doesn't
 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 @@ get does not read @samp{Xref:full}, then you should shout and whine at
 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 @@ readers.
 @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 @@ that's already there.  This is not how this manual is written.  When
 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 @@ looking for it.  It is a reference manual, and not a guide to how to get
 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 @@ collection of @acronym{NOV} lines.
 
 @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 @@ for some quite common situations.
 
 
 @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 @@ also have to set @code{gnus-check-new-newsgroups} and
 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-check-new-newsgroups} and
 
 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