aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiles Bader <[email protected]>2007-10-09 08:55:58 +0000
committerMiles Bader <[email protected]>2007-10-09 08:55:58 +0000
commit4b70e299ef66906fd285198003c72a1439d1f252 (patch)
tree6acb886b895a5fd7d148aafe670ff9dab02ff7b3
parent80025c1c5f9a536a1a825aa16b5982688d8fd7b0 (diff)
Merge from gnus--rel--5.10
Revision: [email protected]/emacs--rel--22--patch-115
-rw-r--r--etc/gnus-logo.eps22
-rw-r--r--lisp/gnus/ChangeLog45
-rw-r--r--lisp/gnus/gnus-agent.el5
-rw-r--r--lisp/gnus/gnus-cus.el63
-rw-r--r--lisp/gnus/gnus-sum.el33
-rw-r--r--lisp/gnus/gnus.el11
-rw-r--r--lisp/gnus/mm-util.el6
-rw-r--r--lisp/gnus/nnmbox.el134
-rw-r--r--man/gnus.texi80
9 files changed, 298 insertions, 101 deletions
diff --git a/etc/gnus-logo.eps b/etc/gnus-logo.eps
index 95408ba9af..861414e52e 100644
--- a/etc/gnus-logo.eps
+++ b/etc/gnus-logo.eps
@@ -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 <[email protected]>
+%
+% 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
diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog
index 0cf879fd26..1def50da1e 100644
--- a/lisp/gnus/ChangeLog
+++ b/lisp/gnus/ChangeLog
@@ -1,3 +1,48 @@
+2007-10-08 Reiner Steib <[email protected]>
+
+ * mm-util.el (mm-charset-synonym-alist): Alias gbk to cp936.
+
+2007-10-04 Reiner Steib <[email protected]>
+
+ * Relicense "GPLv2 or later" files to "GPLv3 or later".
+
+2007-09-13 Katsumi Yamaoka <[email protected]>
+
+ * gnus-sum.el (gnus-newsgroup-maximum-articles): Move from gnus.el.
+ Suggested by Leo <[email protected]>.
+
+ * gnus.el: Do.
+
+2007-09-13 Katsumi Yamaoka <[email protected]>
+
+ * gnus.el (gnus-newsgroup-maximum-articles): Rename from
+ gnus-maximum-newsgroup. Suggested by Leo <[email protected]>.
+
+ * 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 <[email protected]>
+
+ * 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 <[email protected]>
+
+ * 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 <[email protected]>
* mml.el (mml-generate-mime): Make sure it uses multibyte temp buffer.
diff --git a/lisp/gnus/gnus-agent.el b/lisp/gnus/gnus-agent.el
index 347b57983e..21b442aebb 100644
--- a/lisp/gnus/gnus-agent.el
+++ b/lisp/gnus/gnus-agent.el
@@ -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)))
diff --git a/lisp/gnus/gnus-cus.el b/lisp/gnus/gnus-cus.el
index f1719eb04f..1470f0cbac 100644
--- a/lisp/gnus/gnus-cus.el
+++ b/lisp/gnus/gnus-cus.el
@@ -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")
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index 851ec88c96..36e93796a6 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -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.
diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el
index 3f75bba6d1..0e8e9908cf 100644
--- a/lisp/gnus/gnus.el
+++ b/lisp/gnus/gnus.el
@@ -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.
diff --git a/lisp/gnus/mm-util.el b/lisp/gnus/mm-util.el
index 76b1f2779c..04a600abf2 100644
--- a/lisp/gnus/mm-util.el
+++ b/lisp/gnus/mm-util.el
@@ -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.
diff --git a/lisp/gnus/nnmbox.el b/lisp/gnus/nnmbox.el
index 6127974d24..fd8ec27d22 100644
--- a/lisp/gnus/nnmbox.el
+++ b/lisp/gnus/nnmbox.el
@@ -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
diff --git a/man/gnus.texi b/man/gnus.texi
index 7cabf67410..0c9765d92b 100644
--- a/man/gnus.texi
+++ b/man/gnus.texi
@@ -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