1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-23 22:20:24 -08:00

Merge from gnus--rel--5.10

Patches applied:

 * gnus--rel--5.10  (patch 103-104)

   - Update from CVS

Revision: emacs@sv.gnu.org/emacs--devo--0--patch-295
This commit is contained in:
Miles Bader 2006-06-07 16:39:16 +00:00
parent 3f168e2931
commit 26c9afc323
13 changed files with 587 additions and 304 deletions

View file

@ -1,3 +1,86 @@
2006-06-06 Katsumi Yamaoka <yamaoka@jpl.org>
* mm-util.el (mm-mime-mule-charset-alist): Use unicode-precedence-list
to fill the utf-8 entry.
2006-06-05 Dan Christensen <jdc@uwo.ca>
* gnus-sum.el (gnus-summary-read-group-1): When summary is unthreaded,
respect display group parameter and gnus-summary-expunge-below.
(gnus-articles-to-read): Remove unused reference to display group
parameter.
[ Merge 2004-07-06 change from the trunk. ]
2006-05-29 Reiner Steib <Reiner.Steib@gmx.de>
* gnus-ml.el (gnus-mailing-list-subscribe)
(gnus-mailing-list-unsubscribe, gnus-mailing-list-owner)
(gnus-mailing-list-message): Fix doc strings.
2006-05-29 Andreas Seltenreich <uwi7@rz.uni-karlsruhe.de>
* gnus-ml.el (gnus-mailing-list-message): Use gnus-url-mailto instead
of doing it manually.
2006-05-29 Kevin Greiner <kevin.greiner@compsol.cc>
* gnus-agent.el (gnus-agent-possibly-synchronize-flags): A server
must be explicitly online rather than "not explicitly offline" for
its flags to be synchronized.
(gnus-agent-read-local): All symbols allocated in my-obarray
(gnus-agent-set-local): Skip invalid entries (min and/or max is nil).
(gnus-agent-regenerate-group): Check numeric names to see if they are
messages or groups.
2006-05-29 Katsumi Yamaoka <yamaoka@jpl.org>
* gnus-art.el (gnus-save-all-headers): Mention it might be overridden.
(gnus-saved-headers): Ditto.
(gnus-default-article-saver): Doc fix; add
gnus-summary-write-body-to-file; mention functions may have properties.
(gnus-article-save-coding-system): New variable.
(gnus-article-save): Override gnus-save-all-headers and
gnus-saved-headers by :headers property which saver function may have.
(gnus-read-save-file-name): Add optional `dir-var' argument which
specifies directory in which files are saved; work even if optional
`variable' argument is not specified.
(gnus-summary-save-in-file): Add properties :decode and :headers.
(gnus-summary-write-to-file): Add properties :decode, :function, and
:headers; read file name.
(gnus-summary-save-body-in-file): Add :decode property; add optional
`overwrite' argument.
(gnus-summary-write-body-to-file): New function; add properties
:decode and :function.
(gnus-output-to-file): Add coding cookie and encode text according
to gnus-article-save-coding-system; don't use mm-append-to-file.
* gnus-sum.el (gnus-newsgroup-last-directory): New variable.
(gnus-summary-local-variables): Add it.
(gnus-summary-save-map): Add gnus-summary-write-article-body-file.
(gnus-summary-save-article): Require gnus-art; save decoded articles
if function that gnus-default-article-saver specifies has `:decode'
property; bind gnus-prompt-before-saving to t when saving many
articles in a file; move point to article which will be saved.
(gnus-summary-write-article-body-file): New function.
2006-05-26 Reiner Steib <Reiner.Steib@gmx.de>
* uudecode.el (uudecode-decode-region-external): Fix previous commit.
2006-05-26 Katsumi Yamaoka <yamaoka@jpl.org>
* mm-util.el (mm-enrich-utf-8-by-mule-ucs): Don't edit
after-load-alist.
2006-05-22 Reiner Steib <Reiner.Steib@gmx.de>
* uudecode.el (uudecode-decode-region-external): nil isn't a valid
coding system in XEmacs, use binary.
* mail-source.el (mail-sources): Fix custom type.
* imap.el (Commentary): Fix typo.
2006-05-18 Reiner Steib <Reiner.Steib@gmx.de>
* gnus-sum.el (gnus-summary-save-article-mail): Clarify doc string.

View file

