* gnus-art.el (gnus-default-article-saver): Add
authorKatsumi Yamaoka <yamaoka@jpl.org>
Thu, 25 May 2006 07:57:11 +0000 (07:57 +0000)
committerKatsumi Yamaoka <yamaoka@jpl.org>
Thu, 25 May 2006 07:57:11 +0000 (07:57 +0000)
gnus-summary-write-body-to-file.
(gnus-article-save-coding-system): Don't use coding system object
in XEmacs.
(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-write-to-file): Read file name.
(gnus-summary-save-body-in-file): Add optional `overwrite' argument.
(gnus-summary-write-body-to-file): New function.

* 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): Remove optional `decode' argument;
determine whether to decode articles by the value of
gnus-default-article-saver; when saving many files using
gnus-summary-write-to-file or gnus-summary-write-body-to-file, use
it first and use gnus-summary-save-in-file or
gnus-summary-save-body-in-file thereafter unless
gnus-prompt-before-saving is always; move point to article which
will be saved.
(gnus-summary-save-article-file): Revert.
(gnus-summary-write-article-file): Revert.
(gnus-summary-save-article-body-file): Revert.
(gnus-summary-write-article-body-file): New function.

lisp/ChangeLog
lisp/gnus-art.el
lisp/gnus-sum.el

index 5ec8589..1734e08 100644 (file)
@@ -1,3 +1,32 @@
+2006-05-25  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-art.el (gnus-default-article-saver): Add
+       gnus-summary-write-body-to-file.
+       (gnus-article-save-coding-system): Don't use coding system object
+       in XEmacs.
+       (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-write-to-file): Read file name.
+       (gnus-summary-save-body-in-file): Add optional `overwrite' argument.
+       (gnus-summary-write-body-to-file): New function.
+
+       * 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): Remove optional `decode' argument;
+       determine whether to decode articles by the value of
+       gnus-default-article-saver; when saving many files using
+       gnus-summary-write-to-file or gnus-summary-write-body-to-file, use
+       it first and use gnus-summary-save-in-file or
+       gnus-summary-save-body-in-file thereafter unless
+       gnus-prompt-before-saving is always; move point to article which
+       will be saved.
+       (gnus-summary-save-article-file): Revert.
+       (gnus-summary-write-article-file): Revert.
+       (gnus-summary-save-article-body-file): Revert.
+       (gnus-summary-write-article-body-file): New function.
+
 2006-05-24  Katsumi Yamaoka  <yamaoka@jpl.org>
 
        * gnus-art.el (gnus-default-article-saver): Doc fix.
index 569d0ab..45b1159 100644 (file)
@@ -540,7 +540,8 @@ 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)."
   :group 'gnus-article-saving
   :type '(radio (function-item gnus-summary-save-in-rmail)
                (function-item gnus-summary-save-in-mail)
@@ -549,13 +550,14 @@ 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 (mm-coding-system-p 'utf-8)
-      (mm-coding-system-p 'iso-2022-7bit)
-      (mm-coding-system-p 'emacs-mule)
-      (mm-coding-system-p 'escape-quoted))
+  (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,
@@ -565,12 +567,14 @@ 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
@@ -3487,7 +3491,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)
@@ -3500,6 +3505,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
@@ -3564,7 +3573,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."
@@ -3634,9 +3647,13 @@ Directory to save to is default to `gnus-article-save-directory'."
   "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)
+(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'."
@@ -3650,9 +3667,22 @@ 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)
 
+(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
index 40b75be..669bd30 100644 (file)
@@ -1322,6 +1322,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)
 
@@ -1437,6 +1438,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
@@ -2073,6 +2075,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
@@ -11229,7 +11232,7 @@ Argument REVERSE means reverse order."
 
 ;; Summary saving commands.
 
-(defun gnus-summary-save-article (&optional n not-saved decode)
+(defun gnus-summary-save-article (&optional n not-saved)
   "Save the current article using the default saver function.
 If N is a positive number, save the N next articles.
 If N is a negative number, save the N previous articles.
@@ -11238,16 +11241,30 @@ save those articles instead.
 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.  If the optional third argument DECODE is
-non-nil, articles will be decoded before saving."
+will not be marked as saved."
   (interactive "P")
   (require 'gnus-art)
-  (unless gnus-article-save-coding-system
-    (setq decode nil))
   (let* ((articles (gnus-summary-work-articles n))
         (save-buffer (save-excursion
                        (nnheader-set-temp-buffer " *Gnus Save*")))
         (num (length articles))
+        (decode (and gnus-article-save-coding-system
+                     (memq 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))))
+        (gnus-default-article-saver gnus-default-article-saver)
+        ;; When saving many files using `gnus-summary-write-to-file'
+        ;; or `gnus-summary-write-body-to-file', use it first and use
+        ;; `gnus-summary-save-in-file' or `gnus-summary-save-body-in-file'
+        ;; thereafter unless `gnus-prompt-before-saving' is `always'.
+        (saver2 (unless (eq gnus-prompt-before-saving 'always)
+                  (cdr (assq gnus-default-article-saver
+                             '((gnus-summary-write-to-file
+                                . gnus-summary-save-in-file)
+                               (gnus-summary-write-body-to-file
+                                . gnus-summary-save-body-in-file))))))
         header file)
     (dolist (article articles)
       (setq header (gnus-summary-article-header article))
@@ -11262,7 +11279,8 @@ non-nil, articles will be decoded before saving."
                                              gnus-display-mime-function))
                (gnus-article-prepare-hook (when decode
                                             gnus-article-prepare-hook)))
-           (gnus-summary-select-article (not decode) nil nil article)))
+           (gnus-summary-select-article (not decode) nil nil article)
+           (gnus-summary-goto-subject article)))
        (save-excursion
          (set-buffer save-buffer)
          (erase-buffer)
@@ -11272,7 +11290,10 @@ non-nil, articles will be decoded before saving."
        (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)
@@ -11326,7 +11347,7 @@ save those articles instead."
   (interactive "P")
   (require 'gnus-art)
   (let ((gnus-default-article-saver 'gnus-summary-save-in-file))
-    (gnus-summary-save-article arg nil t)))
+    (gnus-summary-save-article arg)))
 
 (defun gnus-summary-write-article-file (&optional arg)
   "Write the current article to a file, deleting the previous file.
@@ -11336,18 +11357,8 @@ If N is nil and any articles have been marked with the process mark,
 save those articles instead."
   (interactive "P")
   (require 'gnus-art)
-  ;; When saving many files, use `gnus-summary-write-to-file' first
-  ;; and `gnus-summary-save-in-file' thereafter unless
-  ;; `gnus-prompt-before-saving' is `always'.
-  (let ((gnus-default-article-saver
-        (if (eq gnus-prompt-before-saving 'always)
-            'gnus-summary-write-to-file
-          (lambda (&rest args)
-            (prog1
-                (apply 'gnus-summary-write-to-file args)
-              (setq gnus-default-article-saver
-                    'gnus-summary-save-in-file))))))
-    (gnus-summary-save-article arg nil t)))
+  (let ((gnus-default-article-saver 'gnus-summary-write-to-file))
+    (gnus-summary-save-article arg)))
 
 (defun gnus-summary-save-article-body-file (&optional arg)
   "Append the current article body to a file.
@@ -11358,7 +11369,18 @@ save those articles instead."
   (interactive "P")
   (require 'gnus-art)
   (let ((gnus-default-article-saver 'gnus-summary-save-body-in-file))
-    (gnus-summary-save-article arg nil t)))
+    (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.