gnus: Saving Articles
3.16 Saving Articles
====================
Gnus can save articles in a number of ways. Below is the documentation
for saving articles in a fairly straight-forward fashion (i.e., little
processing of the article is done before it is saved). For a different
approach (uudecoding, unsharing) you should use ‘gnus-uu’ (
Decoding Articles).
For the commands listed here, the target is a file. If you want to
save to a group, see the ‘B c’ (‘gnus-summary-copy-article’) command
(Mail Group Commands).
If ‘gnus-save-all-headers’ is non-‘nil’, Gnus will not delete
unwanted headers before saving the article.
If the preceding variable is ‘nil’, all headers that match the
‘gnus-saved-headers’ regexp will be kept, while the rest will be deleted
before saving.
‘O o’
‘o’
Save the current article using the default article saver
(‘gnus-summary-save-article’).
‘O m’
Save the current article in a Unix mail box (mbox) file
(‘gnus-summary-save-article-mail’).
‘O r’
Save the current article in Rmail format
(‘gnus-summary-save-article-rmail’). This is mbox since Emacs 23,
Babyl in older versions.
‘O f’
Save the current article in plain file format
(‘gnus-summary-save-article-file’).
‘O F’
Write the current article in plain file format, overwriting any
previous file contents (‘gnus-summary-write-article-file’).
‘O b’
Save the current article body in plain file format
(‘gnus-summary-save-article-body-file’).
‘O h’
Save the current article in mh folder format
(‘gnus-summary-save-article-folder’).
‘O v’
Save the current article in a VM folder
(‘gnus-summary-save-article-vm’).
‘O p’
‘|’
Save the current article in a pipe. Uhm, like, what I mean is—Pipe
the current article to a process (‘gnus-summary-pipe-output’). If
given a symbolic prefix (Symbolic Prefixes), include the
complete headers in the piped output. The symbolic prefix ‘r’ is
special; it lets this command pipe a raw article including all
headers. The ‘gnus-summary-pipe-output-default-command’ variable
can be set to a string containing the default command and options
(default ‘nil’).
‘O P’
Save the current article into muttprint. That is, print it using
the external program Muttprint (http://muttprint.sourceforge.net/).
The program name and options to use is controlled by the variable
‘gnus-summary-muttprint-program’. (‘gnus-summary-muttprint’).
All these commands use the process/prefix convention (
Process/Prefix). If you save bunches of articles using these
functions, you might get tired of being prompted for files to save each
and every article in. The prompting action is controlled by the
‘gnus-prompt-before-saving’ variable, which is ‘always’ by default,
giving you that excessive prompting action you know and loathe. If you
set this variable to ‘t’ instead, you’ll be prompted just once for each
series of articles you save. If you like to really have Gnus do all
your thinking for you, you can even set this variable to ‘nil’, which
means that you will never be prompted for files to save articles in.
Gnus will simply save all the articles in the default files.
You can customize the ‘gnus-default-article-saver’ variable to make
Gnus do what you want it to. You can use any of the eight ready-made
functions below, or you can create your own.
‘gnus-summary-save-in-rmail’
This is the default format, that used by the Rmail package. Since
Emacs 23, Rmail uses standard mbox format. Before this, it used
the “Babyl” format. Accordingly, this command writes mbox format
since Emacs 23, unless appending to an existing Babyl file. In
older versions of Emacs, it always uses Babyl format. Uses the
function in the ‘gnus-rmail-save-name’ variable to get a file name
to save the article in. The default is ‘gnus-plain-save-name’.
‘gnus-summary-save-in-mail’
Save in a Unix mail (mbox) file. Uses the function in the
‘gnus-mail-save-name’ variable to get a file name to save the
article in. The default is ‘gnus-plain-save-name’.
‘gnus-summary-save-in-file’
Append the article straight to an ordinary file. Uses the function
in the ‘gnus-file-save-name’ variable to get a file name to save
the article in. The default is ‘gnus-numeric-save-name’.
‘gnus-summary-write-to-file’
Write the article straight to an ordinary file. The file is
overwritten if it exists. Uses the function in the
‘gnus-file-save-name’ variable to get a file name to save the
article in. The default is ‘gnus-numeric-save-name’.
‘gnus-summary-save-body-in-file’
Append the article body to an ordinary file. Uses the function in
the ‘gnus-file-save-name’ variable to get a file name to save the
article in. The default is ‘gnus-numeric-save-name’.
‘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
‘gnus-file-save-name’ variable to get a file name to save the
article in. The default is ‘gnus-numeric-save-name’.
‘gnus-summary-save-in-folder’
Save the article to an MH folder using ‘rcvstore’ from the MH
library. Uses the function in the ‘gnus-folder-save-name’ variable
to get a file name to save the article in. The default is
‘gnus-folder-save-name’, but you can also use
‘gnus-Folder-save-name’, which creates capitalized names.
‘gnus-summary-save-in-vm’
Save the article in a VM folder. You have to have the VM mail
reader to use this setting.
‘gnus-summary-save-in-pipe’
Pipe the article to a shell command. This function takes optional
two arguments COMMAND and RAW. Valid values for COMMAND include:
• a string
The executable command name and possibly arguments.
• ‘nil’
You will be prompted for the command in the minibuffer.
• the symbol ‘default’
It will be replaced with the command which the variable
‘gnus-summary-pipe-output-default-command’ holds or the
command last used for saving.
Non-‘nil’ value for RAW overrides ‘:decode’ and ‘:headers’
properties (see below) and the raw article including all headers
will be piped.
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’,
‘gnus-summary-write-body-to-file’, and ‘gnus-summary-save-in-pipe’.
‘: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.
All of these functions, except for the last one, will save the
article in the ‘gnus-article-save-directory’, which is initialized from
the ‘SAVEDIR’ environment variable. This is ‘~/News/’ by default.
As you can see above, the functions use different functions to find a
suitable name of a file to save the article in. Below is a list of
available functions that generate names:
‘gnus-Numeric-save-name’
File names like ‘~/News/Alt.andrea-dworkin/45’.
‘gnus-numeric-save-name’
File names like ‘~/News/alt.andrea-dworkin/45’.
‘gnus-Plain-save-name’
File names like ‘~/News/Alt.andrea-dworkin’.
‘gnus-plain-save-name’
File names like ‘~/News/alt.andrea-dworkin’.
‘gnus-sender-save-name’
File names like ‘~/News/larsi’.
You can have Gnus suggest where to save articles by plonking a regexp
into the ‘gnus-split-methods’ alist. For instance, if you would like to
save articles related to Gnus in the file ‘gnus-stuff’, and articles
related to VM in ‘vm-stuff’, you could set this variable to something
like:
(("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff")
("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff")
(my-choosing-function "../other-dir/my-stuff")
((equal gnus-newsgroup-name "mail.misc") "mail-stuff"))
We see that this is a list where each element is a list that has two
elements—the “match” and the “file”. The match can either be a string
(in which case it is used as a regexp to match on the article head); it
can be a symbol (which will be called as a function with the group name
as a parameter); or it can be a list (which will be ‘eval’ed). If any
of these actions have a non-‘nil’ result, the “file” will be used as a
default prompt. In addition, the result of the operation itself will be
used if the function or form called returns a string or a list of
strings.
You basically end up with a list of file names that might be used
when saving the current article. (All “matches” will be used.) You
will then be prompted for what you really want to use as a name, with
file name completion over the results from applying this variable.
This variable is ‘((gnus-article-archive-name))’ by default, which
means that Gnus will look at the articles it saves for an ‘Archive-name’
line and use that as a suggestion for the file name.
Here’s an example function to clean up file names somewhat. If you
have lots of mail groups called things like ‘nnml:mail.whatever’, you
may want to chop off the beginning of these group names before creating
the file name to save to. The following will do just that:
(defun my-save-name (group)
(when (string-match "^nnml:mail." group)
(substring group (match-end 0))))
(setq gnus-split-methods
'((gnus-article-archive-name)
(my-save-name)))
Finally, you have the ‘gnus-use-long-file-name’ variable. If it is
‘nil’, all the preceding functions will replace all periods (‘.’) in the
group names with slashes (‘/’)—which means that the functions will
generate hierarchies of directories instead of having all the files in
the top level directory (‘~/News/alt/andrea-dworkin’ instead of
‘~/News/alt.andrea-dworkin’.) This variable is ‘t’ by default on most
systems. However, for historical reasons, this is ‘nil’ on Xenix and
usg-unix-v machines by default.
This function also affects kill and score file names. If this
variable is a list, and the list contains the element ‘not-score’, long
file names will not be used for score files, if it contains the element
‘not-save’, long file names will not be used for saving, and if it
contains the element ‘not-kill’, long file names will not be used for
kill files.
If you’d like to save articles in a hierarchy that looks something
like a spool, you could
(setq gnus-use-long-file-name '(not-save)) ; to get a hierarchy
(setq gnus-default-article-saver
'gnus-summary-save-in-file) ; no encoding
Then just save with ‘o’. You’d then read this hierarchy with
ephemeral ‘nneething’ groups—‘G D’ in the group buffer, and the top
level directory as the argument (‘~/News/’). Then just walk around to
the groups/directories with ‘nneething’.