@ -825,7 +825,7 @@ be a select method."
(save-excursion
(dolist (gnus-command-method (gnus-agent-covered-methods))
(when (and (file-exists-p (gnus-agent-lib-file "flags"))
(not (eq (gnus-server-status gnus-command-method) 'offline)))
(eq (gnus-server-status gnus-command-method) 'ok))
(gnus-agent-possibly-synchronize-flags-server gnus-command-method)))))
(defun gnus-agent-synchronize-flags-server (method)
@ -2133,7 +2133,8 @@ modified) original contents, they are first saved to their own file."
(let (group
min
max
(cur (current-buffer)))
(cur (current-buffer))
(obarray my-obarray))
(setq group (read cur)
min (read cur)
max (read cur))
@ -2214,7 +2215,9 @@ modified) original contents, they are first saved to their own file."
(if (cond ((and minmax
(or (not (eq min (car minmax)))
(not (eq max (cdr minmax)))))
(not (eq max (cdr minmax))))
min
max)
(setcar minmax min)
(setcdr minmax max)
t)
@ -3743,8 +3746,10 @@ If REREAD is not nil, downloaded articles are marked as unread."
(dir (file-name-directory file))
point
(downloaded (if (file-exists-p dir)
(sort (mapcar (lambda (name) (string-to-number name))
(directory-files dir nil "^[0-9]+$" t))
(sort (delq nil (mapcar (lambda (name)
(and (not (file-directory-p (nnheader-concat dir name)))
(string-to-number name)))
(directory-files dir nil "^[0-9]+$" t)))
'>)
(progn (gnus-make-directory dir) nil)))
dl nov-arts

View file

@ -492,7 +492,10 @@ be fed to `format-time-string'."
:group 'gnus-article-washing)
(defcustom gnus-save-all-headers t
"*If non-nil, don't remove any headers before saving."
"*If non-nil, don't remove any headers before saving.
This will be overridden by the `:headers' property that the symbol of
the saver function, which is specified by `gnus-default-article-saver',
might have."
:group 'gnus-article-saving
:type 'boolean)
@ -513,14 +516,17 @@ each invocation of the saving commands."
"Headers to keep if `gnus-save-all-headers' is nil.
If `gnus-save-all-headers' is non-nil, this variable will be ignored.
If that variable is nil, however, all headers that match this regexp
will be kept while the rest will be deleted before saving."
will be kept while the rest will be deleted before saving. This and
`gnus-save-all-headers' will be overridden by the `:headers' property
that the symbol of the saver function, which is specified by
`gnus-default-article-saver', might have."
:group 'gnus-article-saving
:type 'regexp)
(defcustom gnus-default-article-saver 'gnus-summary-save-in-rmail
"A function to save articles in your favourite format.
The function must be interactively callable (in other words, it must
be an Emacs command).
The function will be called by way of the `gnus-summary-save-article'
command, and friends such as `gnus-summary-save-article-rmail'.
Gnus provides the following functions:
@ -530,7 +536,28 @@ Gnus provides the following functions:
* gnus-summary-save-in-file (article format)
* gnus-summary-save-body-in-file (article body)
* gnus-summary-save-in-vm (use VM's folder format)
* gnus-summary-write-to-file (article format -- overwrite)."
* gnus-summary-write-to-file (article format -- overwrite)
* gnus-summary-write-body-to-file (article body -- overwrite)
The symbol of each function may have the following properties:
* :decode
The value non-nil means save decoded articles. This is meaningful
only with `gnus-summary-save-in-file', `gnus-summary-save-body-in-file',
`gnus-summary-write-to-file', and `gnus-summary-write-body-to-file'.
* :function
The value specifies an alternative function which appends, not
overwrites, articles to a file. This implies that when saving many
articles at a time, `gnus-prompt-before-saving' is bound to t and all
articles are saved in a single file. This is meaningful only with
`gnus-summary-write-to-file' and `gnus-summary-write-body-to-file'.
* :headers
The value specifies the symbol of a variable of which the value
specifies headers to be saved. If it is omitted,
`gnus-save-all-headers' and `gnus-saved-headers' control what
headers should be saved."
:group 'gnus-article-saving
:type '(radio (function-item gnus-summary-save-in-rmail)
(function-item gnus-summary-save-in-mail)
@ -539,8 +566,49 @@ Gnus provides the following functions:
(function-item gnus-summary-save-body-in-file)
(function-item gnus-summary-save-in-vm)
(function-item gnus-summary-write-to-file)
(function-item gnus-summary-write-body-to-file)
(function)))
(defcustom gnus-article-save-coding-system
(or (and (mm-coding-system-p 'utf-8) 'utf-8)
(and (mm-coding-system-p 'iso-2022-7bit) 'iso-2022-7bit)
(and (mm-coding-system-p 'emacs-mule) 'emacs-mule)
(and (mm-coding-system-p 'escape-quoted) 'escape-quoted))
"Coding system used to save decoded articles to a file.
The recommended coding systems are `utf-8', `iso-2022-7bit' and so on,
which can safely encode any characters in text. This is used by the
commands including:
* gnus-summary-save-article-file
* gnus-summary-save-article-body-file
* gnus-summary-write-article-file
* gnus-summary-write-article-body-file
and the functions to which you may set `gnus-default-article-saver':
* gnus-summary-save-in-file
* gnus-summary-save-body-in-file
* gnus-summary-write-to-file
* gnus-summary-write-body-to-file
Those commands and functions save just text displayed in the article
buffer to a file if the value of this variable is non-nil. Note that
buttonized MIME parts will be lost in a saved file in that case.
Otherwise, raw articles will be saved."
:group 'gnus-article-saving
:type `(choice
:format "%{%t%}:\n %[Value Menu%] %v"
(const :tag "Save raw articles" nil)
,@(delq nil
(mapcar
(lambda (arg) (if (mm-coding-system-p (nth 3 arg)) arg))
'((const :tag "UTF-8" utf-8)
(const :tag "iso-2022-7bit" iso-2022-7bit)
(const :tag "Emacs internal" emacs-mule)
(const :tag "escape-quoted" escape-quoted))))
(symbol :tag "Coding system")))
(defcustom gnus-rmail-save-name 'gnus-plain-save-name
"A function generating a file name to save articles in Rmail format.
The function is called with NEWSGROUP, HEADERS, and optional LAST-FILE."
@ -3249,10 +3317,13 @@ This format is defined by the `gnus-article-time-format' variable."
(defun gnus-article-save (save-buffer file &optional num)
"Save the currently selected article."
(unless gnus-save-all-headers
;; Remove headers according to `gnus-saved-headers'.
(when (or (get gnus-default-article-saver :headers)
(not gnus-save-all-headers))
;; Remove headers according to `gnus-saved-headers' or the value
;; of the `:headers' property that the saver function might have.
(let ((gnus-visible-headers
(or gnus-saved-headers gnus-visible-headers))
(or (symbol-value (get gnus-default-article-saver :headers))
gnus-saved-headers gnus-visible-headers))
(gnus-article-buffer save-buffer))
(save-excursion
(set-buffer save-buffer)
@ -3277,7 +3348,8 @@ This format is defined by the `gnus-article-time-format' variable."
(funcall gnus-default-article-saver filename)))))
(defun gnus-read-save-file-name (prompt &optional filename
function group headers variable)
function group headers variable
dir-var)
(let ((default-name
(funcall function group headers (symbol-value variable)))
result)
@ -3290,6 +3362,10 @@ This format is defined by the `gnus-article-time-format' variable."
default-name)
(filename filename)
(t
(when (symbol-value dir-var)
(setq default-name (expand-file-name
(file-name-nondirectory default-name)
(symbol-value dir-var))))
(let* ((split-name (gnus-get-split-value gnus-split-methods))
(prompt
(format prompt
@ -3354,7 +3430,11 @@ This format is defined by the `gnus-article-time-format' variable."
;; Possibly translate some characters.
(nnheader-translate-file-chars file))))))
(gnus-make-directory (file-name-directory result))
(set variable result)))
(when variable
(set variable result))
(when dir-var
(set dir-var (file-name-directory result)))
result))
(defun gnus-article-archive-name (group)
"Return the first instance of an \"Archive-name\" in the current buffer."
@ -3402,6 +3482,8 @@ Directory to save to is default to `gnus-article-save-directory'."
(gnus-output-to-mail filename)))))
filename)
(put 'gnus-summary-save-in-file :decode t)
(put 'gnus-summary-save-in-file :headers 'gnus-saved-headers)
(defun gnus-summary-save-in-file (&optional filename overwrite)
"Append this article to file.
Optional argument FILENAME specifies file name.
@ -3420,13 +3502,21 @@ Directory to save to is default to `gnus-article-save-directory'."
(gnus-output-to-file filename))))
filename)
(put 'gnus-summary-write-to-file :decode t)
(put 'gnus-summary-write-to-file :function 'gnus-summary-save-in-file)
(put 'gnus-summary-write-to-file :headers 'gnus-saved-headers)
(defun gnus-summary-write-to-file (&optional filename)
"Write this article to a file, overwriting it if the file exists.
Optional argument FILENAME specifies file name.
The directory to save in defaults to `gnus-article-save-directory'."
(gnus-summary-save-in-file nil t))
(setq filename (gnus-read-save-file-name
"Save %s in file" filename
gnus-file-save-name gnus-newsgroup-name
gnus-current-headers nil 'gnus-newsgroup-last-directory))
(gnus-summary-save-in-file filename t))
(defun gnus-summary-save-body-in-file (&optional filename)
(put 'gnus-summary-save-body-in-file :decode t)
(defun gnus-summary-save-body-in-file (&optional filename overwrite)
"Append this article body to a file.
Optional argument FILENAME specifies file name.
The directory to save in defaults to `gnus-article-save-directory'."
@ -3440,9 +3530,25 @@ The directory to save in defaults to `gnus-article-save-directory'."
(widen)
(when (article-goto-body)
(narrow-to-region (point) (point-max)))
(when (and overwrite
(file-exists-p filename))
(delete-file filename))
(gnus-output-to-file filename))))
filename)
(put 'gnus-summary-write-body-to-file :decode t)
(put 'gnus-summary-write-body-to-file
:function 'gnus-summary-save-body-in-file)
(defun gnus-summary-write-body-to-file (&optional filename)
"Write this article body to a file, overwriting it if the file exists.
Optional argument FILENAME specifies file name.
The directory to save in defaults to `gnus-article-save-directory'."
(setq filename (gnus-read-save-file-name
"Save %s body in file" filename
gnus-file-save-name gnus-newsgroup-name
gnus-current-headers nil 'gnus-newsgroup-last-directory))
(gnus-summary-save-body-in-file filename t))
(defun gnus-summary-save-in-pipe (&optional command)
"Pipe this article to subprocess."
(setq command
@ -5182,17 +5288,55 @@ Provided for backwards compatibility."
;;; Article savers.
(defun gnus-output-to-file (file-name)
"Append the current article to a file named FILE-NAME."
(let ((artbuf (current-buffer)))
"Append the current article to a file named FILE-NAME.
If `gnus-article-save-coding-system' is non-nil, it is used to encode
text and used as the value of the coding cookie which is added to the
top of a file. Otherwise, this function saves a raw article without
the coding cookie."
(let* ((artbuf (current-buffer))
(file-name-coding-system nnmail-pathname-coding-system)
(coding gnus-article-save-coding-system)
(coding-system-for-read (if coding
nil ;; Rely on the coding cookie.
mm-text-coding-system))
(coding-system-for-write (or coding
mm-text-coding-system-for-write
mm-text-coding-system))
(exists (file-exists-p file-name)))
(with-temp-buffer
(when exists
(insert-file-contents file-name)
(goto-char (point-min))
;; Remove the existing coding cookie.
(when (looking-at "X-Gnus-Coding-System: .+\n\n")
(delete-region (match-beginning 0) (match-end 0))))
(goto-char (point-max))
(insert-buffer-substring artbuf)
;; Append newline at end of the buffer as separator, and then
;; save it to file.
(goto-char (point-max))
(insert "\n")
(let ((file-name-coding-system nnmail-pathname-coding-system))
(mm-append-to-file (point-min) (point-max) file-name))
t)))
(when coding
;; If the coding system is not suitable to encode the text,
;; ask a user for a proper one.
(when (fboundp 'select-safe-coding-system)
(setq coding (coding-system-base
(save-window-excursion
(select-safe-coding-system (point-min) (point-max)
coding))))
(setq coding-system-for-write
(or (cdr (assq coding '((mule-utf-8 . utf-8))))
coding)))
(goto-char (point-min))
;; Add the coding cookie.
(insert (format "X-Gnus-Coding-System: -*- coding: %s; -*-\n\n"
coding-system-for-write)))
(if exists
(progn
(write-region (point-min) (point-max) file-name nil 'no-message)
(message "Appended to %s" file-name))
(write-region (point-min) (point-max) file-name))))
t)
(defun gnus-narrow-to-page (&optional arg)
"Narrow the article buffer to a page.

View file

@ -4,7 +4,7 @@
;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Julien Gilles <jgilles@free.fr>
;; Keywords: news
;; Keywords: news, mail
;; This file is part of GNU Emacs.
@ -51,8 +51,7 @@
"\C-c\C-nu" gnus-mailing-list-unsubscribe
"\C-c\C-np" gnus-mailing-list-post
"\C-c\C-no" gnus-mailing-list-owner
"\C-c\C-na" gnus-mailing-list-archive
))
"\C-c\C-na" gnus-mailing-list-archive))
(defun gnus-mailing-list-make-menu-bar ()
(unless (boundp 'gnus-mailing-list-menu)
@ -103,7 +102,8 @@ If FORCE is non-nil, replace the old ones."
;; Set up the menu.
(when (gnus-visual-p 'mailing-list-menu 'menu)
(gnus-mailing-list-make-menu-bar))
(gnus-add-minor-mode 'gnus-mailing-list-mode " Mailing-List" gnus-mailing-list-mode-map)
(gnus-add-minor-mode 'gnus-mailing-list-mode " Mailing-List"
gnus-mailing-list-mode-map)
(gnus-run-hooks 'gnus-mailing-list-mode-hook))))
;;; Commands
@ -118,7 +118,7 @@ If FORCE is non-nil, replace the old ones."
(t (gnus-message 1 "no list-help in this group")))))
(defun gnus-mailing-list-subscribe ()
"Subscribe"
"Subscribe to mailing list."
(interactive)
(let ((list-subscribe
(with-current-buffer gnus-original-article-buffer
@ -127,7 +127,7 @@ If FORCE is non-nil, replace the old ones."
(t (gnus-message 1 "no list-subscribe in this group")))))
(defun gnus-mailing-list-unsubscribe ()
"Unsubscribe"
"Unsubscribe from mailing list."
(interactive)
(let ((list-unsubscribe
(with-current-buffer gnus-original-article-buffer
@ -145,7 +145,7 @@ If FORCE is non-nil, replace the old ones."
(t (gnus-message 1 "no list-post in this group")))))
(defun gnus-mailing-list-owner ()
"Mail to the owner"
"Mail to the mailing list owner."
(interactive)
(let ((list-owner
(with-current-buffer gnus-original-article-buffer
@ -154,7 +154,7 @@ If FORCE is non-nil, replace the old ones."
(t (gnus-message 1 "no list-owner in this group")))))
(defun gnus-mailing-list-archive ()
"Browse archive"
"Browse archive."
(interactive)
(require 'browse-url)
(let ((list-archive
@ -169,33 +169,14 @@ If FORCE is non-nil, replace the old ones."
;;; Utility functions
(defun gnus-mailing-list-message (address)
""
(let ((mailto "")
(to ())
(subject "None")
(body "")
)
(cond
((string-match "<mailto:\\([^>]*\\)>" address)
(let ((args (match-string 1 address)))
(cond ; with param
((string-match "\\(.*\\)\\?\\(.*\\)" args)
(setq mailto (match-string 1 args))
(let ((param (match-string 2 args)))
(if (string-match "subject=\\([^&]*\\)" param)
(setq subject (match-string 1 param)))
(if (string-match "body=\\([^&]*\\)" param)
(setq body (match-string 1 param)))
(if (string-match "to=\\([^&]*\\)" param)
(push (match-string 1 param) to))
))
(t (setq mailto args))))) ; without param
; other case <http://... to be done.
(t nil))
(gnus-setup-message 'message (message-mail mailto subject))
(insert body)
))
"Send message to ADDRESS.
ADDRESS is specified by a \"mailto:\" URL."
(cond
((string-match "<\\(mailto:[^>]*\\)>" address)
(require 'gnus-art)
(gnus-url-mailto (match-string 1 address)))
;; other case <http://...> to be done.
(t nil)))
(provide 'gnus-ml)

View file

@ -1249,6 +1249,7 @@ the type of the variable (string, integer, character, etc).")
(defvar gnus-newsgroup-last-mail nil)
(defvar gnus-newsgroup-last-folder nil)
(defvar gnus-newsgroup-last-file nil)
(defvar gnus-newsgroup-last-directory nil)
(defvar gnus-newsgroup-auto-expire nil)
(defvar gnus-newsgroup-active nil)
@ -1364,6 +1365,7 @@ This list will always be a subset of gnus-newsgroup-undownloaded.")
gnus-newsgroup-begin gnus-newsgroup-end
gnus-newsgroup-last-rmail gnus-newsgroup-last-mail
gnus-newsgroup-last-folder gnus-newsgroup-last-file
gnus-newsgroup-last-directory
gnus-newsgroup-auto-expire gnus-newsgroup-unreads
gnus-newsgroup-unselected gnus-newsgroup-marked
gnus-newsgroup-spam-marked
@ -1991,6 +1993,7 @@ increase the score of each group you read."
"r" gnus-summary-save-article-rmail
"f" gnus-summary-save-article-file
"b" gnus-summary-save-article-body-file
"B" gnus-summary-write-article-body-file
"h" gnus-summary-save-article-folder
"v" gnus-summary-save-article-vm
"p" gnus-summary-pipe-output
@ -3709,16 +3712,10 @@ If NO-DISPLAY, don't generate a summary buffer."
(when gnus-build-sparse-threads
(gnus-build-sparse-threads))
;; Find the initial limit.
(if gnus-show-threads
(if show-all
(let ((gnus-newsgroup-dormant nil))
(gnus-summary-initial-limit show-all))
(if show-all
(let ((gnus-newsgroup-dormant nil))
(gnus-summary-initial-limit show-all))
;; When unthreaded, all articles are always shown.
(setq gnus-newsgroup-limit
(mapcar
(lambda (header) (mail-header-number header))
gnus-newsgroup-headers)))
(gnus-summary-initial-limit show-all))
;; Generate the summary buffer.
(unless no-display
(gnus-summary-prepare))
@ -5419,8 +5416,7 @@ If SELECT-ARTICLES, only select those articles from GROUP."
(defun gnus-articles-to-read (group &optional read-all)
"Find out what articles the user wants to read."
(let* ((display (gnus-group-find-parameter group 'display))
(articles
(let* ((articles
;; Select all articles if `read-all' is non-nil, or if there
;; are no unread articles.
(if (or read-all
@ -10993,12 +10989,26 @@ If N is a positive number, save the N next articles.
If N is a negative number, save the N previous articles.
If N is nil and any articles have been marked with the process mark,
save those articles instead.
The variable `gnus-default-article-saver' specifies the saver function."
The variable `gnus-default-article-saver' specifies the saver function.
If the optional second argument NOT-SAVED is non-nil, articles saved
will not be marked as saved."
(interactive "P")
(require 'gnus-art)
(let* ((articles (gnus-summary-work-articles n))
(save-buffer (save-excursion
(nnheader-set-temp-buffer " *Gnus Save*")))
(num (length articles))
;; Whether to save decoded articles or raw articles.
(decode (when gnus-article-save-coding-system
(get gnus-default-article-saver :decode)))
;; When saving many articles in a single file, use the other
;; function to save articles other than the first one.
(saver2 (get gnus-default-article-saver :function))
(gnus-prompt-before-saving (if saver2
t
gnus-prompt-before-saving))
(gnus-default-article-saver gnus-default-article-saver)
header file)
(dolist (article articles)
(setq header (gnus-summary-article-header article))
@ -11009,17 +11019,25 @@ The variable `gnus-default-article-saver' specifies the saver function."
(gnus-message 1 "Article %d is unsaveable" article))
;; This is a real article.
(save-window-excursion
(let ((gnus-display-mime-function nil)
(gnus-article-prepare-hook nil))
(gnus-summary-select-article t nil nil article)))
(let ((gnus-display-mime-function (when decode
gnus-display-mime-function))
(gnus-article-prepare-hook (when decode
gnus-article-prepare-hook)))
(gnus-summary-select-article t nil nil article)
(gnus-summary-goto-subject article)))
(save-excursion
(set-buffer save-buffer)
(erase-buffer)
(insert-buffer-substring gnus-original-article-buffer))
(insert-buffer-substring (if decode
gnus-article-buffer
gnus-original-article-buffer)))
(setq file (gnus-article-save save-buffer file num))
(gnus-summary-remove-process-mark article)
(unless not-saved
(gnus-summary-set-saved-mark article))))
(gnus-summary-set-saved-mark article)))
(when saver2
(setq gnus-default-article-saver saver2
saver2 nil)))
(gnus-kill-buffer save-buffer)
(gnus-summary-position-point)
(gnus-set-mode-line 'summary)
@ -11097,6 +11115,17 @@ save those articles instead."
(let ((gnus-default-article-saver 'gnus-summary-save-body-in-file))
(gnus-summary-save-article arg)))
(defun gnus-summary-write-article-body-file (&optional arg)
"Write the current article body to a file, deleting the previous file.
If N is a positive number, save the N next articles.
If N is a negative number, save the N previous articles.
If N is nil and any articles have been marked with the process mark,
save those articles instead."
(interactive "P")
(require 'gnus-art)
(let ((gnus-default-article-saver 'gnus-summary-write-body-to-file))
(gnus-summary-save-article arg)))
(defun gnus-summary-muttprint (&optional arg)
"Print the current article using Muttprint.
If N is a positive number, save the N next articles.

View file

@ -79,7 +79,7 @@
;; (NAMESPACE), RFC2359 (UIDPLUS), the IMAP-part of RFC2595 (STARTTLS,
;; LOGINDISABLED) (with use of external library starttls.el and
;; program starttls) and the GSSAPI / kerberos V4 sections of RFC1731
;; (with use of external program `imtest'). It also take advantage
;; (with use of external program `imtest'). It also takes advantage of
;; the UNSELECT extension in Cyrus IMAPD.
;;
;; Without the work of John McClary Prevost and Jim Radford this library

View file

@ -63,175 +63,177 @@ This variable is a list of mail source specifiers.
See Info node `(gnus)Mail Source Specifiers'."
:group 'mail-source
:link '(custom-manual "(gnus)Mail Source Specifiers")
:type `(repeat
(choice :format "%[Value Menu%] %v"
:value (file)
(cons :tag "Spool file"
(const :format "" file)
(checklist :tag "Options" :greedy t
(group :inline t
(const :format "" :value :path)
file)))
(cons :tag "Several files in a directory"
(const :format "" directory)
(checklist :tag "Options" :greedy t
(group :inline t
(const :format "" :value :path)
(directory :tag "Path"))
(group :inline t
(const :format "" :value :suffix)
(string :tag "Suffix"))
(group :inline t
(const :format "" :value :predicate)
(function :tag "Predicate"))
(group :inline t
(const :format "" :value :prescript)
(choice :tag "Prescript"
:value nil
(string :format "%v")
(function :format "%v")))
(group :inline t
(const :format "" :value :postscript)
(choice :tag "Postscript"
:value nil
(string :format "%v")
(function :format "%v")))
(group :inline t
(const :format "" :value :plugged)
(boolean :tag "Plugged"))))
(cons :tag "POP3 server"
(const :format "" pop)
(checklist :tag "Options" :greedy t
(group :inline t
(const :format "" :value :server)
(string :tag "Server"))
(group :inline t
(const :format "" :value :port)
(choice :tag "Port"
:value "pop3"
(number :format "%v")
(string :format "%v")))
(group :inline t
(const :format "" :value :user)
(string :tag "User"))
(group :inline t
(const :format "" :value :password)
(string :tag "Password"))
(group :inline t
(const :format "" :value :program)
(string :tag "Program"))
(group :inline t
(const :format "" :value :prescript)
(choice :tag "Prescript"
:value nil
(string :format "%v")
(function :format "%v")))
(group :inline t
(const :format "" :value :postscript)
(choice :tag "Postscript"
:value nil
(string :format "%v")
(function :format "%v")))
(group :inline t
(const :format "" :value :function)
(function :tag "Function"))
(group :inline t
(const :format ""
:value :authentication)
(choice :tag "Authentication"
:value apop
(const password)
(const apop)))
(group :inline t
(const :format "" :value :plugged)
(boolean :tag "Plugged"))))
(cons :tag "Maildir (qmail, postfix...)"
(const :format "" maildir)
(checklist :tag "Options" :greedy t
(group :inline t
(const :format "" :value :path)
(directory :tag "Path"))
(group :inline t
(const :format "" :value :plugged)
(boolean :tag "Plugged"))))
(cons :tag "IMAP server"
(const :format "" imap)
(checklist :tag "Options" :greedy t
(group :inline t
(const :format "" :value :server)
(string :tag "Server"))
(group :inline t
(const :format "" :value :port)
(choice :tag "Port"
:value 143
number string))
(group :inline t
(const :format "" :value :user)
(string :tag "User"))
(group :inline t
(const :format "" :value :password)
(string :tag "Password"))
(group :inline t
(const :format "" :value :stream)
(choice :tag "Stream"
:value network
,@mail-source-imap-streams))
(group :inline t
(const :format "" :value :program)
(string :tag "Program"))
(group :inline t
(const :format ""
:value :authenticator)
(choice :tag "Authenticator"
:value login
,@mail-source-imap-authenticators))
(group :inline t
(const :format "" :value :mailbox)
(string :tag "Mailbox"
:value "INBOX"))
(group :inline t
(const :format "" :value :predicate)
(string :tag "Predicate"
:value "UNSEEN UNDELETED"))
(group :inline t
(const :format "" :value :fetchflag)
(string :tag "Fetchflag"
:value "\\Deleted"))
(group :inline t
(const :format ""
:value :dontexpunge)
(boolean :tag "Dontexpunge"))
(group :inline t
(const :format "" :value :plugged)
(boolean :tag "Plugged"))))
(cons :tag "Webmail server"
(const :format "" webmail)
(checklist :tag "Options" :greedy t
(group :inline t
(const :format "" :value :subtype)
;; Should be generated from
;; `webmail-type-definition', but we
;; can't require webmail without W3.
(choice :tag "Subtype"
:value hotmail
(const hotmail)
(const yahoo)
(const netaddress)
(const netscape)
(const my-deja)))
(group :inline t
(const :format "" :value :user)
(string :tag "User"))
(group :inline t
(const :format "" :value :password)
(string :tag "Password"))
(group :inline t
(const :format ""
:value :dontexpunge)
(boolean :tag "Dontexpunge"))
(group :inline t
(const :format "" :value :plugged)
(boolean :tag "Plugged")))))))
:type `(choice
(const nil)
(repeat
(choice :format "%[Value Menu%] %v"
:value (file)
(cons :tag "Spool file"
(const :format "" file)
(checklist :tag "Options" :greedy t
(group :inline t
(const :format "" :value :path)
file)))
(cons :tag "Several files in a directory"
(const :format "" directory)
(checklist :tag "Options" :greedy t
(group :inline t
(const :format "" :value :path)
(directory :tag "Path"))
(group :inline t
(const :format "" :value :suffix)
(string :tag "Suffix"))
(group :inline t
(const :format "" :value :predicate)
(function :tag "Predicate"))
(group :inline t
(const :format "" :value :prescript)
(choice :tag "Prescript"
:value nil
(string :format "%v")
(function :format "%v")))
(group :inline t
(const :format "" :value :postscript)
(choice :tag "Postscript"
:value nil
(string :format "%v")
(function :format "%v")))
(group :inline t
(const :format "" :value :plugged)
(boolean :tag "Plugged"))))
(cons :tag "POP3 server"
(const :format "" pop)
(checklist :tag "Options" :greedy t
(group :inline t
(const :format "" :value :server)
(string :tag "Server"))
(group :inline t
(const :format "" :value :port)
(choice :tag "Port"
:value "pop3"
(number :format "%v")
(string :format "%v")))
(group :inline t
(const :format "" :value :user)
(string :tag "User"))
(group :inline t
(const :format "" :value :password)
(string :tag "Password"))
(group :inline t
(const :format "" :value :program)
(string :tag "Program"))
(group :inline t
(const :format "" :value :prescript)
(choice :tag "Prescript"
:value nil
(string :format "%v")
(function :format "%v")))
(group :inline t
(const :format "" :value :postscript)
(choice :tag "Postscript"
:value nil
(string :format "%v")
(function :format "%v")))
(group :inline t
(const :format "" :value :function)
(function :tag "Function"))
(group :inline t
(const :format ""
:value :authentication)
(choice :tag "Authentication"
:value apop
(const password)
(const apop)))
(group :inline t
(const :format "" :value :plugged)
(boolean :tag "Plugged"))))
(cons :tag "Maildir (qmail, postfix...)"
(const :format "" maildir)
(checklist :tag "Options" :greedy t
(group :inline t
(const :format "" :value :path)
(directory :tag "Path"))
(group :inline t
(const :format "" :value :plugged)
(boolean :tag "Plugged"))))
(cons :tag "IMAP server"
(const :format "" imap)
(checklist :tag "Options" :greedy t
(group :inline t
(const :format "" :value :server)
(string :tag "Server"))
(group :inline t
(const :format "" :value :port)
(choice :tag "Port"
:value 143
number string))
(group :inline t
(const :format "" :value :user)
(string :tag "User"))
(group :inline t
(const :format "" :value :password)
(string :tag "Password"))
(group :inline t
(const :format "" :value :stream)
(choice :tag "Stream"
:value network
,@mail-source-imap-streams))
(group :inline t
(const :format "" :value :program)
(string :tag "Program"))
(group :inline t
(const :format ""
:value :authenticator)
(choice :tag "Authenticator"
:value login
,@mail-source-imap-authenticators))
(group :inline t
(const :format "" :value :mailbox)
(string :tag "Mailbox"
:value "INBOX"))
(group :inline t
(const :format "" :value :predicate)
(string :tag "Predicate"
:value "UNSEEN UNDELETED"))
(group :inline t
(const :format "" :value :fetchflag)
(string :tag "Fetchflag"
:value "\\Deleted"))
(group :inline t
(const :format ""
:value :dontexpunge)
(boolean :tag "Dontexpunge"))
(group :inline t
(const :format "" :value :plugged)
(boolean :tag "Plugged"))))
(cons :tag "Webmail server"
(const :format "" webmail)
(checklist :tag "Options" :greedy t
(group :inline t
(const :format "" :value :subtype)
;; Should be generated from
;; `webmail-type-definition', but we
;; can't require webmail without W3.
(choice :tag "Subtype"
:value hotmail
(const hotmail)
(const yahoo)
(const netaddress)
(const netscape)
(const my-deja)))
(group :inline t
(const :format "" :value :user)
(string :tag "User"))
(group :inline t
(const :format "" :value :password)
(string :tag "Password"))
(group :inline t
(const :format ""
:value :dontexpunge)
(boolean :tag "Dontexpunge"))
(group :inline t
(const :format "" :value :plugged)
(boolean :tag "Plugged"))))))))
(defcustom mail-source-ignore-errors nil
"*Ignore errors when querying mail sources.

View file

@ -364,14 +364,17 @@ could use `autoload-coding-system' here."
(iso-2022-jp-3 latin-jisx0201 japanese-jisx0208-1978 japanese-jisx0208
japanese-jisx0213-1 japanese-jisx0213-2)
(shift_jis latin-jisx0201 katakana-jisx0201 japanese-jisx0208)
,(if (or (not (fboundp 'charsetp)) ;; non-Mule case
(charsetp 'unicode-a)
(not (mm-coding-system-p 'mule-utf-8)))
'(utf-8 unicode-a unicode-b unicode-c unicode-d unicode-e)
;; If we have utf-8 we're in Mule 5+.
(append '(utf-8)
(delete 'ascii
(coding-system-get 'mule-utf-8 'safe-charsets)))))
,(cond ((fboundp 'unicode-precedence-list)
(cons 'utf-8 (delq 'ascii (mapcar 'charset-name
(unicode-precedence-list)))))
((or (not (fboundp 'charsetp)) ;; non-Mule case
(charsetp 'unicode-a)
(not (mm-coding-system-p 'mule-utf-8)))
'(utf-8 unicode-a unicode-b unicode-c unicode-d unicode-e))
(t ;; If we have utf-8 we're in Mule 5+.
(append '(utf-8)
(delete 'ascii
(coding-system-get 'mule-utf-8 'safe-charsets))))))
"Alist of MIME-charset/MULE-charsets.")
(defun mm-enrich-utf-8-by-mule-ucs ()
@ -379,10 +382,6 @@ could use `autoload-coding-system' here."
This function will run when the `un-define' module is loaded under
XEmacs, and fill the `utf-8' entry in `mm-mime-mule-charset-alist'
with Mule charsets. It is completely useless for Emacs."
(unless (cdr (delete '(mm-enrich-utf-8-by-mule-ucs)
(assoc "un-define" after-load-alist)))
(setq after-load-alist
(delete '("un-define") after-load-alist)))
(when (boundp 'unicode-basic-translation-charset-order-list)
(condition-case nil
(let ((val (delq

View file

@ -100,7 +100,11 @@ used is specified by `uudecode-decoder-program'."
(make-temp-name "uu")
uudecode-temporary-file-directory))))
(let ((cdir default-directory)
default-process-coding-system)
(default-process-coding-system
(if (featurep 'xemacs)
;; In XEmacs, `nil' is not a valid coding system.
'(binary . binary)
nil)))
(unwind-protect
(with-temp-buffer
(insert "begin 600 " (file-name-nondirectory tempfile) "\n")

View file

@ -136,21 +136,21 @@ Bourne shell or its equivalent \(not tcsh) is needed for \"2>\"."
"Encrypt the current region between START and END."
(let* ((pgg-pgp-user-id (or pgg-pgp-user-id pgg-default-user-id))
(passphrase (or passphrase
(when sign
(pgg-read-passphrase
(format "PGP passphrase for %s: "
pgg-pgp-user-id)
pgg-pgp-user-id))))
(when sign
(pgg-read-passphrase
(format "PGP passphrase for %s: "
pgg-pgp-user-id)
pgg-pgp-user-id))))
(args
(append
`("+encrypttoself=off +verbose=1" "+batchmode"
"+language=us" "-fate"
,@(if recipients
(mapcar (lambda (rcpt) (concat "\"" rcpt "\""))
(append recipients
(if pgg-encrypt-for-me
(list pgg-pgp-user-id))))))
(if sign '("-s" "-u" pgg-pgp-user-id)))))
(append
`("+encrypttoself=off +verbose=1" "+batchmode"
"+language=us" "-fate"
,@(if recipients
(mapcar (lambda (rcpt) (concat "\"" rcpt "\""))
(append recipients
(if pgg-encrypt-for-me
(list pgg-pgp-user-id))))))
(if sign '("-s" "-u" pgg-pgp-user-id)))))
(pgg-pgp-process-region start end nil pgg-pgp-program args)
(pgg-process-when-success nil)))
@ -162,11 +162,11 @@ passphrase cache or user."
(let* ((pgg-pgp-user-id (or pgg-pgp-user-id pgg-default-user-id))
(key (pgg-pgp-lookup-key pgg-pgp-user-id 'encrypt))
(passphrase
(or passphrase
(pgg-read-passphrase
(format "PGP passphrase for %s: " pgg-pgp-user-id) key)))
(or passphrase
(pgg-read-passphrase
(format "PGP passphrase for %s: " pgg-pgp-user-id) key)))
(args
'("+verbose=1" "+batchmode" "+language=us" "-f")))
'("+verbose=1" "+batchmode" "+language=us" "-f")))
(pgg-pgp-process-region start end passphrase pgg-pgp-program args)
(pgg-process-when-success
(if pgg-cache-passphrase
@ -179,10 +179,10 @@ If optional PASSPHRASE is not specified, it will be obtained from the
passphrase cache or user."
(let* ((pgg-pgp-user-id (or pgg-pgp-user-id pgg-default-user-id))
(passphrase
(or passphrase
(pgg-read-passphrase
(format "PGP passphrase for %s: " pgg-pgp-user-id)
(pgg-pgp-lookup-key pgg-pgp-user-id 'sign))))
(or passphrase
(pgg-read-passphrase
(format "PGP passphrase for %s: " pgg-pgp-user-id)
(pgg-pgp-lookup-key pgg-pgp-user-id 'sign))))
(args
(list (if clearsign "-fast" "-fbast")
"+verbose=1" "+language=us" "+batchmode"

View file

@ -147,23 +147,23 @@ Bourne shell or its equivalent \(not tcsh) is needed for \"2>\"."
"Encrypt the current region between START and END."
(let* ((pgg-pgp5-user-id (or pgg-pgp5-user-id pgg-default-user-id))
(passphrase (or passphrase
(when sign
(pgg-read-passphrase
(format "PGP passphrase for %s: "
pgg-pgp5-user-id)
pgg-pgp5-user-id))))
(when sign
(pgg-read-passphrase
(format "PGP passphrase for %s: "
pgg-pgp5-user-id)
pgg-pgp5-user-id))))
(args
(append
`("+NoBatchInvalidKeys=off" "-fat" "+batchmode=1"
,@(if recipients
(apply #'append
(mapcar (lambda (rcpt)
(list "-r"
(concat "\"" rcpt "\"")))
(append recipients
(if pgg-encrypt-for-me
(list pgg-pgp5-user-id)))))))
(if sign '("-s" "-u" pgg-pgp5-user-id)))))
(append
`("+NoBatchInvalidKeys=off" "-fat" "+batchmode=1"
,@(if recipients
(apply #'append
(mapcar (lambda (rcpt)
(list "-r"
(concat "\"" rcpt "\"")))
(append recipients
(if pgg-encrypt-for-me
(list pgg-pgp5-user-id)))))))
(if sign '("-s" "-u" pgg-pgp5-user-id)))))
(pgg-pgp5-process-region start end nil pgg-pgp5-pgpe-program args)
(pgg-process-when-success nil)))
@ -171,10 +171,10 @@ Bourne shell or its equivalent \(not tcsh) is needed for \"2>\"."
"Decrypt the current region between START and END."
(let* ((pgg-pgp5-user-id (or pgg-pgp5-user-id pgg-default-user-id))
(passphrase
(or passphrase
(pgg-read-passphrase
(format "PGP passphrase for %s: " pgg-pgp5-user-id)
(pgg-pgp5-lookup-key pgg-pgp5-user-id 'encrypt))))
(or passphrase
(pgg-read-passphrase
(format "PGP passphrase for %s: " pgg-pgp5-user-id)
(pgg-pgp5-lookup-key pgg-pgp5-user-id 'encrypt))))
(args
'("+verbose=1" "+batchmode=1" "+language=us" "-f")))
(pgg-pgp5-process-region start end passphrase pgg-pgp5-pgpv-program args)
@ -184,10 +184,10 @@ Bourne shell or its equivalent \(not tcsh) is needed for \"2>\"."
"Make detached signature from text between START and END."
(let* ((pgg-pgp5-user-id (or pgg-pgp5-user-id pgg-default-user-id))
(passphrase
(or passphrase
(pgg-read-passphrase
(format "PGP passphrase for %s: " pgg-pgp5-user-id)
(pgg-pgp5-lookup-key pgg-pgp5-user-id 'sign))))
(or passphrase
(pgg-read-passphrase
(format "PGP passphrase for %s: " pgg-pgp5-user-id)
(pgg-pgp5-lookup-key pgg-pgp5-user-id 'sign))))
(args
(list (if clearsign "-fat" "-fbat")
"+verbose=1" "+language=us" "+batchmode=1"

View file

@ -1,3 +1,7 @@
2006-05-18 Reiner Steib <Reiner.Steib@gmx.de>
* gnus.texi (Saving Articles): Clarify gnus-summary-save-article-mail.
2006-06-07 Nick Roberts <nickrob@snap.net.nz>
* building.texi (Watch Expressions): Move node to end.

View file

@ -7456,7 +7456,7 @@ files.
@vindex gnus-default-article-saver
You can customize the @code{gnus-default-article-saver} variable to make
Gnus do what you want it to. You can use any of the six ready-made
Gnus do what you want it to. You can use any of the eight ready-made
functions below, or you can create your own.
@table @code
@ -7497,6 +7497,13 @@ Append the article body to an ordinary file. Uses the function in the
@code{gnus-file-save-name} variable to get a file name to save the
article in. The default is @code{gnus-numeric-save-name}.
@item gnus-summary-write-body-to-file
@findex gnus-summary-write-body-to-file
Write the article body straight to an ordinary file. The file is
overwritten if it exists. Uses the function in the
@code{gnus-file-save-name} variable to get a file name to save the
article in. The default is @code{gnus-numeric-save-name}.
@item gnus-summary-save-in-folder
@findex gnus-summary-save-in-folder
@findex gnus-folder-save-name
@ -7516,6 +7523,31 @@ Save the article in a VM folder. You have to have the VM mail
reader to use this setting.
@end table
The symbol of each function may have the following properties:
@table @code
@item :decode
The value non-@code{nil} means save decoded articles. This is
meaningful only with @code{gnus-summary-save-in-file},
@code{gnus-summary-save-body-in-file},
@code{gnus-summary-write-to-file}, and
@code{gnus-summary-write-body-to-file}.
@item :function
The value specifies an alternative function which appends, not
overwrites, articles to a file. This implies that when saving many
articles at a time, @code{gnus-prompt-before-saving} is bound to
@code{t} and all articles are saved in a single file. This is
meaningful only with @code{gnus-summary-write-to-file} and
@code{gnus-summary-write-body-to-file}.
@item :headers
The value specifies the symbol of a variable of which the value
specifies headers to be saved. If it is omitted,
@code{gnus-save-all-headers} and @code{gnus-saved-headers} control what
headers should be saved.
@end table
@vindex gnus-article-save-directory
All of these functions, except for the last one, will save the article
in the @code{gnus-article-save-directory}, which is initialized from the