Merge from gnus--rel--5.10

Revision: emacs@sv.gnu.org/emacs--rel--22--patch-115
This commit is contained in:
Miles Bader 2007-10-09 08:55:58 +00:00
parent 80025c1c5f
commit 4b70e299ef
9 changed files with 298 additions and 101 deletions

View 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

View 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.

View 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)))

View 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")

View 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.

View 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.

View 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.

View file

@ -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

View 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