This manual documents the VM mail reader, a Lisp program which runs as a subsystem under Emacs. The manual is divided into the following chapters.
This manual corresponds to VM version 9.0.0snapshot.
VM, short for “View Mail,” is a mail reader that runs within the Emacs editor. If you are already an Emacs-user, you will be working in a familiar environment. You might have even used other Emacs-based mail readers such as Rmail and Gnus. If you are new to Emacs, you can start using VM via the menubar and toolbar until you become familiar with it. Then you can move on to keyboard shortcuts and advanced features. VM runs in GNU Emacs, and needs version 28.1 or later.
Emacs provides a powerful text-based user interface for VM users, with facilities for quick navigation, incremental searching , sophisticated customization and powerful add-on functions. You also have all the editing features of Emacs available for composing mail, without having to switch environments.
VM was developed by Kyle Jones starting in 1989. It was a leader in mail-reading functionality by introducing features like thread management, virtual folders, automatic archiving of messages and a full treatment of MIME. VM can interface to other packages available in Emacs, for remote file access, BBDB address book, GPG encryption and Org mode task management etc. It can also invoke external utilities available on your system such as mail filtering tools and html rendering tools.
VM can read and store mail on your file system (both local and
remote). It can also handle mail stored in remote file servers
running POP and IMAP protocols. The local folders are stored in
mbox format, which many other mail readers use as well, so a folder
another reader wrote in that format is one VM can open. Thunderbird is one
of them where it has been told to store mail as mbox rather than as maildir,
which VM cannot read at all. VM also handles the Babyl format used
by Emacs Rmail, so archived Rmail folders can be read too.
Where mail is on an IMAP server, two readers can of course see it at once, VM being one of them.
There are also a few things that VM cannot (yet) do. It does not have the ability to deal with maildir folders. It cannot be used to read newsgroups and RSS feeds. It does not have its own mail filtering tools. VM is actively developed, so this list is worth checking against the newest NEWS file rather than taken as permanent.
VM has been found most useful by professional users who must deal with large quantities of email in the course of their work, and deal with it efficiently and reliably. We enjoy using VM and find that it is better than any other mail tool in its flexibility and efficiency. We hope you will too!
– VM Development Team
VM is a package on NonGNU ELPA, which Emacs 28.1 and later know about without being told:
M-x package-install RET vm RET
That is the whole of it. Nothing else has to be loaded or required: VM’s
commands are autoloaded, so M-x vm works from the next keystroke, and
package-install arranges for VM to be there in later sessions too.
To build from source instead, clone https://gitlab.com/emacs-vm/vm and follow INSTALL.md in it. That is the way to run what is being worked on rather than what was last released, and the way to send a patch that applies.
A distribution may package VM as well, and such a package can be years behind: one that predates every release named in History and Administration has been seen in the wild. Check what you have with M-x vm-view-news, whose first entry names the version, and prefer ELPA unless you have a reason not to.
See Overview, for what to type once it is installed, and Setting Up for a configuration built one piece at a time.
VM (View Mail) reads and disposes of your mail inside Emacs, whether it is in a file on this machine or on a POP or IMAP server. Commands exist to do the normal things expected of a mail user agent, such as generating replies, saving messages to folders, deleting messages and so on. There are other more advanced commands that do tasks like bursting and creating digests, message forwarding, and organizing message presentation according to various criteria.
You can make VM your default mail user agent by setting mail-user-agent
to vm-user-agent, e.g. by M-x customize-variable RET
mail-user-agent RET.
To invoke VM, type M-x vm. VM gathers any mail that has arrived in your system mailbox and appends it to a mail folder known as your primary inbox, and visits that folder for reading. See Starting Up. Depending on how you have configured VM, the primary inbox might be a file on your file system (in a format understood by VM) or it could be a folder on a remote mail server.
If you type ? in a VM folder buffer you will get some help, i.e.
vm-help is called.
M-x vm-view-manual opens this manual, and M-x vm-view-news the newest of VM’s NEWS files, which is where a release says what changed.
If there are any messages in the primary inbox, VM selects the first new
or unread message, and previews it. Previewing is VM’s way of
showing you part of a message and allowing you to decide whether you want
to read it. See Previewing. By default VM shows you the message’s
sender, recipient, subject and date headers. Typing SPC
(vm-scroll-forward) exposes the body of the message and flags the
message as read. Subsequent SPC’s scroll forward through the
message, DEL scrolls backward. When you reach the end
of a message, typing SPC or n moves you forward to preview
the next message. See Paging.
If you do not want to read a message that’s being previewed, type n and VM will move to the next message (if there is one). See Navigating.
To save a message to a mail folder use s (vm-save-message).
VM will prompt you for the folder name in the minibuffer.
See Saving Messages.
Messages are deleted by typing d (vm-delete-message) while
previewing or reading them. The message is not removed right away; VM
makes a note that you want the message to be removed later. If you
change your mind about deleting a message, select it and type u
(vm-undelete-message), and the message will be undeleted.
See Deleting Messages. The actual removal of deleted messages from
the current folder is called expunging or compacting, and it is
accomplished by
typing ### (vm-expunge-folder, vm-compact-folder). The
deleted messages are still present
in the on-disk version of the folder until the folder is saved.
Typing h (vm-summarize, vm-headers-summary) causes VM to
display a window containing a summary of the contents of the current folder.
The summary is presented one line per message, by message number, listing
each message’s author, date sent, line and byte count, and subject. Also,
various letters appear beside the message number to indicate that a message
is new, unread, flagged for deletion, etc. An arrow ‘->’ appears to
the left of the line summarizing the current message. The summary format is
user configurable, see Summaries.
When you are finished reading mail the current folder must be saved, so
that the next time the folder is visited VM will know which messages
have been already read, replied to and so on. Typing S
(vm-save-folder) saves the folder. The default behavior is
that deleted messages are not expunged automatically when you
save a folder.
The next time you visit the folder any deleted
messages will still be flagged for deletion. see Deleting Messages.
When a folder is first visited, the value of the variable
vm-folder-file-precious-flag is used to initialize a
buffer-local instance of file-precious-flag, which
determines how folders are saved. A non-nil value causes
folders to be saved by writing to a temporary file and then
replacing the folder with that file. A nil value causes
folders to be saved by writing directly to the folder without
the use of a temporary file.
Writing a temporary file and renaming it into place replaces the folder’s own
name, which matters if the name you visited is a link. For a symbolic
link VM sets Emacs’s file-preserve-symlinks-on-save as well, so the
folder is saved through the link and the mailbox it names is the file that
changes. A hard link cannot be preserved that way: replacing a file
atomically and keeping another name pointing at the same contents are not both
possible, so a folder you reach through a hard link needs
vm-folder-file-precious-flag set to nil, at the cost of the
protection above.
If the folder is empty at the time you save it and the variable
vm-delete-empty-folders is non-nil, VM will remove
the zero length folder after saving it.
To quit visiting a folder you can type q (vm-quit) or
x (vm-quit-no-change). Typing q saves the current
folder before quitting. Also, any messages flagged new are changed to
be flagged as old and unread, before saving. The x command quits
a folder without changing the status of new messages, saving or
otherwise modifying the current folder.
Whether either of them asks first is up to you:
Value of t causes VM to always ask for confirmation before quitting a VM visit of a folder. A nil value means VM will ask only when messages will be lost unwittingly by quitting, i.e. not removed by intentional delete and expunge. A value that is not nil and not t causes VM to ask only when there are unsaved changes to message attributes, or when messages will be unwittingly lost.
Default value: if-something-will-be-lost
You do not have to quit a folder to continue using Emacs for other
purposes. M-x vm-quit-just-bury buries the buffers associated with
the current folder deep in Emacs’ stack of buffers, but otherwise leaves
the folder visited so that you can resume reading messages quickly.
You can return to the folder using M-x vm-switch-to-folder.
Or, you can locate the folder’s buffers again by using list-buffers,
which is normally bound to C-x C-b.
Another command you can use if you are using a window system like X
Windows is vm-quit-just-iconify. This command buries the
folder’s buffers like vm-quit-just-bury and also iconifies the
current frame.
At any time while reading mail in any folder you can type g
(vm-get-new-mail) to check to see if new mail for that folder has
arrived. If new mail has arrived it will be moved from the spool files
or maildrops associated with the current folder and merged into the
folder. If you are not in the middle of another message, VM will also
move to the first new or unread message.
If vm-get-new-mail is given a prefix argument, it will prompt for
another file from which to gather messages instead of the usual spool
files. In this case the source folder is copied but no messages are
deleted from it as they would be for a spool file.
The file need not be a folder of this folder’s type. One of another type
VM knows is converted as it is gathered, which is what
vm-check-folder-types and vm-convert-folder-types describe;
set the latter to nil to be told of the mismatch instead. A file
holding a single message with no envelope line, which is what a .eml
file saved out of another mailer is, is wrapped in this folder’s separators
and gathered as one message. Anything else is refused.
Two prefix arguments (C-u C-u g) mean something else again, and only for an IMAP folder: fetch every message the mailbox has and this folder has not, including the ones VM has recorded as retrieved once already. That record is what stops a message you deleted here from coming back, so this is not for reading mail day to day; it is how to refill a cache folder that has lost messages some other way. See IMAP Synchronization.
By default your primary inbox has your system mailbox associated with
it, e.g. /var/spool/mail/kyle, and so typing g will retrieve
mail from this file. Your system mailbox is one example of a spool
file, a file that the mail transport system delivers messages into.
You can associate other spool files with your primary inbox and spool
files with other folders by setting the variable
vm-spool-files. See Spool Files.
M-x vm is how you begin, and on a machine whose mail is already where Emacs expects it that is all you need. Otherwise VM has to be told where your mail is: Setting Up builds a configuration one piece at a time, and M-x vm-check-configuration says what is still missing.
The rest of this chapter is what happens when VM starts, which is worth knowing when something does not.
The first time VM is started in an Emacs session, it attempts to load
the file specified by the variable vm-init-file, normally
~/.vm. If present this file should contain Lisp code, much
like the .emacs file. It should contain the “configuration
settings” for VM, i.e., variables that define where the mail folders
are stored, where the incoming mail is to be found, the various
directories that VM needs to use for its operation and the external
applications that VM can invoke. You can reload this file by typing
M-x vm-load-init-file from within VM.
See Setting Up, for a configuration built one piece at a time. The same settings in one file ship with VM as example.vm: in VM’s documentation directory where VM was installed from source, and in the package’s own directory, ~/.emacs.d/elpa/vm-version/, where it came from ELPA. It names servers and addresses that do not exist, so it is to be read and taken from rather than used as it stands.
In addition, VM also attempts to load a file specified by the variable
vm-preferences-file, normally ~/.vm.preferences. This
file should contain your preferential settings for various VM
variables affecting how VM works. Since VM has well over one
hundred configuration variables, use of the ~/.vm.preferences
can considerably reduce clutter in the .vm file.
Invoking vm-load-init-file with a prefix argument (e.g.,
C-u) causes the vm-init-file to be loaded without the
vm-preferences-file. VM then works with its default settings for everything the
preferences file would have changed, while still reading
vm-init-file. If you ever find a problem with VM’s behaviour, it is
a good idea to run it that way to see whether the preferences caused it.
M-x vm causes VM to visit a folder known as your primary
inbox, specified by the variable vm-primary-inbox. It also gathers
any new mail that has arrived and puts it in that folder, which is what
vm-auto-get-new-mail asks for and is its default; set it to
nil and g (vm-get-new-mail) is the only way mail
arrives. The default setting for your
primary inbox is the local file ~/INBOX, but a variety of
other options are available.
VM can work with mail folders saved on the local file system. See Local Folders. It can also work with mail folders stored on remote mail servers, such as POP and IMAP servers. See POP and IMAP Folders. Server folders have the advantage that they can be accessed from multiple locations on the internet. VM might appear to have a bias towards local folders due to its history of development. But it treats server folders with equal facility.
M-x vm-visit-folder (v from within VM) allows you to visit any local mail folder. The folder name will be prompted for in the minibuffer. M-x vm-visit-pop-folder and M-x vm-visit-imap-folder perform similar function for server folders.
With a prefix argument M-x vm-visit-folder visits a folder in
“read-only” mode. In read-only mode, no attribute changes, messages
additions or deletions will be allowed in the visited folder. However, VM
might still make internal changes to the visited folder (with the effect
that you might see the buffer-modified indicator in the modeline). These
changes will be discarded when the folder is quit. The variable
vm-preserve-read-only-folders-on-disk should be set to nil if
you want to save VM’s internal modifications.
Once VM has read the folder and assimilated any new mail, the first new or unread message will be selected, if any. If there is no such message, VM will select whatever the selected message was when this folder was last saved. If this folder has never been visited and saved by VM, then the first message in the folder is selected.
M-x vm-mode can be used on a buffer already loaded into Emacs
to put it into the VM major mode so that VM commands can be executed
on it. This command is suitable for use in Lisp programs, and for
inclusion in auto-mode-alist to automatically start VM on a
file based on a particular filename suffix. vm-mode skips
some of VM’s start-up procedures (e.g. starting up a summary) to make
non-interactive use easier.
Whether a summary of the folder appears at startup is up to you:
Value tells VM whether to generate a summary when a folder is visited. Nil means don’t automatically generate a summary.
A value of t means always generate a summary.
A positive numeric value N means only generate a summary if there are N or more messages.
A negative numeric value -N means only generate a summary if there are N or less messages.
Default value: t
A local mail folder is simply a file that can be stored on the local file system. VM works with the Unix mbox format to store messages in folders. It can also work with the Babyl format used by the Emacs Rmail package. The subtypes of mboxes handled by VM are listed under Folder types below.
It is a good idea to create directory, e.g., ~/Mail, where all
of VM’s local folders will be kept. If you create such a directory,
you should set the variable vm-folder-directory to point to it.
A spool file is a file where the mail transport system delivers messages intended for you. On Unix systems, a program called /bin/mail or /bin/mail.local does this delivery. It is also possible for agents such as procmail, filter and slocal to be invoked from a user’s ~/.forward or ~/.qmail files, sorting the incoming mail into separate spool files. On other systems, incoming mail may be delivered to mailboxes on remote mail servers, from where it can be retrieved through protocols like POP and IMAP. No matter what the delivery agent, what all spool files have in common is that mail is delivered into them by one or more entities apart from VM and that all access to spool files must therefore be accompanied by the use of some file locking protocol.
When spool files are on the local file system, VM uses the program
movemail, a program distributed with Emacs to extract mail from
a spool file. The variable vm-movemail-program specifies the
name of the movemail program. Its default, nil, means the one
Emacs came with, in exec-directory.
If this Emacs has none, getting new mail from a local spool file signals an
error saying what to do about it. An Emacs without its own movemail is not
broken: it is left out when Emacs is built --with-mailutils, which is
Emacs’s default whenever GNU Mailutils is present at build time. Set
vm-movemail-program to the one you want to use, bearing in mind the
warning below about what Mailutils’ does to a mailbox.
The variable vm-movemail-program-switches lets you specify some
initial command line argument to pass to the movemail program.
It has to be Emacs’s movemail and not merely the first movemail on
exec-path. Emacs’s copies the spool byte for byte, which is all VM
asks of it; other implementations move mail by parsing and rewriting it. GNU
Mailutils’ movemail, which is /usr/bin/movemail on Debian and Ubuntu
once the mailutils package is installed, rewrites the ‘From ’ separator
line, adds headers of its own, and given a message whose body is empty reads
the message after it as body text and writes the two out as one. Setting
vm-movemail-program to it deliberately is fine for a maildrop it does
not mangle; what the default avoids is picking it up by accident.
VM asks movemail for local spool files only: POP and IMAP retrieval are VM’s own, so the extra protocols other movemail implementations support are of no use here.
VM transfers the mail from a spool file to a folder via a
temporary file known as the crash box. The variable
vm-crash-box names the crash box file for the primary inbox.
Or a crash-box name may be created from vm-crash-box-suffix
described below.
(see Spool Files.)
VM first copies the mail to the crash box, truncates the spool file
to zero messages, merges the crash box contents into the
primary inbox, and then deletes the crash box. If the system or Emacs
should crash in the midst of this activity, any message not present in
the primary inbox will be either in the spool file or the crash
box. Some messages may be duplicated but no mail will be lost.
If the file named by vm-crash-box already exists when VM is
started up, VM will merge that file with the primary inbox before
retrieving any new messages from the system mailbox.
Every folder, including the primary inbox, can have one or more spool
files associated with it. You make these associations known to VM by
setting the variable vm-spool-files.
If you only want to associate spool files with your primary inbox, you
can set vm-spool-files to a list of strings. By default, the location
of your system mailbox (the spool file that is associated with your
primary inbox) is determined heuristically based on what type of system
you’re using. VM can be told explicitly where the system mailbox is by
setting vm-spool-files like this:
(setq vm-spool-files '("/var/spool/mail/kyle" "~/Mailbox"))
With this setting, VM will retrieve mail for the primary inbox from first /var/spool/mail/kyle and then ~/Mailbox.
If the value of vm-spool-files is nil, a default value for
vm-spool-files will be inherited from the shell environmental
variables MAILPATH or MAIL if either of these variables are defined.
This inheritance happens before your init file is loaded, so setting
vm-spool-files in your init file will override any environmental
variables.
If you want to associate spool files with folders other than or in
addition to the primary inbox, the value of vm-spool-files must be a
list of lists. Each sublist specifies three entities, a folder, a spool
file and a crash box. When retrieving mail for a particular folder, VM
will scan vm-spool-files for folder names that match the current
folder’s name. The spool file and crash box found in any matching
entries will be used to gather mail for that folder.
For example, you can set vm-spool-files like this
(setq vm-spool-files
'(
("~/INBOX" "/var/spool/mail/kyle" "~/INBOX.CRASH")
("~/INBOX" "~/Mailbox" "~/INBOX.CRASH")
("~/Mail/bugs" "/var/spool/mail/answerman" "~/Mail/bugs.crash")
)
)
The folder ~/INBOX has two spool files associated with it in this example, /var/spool/mail/kyle and ~/Mailbox. Another folder, "~/Mail/bugs" has one spool file /var/spool/mail/answerman associated with it. Note that both of the ~/INBOX entries used the same crash box. The crash box can be the same if the folder name is the same. Different folders should use different crashboxes.
An alternate way of specifying folder/spool file associations
is to use the variables vm-spool-file-suffixes and
vm-crash-box-suffix.
The value of vm-spool-file-suffixes should be a list of string suffixes
to be used to create possible spool file names for folders. Example:
(setq vm-spool-file-suffixes '(".spool" "-"))
With vm-spool-file-suffixes set this way, if you
visit a
folder ~/mail/beekeeping, when VM attempts to retrieve new mail for
that folder it will look for mail in ~/mail/beekeeping.spool
and ~/mail/beekeeping- in addition to scanning vm-spool-files
for matches. The value of vm-spool-file-suffixes will not be used
unless vm-crash-box-suffix is also defined, since a crash box is
required for all mail retrieval from spool files.
The value of vm-crash-box-suffix should be a string suffix used to
create possible crash box file names for folders. When VM uses
vm-spool-file-suffixes to create a spool file name, it will append
the value of vm-crash-box-suffix to the folder’s file name to
create a crash box name. If the value of vm-spool-file-suffixes
is nil, then the value of vm-crash-box-suffix is not used
by VM.
The idea behind vm-spool-file-suffixes and
vm-crash-box-suffix is to give you a way to have many
folders with individual spool files associated with them, without
having to list them all in vm-spool-files. If you need
even more control of spool file and crash box names, use
vm-make-spool-file-name and vm-make-crash-box-name.
The value of both of these should be a function or the name of a
function. When VM visits a folder, it will call the function
with the name of the folder as an argument, and the function
should return the spool file name or crash box name to be used
for that folder.
If your spool file is on another host, VM supports accessing spool files on remote hosts using the POP and IMAP protocols.
VM can access spool files on mail servers via the Post Office Protocol (POP). To use a POP mailbox as a spool file, you need to use a POP maildrop specification (maildrop specification, POP and IMAP Folders). Once this is done, VM will retrieve new mail from the POP mailbox in the same way as it retrieves it from system mailbox. The retrieved messages can be automatically removed from the POP mailbox or retained until a later expunge (compact) operation.
VM retrieves the messages while you carry on reading: the fetch is started and Emacs comes straight back to you, the messages arrive a bunch at a time, and the mode line says how far it has got. One fetch brings in everything waiting, however large the mailbox.
You can say how large a message VM will fetch at all. If you set
vm-pop-max-message-size to a positive numeric value, VM leaves a
message larger than that on the server and says how large it was and what the
limit is; raise the limit and the next vm-get-new-mail brings it in.
In earlier releases VM asked, message by message, whether to retrieve it.
After VM retrieves messages from the mailbox, the default action is to
leave the original messages on the server unchanged. They can be
expunged from the server by running vm-expunge-pop-messages;
only those messages that VM has retrieved into the current folder will
be expunged.
If you want VM to expunge the messages automatically after retrieving
them, you can set vm-pop-expunge-after-retrieving to t.
But a better method is to set the variable
vm-pop-auto-expunge-alist, which gives you a way to specify, on
a per-mailbox basis, which POP mailboxes should have messages
automatically
removed after retrieving and which ones should leave the messages on the
POP
server. The value of vm-pop-auto-expunge-alist should be a
list of POP mailboxes and values specifying whether messages should
be automatically deleted from the mailbox after retrieval. The format
of the list is:
((MAILDROP . VAL) (MAILDROP . VAL) ...)
MAILDROP should be a POP maildrop specification as described
in the documentation for the variable vm-spool-files. If
you have the POP password specified in the vm-spool-files
entry, you do not have to specify it here as well. Use ‘*’
instead; VM will still understand that this mailbox is the same as
the one in vm-spool-files that contains the password.
VAL should be nil if retrieved messages should be left in the
corresponding POP mailbox, t if retrieved messages should be
removed from the mailbox immediately after retrieval.
Here is an example:
(setq vm-pop-auto-expunge-alist
'(
("odin.croc.net:110:pass:kyle:*" . nil) ;; leave message on the server
("hilo.harkie.org:110:pass:kyle:*" . t) ;; expunge immediately
)
)
VM can also use IMAP (Internet Message Access Protocol) to
retrieve mail from a mail server.
As with POP, instead of specifying a local file name in the
vm-spool-files definition, you would give an IMAP maildrop
specification (maildrop specification, POP and IMAP Folders).
Once this is done, VM will retrieve new mail from the IMAP mailbox in
the same way as it retrieves it from system mailbox. The retrieved
messages can be automatically removed from the IMAP mailbox or
retained until a later expunge operation.
VM retrieves the messages while you carry on reading: the fetch is started and Emacs comes straight back to you, the messages arrive a bunch at a time, and the mode line says how far it has got. One fetch brings in everything waiting, however large the mailbox.
You can say how large a message VM will fetch at all. If you set
vm-imap-max-message-size to a positive numeric value, VM will not
retrieve messages larger than this size from a maildrop. Each one is left
on the server, and VM says how large it was and
what the limit is; raise the limit and the next vm-get-new-mail brings
it in. In earlier releases VM asked, message by message, whether to retrieve
it, delete it or leave it, and showed you its headers to decide by.
This is about a maildrop, fetched into a local folder, which cannot go back to
the server for a body later. In an IMAP folder an oversize message
is retrieved as its headers alone where vm-enable-external-messages
includes imap, and its body is fetched when you read it.
After VM retrieves messages from the mailbox, the default action is to
leave the original messages on the server unchanged. They can be
expunged from the server by running vm-expunge-imap-messages;
only those messages that VM has retrieved into the current folder will
be expunged.
If you want VM to expunge the messages automatically after retrieving them,
you can set vm-imap-expunge-after-retrieving to t. But a
better method is to set the variable vm-imap-auto-expunge-alist,
which gives you a way to specify, on a per-mailbox basis, which
IMAP mailboxes should have messages automatically removed after
retrieving and which ones should leave the messages on the IMAP
server. The value of vm-imap-auto-expunge-alist should be a list of
IMAP mailboxes and values specifying whether messages should be
automatically deleted from the mailbox after retrieval. The format of the
list is:
((MAILDROP . VAL) (MAILDROP . VAL) ...)
MAILDROP should be an IMAP maildrop specification as described
in the documentation for the variable vm-spool-files. If
you have the IMAP password specified in the vm-spool-files
entry, you do not have to specify it here as well. Use ‘*’
instead; VM will still understand that this mailbox is the same as
the one in vm-spool-files that contains the password.
VAL should be nil if retrieved messages should be left in the
corresponding IMAP mailbox, t if retrieved messages should be
removed from the mailbox immediately after retrieval.
Here is an example:
(setq vm-imap-auto-expunge-alist
'(
;; leave message on the server
("imap:odin.croc.net:143:inbox:login:kyle:*" . nil)
;; expunge immediately
("imap:hilo.harkie.org:143:inbox:login:kyle:*" . t)
)
)
A principal idea behind the IMAP protocol is that messages can be retained on the server so that you can read them from multiple locations, e.g., from office and home, or from other places on the Internet while you travel. If you access your IMAP mailbox from multiple locations then you would need to plan your strategy for expunging messages carefully. For instance, if you access your work mailbox from home, and both your office machine and home machine expunge messages after retrieving them, then some of your mail will end up on your office machine and some on your home machine. That is unlikely to be a successful strategy.
The best way to access IMAP mailboxes from multiple locations is
to use the facility of IMAP folders. (See POP and IMAP Folders.) However, if you prefer to download all mail to
local folders, then your best bet is to designate one of your machines as
the principal location for downloading mail and treat the other machines as
temporary mail reading sites. In that case, you should set the principal
downloading location to expunge messages on the server and set the other
reading sites to leave the messages on the server intact. You can also
manually run vm-expunge-imap-messages if you are careful to remember
which site should expunge messages and which site should retain them.
VM remembers the messages you have downloaded from an IMAP spool
file so that it can avoid downloading them again on your next visit. The
list of these messages is written into a special mail header titled
X-VM-IMAP-Retrieved in your mail folder. When you expunge
IMAP messages, their entries are deleted from the list. However,
when you designate one of your machines as a reading site and never expunge
messages from there, then the X-VM-IMAP-Retrieved header on
that machine will only grow over time. When the list gets excessively long,
it will slow down the saving of folders.
To avoid the problem, you should periodically run the command
vm-prune-imap-retrieved-list. It will examine the IMAP server
to see which messages still exist and retain only their information in
the X-VM-IMAP-Retrieved header.
VM can create an index file, which describes the messages contained in a folder. If such an index file exists and is up to date, then VM will read the contents of the index file first while starting up in order to quickly form the summary of the folder.
To use this feature, set the variable vm-index-file-suffix to a
file name extension, e.g.,
(setq vm-index-file-suffix "idx")
VM can handle a variety of formats for mail folders, which differ in
details. The variable vm-default-folder-type can be used to
set the default format that is suitable for your environment. This
setting is used when VM creates new folders.
VM’s own format has not changed: a folder is a From_ folder (VM’s mbox,
see VM's mbox) unless you ask for something else. mboxcl2 is opt-in,
and the way to ask is the folder’s name: an extension of ‘.mboxcl2’.
Nothing converts a folder of yours behind you, and neither VM nor an
FCC: nor a cache turns From_ into mboxcl2 on its own.
When VM reads a folder from the file system, it examines contents of the folder to determine what format it is stored in and decodes it appropriately. (However, such inference is not fully automatic. See below.)
Every message in an mboxcl2 folder carries a Content-Length header,
which is how the end of a message is found.
vm-change-folder-type is the repair for both. Converting a folder to
the type it already claims recomputes every length.
A folder that does not exist yet has no contents to examine, so a name
can say what it is instead. vm-folder-type-by-extension-alist matches
the file name’s extension against folder types, and out of the box a folder
whose name ends in ‘.mboxcl2’ is created as one, which is what a name
like 2026-08.out.mboxcl2 was already trying to say. ‘.mbox’ is
From_, which is what everything outside VM means by an mbox file.
A name settles the question for an existing folder too, but only between
From_ and mboxcl2: those are the same folder but for the
Content-Length header, so a folder that looks like one gives no
evidence either way. A folder called .mboxcl2 is read as mboxcl2
whether or not it has the headers yet, and one that does not have them is
refused with the message above, which is how you find out, rather than
VM reading it as a From_ folder and saying nothing. A folder’s own
contents win where they decide the question: a BABYL file called
old.mboxcl2 is read as BABYL.
An extension, and not a pattern over the name. A pattern can be written so that it matches nothing, and it does so silently, since a rule that matches nothing is a rule that does nothing. It can also be written so that it claims every folder in a directory, which for a directory holding one mboxcl2 folder and nine From_ ones is nine folders VM then refuses to read. Neither can be said in an extension.
What it costs: a folder that cannot be renamed cannot be typed by its name.
A primary inbox called INBOX is the case, and the answer for one is
vm-default-folder-type, or a name with the extension on it.
In a From_ folder the end of a message is the next line that begins “From ”. Nothing but the structure of the line says so, and mail contains such lines: a message that quotes another message, a digest, a mailing list footer, a base64 attachment that happens to wrap that way. The answer every mailer uses, VM included, is to alter the mail to protect the format, turning such a line in a body into “>From ”. That works, and it costs you the original: a line that already read “>From ” is indistinguishable from one that was quoted, and nobody unquotes on reading, so what you read back is close to what arrived rather than what arrived. VM quotes a narrower set of lines than most, which is a difference of degree and not of kind. See VM's mbox.
An mboxcl2 folder records the length of each body instead, so the boundary is arithmetic rather than a guess, and no body needs altering. Two things follow:
The cost is that the header must be right. A missing one is refused and named; a wrong one is worse, because the folder opens. See Folder types above for the repair. This is why VM writes its own files (the caches below) in mboxcl2 and can be relied on to have got the lengths right, while a folder some other mailer wrote is only as good as that mailer.
There is no standard for mbox, and mailers do not all do the same thing. VM’s From_ folders differ from what other mailers write in several ways. None of it matters while VM alone reads and writes the folder; all of it matters when another program reads that folder, appends to it, or wrote it in the first place.
VM quotes, as every mailer does: a body line that would be taken for a separator gets ‘>’ put in front of it. What differs is which lines. Most mailers quote every body line beginning ‘From ’. VM quotes only a line that begins ‘From ’ and ends in a digit, as a date does: in regular expression terms, ‘^From .*[0-9]$’. So a paragraph beginning “From now on we ship on Fridays” is left exactly as it was written in a VM folder and comes back ‘>From now on’ in most others.
VM quotes on the way in: mail arriving over POP or IMAP,
a message you edit, one you compose or FCC:, a digest you burst, and a
folder whose type you convert.
VM does not unescape on the way out, and neither does the common variant. A line that arrived reading ‘>From bob… 2026’ and one VM escaped are the same line afterwards, and no reader can tell them apart. That variant has a name, mboxo, and the loss is the reason it has a rival: mboxrd escapes ‘>From ’ to ‘>>From ’ as well, so that a reader can strip one ‘>’ and get the original back. VM writes neither. It writes mboxcl2 instead, where the boundary is a byte count and nothing is escaped at all, so there is nothing to reverse.
The ‘>’ is permanent, and it outlasts the folder that called for it. A
message held in mboxcl2, filed or converted into a From_ folder and brought
back to mboxcl2, keeps it: nothing in VM takes off a ‘>’ it put on, so
the byte count on the way back describes the quoted line. Saving a message
from one folder to another of a different type is enough;
vm-change-folder-type is not needed.
One ‘>’ per quoted line is the whole of it, however many trips the message makes. A line already reading ‘>From ’ is left alone, so quoting an already quoted line changes nothing. Only a line matching ‘^From .*[0-9]$’ is ever touched, which is the narrow rule above, so most bodies are not touched at all.
To hold a message exactly as it came, keep it out of From_ folders: file it between mboxcl2 folders, where neither end quotes anything.
Reading a From_ folder, VM takes a line as a separator only if it begins ‘From ’, ends in a digit, and follows an empty line. Writing one, VM quotes without the third test, deliberately: a folder VM writes has to be safe for a reader using the loose rule, which is most of them, and for older versions of VM. So VM quotes some lines it would not itself have mistaken.
The reader’s test is narrower, not exact. A body line that begins ‘From ’, ends in a digit and follows an empty line is read as a separator wherever it was not quoted, in a folder some other program wrote or one assembled by hand, and one message becomes two.
A message must therefore be followed by an empty line, which VM writes. A program that appends to a VM folder without one leaves a message VM reads as part of the message before it.
Everything above is about From_. mboxcl2 finds the end of a message by counting its bytes, so no body line can be mistaken for a separator and none is altered. That is what Why mboxcl2 above means by storing a message exactly as it came, and it is the whole difference between mboxcl2 and the older mboxcl, which counted the bytes and quoted.
The folder does no quoting; it does not undo quoting done elsewhere. A message that has passed through a From_ folder arrives carrying whatever that folder added, and mboxcl2 stores it faithfully, ‘>’ and all.
VM quotes a body line that a From_ or an mmdf folder would read as a separator, as above. It does not quote one that a babyl folder would: a body holding the two characters that begin a babyl message, C-_ and C-l at the start of a line, is written as it stands.
VM reads such a folder back correctly, because its own reader takes those two characters for a separator only where a babyl attribute line follows them. Rmail is less forgiving and refuses the file:
Search failed: ",, ?"
having taken the bare separator for the start of a message and then looked for
the attribute line that is not there. Other readers of the format differ
again: Python’s mailbox.Babyl finds one message more than VM filed.
This is deliberate. Quoting the line would make Rmail read the folder, at the price of a ‘>’ that nothing ever removes, on a message that had none: the same loss described above for From_, in a format where it does not arise today. Babyl is a legacy format here, and the choice was to leave it as it has always been rather than buy Rmail compatibility with a permanent mark on the message.
If you keep mail in babyl folders and want Rmail to be able to open them,
convert them with vm-change-folder-type: an mboxcl2 folder stores a
message exactly as it came and has none of this.
Every message carries an X-VM-v5-Data header holding its attributes,
its labels and the summary data VM caches for it, and the first message in
the folder carries the folder’s own state as well: the message order, the
bookmark, the label list, the summary format, which headers are shown, when
the folder was last modified, and for a cache folder what has been retrieved
from the server and what deletions the server has not been told about yet.
So the first message is not only a message. Another program that deletes it, or moves it, or rewrites its headers, takes the folder’s order and bookmark with it, and for a cache folder the record of what has been fetched and the deletions still owed to the server. Losing any of them but the last two costs no more than the folder’s order and your place in it, both of which VM writes again; losing the last two means mail fetched a second time, or a deletion the server is never told about, which is why a server cache is a folder to leave to VM.
A message’s attributes live in X-VM-v5-Data and nowhere else by
default, so a mailer that reads Status: or X-Status: shows a VM
folder as entirely unread. vm-berkeley-mail-compatibility makes VM
read and write Status: as BSD Mail does; it is on by default
only on the BSDs. Thunderbird is the exception in the other direction:
vm-sync-thunderbird-status is t out of the box, so
X-Mozilla-Status is kept up to date both ways. See Thunderbird Folders.
The escaping rules above have a consequence worth stating plainly: there are folders VM reads correctly that another program does not, and the fault is not in either of them. Two cases, both verified, both one-directional.
VM escapes only a ‘From ’ line that ends in a digit, so a body line such as ‘From the desk of Bob’, standing after a blank line, is left exactly as it was written. VM reads that folder as one message. A program that takes any ‘From ’ line after a blank line as a separator reads it as two, and the second is a fragment with no headers.
Content-Length:.Nothing in an mboxcl2 folder is escaped, so every body line beginning ‘From ’ is exposed. A program that honours the header reads the folder correctly. One that ignores it, and some do, splits the folder at those lines.
The other direction is milder. VM does not unescape, so a folder written by a program that doubles its escapes, mboxrd, shows the extra ‘>’ in the text of the message. Nothing is lost and no message is split; it just reads wrong.
There is no setting that makes a folder safe for every reader, because the readers disagree with each other. If a folder has to be handed to a particular program, the thing to know is which rule that program uses.
The short of it: a From_ folder is safe to share with another program if you are content that read and unread will not travel, that the first message is carrying luggage, and that a message whose body has a ‘From ’ line in it may be escaped differently, and so split differently, at each end. A folder VM writes for itself, a cache above all, is better left to VM, and better still written as mboxcl2, where the boundary is a byte count rather than a line that has to be recognised, and where nothing is escaped at all.
The Library of Congress describes the format family and its variants:
‘https://www.loc.gov/preservation/digital/formats/fdd/fdd000383.shtml’.
The name decides, and between From_ and mboxcl2 the name is the only thing that can:
vm-folder-type-by-extension-alist,
matched against the file name’s extension. A folder called
sent.mboxcl2 is mboxcl2 wherever it sits. Nothing in a folder can
supply this or overrule it. From_ and mboxcl2 look alike: the difference is a
Content-Length header that a From_ folder is free to carry as well, so
a folder that looks like one is no evidence of either.
vm-default-folder-type, for a folder that does not exist yet. It
decides what VM creates and nothing else, so changing it cannot change how a
folder you already have is read. It is From_ on every platform, which
is why a folder called INBOX, or one called 2026-08.out, is VM’s
mbox and stays it.
Set the default to mboxcl2 and it decides the name as well: a folder VM
creates is created as NAME.mboxcl2, whether it is a folder you saved a
message to, an FCC: copy or a postponed draft. That is the same rule
vm-change-folder-type follows when it converts a folder, and for the
same reason: a folder’s type is read back from its name, so mboxcl2 written
under a name that says nothing would be read as From_ next time and split
wherever a body line begins ‘From ’.
Detection is not the same as knowing. A BABYL file called
old.mboxcl2 is read as BABYL, since what is at the front of the file
settles it and reading it as mboxcl2 would read nonsense; but a From_ folder
that collected a few Content-Length headers, which happens, is a folder
VM has to guess about. An empty file gives nothing to detect, and neither
does a folder that does not exist yet, which is where the name and the default
come in.
An FCC: copy, a postponed draft and a server cache are all folders VM
creates without asking, and each is written in the type the same rule gives: an
existing folder keeps the type it has, and a new one is written as its name
asks, else as vm-default-folder-type, From_, unless you have said
otherwise.
FCC: and postponed drafts. Name the file for the type and it is
written in it, so an FCC: of ~/mail/2026-08.out.mboxcl2
accumulates mboxcl2 and one of ~/mail/2026-08.out accumulates whatever
the default is. An existing folder keeps its own type, so an FCC:
never converts a folder behind you.
vm-default-folder-type; a cache is named for its type either way.
A cache made by an earlier VM has no suffix, keeps its name, and is read as
From_. Nothing is converted and nothing is refetched. It could be mboxcl2:
a cache was written in vm-default-folder-type, which was mboxcl2 on
Solaris, AIX and System V until 2026. But VM cannot tell such a cache from a
From_ cache that collected a few lengths, and believing a length that is wrong
puts a message boundary inside a body, where ignoring one that is right costs a
spurious message you can see. So From_, and where the cache looks like the
other thing its name is reported once, with the name to rename it to.
Note that a cache file is not the same thing as a local IMAP server holding a copy of a remote mailbox. See IMAP Cache Server.
Every cache VM creates is mboxcl2 and named for it. A cache from before that
has no such name and is read as From_, so it keeps the one weakness mboxcl2
exists to remove: a message whose body holds a line beginning ‘From ’ can
split it in two. vm-convert-caches-to-mboxcl2 converts each of those
and renames it.
It looks where cache names are built: vm-imap-folder-cache-directory,
vm-pop-folder-cache-directory, vm-folder-directory and your home
directory. It says how many it found and asks once; with a prefix argument it
asks about each. Each conversion is vm-change-folder-type-of-file on
that cache, so the previous contents are kept in a backup file and you are
asked whether to delete the copy under the old name. Two copies of a large
cache on disk is the price of the safety net; delete the backups when you are
satisfied.
A cache that cannot be read is left exactly as it was, and the others are converted anyway. A directory that cannot be read is reported the same way and the rest are still searched. Where anything could not be converted the faults are listed in a buffer, *VM cache conversion*, naming each cache or directory and what stopped it; a run that converts everything says so in one line and opens nothing.
A cache you are reading cannot be converted. Quit that folder with
vm-quit and run the command again: converting the file under a live
folder buffer would leave the buffer holding the cache in the type it no
longer is. Nothing is refetched from any server.
vm-check-folder reports what the folder you are in is and whether it is
sound, and writes nothing. It says what type VM reads it as, what its name
says it is, what its contents say and what vm-default-folder-type is,
how many messages the folder holds against how many the reader finds by
walking the separators, and for an mboxcl2 folder whether every message’s
Content-Length matches its body. A sound folder is one line in the
echo area; anything else gets a report naming each message at fault.
With a prefix argument, vm-check-folder asks for a folder file and
checks that, without visiting it. That is how to check the folder most likely
to want it: a folder whose name says mboxcl2 and which has a message with no
Content-Length cannot be visited at all, so there is no buffer in which
to check it. Nothing is written either way.
What the contents say is counted over every message in the folder, and the
name is not consulted for it. That is the case a name cannot answer: VM takes
a folder’s type from its name, so a folder carrying a Content-Length
that fits on every message, under a name that does not say mboxcl2, is read as
From_ and split wherever a body line begins ‘From ’. Visiting such a
folder warns, and the check is what settles it: the warning looks at the
first two messages, which is as much as a folder being visited can afford to
read. The report then names the rename and the conversion.
A cache whose name states no type is reported too, and
vm-convert-caches-to-mboxcl2 named as what converts it. Nothing in
such a cache is wrong: read as From_ it is From_, and the messages in it now
are delimited correctly. What it lacks is the guarantee mboxcl2 gives, so the
report says so and names the command rather than calling it a fault. It is
the one place a reader is told, since the warning at visit time fires only for
a cache that carries lengths.
A wrong length is what the command exists for, because it is the only one of these faults that gives no other sign. A missing length is refused when the folder is visited, and a folder VM cannot parse fails loudly, but a length that is merely wrong opens without complaint: the reader falls back on searching for the next separator when the count does not land on one, so VM reads the folder correctly while anything that believes the header, which is what the format is for, takes the wrong bytes.
A length short by the newlines at the end of a body is not a fault. The reader skips any number of them past the count, because some mailers do not count the last one, so a folder they wrote is sound as far as VM is concerned.
vm-change-folder-type converts the folder you are in. With a prefix
argument it asks for a file and converts that instead, without visiting it,
which is the only way in when a folder cannot be read. With two prefix
arguments it asks for a file and then for where to write the conversion: the
result goes to the file you name and the folder you converted is left exactly
as it was, with no backup made and nothing offered for deletion, since nothing
of it was touched. That is the way to look at a conversion before trusting
it, and the way to repair a copy of a folder rather than the folder. It is a
good idea to keep all your mail folders in a single format in order to avoid
incompatibilities.
A name that cannot hold the type is refused rather than written, and the
command says what to call it instead. An mboxcl2 folder called
out.mbox would be read back as From_ and split wherever a body line
begins “From ”, and one called out with no extension the same, so
neither is written. Nothing is asked of a name that could not state the type
anyway: From_ is the type a folder has when its name says nothing, and
a reader who has emptied vm-folder-type-by-extension-alist has said
that names mean nothing here.
Plain mbox is VM’s From_ type: no Content-Length headers, the
end of a message found by the next line beginning “From ”. It is what other
Unix mail programs mean by mbox, and what to convert to before handing a
folder to one of them.
To convert the folder you are reading:
To convert a folder you are not reading, or one VM will not open, give the command a prefix argument and it asks for the file: C-u M-x vm-change-folder-type RET From_ RET.
Going the other way is the same command with mboxcl2, and it is worth
knowing what it costs: every body is measured and a header added, so the
folder is rewritten entirely, and a mailer that does not understand
Content-Length will still read it, since an mboxcl2 folder is a From_
folder with an extra header. What such a mailer will not do is keep the
header right when it writes, which is how a folder ends up with lengths that
lie. vm-check-folder is how you find out.
Note: Converting to
From_does not put back what mboxo quoting took out. A body line that began “From ” was rewritten to “>From ” when it was first written into an mbox folder, and nothing can tell that apart from a line the author wrote as “>From ”. Converting away from mboxcl2 and back does not lose anything further, but neither does it recover what an earlier mbox writer already changed.
The name moves with the type, since the name is what states the type: a folder converted to mboxcl2 is written as name.mboxcl2, one converted away from it loses the extension, and the file left behind under the old name is offered for deletion once the new one is on disk.
From_ is the exception, and is never put into a name that has not got it: it is the type a folder has when its name says nothing about it, so a folder called INBOX converted to From_ is still INBOX rather than INBOX.mbox. A folder you called sent.mbox keeps that name, since the name already says what the folder now is. Keeping it is allowed, and it is worth knowing what you are keeping: two folders holding the same mail, of which the old one is the copy VM is no longer looking at. The folder as it was is kept in a backup file either way, named as Emacs names one when saving a buffer.
A conversion that would overwrite an existing folder is refused rather than asked about. Where the name already states the new type, converting mboxcl2 to mboxcl2 to recompute every length, which is the repair described above – nothing is renamed and nothing is offered.
The system default format on most flavors of Unix (except Solaris, AIX and
System V) is referred to as
From_. It is the traditional Unix mbox format. In this
format, a leading separator line and a trailing separator line are added to
each message. The leading separator line starts with the string “From ”.
The trailing separator line is a blank line. VM actually adds two blank
lines at the end for clarity.
A variant of this format is referred to as BellFrom_. It has a
leading separator line that starts with the string “From ”. However,
it does not have a trailing blank line.
Since VM cannot reliably infer whether a mail folder is of type
From_ or BellFrom_, you must tell VM which one your system
uses by setting the variable vm-default-From_-folder-type. Some
of the old folders created by VM prior to 2000 were in the
BellFrom_ format. If you will be using both From_ and
BellFrom_ style folders, it is not possible to choose an
appropriate setting for this variable. It is recommended that you
convert all the old BellFrom_ folders to the From_ format using
the command vm-change-folder-type.
VM will not create a BellFrom_ folder. It is not among the types
vm-default-folder-type offers, nor among those
vm-change-folder-type offers to convert to, because a folder VM writes
as one cannot be read back as one: having no trailing blank line, the format
has no signature of its own, so VM reads it as From_ and each message
swallows the headers of the next. Reading is unaffected, which is what
vm-default-From_-folder-type above is for. Setting
vm-default-folder-type to BellFrom_ by hand still works, and
still has that result, so VM says so as it starts.
Solaris, System V and AIX operating systems use another variant of the mbox
format, in which each message carries a Content-Length header giving
the length of its body, and that count rather than the next “From ” line
says where the message ends. VM refers to this format as
mboxcl2.
Asking for it used to mean setting vm-trust-content-length, which told
VM to believe a Content-Length header wherever it found one. That
option is deprecated: it made a statement about every folder read, in order to
say something about one, and nothing stops a message carrying such a header
that means something else. Name the folder for the type instead, or set
vm-default-folder-type; both are described below.
Mail folders written as mbox come in four variants, named by convention rather than by any standard. They differ in two things: what marks the end of a message, and whether the message is modified to make that work. There is no file name extension, magic number or header that tells them apart, so the names below are a way of talking about folders rather than something a program can detect.
The end of a message is the next line beginning “From ”. A body line that
begins that way is therefore changed on writing: “From ” becomes “>From
”. The change is not reversible, because a line that already read “>From
” is left alone, and a reader cannot tell the two apart. VM’s
From_ and BellFrom_ are this variant.
As mboxo, but “>From ” becomes “>>From ” as well, so the change can be undone exactly. VM does not write this variant.
The end of a message is found from its Content-Length header, and
body lines are still quoted as in mboxo. VM does not write this
variant: quoting a body it has already measured alters the message for no
gain.
As mboxcl, but with no quoting at all: the count alone says where the
message ends, so the body is stored exactly as it arrived. This is VM’s
mboxcl2 folder type.
VM reads and writes the first and the last of these. It has no name of its own for mboxrd, and does not write mboxcl.
VM wrote mboxcl until 2026: these folders were given a
Content-Length header and had their bodies quoted. Reading is
unaffected either way, since VM has never unquoted a body, so a folder
written before that change reads exactly as it did; what changed is that new
messages are no longer altered on the way in.
The folder type was called From_-with-Content-Length until then,
after the mechanism rather than the format. The old type name still works
wherever a type is given: in vm-default-folder-type, by
vm-change-folder-type, and in an index file written before the change.
It is not going to be removed. The option was renamed with it, and setting
it under its old name reports the current one.
The reason to care is that the first three change the message. A folder
kept for its own sake (an archive, or anything you may want to verify
later) is better in a format that does not, and mboxcl2 is the only one of
the four that does not. It is what vm-default-folder-type should be
set to for a folder kept as a record. All four are described in the Library of Congress’s
registry of formats for digital preservation, which exists to record how
well a format suits keeping things: mboxcl2 is fdd000387, mboxcl
fdd000386, mboxrd fdd000385 and mboxo fdd000384. Those
are descriptions rather than standards: they say what each format is, not
what anyone is obliged to write.
The reason not to care is interoperability, and it cuts the other way. A
program that does not honour Content-Length, which is most of them
– will read an mboxcl2 folder as mboxo, and split it wrongly at the first
body line beginning “From ”, silently. Content-Length formats are right
for folders you keep and wrong for folders you hand to other tools.
Which of the two VM reads a folder as is not something it can tell from the
file, since nothing in an mbox says which variant it is. There is no
extension, media type or magic number for any of them, and the Library of
Congress descriptions say as much. VM looks at the first message: if it has
a Content-Length header and vm-trust-content-length
is set, the folder is read by its counts, and otherwise by its ‘From ’
lines. A folder read the wrong way is not damaged, but it is a different
folder: a body line beginning ‘From ’ starts a new message under one
reading and does not under the other.
On the formats themselves, see the Library of Congress descriptions at
https://www.loc.gov/preservation/digital/formats/fdd/fdd000387.shtml
for mboxcl2 and fdd000383 for the mbox family it belongs to. The four
names were settled on by Daniel J.
Bernstein, Rahul Dhesi and others in 1996; they are a convention for talking
about folders rather than anything a program can detect.
Two additional formats are mmdf used by MMDF systems and
babyl used by the Emacs Rmail mode. These formats are recognized
automatically when read from the file system.
That is what makes mail from another reader easy to bring over. An Rmail
folder can be visited as it stands, or converted first with Emacs’s
M-x unrmail. An MH folder becomes a folder VM can read by
running MH’s own packf or packmbox over it, which
writes the messages out in one of the formats above. Once such a folder is
open, vm-change-folder-type writes it out in whichever format you have
settled on.
VM supports accessing remote mailboxes on mail servers via the Post
Office Protocol (POP) and the Internet Message Access Protocol (IMAP).
Instead of a local file name, you can set the vm-primary-inbox to
a string that tells VM how to access a server mailbox. Called a
maildrop specification, the string is of one of the
following formats:
``pop:HOST:PORT:AUTH:USER:PASSWORD'' ``imap:HOST:PORT:MAILBOX:AUTH:USER:PASSWORD''
Remote mailboxes accessed by VM in this fashion are referred to as server folders (and POP folders or IMAP folders, more specifically).
VM retrieves mail from the server folders into internal Emacs buffers for its normal operation. It also saves copies of the folders on the local file system for speed of operation. These are referred to as cache folders. However, the only permanent copies of the folders are on the mail server. This should be contrasted with using server mailboxes as spool files (see POP Spool Files and see IMAP Spool Files), where the permanent folders are on the local file system and only the incoming mail is held on the servers.
Server folders have the advantage that they can be transparently accessed from multiple locations on the internet. However, you must ensure that you have access to enough storage on the mail server to store all your email.
The format of a POP or IMAP maildrop specification is as follows:
``pop:HOST:PORT:AUTH:USER:PASSWORD'' ``imap:HOST:PORT:MAILBOX:AUTH:USER:PASSWORD''
Replace ‘pop’ in the example with ‘pop-ssl’ to have VM speak POP over an SSL connection. Use ‘pop-ssh’ to use POP over an SSH connection. Similarly, replace ‘imap’ with ‘imap-ssl’ or ‘imap-ssh’, as needed.
SSL refers to a protocol called secure sockets layer, which allows you to securely communicate with a mail server using encryption technology. A newer version of the same protocol is called TLS (transport layer security). We refer to both of them as “SSL” in this manual.
For SSL, Emacs makes the connection itself where it was built with
GnuTLS, and VM runs the stunnel program where it was not. That is
what vm-stunnel-program says: its default is nil, meaning
Emacs’s own, on an Emacs with GnuTLS, and ‘"stunnel"’ on one without,
which works if that program is in your command search path. An Emacs without
GnuTLS on a machine without stunnel cannot reach a server that requires
SSL at all. Depending on the version of
‘stunnel’ program you are using, you may need to define a configuration
file for ‘stunnel’. If you need it, you should set the variable
vm-stunnel-program-additional-configuration-file to the location of
the configuration file. (Consult the doc string of the variable and the
manual of the ‘stunnel’ program
to find out what to put in the configuration file.)
For SSH, you must have the ssh program installed and the variable
vm-ssh-program must name it in order for POP/IMAP
over SSH to work. When VM makes the SSH connection it must run a command on
the remote server so that the SSH session is maintained long enough for the
POP/IMAP connection to be established. By default that
command is ‘"echo ready; sleep 15"’, but you can specify another
command by setting vm-ssh-remote-command. Whatever command you use
must produce some output and hold the connection open long enough for VM to
establish a port-forwarded connection to the mail server. (SSH must be able
to authenticate without a password, which means you must be using .shosts
authentication or RSA.)
HOST is the host name of the mail server.
PORT is the TCP port number to connect to. The normal port numbers are:
| 110 | for POP |
| 995 | for POP over SSL |
| 143 | for IMAP |
| 993 | for IMAP over SSL |
MAILBOX is the name of the mailbox on the IMAP server. This should be ‘"inbox"’, to access your default IMAP mailbox on the server. No MAILBOX component is needed for POP maildrops because POP does not support multiple mailboxes.
AUTH is the authentication method used to convince the
server you should have access to the mailbox. Acceptable
values for POP are ‘pass’ and ‘apop’. For
‘pass’, the PASSWORD is sent to the server with
the POP PASS command. For ‘apop’, an
MD5 digest of the PASSWORD appended to the server
time-stamp will be sent to the server with the APOP command.
If Emacs does not have built in MD5 support, you will have
to set the value of vm-pop-md5-program appropriately
to point at the program that will generate the MD5 digest
that VM needs.
Acceptable values of AUTH for IMAP
are ‘"preauth"’, ‘"cram-md5"’, and ‘"login"’.
‘"preauth"’ causes VM to skip the authentication stage of
the protocol with the assumption that the session was
authenticated in some way external to VM. The hook
vm-imap-session-preauth-hook is run, and it is expected to
return a process connected to an authenticated IMAP session.
‘"cram-md5’ tells VM to use the CRAM-MD5 authentication
method as specified in RFC 2195. The advantage of this method
over the ‘"login"’ method is that it avoids sending your
password over the net unencrypted. Not all IMAP servers support
‘"cram-md5"’; if you’re not sure, ask your mail
administrator or just try it. The other value, ‘"login"’,
tells VM to use the IMAP LOGIN command for authentication, which
sends your user name and password in clear text to the server.
USER is the user name used in authentication methods that require such an identifier. ‘"login"’ and ‘"cram-md5"’ use it currently.
PASSWORD is the secret shared by you and the server for authentication purposes. How it is used depends on the value of the AUTH parameter. If the PASSWORD is ‘*’, VM will prompt you for the password the first time you try to retrieve mail from the mailbox. If the password is valid, VM will not ask you for the password again during this Emacs session.
If your environment has the EasyPG utility and your version of Emacs supports it, i.e., has the ‘epa-file’ and ‘auth-source’ libraries, then you can store password information in a file such as .authinfo.gpg. The ‘EasyPG’ protocol allows you to store this information in an encrypted form so that it cannot be read by third parties. Each line in the .authinfo.gpg file should be of the form
machine HOST login USER password PASSWORD port PORT
where HOST, USER, PASSWORD and PORT are as detailed above.
Ensure that the variable auth-sources is customized to refer to
your authinfo file.
See Help for users in Emacs auth-source.
Then VM will read passwords from the file and you
don’t need to type them in when accessing mail servers.
If you have multiple login accounts on the same HOST then VM will only
use the first login listed in the authinfo file. To allow for multiple
login’s, the HOST entry in the authinfo line can be replaced by an
account name as defined internally in VM. These account names are
defined via the variables vm-pop-folder-alist and
vm-imap-account-alist, described below.
Since a number of components have to be brought together to establish connections to mail servers, it is not uncommon for problems to arise.
To find out what could be going wrong, you can look at the Emacs buffer that
store a trace of the session with mail server. Such buffers have names
beginning with “trace of POP session” or “trace of
IMAP session”. There could be multiple buffers of this kind for
different servers and multiple sessions. In the trace buffer, you will find
the commands that VM sent to the server and the responses it has received.
Typical problems are protocol mismatches between VM and the mail server, or
malfunctions in other components such as the stunnel program.
How many of them are kept is one variable per protocol:
The number of POP session trace buffers that should be
retained for debugging purposes. If it is nil, then no trace buffers are kept.
Default value: 1
The number of IMAP session trace buffers that should be
retained for debugging purposes. If it is nil, then no trace buffers are kept.
Default value: 1
Visit a POP mailbox. VM will present its messages to you in the usual way. Messages found in the POP mailbox will be downloaded and stored in a local cache. If you expunge messages from the cache, the corresponding messages will be expunged from the POP mailbox.
First arg FOLDER specifies the name of the POP mailbox to visit.
You can only visit mailboxes that are specified in vm-pop-folder-alist.
When this command is called interactively the mailbox name is read from the
minibuffer.
Prefix arg or optional second arg READ-ONLY non-nil indicates that the folder should be considered read only. No attribute changes, messages additions or deletions will be allowed in the visited folder.
The cache lives in the directory named by
vm-pop-folder-cache-directory, or in vm-folder-directory if
that one is not set. Deletions reach the POP server when you save
the changes with vm-save-folder, not when you make them.
Message attributes (new, replied, filed, etc.) and labels cannot be stored on the POP server but they will be maintained in the cache folder. This means that if you access the same POP mailbox from multiple locations on the internet, you will see different attributes at different locations. To be able to store message attributes and labels on the server, you should use IMAP folders (IMAP Folders) resident on an IMAP server.
In order for VM to know about POP folders that you can access, you
must declare them by setting the variable vm-pop-folder-alist.
The variable’s value should be an associative list of the form:
((POPDROP NAME) ...)
POPDROP is a POP maildrop specification (maildrop specification).
NAME is a string that should give a less cumbersome name that you
will use to refer to this maildrop when using vm-visit-pop-folder.
For example:
(setq vm-pop-folder-alist
'(
("pop:pop.mail.yahoo.com:110:pass:someuser:*" "Yahoo! mail")
("pop:localhost:110:pass:someuser:*" "local mail")
)
)
‘Yahoo! mail’ and ‘local mail’ are what you would type
when vm-visit-pop-folder asks for a folder name. There is no
need to specify the password for POP accounts in this definition.
Visit a IMAP mailbox. VM will present its messages to you in the usual way. Messages found in the IMAP mailbox will be downloaded and stored in a local cache. If you expunge messages from the cache, the corresponding messages will be expunged from the IMAP mailbox when the folder is saved.
When this command is called interactively, the FOLDER name will
be read from the minibuffer in the format
"account-name:folder-name", where account-name is the short
name of an IMAP account listed in vm-imap-account-alist and
folder-name is a folder in this account.
Prefix arg or optional second arg READ-ONLY non-nil indicates that the folder should be considered read only. No attribute changes, messages additions or deletions will be allowed in the visited folder.
When you visit an IMAP folder, VM will
download copies of the messages that it finds there for you to read.
These messages are saved locally in a cache folder on the disk, in the
directory specified by vm-imap-folder-cache-directory (or
vm-folder-directory if the former is not defined).
If you delete and expunge messages, these changes are made to both the
cache folder and the folder on the IMAP server when saved
with vm-save-folder.
A cache folder is named after the MD5 of the maildrop it holds, so
it can be neither read nor typed by hand. M-x vm-folder-cache-file in
the folder says which file it is; it works for POP folders too, and
answers nothing for a folder that is a file in the first place. Only the
scheme, the host, the mailbox and the login name go into the name, so
imap and imap-ssl for one mailbox share a cache and changing
your password does not orphan it.
The port is left out along with them, and that is a restriction: two IMAP servers on one host, reached on different ports with the same login name and the same mailbox, name the same cache file and so share one. Visiting the second gets you the first one’s folder. Give them different host names, through /etc/hosts or an SSH tunnel on a name of its own, and the caches are separate again.
The port cannot simply be added: every cache file that exists is named without it, so putting it in would rename all of them and lose what they hold. A host running two mail servers on different ports for one account is rare enough that the caches you already have are worth more.
VM’s IMAP and POP operations are asynchronous: they do not block Emacs. Fetching mail, loading a message body, sending your flag changes, expunging, saving, quitting, synchronising, filing a copy of a message you send: all of them go on in the background, and Emacs answers you throughout. What you see of it is in the mode line of the folder, its summary and its presentation buffer, which say what the folder is doing:
VM: inbox 3 (of 412) fetching 24/340 +1
‘fetching’ is what it is doing; ‘24/340’ is how far it has got, which
moves as each bunch of messages arrives; ‘+1’ is one more piece of work
waiting for it. The count appears once VM knows how many messages it is
fetching, and a piece of work with nothing to count (sending your flag
changes, say) shows none. It is shown in the face vm-net-session-face, which
inherits mode-line-emphasis; give that face a background if you want it
louder. When the mode line says nothing there, VM is not talking to that
folder’s server.
A folder is not locked while this goes on. You can read it, move about it, delete, undelete, mark, label and expunge as usual. What VM does with the work you ask for depends on whether it needs the server:
New mail arrives into the folder as it is fetched, a bunch at a time, rather than all at the end, so a large mailbox fills in while you read it.
Message attributes (new, replied, filed, etc.) are stored on the IMAP server and are also cached locally. Message labels are also stored on the IMAP server as user-defined permanent flags. (This assumes that the IMAP server has the ability to store user-defined permanent flags.)
In order for VM to know about IMAP accounts that you can access, you
must declare them by setting the variable vm-imap-account-alist.
The variable’s value should be an associative list of the form:
((IMAPDROP NAME) ...)
IMAPDROP is an IMAP maildrop specification (maildrop specification).
NAME is a string that should give a less cumbersome name that you
will use to refer to this maildrop when using vm-visit-imap-folder.
For example:
(setq vm-imap-account-alist
'(
("imap-ssl:mail.foocorp.com:993:*:login:becky:*" "becky")
("imap:crickle.lex.ky.us:143:*:login:becky:*" "crickle")
)
)
The mailbox and password fields (‘*’ in the example) are
ignored. When vm-visit-imap-folder asks for a folder name, you
enter an account name followed by “:” and a folder name. Any folder
that is accessible to you on the IMAP server can be specified. For
example, becky:inbox or crickle:drafts.
When you visit an IMAP folder inside VM, the folder is referred to
by its folder name as it exists on the server. For example, visiting
becky:INBOX creates a folder called INBOX inside VM. If you
visit multiple IMAP accounts within a VM session, then you would
end up with multiple folder buffers all named INBOX. To avoid this
problem, you can set the variable
vm-imap-refer-to-inbox-by-account-name to t, which causes the
INBOX folder buffers to be named by their IMAP account
names instead. For example, visiting becky:INBOX would create a VM
folder named becky and visiting crickle:INBOX would create a
VM folder named crickle.
The variable vm-imap-server-list, used in older versions of VM, was
deprecated in 8.1.0 and is gone; vm-imap-account-alist replaces it,
in a different format that names each account.
The cache folder and the folder on the IMAP server are partially
synchronized every time vm-get-new-mail is invoked. This involves
(i) writing the changed attributes and labels to the server, (ii) updating
the attributes and labels in the cache folder based on the server data,
(iii) expunging messages in the cache folder that have been expunged on the
server, and finally, (iv) retrieving any new messages on the server.
VM remembers the UID of every message it has retrieved, in the
cache folder’s own X-VM-IMAP-Retrieved header, and step (iv) passes
over a message that record already names. That is what makes deleting a
message here stick, rather than the message arriving again with the next
g. A cache that has lost messages the record still names (one
restored from a partial backup, say) is short of them for the same reason;
C-u C-u g is what asks for those.
The cache folder and the folder on the IMAP server are also
synchronized every time vm-save-folder is invoked. This involves (i)
writing the changed attributes and labels to the server, (ii) updating the
attributes and labels in the cache folder based on the server data, (iii)
expunging messages in the cache folder that have been expunged on the
server, (iv) deleting and expunging the locally expunged messages on the
server folder, and finally, (v) saving a copy of the folder on the file
system.
The synchronization can also be asked for on its own:
Synchronize the current folder with the IMAP mailbox. Changes made to the buffer are uploaded to the server first before downloading the server data. Deleted messages are not expunged.
Prefix argument FULL says to write every message’s attributes to the server, rather than only those of the messages whose attributes changed in this session, and to fetch a message the cache no longer holds rather than leaving it alone. This is useful for saving offline work on the cache folder, whose expunges are sent whether FULL is given or not: VM records them as the reader makes them.
FULL used to delete on the server every message the mailbox had and the cache did not. A damaged cache says the same thing as a reader who expunged, so that destroyed mail nobody asked it to (emacs-vm/vm#752).
Gmail’s IMAP is a mapping onto Gmail’s own model rather than an implementation of the protocol, and the differences are not ones VM can paper over.
A message carrying two labels appears in two mailboxes, and All Mail
holds every message once. Applying a label is a UID COPY into the
mailbox of that name, not a flag.
A VM label is an IMAP keyword on the wire. Gmail accepts a
STORE of an arbitrary keyword, answers success, and does not keep it,
with no error at any point. VM notices and says so once per session, and
keeps the label in the folder. It used to be erased in the same breath: the
flags read back from the server replaced the folder’s labels with what the
server had, which was nothing, so setting a label against Gmail looked like a
command that did nothing. A label now stays where you set it and goes no
further, no other client sees it, and it is lost with the folder’s cache
file. Nothing VM can do at the protocol level puts it on the server.
\Deleted does not delete.Setting the flag marks nothing for removal in the usual sense. What deletes
is an EXPUNGE from All Mail, or moving the message to
[Gmail]/Trash.
Gmail advertises its own extension, X-GM-EXT-1 in the
CAPABILITY response, whose X-GM-LABELS does the mapping
properly, and that is what clients written for Gmail use. VM does not use it
today.
The workable arrangement is to put a local IMAP server in front of Gmail and let VM talk to that. Keywords persist against a local server, so labels behave, and the local server is faster besides. See IMAP Cache Server.
Be clear about the ceiling: labels then live on your machine. A keyword set
in VM reaches the local server and stops there, because Gmail has nowhere to
put it and the sync tools do not translate keywords into labels. The reverse
direction is possible with a tool that carries Gmail’s labels,
offlineimap writes them as an X-Keywords: header with
synclabels = yes, but that is a header rather than a keyword, so VM
does not read it as labels either. If your labels matter across machines and
clients, they cannot be VM labels against Gmail today.
A remote server that is slow to answer makes every operation slow, because
each one is a round trip. Gmail is the usual example. The arrangement that
fixes it is not a VM feature at all: run an IMAP server on your own
machine, hold a copy of the remote mailbox in it, and point VM at
localhost. VM then sees a fast IMAP server, and something
else deals with the slow one on its own schedule.
Two things follow, and the second is the one people do not expect:
Three pieces:
dovecot is the usual
choice.
mbsync (from
isync) is the usual choice; offlineimap and imapsync are
alternatives.
goimapnotify watches the remote with IMAP IDLE and
runs the sync tool.
VM’s part is one line: a maildrop specification naming localhost and
the password you gave the local server.
(setq vm-imap-account-alist
'(("imap:localhost:143:INBOX:login:you@example.com:*" "local")))
What follows is the structure rather than a recipe, because the paths and the
service manager differ by system. Use your packaging’s own locations: a
MacPorts install puts configuration under /opt/local/etc and its store
under /opt/local/var, Homebrew uses /opt/homebrew or
/usr/local, and a Linux distribution package uses /etc/dovecot
and /var/mail. dovecot -n prints the configuration actually in
force, which is the quickest way to find out where yours lives.
0700. On Linux the package usually does this; on macOS you create the
user yourself, with a free numeric id, and it will not appear in the
graphical user list.
doveadm pw -s BLF-CRYPT
and put the hash in dovecot’s user database, readable by the authentication user and nothing else. Use the same account names as the remote ones if you want to keep your own bearings.
mbsync takes PassCmd, which runs a command
and reads the password from its output, so any secret store will do: the
Keychain on macOS through security find-generic-password, or
secret-tool, pass or gpg on other systems. Two passwords
are involved per account and they are easy to confuse: the remote server’s,
which the sync tool needs, and the local server’s, which both the sync tool
and VM need.
launchd on macOS or
a systemd user timer on Linux; goimapnotify on the remote account is
the responsive one, running the sync when the server says something has
arrived. A service started by the system does not inherit your interactive
PATH, so name programs by absolute path in whatever you install there.
UIDVALIDITY. Deleting the local
store and syncing again gives every message a new UID, and VM
notices: it treats the mailbox as a different one, which is the correct
response and not a fault. Expect it after any rebuild of the local store.
mbsync maps folders and
flags, and a keyword set in VM stops at the local server (see Gmail).
Verify what reaches the remote before relying on it.
doveadm mailbox list and
doveadm fetch against the local server answer “is the mail here”,
which is a different question from whether VM can see it. Where a
notification tool is involved, note that it can exit successfully having
displayed nothing, so its exit status is not evidence.
VM can work with local folders managed by Mozilla Thunderbird. You can find the location of Thunderbird’s folders by examining the Account Settings for “Local Folders” inside Thunderbird. You can visit any of the folders in that directory using VM and make changes. Such changes will be propagated to Thunderbird in an appropriate way.
Alternatively, you can set the variable
vm-thunderbird-folder-directory to the directory where Thunderbird
stores its folders, and use the command M-x
vm-visit-thunderbird-folder to visit its folders. This works the same way
as vm-visit-folder except that the default directory for visiting
folders as well as saving messages will be the value of
vm-thunderbird-folder-directory. On the other hand, the folders
visited using vm-visit-folder will continue to be in
vm-folder-directory, allowing you to manage the two spaces
separately.
If, on the other hand, you want to maintain a single space where VM
and Thunderbird can jointly operate, then you should set the variable
vm-folder-directory to that place and leave
vm-thunderbird-folder-directory with its default value of
nil.
Most current versions of Thunderbird hide deleted messages from the summary window. However, the deleted messages are still present in the folder. They are expunged from the folder only when you do some bulk operation such as “purge” or “compact”. Since the deleted messages are still present in the folder, when you visit the folder in VM, the deleted messages will appear in the VM summary buffer. This is normal.
If you want VM’s summary buffer to appear similar to Thunderbird’s, you can
use the vm-summary-faces-hide command. See Hiding summary lines.
Thunderbird stores the folders in the ‘From_’ folder type.
See Folder types. Within such folders, Thunderbird stores the
message status flags (message attributes such as whether a message is
read, replied to, deleted etc.) under special header fields called
X-Mozilla-Status and X-Mozilla-Status2. In addition to
these headers, Thunderbird also stores a quick copy of the message
status flags in a separate file with the extension .msf.
When you visit a Thunderbird folder, VM reads the status flags stored in
the special headers and uses them for processing. As you make changes
to the folder by reading messages, replying to them or deleting them,
the changes are propagated to the Thunderbird status flags and written
to the disk when saved. VM also deletes the .msf file maintained
by Thunderbird so that Thunderbird will recompute the status information
from the headers. Thus, the changes made to the Thunderbird folders
will be visible inside Thunderbird.
The default gives the behaviour described above:
If set to t, VM synchronizes its headers with the headers of
Thunderbird so that full interoperation with Thunderbird becomes
possible. If it is set to read-only then VM reads the Thunderbird
status flags, but refrains from updating them. If it is set to nil
then VM makes no attempt to read or write the Thunderbird status
flags.
Default value: t
Under read-only the changes you make are lost when you quit VM, since
they were never written back. Under nil they survive inside VM and
mean nothing to Thunderbird.
WARNING: Keep in mind that all this applies to changes to message attributes only. If you expunge (compact) a folder, then the deleted messages are physically purged from the folder. They will be lost both inside VM as well as Thunderbird.
The variable vm-sync-thunderbird-status is a buffer-local
variable. You may set its default value in your .vm file. To
change it in a running Emacs session, you must use setq-default.
See Local Variables in GNU Emacs manual.
A VM folder can hold the headers of its messages and not the bodies, which stay where they are, in the file system or on a remote server, and are fetched when a message is viewed or operated on. This is headers-only mode. What it trades:
To enable external messages, set the variable
vm-enable-external-messages to a list of contexts in which external
messages may be maintained by VM.
IMAP folders are the only context in which external messages are
implemented. Setting
vm-enable-external-messages to (imap) enables IMAP
messages to be maintained externally. When new messages are retrieved, this
causes all messages with size below vm-imap-max-message-size to be
loaded immediately, and larger messages will be left on the server to be
fetched on demand. To treat all messages as external messages, you can set
vm-imap-max-message-size to 0.
Both variables have to be set. vm-imap-max-message-size is
nil by default, and nil means no size limit at all, so every
message counts as small enough to load, and enabling
vm-enable-external-messages on its own leaves nothing external. A
working configuration looks like this:
(setq vm-enable-external-messages '(imap)) (setq vm-imap-max-message-size 50000) ; bytes; 0 for every message
Note when trying this out that visiting a folder previews its current message, and previewing an external message fetches it. So the message you are looking at is normally loaded, and a folder where every message should be external will still show one that is not.
The variable vm-load-headers-only was replaced by
vm-enable-external-messages in version 8.2.0 and is now gone, so
older instructions that mention it need translating to the two settings
above.
Normally, the messages that are not present in the folder are fetched
automatically when an attempt is made to view them. You can disable this by
setting the variable vm-external-fetch-message-for-presentation to
nil. In that case, the messages are displayed with an empty message
body. You can load the missing message body using the o command
described below.
After fetching the bodies of external messages, VM stores them in the Folder
buffer temporarily, so that repeated fetching is avoided. The variable
vm-external-fetched-message-limit controls how many message bodies are stored
in this way. You can set it to an integer (10 is the default), or to
nil, signifying that there is no limit. All the fetched message
bodies are removed from the folders before they are saved to disk.
You can manually load message bodies into the Folder using the command
o (vm-load-message). The command O
(vm-unload-message) unloads a previously loaded message body. Both
the commands can take numerical prefix arguments or operate on marked
messages. Note that “loading” a message body is different from on-demand
“fetching”. Loaded messages are permanently stored in the Folder buffer
and written to disk when the folder is saved. In contrast, fetched message
bodies are always discarded before writing to disk. The command
vm-refresh-message reloads an already loaded message with a fresh
copy retrieved from the server.
Pressing g runs vm-get-new-mail, which will retrieve mail from
all the spool files associated with the current folder. See Local Folders. For POP and IMAP folders, any newly arrived
messages at the mail server will be incorporated into the local copy of the
folders.
If the value of the variable vm-auto-get-new-mail is non-nil VM
will retrieve mail for a folder whenever the folder is visited. If the
value is a positive integer n, VM will also check for new mail
every n seconds for all folders currently being visited. If new
mail is present, VM will retrieve it.
If the value of the variable vm-mail-check-interval is a positive
integer n, VM checks for new mail every n seconds and, rather
than retrieving it, puts the word “Mail” on the Emacs mode line of folders
that have mail waiting. Having found mail it leaves the indicator on and
checks no further until you retrieve it.
Where several mail clients read the same spool, another of them can take
that mail, and the indicator then says what is no longer true. Set
vm-mail-check-always to have VM go on checking.
For a POP or IMAP folder a check is a conversation with
the server, and it goes on in the background like everything else VM does
with one (see talking to the server): the check is started and Emacs
comes straight back to you, and the answer sets the indicator when it
arrives. A server that is slow or unreachable therefore costs you nothing
but a late answer or none, and a check that fails says so in the session log
rather than at you. Setting vm-mail-check-interval and
vm-auto-get-new-mail to nil stops the checking altogether, at
the price of no longer being told about new mail until you ask for it with
g.
When Emacs crashes, its last action before dying is to try to write out an auto-save file that contains changes to files that you were editing. VM folders are file buffers inside Emacs, so folders are auto-saved also. For VM folders, changes means attribute changes, label additions and deletions, message edits, and expunges. VM keeps track of whether a message is new or old, whether it has been replied to, whether it is flagged for deletion and so on, by writing special headers into the folder buffer. These headers are saved to disk when you save the folder. If Emacs crashes before the folder has been saved, VM may forget some attribute changes unless they were written to the auto-save file.
Note that when VM retrieves mail from spool files it always writes them to disk immediately and at least one copy of the message is on disk at all times. So while you can lose attribute changes from crashes, you should not lose messages unless the disk itself is compromised.
When you visit a folder, VM looks for an auto-save file modified more recently than the folder file. One that exists is a good sign that Emacs or your operating system crashed while VM was visiting the folder, so VM says so in the echo area and visits the folder in read-only mode. Read-only mode is what protects the auto-save file: nothing can modify the folder, so Emacs has no new changes to write over it. While the folder is read-only:
The last two are to catch your attention.
If you want to recover the lost changes, run M-x vm-recover-folder or use the Recover Folder entry in Folder menu. At the ‘Recover File:’ prompt press RET. Emacs’s built-in recover-file command is not recommended for this purpose because VM is unable to obtain reliable data regarding mail folders from Emacs.
In response to vm-recover-folder, Emacs displays a detailed directory
listing showing the folder file and the auto-save file, and asks whether you
want to recover from the auto-save file. Their sizes are the rule of thumb:
The folder buffer takes the contents of the auto-save file and VM re-parses it. Buffer and disk copy now differ, so VM fetches no new mail for the folder until they agree: when you are satisfied that the recovered folder is whole and intact, type S to save it, after which g retrieves new mail as usual.
Either Emacs did not finish writing it during the crash, or it holds an
expunge you had not yet committed to disk, and answering “no” may mean
doing that expunge again. That is better than not knowing whether the file
was truncated. Type C-x C-q, which is vm-toggle-read-only in a
folder buffer, to take the folder out of read-only mode; read and retrieve
mail normally, the auto-save file staying on disk and ignored.
Recovering a POP or IMAP folder modified during a previous crash works the same way, but its auto-save file holds less that is of any use. Synchronizing an IMAP folder saves only the changes made during the current VM session, and the changes in the auto-save file were made in an earlier one, so they cannot reach the server at all. Answering “no” and taking the folder out of read-only mode with C-x C-q is the better course for a server folder.
Any messages you were in the midst of composing when Emacs crashed, would
also have auto-save files in the disk. They would be saved in the
vm-mail-auto-save-directory, if you have set that variable, or
vm-folder-directory, or the directory that was current when you
started composing the message. You can visit the auto-save file, which
would get loaded as a text file by default, and then run M-x
mail-mode. VM’s mail-mode command keys are not available in this mode.
The best option is to run M-x vm-postpone-message to save the
unfinished message composition and then continue it using
vm-continue-postponed-message. See Postponing Messages.
Emacs also provides a way to recover the entire Emacs session after a crash.
See Recover in the GNU Emacs Manual. However, the Emacs
recover-session command will recover VM folders as if they were
ordinary files. As mentioned above, this is not a good method of recovering
VM folders. You should use vm-recover-folder command instead. So,
when Emacs recover-session command asks you whether to recover a VM
folder, the best option is to answer “no”. Then you should recover the
folders separately, using the vm-recover-folder command.
If you do answer “yes”, Emacs loads the auto-save file into a buffer. The auto-save file is still on the disk and is deleted when you save the buffer, so examine the folder before you save it:
Emacs backs a file up on the first save of its buffer and not again, so a folder saved earlier in the session has no copy of what is on disk now. To make one:
Keep a copy of this folder as it is on disk.
Emacs backs a file up on the first save of its buffer and not again, so a
folder saved earlier in this session has no copy of what is on disk now.
This makes one whatever make-backup-files says.
The copy is named as Emacs would name a backup: backup-directory-alist
decides where it goes and the numbered-backup settings how many are kept, so
it lands where your other backups are.
It copies the file and not the buffer, so changes you have not saved are not in it. Save the folder first to keep those.
Run it from anywhere in a folder, the summary included. backup-buffer
does nothing in a summary or presentation buffer, those visiting no file,
which is what makes a command of VM’s own worth having.
C-u C-u S does it as part of a save, vm-save-folder handing its
prefix argument to save-buffer, which documents that one. It saves as
well, and does nothing at all where the folder is unmodified.
To keep a copy at every save instead of the first, clear the flag Emacs sets when it has backed a buffer up:
(add-hook 'vm-mode-hook
(lambda ()
(add-hook 'before-save-hook
(lambda () (setq buffer-backed-up nil))
nil t)))
A drafts folder you are not visiting is a file VM appends to rather than a buffer it saves, so nothing backs it up. Visit it to have the copies, or keep them another way.
If you have made changes to a mail folder which you would like to cancel and go back to the version currently on the disk, use the Revert Folder entry in the Folder menu, or:
Revert the current folder to its version on the disk. The summary and presentation buffers are killed, the file is read again, and the folder is visited afresh with the access method it had, so an IMAP or POP folder comes back connected rather than as a plain file.
Also available as vm-revert-folder.
Emacs’s own revert-buffer is not recommended: it reads the file back
without VM’s bookkeeping, so the folder buffer and VM’s idea of it part
company.
A configuration built one piece at a time. Each piece stands on its own, so
take the ones you want. Everything here goes in your vm-init-file,
normally ~/.vm (see Starting Up).
The same settings, in one file you can copy, are installed as example.vm in VM’s documentation directory.
M-x vm-check-configuration says what is still missing, and what to set
for each, in a buffer of its own. It reports only settings whose default either does nothing or
does something you did not choose, so a report is worth acting on and
silence means the pieces below are in place. It also checks each maildrop
for a type VM knows and the right number of fields, neither of which the
parsers mind: a misspelt imapssl is accepted where it is written and
fails much later, saying something about the server.
It checks vm-mail-header-from as well, whose value VM writes into a
composition verbatim after ‘From: ’. A value that reads as a header
line, ‘IMAP-FCC: Sent’ for instance, makes every message go out with a
From header nobody can reply to; mail-default-headers is what
adds a header to every composition.
It never runs by itself. What VM does unasked is say once per session, in
one line, that the command would have something to report, and only where
it would; vm-suggest-checking-configuration set to nil stops even
that.
The line waits for Emacs to go idle before it is said, so that the folder totals and the messages a fetch prints do not overwrite it on their way past. Nothing waits for you to read it: it stays in the echo area until you do something.
So that C-x m and anything else that composes mail goes through VM:
(setq mail-user-agent 'vm-user-agent)
This line belongs in your Emacs init file rather than in
vm-init-file, and it is the only one here that does. A file VM
loads is read when VM starts, so a C-x m before that would find
whatever mail-user-agent was. It works from the init file because
vm-autoloads.el registers the agent, so nothing of VM needs to be
loaded for Emacs to know how to reach it.
Where your folders live, which folder new mail lands in, and the file VM moves mail through on the way:
(setq vm-folder-directory "~/mail/")
(setq vm-primary-inbox "~/INBOX"
vm-crash-box (concat vm-primary-inbox ".crash"))
Where new mail comes from. Each entry is (INBOX SPOOL CRASHBOX), and
several may name the same inbox, so mail from more than one place collects in
one folder:
(setq vm-spool-files
(list
(list vm-primary-inbox "/var/spool/mail/you" vm-crash-box)
(list vm-primary-inbox "/var/spool/mail/you-too" vm-crash-box)
;; another folder, fed from somewhere else
(list "spam" "~/spamdrop" (concat vm-folder-directory "spam.crash"))))
See Spool Files, for what a spool specification may be: a file, or a POP or IMAP maildrop.
Point the primary inbox at the server instead of a file. One of these, not both:
(setq vm-primary-inbox "pop:pop.example.com:110:pass:you:*") ;; or (setq vm-primary-inbox "imap:imap.example.com:143:inbox:login:you:*")
VM keeps a local copy of a server folder so that reading it does not mean fetching it again. See IMAP Cache Server, for what that copy is and is not:
(setq vm-pop-folder-cache-directory "~/mailcache/") (setq vm-imap-folder-cache-directory "~/mailcache/")
Give each account a short name, and VM asks for the name rather than the whole specification:
(setq vm-imap-account-alist
'(("imap:imap.example.com:143:*:login:you:*" "work")
("imap:mail.example.net:143:*:login:you:*" "home")))
A summary line shows the author. For mail you sent, the author is you, which tells you nothing; naming yourself here shows the recipient instead:
(setq vm-summary-uninteresting-senders
(regexp-opt '("@example.com" "Your Name")))
vm-summary-format decides the rest. See Summary Format, for what
the conversions mean. Change it in a folder you already have and
M-x vm-fix-my-summary rebuilds the lines that were made under the old
one.
HTML mail is displayed by whatever
vm-mime-text/html-handler names, and its default, auto-select,
takes the best of what you have installed. See HTML display.
For types nothing displays, name a program to turn one into something that does:
(setq vm-mime-type-converter-alist
'(("application/zip" "text/plain" "zipinfo /dev/stdin")))
If you send from more than one address, Personality Crisis picks the one that fits each message. See Multiple Email Addresses (Personality Crisis):
(require 'vm-pcrisis) (vm-pcrisis-mode 1)
A composition is an ordinary Emacs buffer, so set it up with a hook:
(defun my-vm-mail-mode-hook ()
(setq fill-column 60
comment-start "> ")
(turn-on-auto-fill)
(flyspell-mode 1))
(add-hook 'vm-mail-mode-hook 'my-vm-mail-mode-hook)
VM reads ~/.mailrc for mail aliases, so a line of
alias fred fred@example.com
lets you address a message to ‘fred’. This is Emacs’s own
mailalias.el and needs nothing set up; mail-personal-alias-file
says where the file is if it is not ~/.mailrc. The alias is expanded
as the message goes out, so the composition shows ‘fred’ until you send
it.
Emacs has a second reader for the same file, mail-abbrevs.el, which expands as you type instead, so the composition shows the address and you can see what you are about to send:
(add-hook 'vm-mail-mode-hook 'mail-abbrevs-setup)
The two read the same aliases and differ only in when they act. Which you prefer is a matter of whether you would rather read the name or the address in a composition.
VM does not send mail; Emacs does, through smtpmail.el.
See Configuration of VM, for the whole of it, including what the ports mean:
(setq send-mail-function 'smtpmail-send-it
smtpmail-smtp-server "smtp.example.com"
smtpmail-smtp-service 587
smtpmail-stream-type 'starttls)
smtpmail-send-it rather than sendmail-send-it because it
removes a Bcc header itself instead of trusting a program outside
Emacs to do it. VM asks before sending a message with a Bcc through
one that does not. See Sending Options.
smtpmail has one server setting, not one per account, so sending each
of your addresses through its own server means setting those variables as
each message goes out. mail-send-hook runs in the composition, just
before it is handed over, which is where the From header is settled
and so where the choice can be made:
(defvar my-smtp-accounts
'(("@work.com" "smtp.work.com" 587 "me@work.com")
("@home.net" "smtp.provider.net" 587 "me")))
(defun my-choose-smtp-account ()
"Point smtpmail at the server for the From address of this message."
(let ((from (or (vm-mail-mode-get-header-contents "From:") "")))
(dolist (account my-smtp-accounts)
(when (string-match-p (regexp-quote (nth 0 account)) from)
(setq smtpmail-smtp-server (nth 1 account)
smtpmail-smtp-service (nth 2 account)
smtpmail-smtp-user (nth 3 account))))))
(add-hook 'mail-send-hook 'my-choose-smtp-account)
Plain setq and not setq-local: smtpmail-send-it copies
the message into a buffer of its own and reads those variables there, so a
value made local to the composition is not seen. Setting them from
mail-send-hook is still right with several compositions open at once,
because the hook runs as each one is sent rather than as it is begun.
This is the part an external program such as msmtp does for you,
by reading the From header and choosing an account from its own
configuration.
A send that has stopped, where the server has taken the connection and then
said nothing, is interrupted with C-g. A sender that runs a program is
run so that Emacs can see the keystroke while it waits; one that talks to the
server itself, smtpmail-send-it being the common one, always could be
interrupted.
Interrupting kills the program and unsends nothing. The message may have reached the server already, so look at what arrived before sending it again.
BBDB completes addresses as you type them and can make a record of everyone you correspond with. It is a separate package, so ask for it in a way that does not break the rest of your configuration when it is not installed:
(when (require 'bbdb nil t) (bbdb-initialize 'vm 'sendmail) (bbdb-mua-auto-update-init 'vm 'mail) (setq bbdb-mua-auto-action 'query))
bbdb-initialize does all the hooking: vm for the folder
commands it binds, sendmail for completion in a composition. Leave
bbdb-insinuate-vm to it, which its own docstring asks you to. The
second line is what looks each address up as you go: vm for the
messages you read, mail for the ones you send. What happens to an
address with no record is bbdb-mua-auto-action: query asks,
create makes one without asking, update touches only records
that exist already, and nil does nothing.
That form is worth copying for any package you are not certain of:
(require feature nil t) answers nil rather than signalling, and
everything that depends on it sits inside the when. A bare
require of something missing stops your configuration where it stands,
and every setting after it is silently never made.
Bind what you use most. These are examples, not advice:
(define-key vm-mode-map [(meta up)] 'vm-previous-unread-message) (define-key vm-mode-map [(meta down)] 'vm-next-unread-message) (define-key vm-mode-map "R" 'vm-reply-other-frame) (define-key vm-mode-map "f" 'vm-forward-message-other-frame)
See Key Index, for what is bound already.
Once a message has been selected, VM will show it to you. By default, presentation is done in two stages: previewing and paging.
Previewing means showing you a small portion of a message and allowing you to decide whether you want to read it. Typing SPC exposes the body of the message, and from there you can repeatedly type SPC to page through the message.
By default, the sender, recipient, subject and date headers are shown
when previewing; the rest of the message is hidden. This behavior may
be altered by changing the settings of three variables:
vm-visible-headers, vm-invisible-header-regexp and
vm-preview-lines.
If the value of vm-preview-lines is a number, it tells VM how
many lines of the text of the message should be visible. The default
value of this variable is 0. If vm-preview-lines is nil,
then previewing is not done at all; when a message is first presented it
is immediately exposed in its entirety and is flagged as read. If
vm-preview-lines is t, the message body is displayed fully
but the message is not flagged as read until you type SPC.
The value of vm-visible-headers should be a list of regular
expressions matching the beginnings of headers that should be made
visible when a message is presented. The regexps should be listed in
the preferred presentation order of the headers they match.
If non-nil, the variable vm-invisible-header-regexp
specifies what headers should not be displayed. Its value should
be a string containing a regular expression that matches all headers you
do not want to see. Setting this variable non-nil implies that
you want to see all headers not matched by it; therefore the value of
vm-visible-headers is only used to determine the order of the
visible headers in this case. Headers not matched by
vm-invisible-header-regexp or vm-visible-headers are
displayed last.
If you change the value of either vm-visible-headers or
vm-invisible-header-regexp in the middle of a VM session the
effects will not be immediate. You will need to use the command
vm-discard-cached-data on each message (bound to j by
default) to force VM to rearrange the message headers. A good way to do
this is to mark all the messages in the folder and apply
vm-discard-cached-data to the marked messages.
See Selecting Messages.
Another variable of interest is vm-highlighted-header-regexp.
The value of this variable should be a single regular expression that
matches the beginnings of any header that should be presented in inverse
video when previewing. For example, a value of
‘"^From\\|^Subject"’ causes the From and Subject headers to be
highlighted. Highlighted headers will be displayed using the face
specified by vm-highlighted-header-face, which defaults to the
face vm-highlighted-header, bold, unless you customize it.
Setting vm-enable-body-faces colours the body as well: quoted text a
face per level of quoting, and the signature its own. It is off by default,
since it changes how every message looks.
vm-citation-faces holds the faces for quoted text, the first for text
quoted once and so on; there are five, and text quoted deeper wears the last
of them. A list of one face colours every level alike, and a list of none
turns citation colouring off while leaving the signature alone. A line
counts as quoted for each ‘>’ it begins with, whether or not initials
stand in front of it, so ‘MD> ’ is one level and not two.
The signature is everything after the last line of exactly ‘-- ’, which
is the separator RFC 3676 describes and what mail readers write. It
wears vm-signature-face, which nil turns off.
In earlier releases this colouring came from a bundled add-on, u-vm-color.el, which had to be wired up by hand and was never documented here. That is gone, and this replaces the part of it worth keeping.
By default, VM will not preview messages that are flagged as read. To
have VM preview all messages, set the value of
vm-preview-read-messages to t.
Typing t (vm-expose-hidden-headers) makes VM toggle
between exposing and hiding headers that would ordinarily be hidden.
SPC during a message preview exposes the body, flagging the message “read” if it was new or unread. From there:
vm-auto-next-message is nil, when you type n yourself.
If the value of vm-honor-page-delimiters is non-nil, VM
will recognize and honor page delimiters. This means that when you
scroll through a document, VM will display text only up to the next page
delimiter. Text after the delimiter will be hidden until you type
another SPC, at which point the text preceding the delimiter will
become hidden. The Emacs variable page-delimiter determines what
VM will consider to be a page delimiter.
You can “unread” a message (so to speak) by typing U
(vm-unread-message, also called vm-mark-message-unread).
The current message will be marked unread. Conversely, you can mark an
unread message as read by typing . (vm-mark-message-read).
Setting the variable vm-move-after-reading will cause vm to move
to the next undeleted message after marking the current message as read.
As you read messages, you might want to flag important messages so
that you can come back to them later. You can do so with
M-x vm-toggle-flag-message. Running it again on a flagged
message turns the flag off. In the Summary display, the flagged
messages are highlighted using the
vm-summary-high-priority face. (See predefined summary faces.) The flag is kept in the folder from session to session, like the
other message attributes (see Message Attributes).
It is on !.
In earlier releases it was not: ! and a handful of others were left unbound because they had meant different things in different versions, and typing one reported that it had an optional binding you could install. They are simply bound now. ! flags, < and > promote and demote a subthread, and the keys the older set used for other things (a, b, e, i, w, L, M-l, *, %, =, M-g) are free for you to bind as you please.
Sometimes you will receive messages that contain lines that are
too long to fit on your screen without wrapping. The simplest answer is
Emacs’s own visual-line-mode, which wraps the display and leaves the
text alone; add turn-on-visual-line-mode to
vm-presentation-mode-hook to have it on for every message you read.
Setting vm-word-wrap-paragraphs to t makes VM wrap the long lines
themselves, in the presentation copy, leaving every line break that is
already there. That is the setting for quoted text: the filling described
next joins the lines of a paragraph before breaking them again, so a short
line followed by a long one becomes one paragraph and two quoted lines
become one. Wrapping never joins, and never breaks a word, so a long
URL survives whole.
In earlier releases this used the longlines.el library. It no longer does, and needs nothing installed: the library had been obsolete since Emacs 24.4 and said so as it loaded. The wrapping is the same, save that longlines.el left a space at the end of each line it wrapped.
Or use Emacs’s paragraph filling. If you set
vm-fill-paragraphs-containing-long-lines to a positive numeric
value N, VM will call fill-paragraph on all paragraphs that
contain lines spanning N columns or more. You can also set this
variable to the symbol window-width, in which case the width of
the current window is used the limiting width beyond which paragraph
filling is invoked. As with other things that VM does for presentation
purposes, this does not change the message contents. VM copies the
message contents to a “presentation” buffer before altering them. The
fill column that VM uses is controlled by
vm-paragraph-fill-column, which is also the column
vm-word-wrap-paragraphs wraps to. Unlike the Emacs variable
fill-column, this variable is not buffer-local by default.
M-x vm-isearch-presentation searches the message you are reading: it selects the presentation buffer, where the text VM displays actually lives, and starts an incremental search there. An C-s typed in the summary would search the summary lines instead.
MIME is a set of extensions to the standard Internet message
format that allows reliable transmission of arbitrary data including images,
audio and video, as well as ordinary text in different languages. By
default, VM will recognize MIME encoded messages and display them
as specified by the various MIME standards specifications. This
can be turned off by setting the variable vm-display-using-mime to
nil and VM will then display MIME messages as plain text
messages.
At its most basic level, MIME is a set of transfer encodings used to ensure error free transport, and a set of content types. VM understands the two standard MIME transport encodings, Quoted-Printable and BASE64, and will decode messages that use them as necessary. VM will also try to recognize and decode messages using the UNIX uuencode encoding system. While this is not an official MIME transfer encoding and never will be, enough old mailers still use it that it is worthwhile to attempt to decode it.
By default VM will display as many content types as possible within Emacs. Images and audio are also supported if support for images and audio has been compiled in. Types that cannot be displayed internally within Emacs can be converted to a type that can, or be displayed using an external viewer.
The first step in displaying a MIME message is decoding it to
determine what object types it contains. The variable
vm-auto-decode-mime-messages controls when this happens.
A value of t means VM should decode the message as soon as
the message body is exposed, or during previewing if
vm-mime-decode-for-preview is also set non-nil. A
nil value means wait until decoding is explicitly
requested. Type D (vm-decode-mime-message) to
manually initiate MIME decoding.
When VM does not display a MIME object immediately, it displays a
MIME button or tag line in its place that describes the object
and what you have to do to display it. The value of
vm-mime-button-format-alist determines the format of the text in
those buttons.
After decoding, you will see either the decoded MIME objects or button lines that must be activated to attempt display of the MIME object.
Which is which is a list and an exception list:
List of MIME content types that should be displayed immediately after decoding. Other types will be displayed as a button that you must activate to display the object.
A value of t means that all types should be displayed immediately. A nil value means never display MIME objects immediately; only use buttons.
If the value is a list, it should be a list of strings, which should all be types or type/subtype pairs. Example:
(setq vm-mime-auto-displayed-content-types ’("text" "image/jpeg"))
If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
Note that all multipart types are processed specially, and this variable does not apply to them. In particular,
multipart/digest messages are always displayed as a button to avoid automatically visiting a new folder while you are moving around in the current folder. message/partial messages are always displayed as a button, because there always needs to be a way to trigger the assembly of the parts into a full message.
Any type that cannot be displayed internally or externally will be displayed as a button that allows you to save the body of the MIME object to a file.
Default value: ("text" "image" "message/rfc822")
List of MIME content types that should not be displayed immediately
after decoding. These types will be displayed as a button that you
must activate to display the object. This is an exception list for
the types listed in vm-mime-auto-displayed-content-types; all types
listed there will be auto-displayed except those in the exception
list.
The value should be either nil or a list of strings. The strings should all be types or type/subtype pairs. Example:
(setq vm-mime-auto-displayed-content-type-exceptions ’("text/html"))
If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
So the two examples above between them display all text types immediately except html, and of the images only JPEG.
A MIME object carries a Content-Disposition header saying
how it is meant to be shown: ‘inline’, as part of the message, or as an
attachment, a button you invoke to see it. It is a suggestion, and
one many mail clients make badly, some declaring every object inline and
others declaring every object an attachment.
vm-mime-honor-content-disposition says how much notice VM takes:
tAlways follow the header.
nilIgnore it.
internal-onlyFollow it for the types VM can display itself. (See Internal display of MIME attachments.)
The MIME structure of a message can be displayed using the command
vm-mime-list-part-structure. It causes VM to display a pop-up
window listing the hierarchical structure of the message in VM’s internal
format, which should be normally discernible.
The commands [ (vm-move-to-previous-button) and ]
(vm-move-to-next-button) move to the attachment buttons within the
message presentation. vm-previous-button and vm-next-button are
the same two commands under their other names.
To activate a button, either click mouse-2 over it, or move the cursor to the line and press RET. If you are running under a window system, you can use mouse-3 over a MIME button to display a menu of actions you can take on the MIME object. If you prefer using keyboard commands, you can save the MIME object with $ w, print it with $ p, or pipe it to a shell command with $ |. Use $ s to append an encapsulated message or USENET news article to a folder. If you want to display the object with its characters displayed using Emacs’ default face, use $ RET. To display the object using an external viewer, type $ e.
| $ w | vm-mime-reader-map-save-file |
| $ s | vm-mime-reader-map-save-message |
| $ p | vm-mime-reader-map-pipe-to-printer |
| $ | | vm-mime-reader-map-pipe-to-command |
| $ RET | vm-mime-reader-map-display-using-default |
| $ e | vm-mime-reader-map-display-using-external-viewer |
| $ v | vm-mime-reader-map-display-object-as-type |
| $ d | vm-delete-mime-object |
| $ a | vm-mime-reader-map-attach-to-composition |
The MIME attachments can be saved to disk with $ w
(vm-mime-reader-map-save-file). They can be deleted at the
same time by setting the variable vm-mime-delete-after-saving.
In this case, the attachment is deleted and replaced by a MIME part
that refers to the saved copy. The variable
vm-mime-attachment-save-directory specifies the default
directory to save the attachments in. The MIME attachments can also
be deleted directly from the message bodies with $ d
(vm-delete-mime-object). The variable
vm-mime-confirm-delete controls whether a confirmation is asked
for.
It is a good idea to use vm-mime-delete-after-saving to delete
saved attachments instead of deleting them manually, because with the
former approach the message will have a handle to the saved copy,
which can be retrieved when desired.
Saving attachments to the file system and deleting them from message bodies has the beneficial effect of reducing the size of VM folders. That leads to a better utilization of the computer resources and usually a faster operation of VM.
Save all attachments in the next COUNT messages or marked
messages. For the purpose of this function, an "attachment" is
a mime part part which has "attachment" as its disposition or
simply has an associated filename. Any mime types that match
vm-mime-saveable-types but not vm-mime-saveable-type-exceptions
are also included.
The attachments are saved to the specified DIRECTORY. The
variables vm-mime-all-attachments-directory or
vm-mime-attachment-save-directory can be used to set the
default location. When directory does not exist it will be
created.
Delete all attachments from the next COUNT messages or marked
messages. For the purpose of this function, an "attachment" is
a mime part part which has "attachment" as its disposition or
simply has an associated filename. Any mime types that match
vm-mime-deletable-types but not vm-mime-deletable-type-exceptions
are also included.
M-x vm-list-mime-part-structure shows how the message you are reading
is put together: a buffer of its own holding one line per MIME
part, indented as the parts are nested, each giving the part’s type and
whatever it has of an id, a description and a disposition. With a prefix
argument the whole layout structure is printed instead, which is for
debugging VM rather than for reading mail. vm-mime-list-part-structure
is the same command under its other name.
List of MIME content types that should be displayed internally
if Emacs is capable of doing so. A value of t means that VM
displays all types internally if possible. A list of exceptions
can be specified via vm-mime-internal-content-type-exceptions.
A nil value means never display MIME objects internally, which
means VM must run an external viewer to display MIME objects.
If the value is a list, it should be a list of strings. Example:
(setq vm-mime-internal-content-types ’("text" "message" "image/jpeg"))
If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
Note that all multipart types are always handled internally. There is no need to list them here.
Default value: t
VM knows which types it can display internally, so naming one it cannot is not an error; it falls back the same way an unlisted type does. For example:
(setq vm-mime-internal-content-types '("text" "message" "image/jpeg"))
If a top-level type is listed without a subtype then all subtypes of that type are assumed to be included. Note that multipart types are always handled internally regardless of the setting of this variable.
List of MIME content types that should not be displayed internally.
This is an exception list for the types specified in
vm-mime-internal-content-types; all types listed there will be
displayed internally except for those in the exception list.
The value should be a list of strings. Example:
(setq vm-mime-internal-content-type-exceptions ’("image/jpeg"))
If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
The HTML content in text/html MIME parts can be displayed in Emacs using a variety of packages. VM knows about:
emacs-w3mThe w3m browser driven from inside Emacs, which renders into the
presentation buffer and can show images. See HTML display.
See Emacs-w3m in Emacs-w3m User’s Manual.
w3mThe same program run outside Emacs, converting the part to plain text.
lynxThe lynx browser run the same way.
shrEmacs’s own renderer, the one eww uses. It needs nothing
installed, only an Emacs built with libxml2, so it is the one that is always
available.
shr fetches no image while VM renders. A remote image in a message
is fetched from the sender’s server, which then learns that the message was
opened and when; vm-mime-shr-inhibit-images is bound while rendering
so that this does not depend on the shr settings chosen for the web.
vm-mime-text/html-handler names which of them is used.
auto-select, the default, takes the first this machine has, in the
order above: emacs-w3m needs both the library and the w3m
program, so a library without the program falls through to the next, and
shr is last because it is the one that is always there.
nil asks VM not to display HTML content internally at all.
With nil, or with none of the three installed, VM says ‘No
handler available for internal display of text/html’ and shows the part as
a button rather than as text. See External display of MIME attachments, for handing the
type to a program of your own.
A sender who does not know how wide your window is can wrap the text and mark
each break it invented by leaving a space at the end of the line, which is what
RFC 3676 calls format=flowed. VM joins those lines back up before
displaying such a part, so that
vm-fill-paragraphs-containing-long-lines wraps the paragraph to the
width you have rather than to the width the sender had. Breaks the author
meant are left alone, as are a change of quote depth and the ‘-- ’
signature separator, and ‘delsp=yes’ is honoured. Set
vm-mime-unflow-flowed-text to nil to see such a message with the
sender’s own line breaks.
Emacs-w3m is the handler that renders rather than converting to plain text, and the only one that shows images. See Emacs-w3m in Emacs-w3m User’s Manual. What VM adds to it is here.
The Emacs-w3m browser has its own key bindings for use within HTML text.
These are disabled by default so that VM’s key bindings will continue to
have effect. To switch to the Emacs-w3m key bindings, set the variable
vm-use-presentation-minor-modes to t. The minor mode to be
used for the Emacs-w3m generated text can be set using the variable
vm-presentation-minor-modes.
An image in an HTML part either came with the message, which ‘multipart/related’ does with a ‘cid:’ URL, or sits on a web server and is fetched as the message is displayed. Fetching the second kind tells the sender that you have read the message, and an address that answers is worth more to them than one that does not. Two settings decide what is fetched:
vm-w3m-display-inline-images ¶vm-w3m-safe-url-regexpWhich image URLs may be fetched, nil meaning every one.
vm-w3m-display-inline-images defaults to t, and
vm-w3m-safe-url-regexp defaults to ‘\`cid:’, so a message shows
the images it came with and fetches nothing from a web server.
M-x vm-w3m-safe-toggle-inline-images turns the images in the message you are reading off and on again. With a prefix argument it treats every image in that message as safe, which is how to see the rest of one you trust without changing what the next message may fetch.
The same setting decides which links Emacs-w3m will follow for you, where
vm-use-presentation-minor-modes is t and its own key bindings
are in force: a link whose URL does not match is refused with
‘This link is considered to be unsafe’, and a prefix argument follows
it anyway. That is worth having on a message asking you to click something,
which is how “phishing” works: the text of a link says nothing about where
it goes.
Emacs-w3m has options of its own. Three of them matter for reading mail:
w3m-force-redisplay ¶You may set this to nil if you find the HTML display “jittery”
(which is caused by Emacs-w3m redisplaying the text during formatting).
w3m-pop-up-frames ¶You may set this to t if you find that Emacs-w3m is too liberal with
your Emacs windows.
w3m-goto-article-function ¶Set this to an Emacs function that opens a URL. If you have already
set vm-url-browser, you may copy its value into this variable.
For types that you want displayed externally, set the value
of vm-mime-external-content-types-alist to specify external
viewers for the types. The value of this variable should be an
associative list of MIME content types and the external programs
used to display them. If VM cannot display a type internally or
a type is not listed in vm-mime-internal-content-types VM will
try to launch an external program to display that type.
The alist format is a list of lists, each sublist having the form
(TYPE FUNCTION ARG ARG ... )
or
(TYPE PROGRAM ARG ARG ... )
or
(TYPE COMMAND-LINE)
TYPE is a string specifying a MIME type or type/subtype pair. For example “text” or “image/jpeg”. If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
In the first form, FUNCTION is a lisp function that is responsible for displaying the attachment in an external application. Any ARGs will be passed to the function as arguments. The octets that compose the object will be written into a temporary file and the name of the file is passed as an additional argument.
In the second form, PROGRAM is a string naming a program to run to display an object. Any ARGs will be passed to the program as arguments. The octets that compose the object will be written into a temporary file and the name of the file can be inserted into an ARG string by writing ‘%f’ in the ARG string. The filename is added as the last argument only where ‘%f’ appears in none of the ARG strings; in earlier releases it was always added there.
If the COMMAND-LINE form is used, the program and its arguments are specified as a single string and that string is passed to the shell ("sh -c" typically) for execution. Since the command line will be passed to the shell, you can use shell variables and input/output redirection if needed. As with the PROGRAM/ARGS form, the name of the temporary file that contains the MIME object will be appended to the command line if ‘%f’ does not appear in the command line string.
In either the PROGRAM/ARG or COMMAND-LINE forms, all the
program and argument strings will have any %-specifiers in
them expanded as described in the documentation for the
variable vm-mime-button-format-alist. The only difference
is that ‘%f’ refers to the temporary file VM creates to store
the object to be displayed, not the filename that the sender
may have associated with the attachment.
Example:
(setq vm-mime-external-content-types-alist
'(
("text/html" browse-url-of-file)
("image/gif" "xv")
("image/jpeg" "xv")
("video/mpeg" "mpeg_play")
("video" w32-shell-execute "open")
)
)
The first matching list element will be used.
No multipart message will ever be sent to an external viewer.
External viewer processes are normally killed when you select
a new message in the current folder. If you want viewer
processes to not be killed, set
vm-mime-delete-viewer-processes to a nil value.
Any type that cannot be displayed internally or externally or converted to a type that can be displayed, will be displayed as a button that allows you to save the body to a file.
As with the internal type list there is an exception list,
vm-mime-external-content-type-exceptions: VM launches no viewer of
its own accord for a type named there. So a viewer can be configured for a
type you do not ordinarily want shown, or for one you usually convert with
vm-mime-type-converter-alist, and $ e still displays such a
type with its external viewer when you ask.
When a MIME object is displayed using an external viewer VM must
first write the object to a temporary file. The external viewer
then opens and displays that file. Some viewers will not open a
file unless the filename ends with some extension that it
recognizes such as ‘.html’ or ‘.jpg’. You can use the
variable vm-mime-attachment-auto-suffix-alist to map MIME
types to extensions that your external viewers will recognize.
The value of this variable should be a list of type and suffix
pairs. The list format is:
((TYPE . SUFFIX) ...)
TYPE is a string specifying a MIME top-level type or a type/subtype pair. If a top-level type is listed without a subtype, all subtypes of that type are matched.
SUFFIX is a string specifying the suffix that should be used for the accompanying type.
Example:
(setq vm-mime-attachment-auto-suffix-alist
'(
("image/jpeg" . ".jpg")
("image/gif" . ".gif")
("image/png" . ".png")
("text" . ".txt")
)
)
VM will search the list for a matching type. The suffix associated with the first type that matches will be used for the temporary filename.
A sender who puts a picture inside an HTML message does not put the picture in the HTML: the image is attached as a further part of the message, and the HTML refers to it as ‘cid:something’, a reference to that part’s ‘Content-ID’ (RFC 2392). An external viewer given only the one temporary file has no way to reach the rest of the message, and so shows a broken image.
VM therefore writes the parts an HTML part refers to beside it, and
rewrites the references to name those files, so the message appears as it was
meant to. This puts the images in the temporary directory along with the
HTML until VM deletes the message’s temporary files. Setting
vm-mime-externalize-cid-references to nil sends the
HTML on its own instead.
Emacs shows an image where the display is graphical, which
display-images-p answers, and in the formats the build has the
libraries for, which image-type-available-p answers one format at a
time, ‘tiff’ or ‘gif’ for instance.
Nothing has to be set for an image to be shown: VM displays every type it
can, vm-mime-internal-content-types defaulting to t, and
vm-mime-auto-displayed-content-types names ‘image’ among the
types it shows as the message is displayed rather than on being asked.
Narrow either of them to a list of types to change that:
(setq vm-mime-auto-displayed-content-types '("text" "message/rfc822"))
An image that is not auto-displayed is shown as a button with a thumbnail, and RET or a middle mouse click on the button shows it full size.
Once an image is displayed, you can use the right mouse button to do
various image manipulations on it, such as enlarging/reducing it,
rotating it etc. To do such operations, VM uses the ‘ImageMagick’
graphics manipulation software. You can install ImageMagick on your
system and name its program to VM in the variable
vm-imagemagick-program: the magick program of
ImageMagick 7, or convert in version 6 and earlier. VM works
out for itself which subcommand to call.
VM displays an image as a run of horizontal strips rather than as one
object, so that scrolling down moves through it a line at a time instead of
jumping past the whole of it. vm-mime-use-image-strips defaults to
t; nil, or a machine with no ImageMagick, displays the image
whole.
VM also uses ImageMagick to convert between image formats, so that an
image that is not displayable in Emacs is converted to another format
that is displayable. You can turn off such conversion by setting
vm-imagemagick-program to ‘nil’.
Types that cannot be displayed internally or externally are
checked against an associative list of types that can be converted to other
types. If an object can be converted to a type that VM can
display, then the conversion is done and the new object is
subject to the auto-display rules which determine whether the
object is displayed immediately or a button is displayed in its
place. The conversion list is stored in the variable
vm-mime-type-converter-alist.
The alist format is
( (START-TYPE END-TYPE COMMAND-LINE ) ... )
START-TYPE is a string specifying a MIME type or type/subtype pair. Example ‘"text"’ or ‘"image/jpeg"’. If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
END-TYPE must be an exact type/subtype pair. This is the type to which START-TYPE will be converted.
COMMAND-LINE is a string giving a command line to be passed to the shell. The octets that compose the object will be written to the standard input of the shell command.
Example:
(setq vm-mime-type-converter-alist
'(
("image/jpeg" "image/gif" "jpeg2gif")
("text/html" "text/plain" "striptags")
)
)
The first matching list element will be used.
For text type messages, MIME also requires that a character set be specified, so that the recipient’s mail reader knows what character glyphs to use to display each character code. Emacs decodes any character set it has a coding system for, and draws a replacement character where the font has no glyph, so a message is shown whatever it declares.
A few of the names that arrive in mail are not names Emacs knows:
‘windows-874’, ‘x-mac-roman’ and ‘unknown-8bit’ are three.
Text declaring one of those is guessed at rather than decoded, and it is
those that vm-mime-charset-converter-alist is for. Name a command
that converts from such a charset to one Emacs knows, and VM runs the text
through it before decoding. A charset Emacs can decode is left alone,
whatever the list says.
The alist format is:
( ( START-CHARSET END-CHARSET COMMAND-LINE ) ... )
START-CHARSET is a string specifying a MIME charset, one Emacs has no coding system for. Example ‘"windows-874"’ or ‘"x-mac-roman"’.
END-CHARSET is a string specifying the charset to which START-CHARSET will be converted, one Emacs does know.
COMMAND-LINE is a string giving a command line to be passed to the shell. The characters in START-CHARSET will be written to the standard input of the shell command and VM expects characters encoded in END-CHARSET to appear at the standard output of the COMMAND-LINE. COMMAND-LINE is passed to the shell, so you can use pipelines, shell variables and redirections.
Example:
(setq vm-mime-charset-converter-alist
'(
("windows-874" "utf-8" "iconv -f cp874 -t utf-8 -c")
)
)
The first matching list element will be used. Be sure to include the
-c option so that nonconvertible characters are ignored instead
of causing error messages.
A header is supposed to be ASCII, with anything else written as the
encoded words of RFC 2047, but mail carrying raw 8-bit bytes in its headers has
always existed and RFC 6532 now makes UTF-8 legal there. Such text
says nothing about its own character set, so VM guesses:
vm-mime-8bit-header-charsets lists the coding systems to try, in order,
and defaults to UTF-8 and then ISO-8859-1. This affects the summary
and the displayed message only; the folder on disk keeps the bytes exactly as
they arrived. Set the variable to nil to be shown the bytes.
MIME allows a message to carry its content in several formats at once, in the same message, as a multipart/alternative. It is there because the sender’s mail program and the recipient’s need not display the same things: a message composed with tables, italics and equations goes out with at least two text subparts, one in the formatting language the sender used and one in plain text, and each reader’s program shows whichever of them it can.
vm-mime-alternative-show-method says which alternative VM shows:
bestThe subpart closest in appearance to what the sender composed, displayed internally or by an external viewer. In the example above, the fully featured text subpart, if VM knows how to display that type.
best-internalThe closest subpart VM can display itself. No external viewer is used.
allEvery alternative.
The value can also be a list of the form
(favorite TYPE ...)
where each TYPE is a MIME type as a string. VM takes each
in turn and shows the first alternative that matches one and can be
displayed. favorite-internal in place of favorite takes the
first that VM can display itself.
To read one alternative and keep the others within reach, ask for all
and then say which types are not to be displayed:
(setq vm-mime-alternative-show-method 'all)
(setq vm-mime-auto-displayed-content-type-exceptions '("text/html"))
Every alternative is then part of the message, and the ones excluded from automatic display arrive as buttons instead:
plain version ---------------------------------------------------------------------- HTML (us-ascii): <no suggested filename>, HTML [display]
Press the button, or type RET on it, to see that alternative. The other settings above choose one alternative and discard the rest, which is why they cannot do this.
Messages with multiple alternatives use up extra file space and slow
down the operation of vm. If you would like keep the text/plain
alternatives but erase the text/html alternatives, you can use the
vm-nuke-alternative-text/html command. This operation may not
always be safe because the text/html alternative is often the
most faithful representation of the sender’s message and it may
include attachments that are not replicated in the other
alternatives. Please use caution.
Some mailers incorrectly use the generic ‘application/octet-stream’ type when sending files that really have a specific MIME type. For example, a JPEG image might be sent using ‘application/octet-stream’ type instead of ‘image/jpeg’, which would be the correct type. In many cases the filename sent along with the mistyped file (e.g. foo.jpg) suggests the correct type.
Non-nil value means that VM should try to infer a MIME object’s
type from its filename when deciding whether the object should be
displayed and how it should be displayed. This will be done only
for objects of type application/octet-stream. The object’s filename
is checked against the regexps in vm-mime-attachment-auto-type-alist
and the type corresponding to the first match found is used.
Non-nil value means VM should try to infer a MIME object’s
type from its filename also for text attachments, not only for application/octet-stream.
A meeting invitation arrives as a ‘text/calendar’ part holding an iCalendar object (RFC 5545), which is a form to be read by a program. VM shows what it says instead:
Invitation Quarterly review When: Monday 10 August 2026 at 14:00 until Monday 10 August 2026 at 15:00 Where: Room 3, second floor Organizer: Alice Example <alice@example.com> Attendees: Bob <bob@example.com> -- accepted Carol <carol@example.com> -- not answered
The first line says what kind of message it is (an invitation, a cancellation, a reply to an invitation) since ‘REQUEST’ and ‘CANCEL’ are not words a reader should have to know. A time is shown as the sender wrote it, with ‘UTC’ where the sender said UTC; a zone named by ‘TZID’ is not converted, on the grounds that 14:00 as written beats 14:00 in the wrong zone.
The description that follows an invitation is often several screens of
dial-in numbers and boilerplate, so only the first
vm-icalendar-description-lines lines of it are shown, ten by default,
and vm-icalendar-show-description set to nil leaves it out
altogether. The part itself is still there, and saving it gives you the
object as it arrived.
M-x vm-icalendar-import adds the event to your diary, by handing the
part to Emacs’s own icalendar.el. With a file name it writes there
instead of to diary-file.
Answering an invitation, which means accepting or declining by sending a reply the organizer’s software understands, is not something VM does.
VM reads S/MIME messages through Emacs’s own smime.el.
Typically, a secure message part (identified
by MIME type “application/pkcs7-mime”) will be presented as a
button which, when pushed, will decrypt that part of the message.
It is also
possible to auto-decrypt whenever you read the message by adding
"application/x-pkcs7-mime" and "application/pkcs7-mime" to
the
variable vm-mime-auto-displayed-content-types But beware that, at
present, the ‘smime.el’ library always asks for a private key passcode,
even for non-encrypted private keys.
So, you will be prompted while
paging through messages, which may be undesirable.
In addition, since the
content of the S/MIME-encoded message should be considered
private, auto-decrypting could compromise security.
In order to get started reading S/MIME messages, you need to first have at least one RSA public/private key pair to be associated with your email address and a certificate generated from them. There are numerous ways to obtain these sets. We will highlight only the simplest one as a way to just get you started. We can create a self-signed certificate (which should only be used with people you already trust) using “openssl” on the command line:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem
This will generate an encrypted private key in ‘key.pem’ and
certificate in ‘cert.pem’. Next we need to tell Emacs about the
certificate and its association to an email address. This is done by
setting the variable smime-keys. (Consult its documentation for
further info.) More importantly, the ‘cert.pem’ file (second element of
each association) is expected to also have the private key within it. Simply
concatenate ‘key.pem’ and ‘cert.pem’ files and store it in a file:
cat key.pem cert.pem > key-cert.pem
Then smime-keys might be
(("joe@example.com" "~/.ssl/key-cert.pem"))
Multiple addresses with different certificates are allowed. When
reading S/MIME messages, VM will search for recipients of
the message that match email addresses in smime-keys and
attempt to decrypt the message with one of those keys. Should there be
no matches in the "To:" or "Cc:" fields, user-mail-address will
be used. Finally, should decryption fail with that key, you will
be prompted to supply another private key with which to attempt
decryption or simply give up.
Secure MIME messages can arrive with a signature using a MIME type
“application/pkcs7-signature”.
VM verifies such signatures automatically,
provided you have set the variable vm-mime-verify-signatures to
t.
It is assumed that the signer’s certificate is embedded in the
message (this is typically the case when sending S/MIME messages).
Success or failure does not affect the reading of the message.
It merely
emits a success message or a warning.
The signers certificate will be
available for download to a file (default is the sender’s email address under
the smime-certificate-directory), which is useful for automatically
choosing certificates when sending mail. See Sending Secure MIME for more information.
When sending messages from within VM, you will be using the standard mail sending facility provided with Emacs, plus some extensions added by VM. See Sending Mail in the GNU Emacs Manual. Emacs comes with two versions of mail sending packages, called “mail mode” and “message mode”. VM currently uses the “mail mode” package, which is not too dissimilar to the “message mode” package.
Even though VM’s mail composition buffers will be in “mail mode”, they have some extra command keys.
vm-yank-message) ¶Copies a message from the folder that is the parent of this composition into
the mail composition buffer. The message number is read from the
minibuffer. Point is left before the inserted text and the mark after it,
which is where a function on mail-citation-hook looks for what it is
to cite; anything on that hook runs once the text is in.
With nothing on the hook, VM does the citing itself: the headers are trimmed
to vm-included-text-headers and
vm-included-text-discard-header-regexp, which between them keep none
unless you say otherwise, and every remaining line is prefixed with
vm-included-text-prefix. See Replying, for the attribution line
and the rest of what is included.
M-x vm-yank-message-other-folderThis allows one to yank a message from a different folder than the parent of this composition.
All VM commands may be accessed in a VM Mail mode buffer by prefixing them with C-c C-v.
vm-attach-file) or drag-and-drop a fileAttaches a file to the composition. When you send the message, VM
will insert the file and MIME encode it. The variable
vm-send-using-mime must be set non-nil for this command to work.
You will be asked for the file’s type, and a brief description of
the attachment. The description is optional. If the file’s type
is a text type, you will also be asked for the character set
in which the text should be displayed.
The new attachment will appear as a highlighted tag in the
composition buffer. You can use mouse button 3 on this tag
to set the default content disposition of the attachment. The
content disposition gives a hint to the recipient’s mailer how to
treat the attachment. Specifically the disposition will indicate
whether the attachment should be displayed along with the message
or saved to a file. Any text in the composition that appears
before the tag will appear in a MIME text part before the
attachment when the message is encoded and sent. Similarly, any
text after the tag will appear after the attachment in the
encoded message. If you change your mind about using the
attachment, you can remove it from the composition with C-k.
If you want to move the attachment to some other part of the message,
you can kill it C-k and yank it back with C-y.
vm-attach-message) ¶Attaches a mail message to the composition. If invoked with a
prefix argument, the name of a folder is read from the minibuffer and
the message or messages to be attached are copied from that
folder. You will be prompted for the message number of the
message to be attached. If you invoke the command on marked
messages by running
vm-next-command-uses-marks first, the marked messages in
the selected folder will be attached as a MIME digest.
vm-attach-buffer)Attaches an Emacs buffer to the composition.
vm-mime-encode-composition) ¶Encodes the composition using MIME, but does not send it. This
is useful if you want to use PGP to sign a message before sending
it. After signing the message, you would use C-c C-c as usual to
send the message. Emacs’ undo command can be used to undo
the encoding, so that you can continue composing the unencoded
message.
vm-preview-composition) ¶Previews the current composition. The message is copied into a temporary folder and you can read the message and interact with it using normal VM mode commands to see how it might look to a recipient. Type q to quit the temporary folder and resume composing your message.
The simplest command is m (vm-mail-from-folder) which sends a mail
message much as M-x mail does but allows the added commands
described above.
The alternative command vm-mail can be invoked outside of VM by
typing M-x vm-mail. However, only
(vm-yank-message-other-folder) will work; all the other commands
require a parent folder.
If you send a message and the mail system returns it as undeliverable, type
M-r (vm-resend-bounced-message) to send it again. VM extracts
the old message and its pertinent headers from the returned message and puts
you in a VM Mail mode buffer, with a ‘Resent-To’ header to fill in with
the corrected addresses of the recipients that bounced. A ‘Resent-Cc’
header can be added as well, and means there what a ‘Cc’ header means
in an ordinary message.
Mail goes only to the addresses in those two headers. Delete both and the ‘To’ and ‘Cc’ headers are used instead.
As already mentioned, VM uses Emacs Mail Mode in the Gnu Emacs Manual for sending email. Therefore, Mail Mode options should be set to configure the mail sending. The extra options provided by VM are described below.
Warning: A
Bccheader promises that the addresses in it are not shown to the other recipients, and whether that promise is kept may be outside Emacs. Withsend-mail-functionset tosendmail-send-it, Emacs leaves the header in the message it handssendmail-programand trusts that program to take it out: it has to, because that program is passed-tand those addresses are also how it learns whom to deliver to. A real sendmail removes it. If yours does not, everyone on the message reads who was blind copied, and nothing anywhere reports a failure.So VM asks before sending a composition that has a
Bcc, unlesssend-mail-functionis one that removes the header itself.smtpmail-send-itis such a function: it works out the recipients first and then deletes the header. See Sending, for a workedsmtpmailconfiguration, including one server for each of your addresses.It asks rather than refusing because a working sendmail, postfix or exim does remove the header, and there is no way for Emacs to tell one of those from a transport that does not. Answer n and nothing is sent; the message then says what to change. Setting
vm-check-bcc-removaltonilstops it asking at all, for someone who knows their transport removes it.
Directory where messages being composed are auto-saved. If it is
nil, vm-folder-directory is used for this purpose.
When a mail composition buffer is created, VM initializes it with
header lines that you can fill in. The From header holds your
address, built from user-full-name and user-mail-address in
the style mail-from-style names, which is what Emacs would have put
on the message as it sent it. Setting mail-setup-with-from to
nil leaves the header out, for a transport that writes its own; the
copies an Fcc or IMAP-FCC header files then name no sender,
since they are written before the message is sent. Setting
vm-mail-header-from to a string uses that instead.
If this set to t, M-x vm-mail will use the sender of the current
message as the recipient for the new message composition.
Some people use vm-reply to get this effect, which is a bad practice:
it also tags the new message as a reply to an older one.
The variable
vm-mail-mode-hidden-headers can be used to hide some of the
header lines from the mail composition buffer. By default, the
headers “References” and “X-Mailer” are hidden.
Additional header lines are created by VM before the composed message
is sent. The variable vm-mail-header-insert-date can be set to
t (which is the default value) asking VM to insert a Date
header into a message before it is sent. You should set it to
nil if you would like to insert a Date header yourself. The
variable vm-mail-header-insert-message-id asks VM to insert a
Message-ID header before sending the message. The variable
vm-mail-reorder-message-headers asks VM to reorder the message
headers into a particular order before sending. The order is
determined by the variable vm-mail-header-order.
These were add-ons switched on through vm-enable-addons in earlier
releases; each is an option of its own now.
Non-nil means check the recipient headers before sending a message.
A missing comma turns two addresses into one that goes nowhere, which is
what vm-mail-check-recipients looks for.
Non-nil means ask before sending a message with an empty Subject.
Default value: t
Non-nil means tidy the Subject prefixes of a new composition.
vm-mail-subject-cleanup does the work, by
vm-mail-subject-prefix-replacements.
Non-nil means make room when you type inside quoted text. Typing in the middle of a citation otherwise leaves your words inside the quotation; with this set VM opens a line for them.
Non-nil means vm-mail-mode-insert-date-maybe keeps an existing date header.
Otherwise, overwrite existing date headers
Default value: t
Two commands go with them, for a composition you are already in:
vm-mail-mode-citation-clean-up takes the noise out of a citation,
and vm-mail-mode-elide-reply-region replaces a stretch of quoted
text with a marker saying it was cut.
A header carrying anything outside US-ASCII is encoded on the way out whatever else is set; that was an add-on too, and is not optional.
To use VM’s MIME composition features, you must have
vm-send-using-mime set to a non-nil value. With MIME composition
enabled, VM will allow you to add file attachments to your
composition and will analyze your message when you send it and
MIME encode it as necessary.
To attach a file to your composition, use C-c C-a
(vm-attach-file). VM will ask you for the name of the
file, its type, a brief description and its character set if it is a
text attachment.
An attachment will be represented in the composition as a tag line like this
[ATTACHMENT ~/sounds/chronophasia_scream.au, audio/basic]
You can type text before and after this tag and it will appear before or after the text in the final MIME message when VM encodes it. You can kill the tag with C-k and yank it back with C-y to move it to another place in the message. You can yank back the tag multiple times to duplicate the attachment in the message. Or you can leave the tag killed and the attachment won’t appear in the message when it is sent.
The name in the tag is the name the recipient will see, and the one their mail reader will suggest when they save the attachment. It need not be the name the file has on your disk. To change it, put point on the tag and use M-x vm-mime-rename-attachment, or choose ‘Rename...’ from the menu described next; the file itself is not touched.
Clicking the right mouse button on the attachment tag brings up a menu that changes the content disposition of the attachment. The Content-Disposition of a MIME object is a hint to the reader’s mail program, and no more than a hint:
The object is displayed within or alongside the message text, where that is possible.
It is displayed as an inert tag or button, which the reader activates.
VM specifies inline for every MIME type but ‘application’ and ‘model’.
To attach a buffer instead of a file, use C-c C-b (normally
bound to vm-attach-buffer. You must not kill the
buffer that you attach until after the message has been sent.
You can attach a message from another folder by using C-c C-m
(vm-attach-message). By default, the folder is the parent
folder of the message composition. If there is no parent folder, then
a folder name will be read from the minibuffer. The message number of
the message to be attached is also read from the minibuffer.
Alternatively, you can mark one or more messages in the parent folder
before invoking this command. All the marked messages will be
attached as a digest in the outgoing message.
A number of point-to-point operations allow you to attach objects from other editing contexts to a message you are composing.
You can visit a directory in Emacs (see Dired in the GNU
Emacs Manual), and run vm-dired-attach-file on any file. The
file will be be attached to your message composition. You can also mark a set
of files in a Dired buffer and run vm-dired-do-attach-files to attach
all of them.
You can use your Window system to drag and drop a file into a
composition buffer (vm-dnd-attach-file).
When you visit a folder in VM, you can attach a message from the
folder by running vm-attach-message-to-composition. When
viewing a message that has MIME attachments, you can attach any of
those attachments to your message composition by using the $ a
(vm-mime-reader-map-attach-to-composition) function.
(See Operating on MIME attachments.) This operation is also
available on the pop-up menu for attachments.
M-x vm-attach-files-in-directory attaches a whole directory’s worth at once. It asks for the directory and for a regexp, and attaches every file whose name matches; an empty regexp attaches all of them. With a prefix argument the regexp is matched literally.
In all these cases, you will be prompted for the message composition buffer to which you would like to attach the objects. The default is the latest message you have been composing, as indicated by the Emacs buffer ring.
A composition holding nothing but ASCII is sent as
us-ascii. Otherwise VM looks for a character set that can hold
everything you have typed: vm-coding-system-priorities is tried in
order, and where none of them fits, iso-2022-jp, which can represent
every character set Emacs knows at the cost of being awkward for a recipient
outside East Asia. So set vm-coding-system-priorities where the
choice matters to you; a list such as (utf-8) settles it.
You do not declare the character set of a composition, and there is nothing
to set for one: Emacs knows which characters are in the buffer, and VM asks
it (vm-determine-proper-charset).
Character codes greater than 128 may not be transported reliably across the Internet in mail messages. Some machines will refuse to accept messages containing such characters and some will accept them but zero the eighth bit, garbling the message. To avoid these problems, VM transfer encodes 8-bit text by default.
MIME has two transfer encodings that convert 8-bit data to 7-bit data for safe transport. Quoted-printable leaves the text mostly readable even if the recipient does not have a MIME-capable mail reader. BASE64 is unreadable without a MIME-capable mail reader.
Symbol specifying what kind of transfer encoding to use on 8bit text. Characters with the high bit set cannot safely pass through all mail gateways and mail transport software. MIME has two transfer encodings that convert 8-bit data to 7-bit for safe transport. Quoted-printable leaves the text mostly readable even if the recipient does not have a MIME-capable mail reader. BASE64 is unreadable without a MIME-capable mail reader, unless your name is U3BvY2s=.
A value of quoted-printable, means to use quoted-printable encoding.
A value of base64 means to use BASE64 encoding.
A value of 8bit means to send the message as is.
Note that this variable usually only applies to textual MIME content types. Images, audio, video, etc. typically will have some attribute that makes VM consider them to be "binary", which moves them outside the scope of this variable. For example, messages with line lengths of 1000 characters or more are considered binary, as are messages that contain carriage returns (ascii code 13) or NULs (ascii code 0).
Default value: quoted-printable
It applies to textual content types. Images, audio and video almost always carry a carriage return or a NUL, which makes VM treat the part as binary and send it BASE64 whatever this says.
A long line is the other thing that cannot go out as it stands. RFC 5322 allows 998 characters in a line and asks for 78; past the first of those a line has to be encoded, and quoted-printable is how VM does it, carrying the line as several physical lines each ending in ‘=’ for the recipient’s mail reader to join back up. So the line arrives as the one line you wrote.
Longest line VM sends in a text part without encoding it.
A longer line is sent quoted-printable, which carries it as several
physical lines each ending in = and has the recipient’s mail reader put
it back together, so the line arrives as the one line you wrote.
998 is the default because it is the limit RFC 5322 sets: a longer line cannot be sent unencoded whatever anyone would prefer. The same RFC asks for 78, which is what most mail readers wrap to, and setting this to 78 makes VM encode anything longer – which is what Gmail does with every message it sends.
A nil value means never to encode a line for its length alone. The 998 limit still applies, since a line past it cannot go out as it stands.
This is not the same as wrapping the text. vm-fill-long-lines-in-reply
rewrites long lines before sending, and vm-send-using-flowed-text marks
VM’s own wrapping as undoable by the recipient; both change where the line
breaks are. This one keeps them exactly where you put them.
Default value: 998
Non-nil means send plain text as format=flowed, per RFC 3676. Each line of a paragraph but the last is sent with a space at the end of it, which tells the reader that the break was VM’s choice rather than yours and may be undone – so the recipient sees the text wrapped to their own window instead of to your fill column. Breaks you made yourself, at the end of a paragraph or a line you deliberately kept short, are sent as they are.
This is off by default: it changes what goes out on the wire, and a reader
that does not know the format shows the trailing spaces as trailing spaces.
Receiving the format is controlled separately, by
vm-mime-unflow-flowed-text.
The internet standards specify that the header lines of messages should
always be in 7 bit ASCII, even if the body of a message can use an
8 bit character set. If you use other non-ASCII characters in typing
the headers then VM encodes their words using the MIME encoded-word
syntax, which is of the form =?charset?encoding?encoded text?=.
A regexp matching the headers whose words should be MIME-encoded.
A header holding a character outside US-ASCII cannot be sent as it stands;
the words carrying those characters are encoded as RFC 2047 words instead.
By default Subject, Organization, From, To, CC, BCC and their Resent- forms
are encoded. vm-mime-encode-headers-type says with which encoding.
Default value:
"Subject\\|\\(\\(Resent-\\)?\\(From\\|To\\|CC\\|BCC\\)\\)\\|Organization"
The encoding to use for the words of a header, Q or B. Q is quoted-printable, which leaves the ASCII part of the word readable to someone whose mail reader does not decode it; B is base64, which does not but is shorter for a word that is mostly non-ASCII. A regexp value picks base64 for the words it matches and quoted-printable for the rest.
Default value: Q
A regexp matching the run of words to encode as one RFC 2047 word. A word here is delimited by whitespace or a comma, and a run of them is encoded together rather than one at a time, which is shorter and is what the standard asks for. What makes a word need encoding is a character outside US-ASCII, which this regexp matches for itself.
Default value:
"[ , \\15]\\(\\([^ , \\15]*[^\\0-\\177]+[^ , \\15]*\\)+\\(\\s-+\\([^ , \\15]*[^\\0-\\177]+[^ , \\15]*\\)+\\)*\\)"
To preview what a MIME message will look like to a recipient,
use C-c C-p (vm-preview-composition). VM
will encode a copy of the message and present it to you in a
temporary mail folder. You can scroll through the message
using normal VM mail reading commands. Typing q in this
folder will return you to your composition where you can make
further changes.
C-c C-e (vm-mime-encode-composition) encodes a
MIME message without sending it, inserting the headers and
boundary markers transport needs. From there:
VM supports sending S/MIME messages utilizing the ‘smime.el’ package included in Emacs. Sending signed, secure, or signed secure messages is essentially no different from sending any other message, except that, sometime before hitting send (C-c C-c), you would use one of the following functions
vm-smime-sign-message
vm-smime-encrypt-message
vm-smime-sign-encrypt-message
These can be used in any combination, but note that VM, when instructed to both encrypt and sign, will always sign before encrypting. Also, signing and encrypting (at present) is only supported for the entire message, including any attachments and text parts.
The functions above only set flags, the actual job of signing and encrypting
is done at the very last stage before sending the message. There are several
ways VM can choose which certificates to use in encrypting a message. The
preferred way is specified via the variable
vm-smime-get-recipient-certificate-method. At present,
the options are one of ’ask or ’links.
Tells VM to prompt the user for all certificates, after entering one the user will be prompted to add more or just send.
This method tells VM that recipient certificates are stored
under smime-certificate-directory using the recipients email
address as a file name, e.g.
~/.ssl/jow@example.com -> joes-cert.pem
This doesn’t require prompting the user unless a particular recipient address could not be associated with a file, in which case the user will be promoted to provide a replacement.
If errors occur during signing or encrypting or thereafter, VM will stop sending the message and whatever steps were completed before will not be repeated. For example, if you request a message to be signed and encrypted, and signing was successful but encryption failed due to a bad certificate file for one of the recipients, then the message will remain signed and the sign flag will be turned off. You can then fix the problem and send the message again with the assurance that it won’t be double-signed but it will be encrypted.
For OpenPGP rather than S/MIME, VM provides the
‘vm-epg’ package, which uses the ‘epg’ (EasyPG) interface to
gpg bundled with Emacs. It is not loaded by default; add
(require 'vm-epg)
to your vm-preferences-file (see Starting Up). To configure it,
use M-x customize-group RET vm-epg RET.
In a composition, the following commands are available, as well as a ‘PGP/MIME’ menu:
vm-epg-sign signs the composition.
vm-epg-encrypt encrypts it. With a prefix argument, it signs it too.
vm-epg-sign-and-encrypt signs and encrypts it.
vm-epg-attach-public-key attaches a public key.
vm-epg-ask-hook asks which of the above to do.
Unlike the S/MIME commands above, these act immediately rather than setting a flag for send time, and they rewrite the composition into its PGP/MIME form. The work is done on a copy, so a failure, a recipient with no usable key for instance, leaves your composition untouched.
Encryption is to the recipients of the message and to nobody else. VM
collects the addresses in the headers named by
vm-epg-get-recipients-headers, which are ‘To:’, ‘CC:’ and
‘BCC:’, and encrypts to one key for each. Your own key is not among
them, so a copy you file with ‘FCC:’ is one you cannot read back, and
neither is anything else you keep of what you sent.
To encrypt to yourself as well, tell gpg to do it, by putting a
line naming your key in your ~/.gnupg/gpg.conf:
encrypt-to YOUR-KEY-ID
VM passes gpg no --no-encrypt-to, so that setting is
honoured. It belongs to gpg rather than to VM, so it applies to
everything that encrypts on your behalf, not to VM alone.
To be prompted at send time instead of remembering to run a command, add
vm-epg-ask-hook to vm-mail-send-hook. It must be
last in that hook, since signing covers the message as it stands:
(add-hook 'vm-mail-send-hook #'vm-epg-ask-hook t)
vm-epg-ask-function selects what is asked; by default you are offered
a choice of actions.
The older inline (or cleartext) format, which puts the
ASCII armor directly in the message body, is also supported, by
C-c # C-s (vm-epg-cleartext-sign) and C-c # C-e
(vm-epg-cleartext-encrypt). Inline PGP cannot cover
attachments and interacts badly with MIME transfer encodings, so
prefer PGP/MIME for messages you send. Incoming inline
PGP is always handled regardless of which format you send.
Displaying a PGP message decrypts encrypted parts, verifies
signatures, and imports (snarfs) any public keys it carries, reporting
the result in the modeline. Set vm-epg-auto-decrypt or
vm-epg-auto-snarf to nil to get a button to press instead of
having it happen automatically. When a signature was made by a key you do
not have, vm-epg-fetch-missing-keys (on by default) fetches it from a
keyserver, which means displaying a signed message may access the network.
A reply command fills in the subject and recipient headers for you, both being apparent from the message replied to. You can edit them, and every other header, as you please.
By an old convention a reply’s subject is prefixed with ‘Re: ’ where it
does not already carry it. vm-reply-subject-prefix is the string to
prepend; nil, the default, prepends nothing.
VM also helps you cite material from the message to which you are
replying, by providing included text as a feature of some of the
commands. Included text is a copy of the message being replied to
with some prefix to each line so that the included text
can be distinguished from the text of the reply. By default, the
prefix string is ‘ > ’. This can be customized via the variable
vm-included-text-prefix.
The reply commands are:
vm-reply) ¶vm-reply-include-text)Replies to the author of the current message and provides included text.
vm-followup)vm-followup-include-text)Replies to the all recipients of the current message and provides included text.
These commands all accept a numeric prefix argument n, which if present, causes VM to reply to the next (or previous if the argument is negative) n-1 messages as well as the current message. Also, all the reply commands set the “replied” attribute of the messages to which you are responding, but only when the reply is actually sent. The reply commands can also be applied to marked messages. (see Marking Messages.)
If you are one of multiple recipients of a message and you use f
and F, your address will be included in the recipients of the
reply. You can avoid this by judicious use of the variable
vm-reply-ignored-addresses. Its value should be a list of
regular expressions that match addresses that VM should automatically
remove from the recipient headers of replies. The default value is
nil, which means that no addresses are removed.
String which specifies the format of the contents of the In-Reply-To
header that is generated for replies. See the documentation for the
variable vm-summary-format for information on what this string may
contain. The format should *not* end with a newline.
Nil means don’t put an In-Reply-To header in replies.
If the format includes elements with non-ASCII characters, then
"In-Reply-To" should be added to vm-mime-encode-headers-regexp.
Default value: "%i"
If the format includes elements that can hold non-ASCII characters, add
‘In-Reply-To’ to vm-mime-encode-headers-regexp.
The recipient headers generated for reply messages are created by
copying the appropriate headers from the message to which you are
replying. This includes any full name information, comments, etc. in
these headers. If the variable vm-strip-reply-headers is
non-nil, the recipient headers will be stripped of all information
except the actual addresses.
As mentioned above, the commands vm-reply-include-text and
vm-followup-include-text provide “included text” from the
original message in your reply. In addition, you can use C-c C-y
(vm-yank-message) inside a mail buffer to include text from any
desired mail message. This is a more general mechanism for citing
message text in the composed message. (The composed message does not
have to be a reply. Neither do the cited messages have to be the
messages you are replying to.)
Citing message text is a tricky business because the original message could be a MIME message with encoded text or formatted text along with embedded images and attachments. By default, VM uses its MIME displaying mechanism to extract the included text to be cited in replies. The quoted text is then similar to what appears in the message Presentation buffer. However, the MIME attachments are not included by default. They are shown in the message composition buffer with attachment buttons labelled similar to:
[DELETED ATTACHMENT mary.jpg, image/jpeg]
If you set the variable vm-include-mime-attachments then
the attachment buttons are converted to actual attachments before the
message is sent. The format of the button in this case looks like:
[ATTACHMENT mary.jpg, image/jpeg]
When citing a multipart/alternative MIME component, VM
uses the variable vm-mime-alternative-yank-method
to decide which alternative should be cited. It can
be defined in a similar way to the variable
vm-mime-alternative-show-method. (see MIME multipart/alternative.)
If the included text contains long lines, i.e., lines longer than the normal window width, you might want to fill paragraphs. It is not necessary to do so. If you send a message with long lines in it, VM will MIME-encode the text so that it can be transported reliably and your recipients can use their own email readers to format the long lines. Keep in mind also that only running text should be filled. Tables, figures and program code have line breaks that are significant, and they may be destroyed by filling.
You can invoke
automatic filling of paragraphs by setting the variable
vm-fill-paragraphs-containing-long-lines-in-reply. Like its
namesake used in message presentation (see Paging), it should be
set to a positive numerical value N or the symbol window-width.
Setting it to nil disables paragraph filling. If filling is
used, the fill column is controlled by the variable
vm-fill-long-lines-in-reply-column.
You can also invoke the command vm-fill-long-lines-in-reply
interactively. It uses the two variables mentioned above to decide when and
how to fill text. If the
vm-fill-paragraphs-containing-long-lines-in-reply is nil, it
assumes that it should fill any lines longer than the current window width.
Finally, you can fill individual paragraphs manually using
C-c C-q (mail-fill-yanked-message).
The method of MIME decoding for included text is relatively new in VM. The older methods are the inclusion of plain text, due to Kyle Jones, and the inclusion of text from the Presentation buffer, due to Robert Fenk.
The Kyle Jones method of plain text inclusion is enabled by setting
the variable vm-include-text-basic to t. Setting the
variable to nil returns you to the default behaviour. You can set the
variable vm-included-mime-types-list to additional MIME
type/subtype pairs that should be included in cited text. But it may
not produce good results because the handling of MIME types is not
available in the basic text inclusion method.
The Robert Fenk method of text inclusion from the Presentation buffer is
enabled by setting the variable vm-include-text-from-presentation
to t. In this case, the text display from the Presentation buffer is
copied verbatim as the quoted text.
The attribution is a line of text saying who wrote what is being included, inserted before it. See Summaries, for the format.
String which specifies the format of the attribution that precedes the
included text from a message in a reply. See the documentation for the
variable vm-summary-format for information on what this string may contain.
Nil means don’t attribute included text in replies.
Default value: "%F writes:\n"
VM normally includes only the body text from the cited messages. If you
wish, you can include also the message headers by customizing
the variables vm-included-text-headers and
vm-included-text-discard-header-regexp.
VM has four commands to forward messages: z
(vm-forward-message),
Z (vm-forward-message-plain),
@ (vm-send-digest) and
B (vm-resend-message).
Typing z (vm-forward-message) puts you into a VM Mail
mode buffer just like m, except that the current message appears
as the body of the message in the VM Mail mode buffer.
The forwarded message is encapsulated as specified by the variable
vm-forwarding-digest-type. Recognized values are nil, "mime",
"rfc934" and "rfc1153". The default is "mime".
If vm-forwarding-digest-type is set to nil, the forwarded
message is not encapsulated. It is included in a plain text form. Any
attachments of the original message appear as attachment buttons in the
composition. They will be replaced by actual attachments when the message
is sent.
The key Z (vm-forward-message-plain) allows you to use
plain-text forwarding directly, without needing to alter
vm-forwarding-digest-type.
If you have previously saved any attachments in the messages being
forwarded, those attachments are normally fetched and included in the
forwarded messages. You can inhibit this by setting the variable
vm-mime-forward-saved-attachments to nil. Messages are then
forwarded with external references to saved attachments. If the recipients
have access to the file system where attachments are saved, they will still
be able to view them. (This may be appropriate if the attachments are saved
in some shared file space, or if you wish to suppress the attachments in the
forwarded messages.)
You can control which header lines are included in forwarded messages via
the variables vm-forwarded-headers and
vm-unforwarded-header-regexp (and their counterparts
vm-forwarded-headers-plain and
vm-unforwarded-header-regexp-plain for plain-text forwarding). How
they are used differs based on the form of forwarding used.
vm-unforwarded-header-regexp to a regular expression. All the
headers matching the regular expression will be omitted. If this variable
is set to nil, then its value is ignored and only the headers listed
in vm-forwarded-headers are forwarded.
vm-forwarded-headers-plain and
vm-unforwarded-header-regexp-plain are used in a similar way. If the
latter is set to a regular expression, then the headers matching it are
omitted. Otherwise, only the headers listed in
vm-forwarded-headers-plain are included. The default settings
forward only the headers “From”, “To”, “Cc”, “Subject”, “Date” and
“In-Reply-To”.
Like vm-forward-message but forwards all the headers.
String which specifies the format of the contents of the Subject
header that is generated for a forwarded message. See the documentation
for the variable vm-summary-format for information on what this string
may contain. The format should *not* end with nor contain a newline.
Nil means leave the Subject header empty when forwarding.
Default value: "forwarded message from %F"
The forwarded message is flagged ‘forwarded’ when the message is sent.
The command @ (vm-send-digest) works like z except
that a digest of all the messages in the current folder is made and
inserted into the VM Mail mode buffer. Also, vm-send-digest can
be applied to just marked messages. See Selecting Messages.
The message encapsulation method is specified by the
variable vm-digest-send-type, which accepts the same values as
vm-forwarding-digest-type. All the messages included in the digest will
be flagged “forwarded” when the digest message is sent.
If you give vm-send-digest a prefix argument, VM will insert a
list of preamble lines at the beginning of the digest, one line per
digestified message. The variable vm-digest-preamble-format
determines the format of the preamble lines. If the value of
vm-digest-center-preamble is non-nil, the preamble lines
will be centered.
B (vm-resend-message) resends a message: it goes on with
its original headers, so that you do not appear to have intervened. VM adds
a ‘Resent-To’ header for you to fill in with the new recipients,
C-c C-c sends it as usual, and the message is flagged
“redistributed”.
Caution: A resent message reaches its new recipients looking as though it came from the original sender, and a reply to it goes to that sender. Only a reader who thinks to look at the
Resent-Toheader sees otherwise.
You can save copies of outgoing mail messages in ’sent’ folders by adding an ‘FCC:’ header line to the composed message. The value of the header should be either the full path name of a mail folder on the file system or the maildrop specification of a folder on an IMAP server. Either way VM files the copy itself when you send the message; nothing has to be added to a hook.
An ‘IMAP-FCC:’ header files the copy on an IMAP account, which is what to use where you have several and want each account’s replies kept with it. Its value is a plain folder name on the current account, ‘Sent’ for instance. Which account is the current one:
That folder’s account. The parent folder is the one you started composing from.
vm-imap-default-account.
As with ‘FCC:’, VM files this copy itself when you send the message.
In earlier releases it was filed by vm-imap-save-composition on
mail-send-hook, which you had to add yourself; a configuration that
still adds it is harmless, since by then there is nothing left to file.
Adding the header by hand to every message is tedious. To have it
added to all your compositions automatically, set Emacs’s
mail-default-headers, whose contents VM inserts into the header
section of each new composition:
(setq mail-default-headers "FCC: ~/Mail/sent\n")
or, for an IMAP account:
(setq mail-default-headers "IMAP-FCC: Sent\n")
Note the trailing newline; the value is inserted verbatim. With Gmail, the sent folder is named ‘[Gmail]/Sent Mail’, but Gmail also files a copy of everything you send through its SMTP server, so an ‘IMAP-FCC:’ header is only needed if you send by some other route.
The copy is written in the format of the folder it goes into, which VM works
out the same way it does when visiting one. A copy filed in a folder that
uses Content-Length headers is given one; a copy filed where the
message boundary is a ‘From ’ line has its body quoted as that format
requires. See Folder types. Before VM did this itself the copy was
always written one way, so filing into a Content-Length folder left
it with a message the counts did not describe.
The ‘FCC:’ header stays in the composition after the message has gone, so the buffer VM leaves you with still says where the copy went. Editing that buffer and sending it again therefore files another copy. The header is not in the message that is sent, nor in the copy that is filed: the first would tell the recipient a path on your machine, and the second does not need to say where it already is.
The name says it all. Sometimes you may want to save a message unencoded, specifically not to waste storage for attachments which are stored on disk anyway.
Not autoloaded: VM has to be loaded before M-x offers this one.
Filing the copy before encoding is also how you keep an unencrypted version of a message you send encrypted. Choose the character coding of the sent folder carefully if you do: it has to hold whatever the message holds.
Sometimes, you might want to interrupt the composing of a message and continue it later. This is called postponing.
Killing a composition you have written in keeps it as a draft, in
vm-save-killed-messages-folder, and VM says where it went and which
key takes it up again. A composition buffer belongs to no file, so Emacs does
not put the question it puts about an unsaved file, and anything bound to
kill-buffer took an unsent message with no warning. Nothing is kept
for a composition you have written nothing in.
vm-save-killed-message says what happens: always, the default,
keeps it; ask asks each time; nil keeps nothing, and then
vm-confirm-killing-a-composition asks before the writing is lost. Set
that to nil as well and a kill takes the writing with it, as it did in
earlier releases.
C-c C-d and vm-continue-postponed-message below are VM’s own and
need nothing switched on, as is keeping a killed composition, above. What
vm-postpone.el adds is four keys that insert a header field. Switch
them on in your vm-init-file:
(vm-postpone-mode 1)
The mode is autoloaded, so no require is needed. Turning it off with
(vm-postpone-mode -1) takes those keys away again. It does not affect
what happens to a composition you kill; that is
vm-save-killed-message, above.
Loading the file installed them in earlier releases, so (require
'vm-postpone) was how one switched it on. That still loads the file but no
longer changes how VM behaves, so an init file saying only (require
'vm-postpone) needs the line above. The same applies to
vm-message-history.el and vm-serial.el, which have
vm-message-history-mode and vm-serial-mode. The reason is that
Customize loads any of them to answer a question about a VM option, so a
reader who never asked for one was getting its hooks and keys anyway.
In a message composition buffer, the command C-c C-d
(vm-postpone-message)
postpones the current composition. The postponed message is stored in the
folder specified in vm-postponed-folder. (The default is a folder
called “postponed”). When called with a prefix argument,
vm-postpone-message will ask you for the folder to save the draft
to. You might also save it to your inbox in this way.
You can continue composing the postponed messages by visiting
vm-postponed-folder, selecting a message and running M-x
vm-continue-postponed-message. This constructs a new message composition
buffer by copying the text from the VM Presentation buffer. It also
converts any MIME buttons into attachment buttons, which will be encoded as
valid MIME attachments when the message is sent. Unfortunately, any
attachments that are displayed inline in the Presentation buffer will not be
encoded. This is a limitation of this feature.
When you continue composition of a postponed message and send it, its
previous draft is still retained in the postponed folder. To expunge such
drafts automatically set vm-auto-expunge-postponed-folder to t
in your VM configuration file.
That happens through vm-delete-postponed-message, which a continued
composition puts on its own mail-send-hook: it marks the draft the
composition came from deleted, and expunges it where
vm-auto-expunge-postponed-folder says to. Typed by hand in a
continued composition, M-x vm-delete-postponed-message does the same
thing there and then, which is how to be rid of a draft you have decided
against without sending anything.
If you have more than one email address, VM can send from whichever of them fits the message you are writing. A reply to mail that arrived at your work address goes out from your work address; the signature and any other header can follow the same rule.
The feature that does this is called Personality Crisis, after the file vm-pcrisis.el it lives in. It works on any composition, not only replies: forwards, resends, new mail, and a message you are already writing, which it calls automorphing.
To use Personality Crisis, switch it on in your vm-init-file:
(vm-pcrisis-mode 1)
The mode is autoloaded, so no require is needed. Turning it on advises
VM’s composition commands (replying, forwarding, resending and starting a new
message) so that your rules are consulted as each composition begins;
turning it off with (vm-pcrisis-mode -1) removes the advice again.
In earlier releases the advice was installed merely by loading the file, so
(require 'vm-pcrisis) was how one switched it on, and there was no way to
switch it off. That still loads the file but no longer changes how VM behaves,
so an init file saying only (require 'vm-pcrisis) needs the line above.
Everything here was named differently in earlier releases. An old name is no longer an alias: setting one, or naming one in a rule, reports what to write instead. The file ~/.vmpc-auto-profiles keeps its name, being a file and not a symbol.
As a quick start, one line defines a set of identities:
(vm-pcrisis-my-identities "me@work.com" "me@home.net" "me@other.org")
It makes each address an action that sets the “From” header, and asks which one to use as a composition begins, remembering the answer for that correspondent in ~/.vmpc-auto-profiles. It asks on every composition, including one to a correspondent it has already been told about.
Warning: This call replaces your configuration rather than adding to it. It assigns
vm-pcrisis-conditions,vm-pcrisis-actionsandvm-pcrisis-default-rulesoutright, so any rules set before it are discarded, and any set after it replace what it installed. It is for someone who has no rules of their own. Use the condition-action rules below instead of it, not as well as it.
For more control, use those rules.
Personality Crisis is based on condition-action rules. You define a variable
vm-pcrisis-conditions to contain a collection of named conditions that you
can test for in the parent message, and a variable vm-pcrisis-actions to
contain a collection of name actions that you can perform on the outgoing
message. These take the form:
(set-variable 'vm-pcrisis-conditions
'(("condition-name1" condition)
("condition-name2" condition)
...))
(set-variable 'vm-pcrisis-actions
'(("action-name1" action...)
("action-name2" action...)
...))
Then, you can set the following variables to contain a collection of condition-action rules, each of which is of the form:
(CONDITION-NAME ACTION-NAME1 ACTION-NAME2...)
vm-pcrisis-default-rules ¶Condition-action rules for composing messages based on a parent message, such as replying, forwarding, resending and mailing (see vm-mail-from-folder).
There are also specialized variables vm-pcrisis-reply-rules,
vm-pcrisis-forward-rules, vm-pcrisis-resend-rules and
vm-pcrisis-mail-rules, which can override the general default rules in
vm-pcrisis-default-rules.
vm-pcrisis-newmail-rules ¶Condition-action rules for new message compositions with no parent message. (see vm-mail).
vm-pcrisis-automorph-rules ¶Condition-action rules for message compositions based on their own content (called “automorphing”).
The conditions are typically checked in the “parent folder” of a mail composition, which may be the message you are responding to, forwarding, resending etc. Personality Crisis provides a collection of useful condition-checking functions. Others can be defined as needed.
vm-pcrisis-header-match ¶This condition checks if a header field of the message matches a regular expression pattern. For example, the condition
(vm-pcrisis-header-match "To\\|Cc" (regexp-quote "me@myisp.net"))
checks if either the “To” or “Cc” header contains the pattern
me@myisp.net.
vm-pcrisis-only-from-match ¶This is similar to vm-pcrisis-header-match, but assumes that the header
field contains email addresses, and matches every one of the email addresses
against the regular expression pattern. For example, the condition
(vm-pcrisis-only-from-match "To\\|Cc" (regexp-quote "@mycompany.com"))
if every email address in the “To” and “Cc” headers is at
mycompany.com.
vm-pcrisis-body-match ¶This condition checks if the body of the message contains the given regular expression pattern.
vm-pcrisis-folder-match ¶This condition checks if the name of the folder contains the given regular expression pattern.
vm-pcrisis-folder-account-match ¶This condition checks if the POP/IMAP account of the folder contains the given regular expression pattern.
vm-pcrisis-virtual-check-selector ¶(This function is provided by the vm-avirtual package.) This
condition checks if the message matches a given virtual selector.
vm-pcrisis-other-cond ¶This condition returns true if another named condition (defined earlier
in vm-pcrisis-conditions) evaluated to true. This allows building
complex conditions from simpler ones.
vm-pcrisis-none-true-yet ¶This condition returns true if none of the conditions that came before it
in vm-pcrisis-conditions have returned true. This is useful as a fallback
to prompt for a profile when no other conditions match.
Conditions are evaluated in the order written, so this one goes last:
(setq vm-pcrisis-conditions
'(("work" (vm-pcrisis-folder-account-match "^work$"))
("home" (vm-pcrisis-folder-account-match "^home$"))
("nothing matched" (vm-pcrisis-none-true-yet))))
(setq vm-pcrisis-actions
'(("from-work" (vm-pcrisis-substitute-header "From" "me@work.com"))
("from-home" (vm-pcrisis-substitute-header "From" "me@home.net"))
("ask" (vm-pcrisis-prompt-for-profile 'prompt))))
(setq vm-pcrisis-default-rules
'(("work" "from-work")
("home" "from-home")
("nothing matched" "ask")))
Composing in either account sets the matching address; anywhere else
asks which of the actions to run, and offers to remember the answer for that
correspondent. Name an ordinary action instead of ask to fall back to
a fixed identity without being asked.
A rule is keyed on the name of a condition, and a rule naming something that
is not a condition never runs. A fallback written as a rule called
"default" with no condition of that name does nothing at all. The
command vm-pcrisis-check-configuration reports such a rule; see
Checking Your Rules below.
The conditions are just normal functions. So, you can combine
them with connectives like and, or and not, and add
other functions that are defined in Emacs or VM or new functions of your
own.
The actions are executed by Personality Crisis itself, as a composition
begins. It runs the action list twice: once before the composition buffer
exists, which is when vm-pcrisis-pre-function and the conditions get their
look at the message being replied to, and once in the composition, which is
where the actions below do their work. Actions are not commands: calling one
by hand where there is no composition tells you so rather than quietly doing
nothing.
vm-pcrisis-substitute-header ¶This action substitutes a specified header field of the outgoing message with a given string. For example, the action
(vm-pcrisis-substitute-header "From" "me@myisp.net")
sets the “From” header of the outgoing message to
me@myisp.net.
vm-pcrisis-add-header ¶This action adds a specified header field to the outgoing message with a given string. If the header field already exists, nothing is done.
vm-pcrisis-insert-header ¶This action appends a given string to a specified header field of the outgoing message.
vm-pcrisis-delete-header ¶This action deletes a specified header field of the outgoing message with a given string. Either the contents of the header field or the header itself can be deleted.
vm-pcrisis-signature ¶The action (vm-pcrisis-signature "signature-file") inserts the signature
from signature-file. If there is already a signature in the outgoing
message, then it replaces with the new signature. If the argument is the empty
string, as in (vm-pcrisis-signature ""), the signature is deleted and none is
inserted.
Personality Crisis can only replace or delete a signature whose extent it
knows. A signature it inserted itself, it knows; one that Emacs put there
because mail-signature is set, it finds by looking for the line
‘-- ’ that separates it, which is what
vm-pcrisis-expect-default-signature asks for and is the default. A
signature in quoted text is prefixed by vm-included-text-prefix and so
is not that line.
(setq vm-pcrisis-expect-default-signature nil)
turns the search off, and a rule saying
(vm-pcrisis-signature "") then has nothing to delete and leaves the
signature where it is.
vm-pcrisis-pre-signature ¶This action is similar to vm-pcrisis-signature, but inserts the new
signature at the top, above the message body.
vm-pcrisis-substitute-replied-header ¶This action takes a header value from the message being replied to and inserts it as a header in the reply. For example:
(vm-pcrisis-substitute-replied-header "To" "From")
copies the “From” header of the original message to the “To” header of the reply.
vm-pcrisis-pre-function ¶This action evaluates a Lisp expression before VM creates the mail composition buffer. This is useful for setting VM variables that need to be set early, such as message encoding.
vm-pcrisis-composition-buffer ¶This action evaluates a Lisp expression in the composition buffer. Use this to set buffer-local variables or call functions that need the composition buffer to exist.
vm-pcrisis-prompt-for-profile ¶This action prompts the user to choose a profile (action) to run. With an optional argument, it can remember the choice for future messages to the same recipient:
(vm-pcrisis-prompt-for-profile) ; prompt but don't remember (vm-pcrisis-prompt-for-profile t) ; prompt and remember automatically (vm-pcrisis-prompt-for-profile 'prompt) ; prompt and ask whether to remember
Remembering writes vm-pcrisis-auto-profiles-file, which is
~/.vmpc-auto-profiles unless you say otherwise, and every later
composition consults it. The question names that file, and so does the
message after any profile is written or removed, which is the only notice
the t form gives since it asks nothing. To be rid of a profile,
answer the question with no actions, or edit the file.
Answer with an action that sets something, never with the name of this action itself. Remembering the asking action makes a profile that means “ask” and so is never asked: the lookup finds it, nothing is prompted, and what it runs is the action that would have prompted. VM refuses such an answer, and drops such a profile if an older VM wrote one.
The profile is keyed on an address taken from the message being replied to,
so a composition with no parent message has none and falls back to
vm-pcrisis-default-profile, the string "default". One answer
then covers every composition of that kind rather than one correspondent.
An action of your own is an ordinary function named in
vm-pcrisis-actions, and it runs twice: once before the composition
buffer exists and once in it. Two variables say which:
vm-pcrisis-current-buffer is none the first time and
composition the second, and vm-pcrisis-current-state is
reply, forward, resend, mail, newmail or
automorph. So an action that sets a header tests the first before
doing anything:
(defun my-set-from (address)
(when (eq vm-pcrisis-current-buffer 'composition)
(vm-pcrisis-substitute-header "From" address)))
Both answer to their old vmpc- names as well.
The vm-pcrisis-automorph function automatically customizes a mail
composition based on its current headers. This is useful for new mail
compositions where you want to set up headers, signatures, etc. based on
the “To” address you have typed.
To use automorph, bind it to a key in vm-mail-mode-map:
(define-key vm-mail-mode-map [f7] 'vm-pcrisis-automorph)
Or attach it to moving between headers:
(define-key vm-mail-mode-map [tab] 'vm-pcrisis-tab-header-or-tab-stop)
One identity per IMAP account, with a prompt for anywhere else. Conditions are evaluated in the order written, so the fallback goes last:
(setq vm-pcrisis-conditions
'(("work" (vm-pcrisis-folder-account-match "^work$"))
("home" (vm-pcrisis-folder-account-match "^home$"))
("nothing matched" (vm-pcrisis-none-true-yet))))
(setq vm-pcrisis-actions
'(("from-work" (vm-pcrisis-substitute-header "From" "me@work.com"))
("from-home" (vm-pcrisis-substitute-header "From" "me@home.net"))
("ask" (vm-pcrisis-prompt-for-profile 'prompt))))
(setq vm-pcrisis-default-rules
'(("work" "from-work")
("home" "from-home")
("nothing matched" "ask")))
Reply from whichever of your addresses the mail was sent to, wherever it is filed:
(setq vm-pcrisis-conditions
'(("to-work" (vm-pcrisis-header-match "To\\|Cc" "me@work\\.com"))
("to-home" (vm-pcrisis-header-match "To\\|Cc" "me@home\\.net"))))
(setq vm-pcrisis-reply-rules
'(("to-work" "from-work")
("to-home" "from-home")))
Setting vm-pcrisis-reply-rules at all means
vm-pcrisis-default-rules is not consulted for replies. The choice is
per variable, not per rule: a state either has its own rules or falls back to
the default ones.
More than one action for a condition, a signature beside the address:
(setq vm-pcrisis-actions
'(("work"
(vm-pcrisis-substitute-header "From" "me@work.com")
(vm-pcrisis-substitute-header "Organization" "Work")
(vm-pcrisis-signature "~/.signature-work"))))
(setq vm-pcrisis-default-rules '(("to-work" "work")))
Conditions are ordinary Lisp, so they combine:
(setq vm-pcrisis-conditions
'(("work but not the list"
(and (vm-pcrisis-header-match "To\\|Cc" "me@work\\.com")
(not (vm-pcrisis-header-match "To\\|Cc" "everyone@work\\.com"))))
("either address"
(or (vm-pcrisis-other-cond "to-work")
(vm-pcrisis-other-cond "to-home")))))
Rules are data, so a mistake in them is not a Lisp error and nothing stops. M-x vm-pcrisis-check-configuration reads what you have set and says what cannot work, and what to do about each:
vm-pcrisis-none-true-yet condition that is not the last one,
which makes it not a fallback
The first of those is the one worth the command. A fallback written as
(setq vm-pcrisis-default-rules
'(("work" "from-work")
("default" "from-home"))) ; no condition is called "default"
contributes nothing, so the composition keeps user-mail-address. That
is the address most people would have got anyway, which is why such a rule can
sit in an init file for years.
The same check runs as each composition begins and warns about the first thing it finds, so a broken rule is noticed where it matters rather than at startup.
To debug Personality Crisis configurations, examine these variables after composing a message:
vm-pcrisis-true-conditions holds the conditions that evaluated to true
vm-pcrisis-actions-to-run holds the actions that will be executed
You can also call vm-pcrisis-build-true-conditions-list interactively
to test your conditions.
In the following sections, you will see various operations that you can do on messages such as saving, deleting or running external applications. All such operations work on either single messages or collections of messages you can select using VM’s features. The mechanisms for selecting collections of messages for operations are described in this section.
All VM operations take a prefix argument, which may be a positive integer, negative integer or 0. If it is a positive integer n, then the current message and the next n-1 are selected for the operation. If it is a negative integer -n, then the current message and the previous n-1 are selected. If it is 0, then all the messages in the current folder are selected.
When you have thread-folding enabled, you can execute VM operations on entire threads in the Summary window. See Thread Operations.
In addition, a collection of messages can be explicitly marked for the purpose of operating on them.
VM provides a way to mark selected messages so that subsequent operations can be applied to them. This is similar to marking in other parts of Emacs, e.g., see Dired Marks, but arguably more powerful. For example, one can mark all messages from a particular sender and save them to a folder, or mark all messages with a particular subject and print them. One can also mark messages by searching for particular strings in their text.
To mark the current message, type M M
(vm-mark-message). If you give a numeric prefix argument
n, the next n-1 messages will be marked as well. A negative
prefix argument means mark the previous n-1. An asterisk
(‘*’) will appear to the right of the message numbers of all marked
messages in the summary window.
To remove a mark from the current message, use M U
(vm-unmark-message). Prefix arguments work as with
vm-mark-message.
Use M m to mark all messages in the current folder; M u removes marks from all messages.
Other marking commands:
vm-mark-messages-by-selector) ¶Mark all messages matching a virtual selector. See Virtual Folders.
vm-unmark-messages-by-selector)vm-mark-messages-by-virtual-folder)Mark all messages matching the selectors of a virtual folder. See Virtual Folders.
vm-unmark-messages-by-virtual-folder)Unmark all messages matching the selectors of a virtual folder.
vm-mark-thread-subtree)Mark all messages in the thread tree rooted at current message. See Threading.
vm-unmark-thread-subtree)Unmark all messages in the thread tree rooted at current message.
vm-mark-messages-same-subject)vm-unmark-messages-same-subject)Unmark messages with the same subject as the current message.
vm-mark-messages-same-author)vm-unmark-messages-same-author)Unmark messages with the same author as the current message.
While the above commands can be used in any VM buffer, the following commands can be used in a Summary buffer to mark or unmark a region of message summary lines.
vm-mark-summary-region) ¶vm-unmark-summary-region)Unmark all messages in the current region in a Summary buffer
To apply a VM command to all marked messages you must prefix it with the
key sequence M N (vm-next-command-uses-marks). The next VM
command will apply to all marked messages, provided the command can be
applied to such messages in a meaningful and useful way. Unfortunately,
as of this writing, this mechanism works only if the next command
invoked is a keyboard command. Commands invoked by M-x are
unable to access the marked messages. So, to invoke a complex command,
you might temporarily bind it to an unused key, e.g.,
M-x local-set-key C vm-forward-message-all-headers M N C
forwards marked messages with all headers included.
It is possible to use marking to execute operations on message threads. For example, the sequence of key strokes:
MuMTMNsMu
saves a thread of messages. However, there are faster methods to operate on message threads. See Thread Operations.
Mail messages are normally saved to files that contain only mail messages. Such files are called folders. Folders are distinguished from spool files in that VM does not expect other programs to modify them while VM is visiting them. This is important to remember. VM does no locking of folders when visiting them. If the disk copy of a folder is modified behind VM’s back, Emacs will complain with the dreaded “File changed on disk” message when you try to save the folder.
The VM command to save a message to a folder is s
(vm-save-message); invoking this command causes the current
message to be saved to a folder whose name you specify in the
minibuffer. It can be given a prefix argument n to indicate how
many messages should be saved. Messages saved with
vm-save-message are flagged “filed”.
Messages can be saved to folders on the local file system or to
folders on an IMAP server.
If vm-folder-directory is set, vm-save-message will
insert this directory name into the minibuffer before prompting you
for a folder name; this will save you some typing. If
vm-thunderbird-folder-directory is set and you enter a Thunderbird
folder using vm-visit-thunderbird-folder, then that directory
will be the default place for saving messages.
Another aid to selecting folders in which to save mail is the variable
vm-auto-folder-alist, described in detail below. Using the data
given in this alist, VM can examine the headers of the message and
automatically suggest an appropriate save folder where the message
should be saved.
If you use an IMAP server and prefer to save messages on other folders
on the same IMAP server, you can set the variable
vm-imap-save-to-server to t. You will be prompted for the name
of the IMAP folder in which to save the message. The variable
vm-auto-folder-alist can also be used to suggest appropriate save
folders on the IMAP server.
You can override the effect of vm-imap-save-to-server by using
the specialized commands vm-save-message-to-local-folder
and vm-save-message-to-imap-folder, which do what their names
indicate.
If the value of the variable vm-confirm-new-folders is
non-nil, VM will ask for confirmation before creating a new
folder on interactive saves.
A message saved into an IMAP mailbox carries its flags with it: read, replied to and flagged, and its labels, which travel as IMAP keywords, as do ‘filed’, ‘written’, ‘forwarded’ and ‘redistributed’. It is never saved as deleted. Whether the destination keeps keywords is its own to say, in its PERMANENTFLAGS, and one that says it keeps none is sent the flags without them: VM names what was left behind.
A message is saved either by appending it to the folder file on disk, or by
visiting the folder as Emacs visits any file and appending to that buffer,
which you then have to save yourself. vm-visit-when-saving decides
which:
not-alwaysThe default. Append to the folder’s buffer when it is being visited, and to the file otherwise.
tAlways visit the folder first.
nilAlways append to the file. VM then refuses to save into the disk copy of a folder that is being visited, which would leave the buffer and the file disagreeing.
After a message is saved to a folder, the usual thing to do next is to
delete it. If the variable vm-delete-after-saving is
non-nil, VM will flag messages for deletion automatically after
saving them. This applies only to saves to folders, not to
vm-save-message-sans-headers, which writes a message to a file. There is a separate variable
vm-delete-after-archiving, which
works like vm-delete-after-saving but applies to the A
(vm-auto-archive-messages) command (see below).
VM can automatically suggest folders for saving messages, using rules that you specify. It saves the work of having to type in a folder for saving messages.
Rules can be written as patterns over header contents, below, or as virtual folder selectors. See vm-virtual-auto-folder-alist. Either way they are only consulted when this is on:
Non-nil value means that VM will suggest folders for saving
messages automatically using the setting of vm-auto-folder-alist.
Default value: t
The value of vm-auto-folder-alist should be a
list of the form:
((header-name-regexp (regexp . folder-name) ...) ...)
where header-name-regexp and regexp are strings, and folder-name is a string or an s-expression that evaluates to a string. header-name-regexp matches header names rather than being one, so ‘To\|Cc’ is a way of looking at both: where several headers match it, their contents are joined with a comma and a space and regexp is matched against the whole. The value of folder-name can be
vm-folder-directory or the
default-directory of the currently visited folder, whichever is
non-nil, or
If any part of those contents is matched by the regular expression regexp, VM will evaluate the corresponding folder-name and use the result as the default when prompting for a folder to save the message in.
When folder-name is evaluated, the current buffer will contain only
those contents. It is safe to
modify this buffer. You can use the match data from any ‘\( …
\)’ grouping constructs in regexp along with the function
buffer-substring to build a folder name based on the header information.
If the result of evaluating folder-name is a list, then the list will
be treated as another auto-folder-alist and will be descended
recursively.
Whether matching is case-sensitive depends on the value of the variable
vm-auto-folder-case-fold-search. A non-nil value makes
matching case-insensitive. The default value is t, which means
matching is case-insensitive. Note that the matching of header names is
always case-insensitive because the Internet message standard RFC 822
specifies that header names are case indistinct.
Saves a message or messages to a file without their headers. This
command responds to a prefix argument exactly as vm-save-message
does. Messages saved this way are flagged “written”.
vm-auto-archive-messages)Save all unfiled messages that auto-match a folder via
vm-auto-folder-alist to their appropriate folders. Messages that
are flagged for deletion are not saved by this command. This command asks
for confirmation before archiving because it is a wholesale operation that
cannot be easy reversed. (Set vm-confirm-for-auto-archive to
nil to override the confirmation dialogue.) If the command is
invoked with a
prefix argument, confirmation will be requested for each save.
vm-pipe-message-to-command)Runs a shell command with some or all of the current message as input.
By default, the entire message is used. However, the leading and
trailing message separator lines are not included. When applied to
multiple messages, the command is invoked on each message individually.
If invoked with one C-u the text portion of the message is used.
If invoked with two C-u’s the header portion of the message is used.
In invoked with three C-u’s the visible headers and the text
portions of the message are used.
If the shell command generates any output, it is displayed in a
‘*Shell Command Output*’ buffer. The message itself is not altered.
vm-pipe-message-to-command-discard-output)Runs a shell command with some or all of the current message as input, like the above, but will not display the output.
vm-pipe-messages-to-command)Runs a shell command using as input the current message or marked
messages in the mbox format. In contrast to
vm-pipe-message-to-command, the leading and trailing separator
lines are included. This behaviour can be altered using the variables
vm-pipe-messages-to-command-start and
vm-pipe-messages-to-command-end.
vm-pipe-messages-to-command-discard-output)Runs a shell command using as input the current message or marked messages in the mbox format, but will not display the output.
Non-nil means to read and write BSD Mail(1) style Status: headers. This makes sense if you plan to use VM to read mail archives created by Mail.
In VM, messages are flagged for deletion, and then are subsequently expunged or removed from the folder. The messages are not removed from the on-disk copy of the folder until the folder is saved.
vm-delete-message) ¶Flags the current message for deletion. A prefix argument n causes the current message and the next n-1 messages to be flagged. A negative n causes the current message and the previous n-1 messages to be flagged.
vm-undelete-message)Removes the deletion flag from the current message. A prefix argument n causes the current message and the next n-1 messages to be undeleted. A negative n causes the current message and the previous n-1 messages to be undeleted.
vm-kill-subject)Flags all messages with the same subject as the current message (ignoring “Re:”) for deletion.
vm-kill-thread-subtree)Flags all messages in the thread subtree of the current message for deletion.
vm-delete-duplicate-messagesFlags duplicate messages for deletion. The duplicate messages are detected by comparing message ID’s.
vm-delete-duplicate-messages-by-bodyFlags duplicate messages for deletion. The duplicate messages are detected by comparing message bodies.
vm-expunge-folder, vm-compact-folder)Does the actual removal of messages flagged for deletion in the current folder.
Setting the variable vm-move-after-deleting non-nil causes
VM to move past the messages after flagging them for deletion. Setting
vm-move-after-undeleting non-nil causes similar movement
after undeletes. Setting vm-move-after-killing non-nil
causes VM to move after killing messages with vm-kill-subject.
Note that the movement is done by calling vm-next-message which
means that the value of vm-circular-folders applies to the
post-command motion as for a motion command, not as for a non-motion
command.
Normally, deleted messages are preserved in folders until an explicit
vm-expunge-folder (vm-compact-folder) operation is done. This
default behavior can be altered by setting the variables
vm-expunge-before-save and vm-expunge-before-quit. If
vm-expunge-before-save is set to non-nil, then deleted
messages are expunged whenever a folder is saved. This is not an undo-able
operation and no confirmation is asked for. So you should use this setting
only if your normal workflow includes expunging messages as part of save.
The variable vm-expunge-before-quit can be similarly set to
non-nil to cause VM to expunge deleted messages whenever you quit the
folder.
Deleted messages can be kept whatever those variables say:
Save current folder to disk.
Prefix arg is handled the same as for the command save-buffer.
Deleted messages are _not_ expunged irrespective of the variable
vm-expunge-before-save.
When applied to a virtual folder, this command runs itself on each of the underlying real folders associated with the virtual folder.
Quit visiting the current folder without expunging deleted messages.
The setting of vm-expunge-before-quit is ignored.
A prefix argument to vm-quit has the same effect as the second of
them.
Delete duplicate messages in the current folder.
This command works by comparing the message ID’s. Messages that
are already deleted are not considered, so VM will never delete the last
copy of a message in a folder. Deleting means flagging for
deletion; you will have to expunge the messages with
vm-expunge-folder to really get rid of them, as usual.
When invoked on marked messages (via vm-next-command-uses-marks),
only duplicate messages among the marked messages are deleted;
unmarked messages are not considered for deletion.
Duplicates arrive easily: on a mailing list, a reply to one of your messages often comes to you and to the list both. If you get many, run the command from a hook. In your VM init file:
(add-hook 'vm-arrived-messages-hook 'vm-delete-duplicate-messages)
This causes the duplicate-deletion function to be invoked every time new messages arrive so that you don’t have to worry about the duplicate copies any further. (See Hooks.)
To edit a message, type C-c C-e (vm-edit-message). The
current message is copied into a temporary buffer, and this buffer is
selected for editing. The major mode of this buffer is controlled by the
variable vm-edit-message-mode. The default is Text mode.
Use C-c ESC (vm-edit-message-end) when you have finished
editing the message. The message will be inserted into its folder,
replacing the old version of the message. If you want to quit the edit
without your edited version replacing the original, use C-c C-]
(vm-edit-message-abort), or you can just kill the edit buffer
with C-x k (kill-buffer).
If you give a prefix argument to vm-edit-message, then the
current message will be flagged unedited.
As with VM Mail mode buffers, all VM commands can be accessed from the edit buffer through the command prefix C-c C-v.
Each message in a folder has a set of attributes that VM will remember from session to session. Various VM commands set and unset these attributes. Here are the attributes maintained by VM.
newThe message was retrieved from a spool file during this visit of the current folder.
unreadThe message was retrieved from a spool file during some past visit of the folder but is still unread.
flaggedA message you marked to come back to, with !
(vm-toggle-flag-message). VM attaches no meaning of its own to it.
vm-summary-high-priority face
(see predefined summary faces). One character carries whichever of
deleted, new, unread and flagged applies first, so a message flagged before
it is read shows ‘N’ until you read it (see Summary Format).
\Flagged flag, which other mail
programs show as a star or a flag.
filedThe message has been saved to some folder.
writtenThe body of the message has been saved to a file.
editedThe message has been altered (with vm-edit-message) since it arrived.
deletedThe message is deleted and will be removed from the folder at the next expunge.
forwardedThe message has been forwarded with either
vm-forward-message, vm-send-digest or one of their variants.
redistributedThe message has been forwarded with the
vm-resend-message command.
repliedThe message has been replied to.
You can set and unset these attributes directly by using
M-x vm-set-message-attributes. You will be prompted in the
minibuffer for names of the attributes and you can enter them with
completion. Every attribute has an “un-” prefixed name you can use
to unset the attribute, excepting “new” and “unread”, which are both
negated by “read”. Completion offers the names BABYL uses as well:
“recent” for new, “unseen” for unread, and “answered” and
“unanswered” for replied. You can use a prefix argument with this command to
affect multiple messages, and you can apply this command to marked
messages with M N.
VM provides a special form of undo which allows changes to message
attributes to be undone. Typing C-x u or C-_
(vm-undo) undoes the last attribute change. Consecutive
vm-undo’s undo further and further back. Any intervening command
breaks the undo chain, after which the undo’s themselves become undoable
by subsequent invocations of vm-undo.
Note that expunges, saves and message edits are not undoable.
Labels are user-defined message attributes. They can have any
name and be assigned any meaning by you. Labels are added with
l a (vm-add-message-labels) and l e
(vm-add-existing-message-labels), and are removed by l d
(vm-delete-message-labels). BABYL format folders use labels to
store basic attributed like “deleted” and “unread”. When visiting a
BABYL folder VM uses these labels also in order to be compatible with
other BABYL mailers. The labels used are “recent”, “unseen”,
“deleted”, “answered”, “forwarded”, “redistributed”, “filed”,
“edited” and “written”. If (and only if) you are using BABYL format
folders, you should not use these label names for your own purposes.
To completely remove a label from a folder, use M-x vm-expunge-label.
This removes the label from all messages that have it and also removes
it from the folder’s label list, so it will no longer appear in label
completions. This operation can be undone with vm-undo.
A folder remembers every label it has ever been given, so a label that you delete from the last message holding it stays in the folder’s label list and keeps appearing in completions. Over time these accumulate. M-x vm-list-unused-labels shows the labels of the current folder that no message carries, and M-x vm-expunge-unused-labels removes them, asking for confirmation first.
The list can also be short. A message that arrives already labelled has
its labels added to the folder’s list, so ordinarily this takes care of
itself; but a folder written by an older VM, or edited by other means,
may hold a label that is in use and yet missing from the list, in which
case it never appears in completions. M-x vm-sync-labels makes
the list agree with the messages in both directions, adding what is used
and removing what is not. vm-list-unused-labels reports both
kinds of discrepancy.
No message is changed by any of these commands; only the folder’s label
list. All of them can be undone with vm-undo.
Message attributes live in the folder, and reach the disk only by being
written into the folder’s buffer before that buffer is saved.
vm-flush-interval says when they are written:
nEvery n seconds, n being a positive integer.
vm-flush-interval defaults to 90.
tAt every change.
nilNot until the folder is saved. Faster, but a crash then leaves the auto-save file with no record of the attribute changes. It still holds the message edits and expunges. See Crash Recovery.
G (vm-sort-messages) sorts a folder by one or more sort keys.
The messages in the file stay where they are: VM numbers and presents them
in the new order, and a program reading the file sees the old one. To move
them for real, so that the new order survives the save and is there for
anything else that reads the folder, either
vm-sort-messages a prefix argument, or
vm-move-messages-physically non-nil before sorting.
Valid sort keys are:
date | the date the message was sent |
activity | the date of the newest message in its thread |
author | the address in the From header |
full-name | the name in the From header |
subject | the subject, normalized as below |
recipients | the To and Cc headers together |
addressees | the To header alone |
line-count | the number of lines |
byte-count | the number of bytes |
physical-order | the order the messages are stored in |
spam-score | the spam score of the headers |
Each has a reversed- form that sorts the other way, as
reversed-date does, and G takes several keys at once: messages
that compare equal by the first are ordered by the second, and so on.
The sort key date represents the date and time of the message.
Normally, this is the date when the message was sent by the sender. Note
that the message could have been “queued” after it was sent, either on the
sender’s machine, on some server on the network, or in a mailing list
moderator’s tray. It is not uncommon for messages to arrive much later than
their sent date. Setting the variable
vm-sort-messages-by-delivery-date to t causes VM to use the
delivery dates of messages rather than sent dates for sorting purposes.
(This assumes that your own mail server records the delivery date in a
‘Delivery-Date’ header. If no such header is present, then VM uses the
sent date.)
The sort key activity represents the date of the most recent
activity. This is the default sort order used with threads.
See Threading. It allows even old threads that have recent messages to
be brought to the front.
When sorting by subject (or threading using subjects, or killing
messages by subject) the subject of the message is
normalized before comparisons are done. A normalized
subject has uninteresting prefixes and suffixes stripped off, and
multiple consecutive white space characters are collapsed to a single
space. The variable vm-subject-ignored-prefix should be
a regular expression that matches all strings at the beginning of
a subject that you do not want to be considered when message
subjects are compared. A nil value means VM should not ignore
any prefixes. The analogous variable for subject suffixes is
vm-subject-ignored-suffix. By default,
vm-subject-ignored-prefix is set to remove the prefix “Re:”, which
is often added in replying to messages. The default value of
vm-subject-ignored-suffix is set to remove the suffix “(fwd)”,
which is sometimes added when messages are forwarded.
In addition to these uninteresting prefixes/suffixes, you also have the
option of removing subject tags that are added by mailing lists when
forwarding messages to members. For example, the ‘viewmail-info’
mailing list adds the subject tag “[VM]” at the beginning of each subject
line. Bug report handling systems often add tags indicating reference
numbers, e.g., a tag of the form “bug#nnnn” added by the
GNU Emacs bug reports system. To remove such subject tags, set the variable
vm-subject-tag-prefix to a regular expression that matches all
subject tags you want removed. For example, the setting
(setq vm-subject-tag-prefix "\\[[^]][ \n\t]*")
asks VM to strip all subject tags enclosed in square brackets
(along with the white space following them). The default value of
vm-subject-tag-prefix is nil. The additional variable
vm-subject-tag-prefix-exceptions can specify a regular expression
pattern whose matching subject tags are not removed.
In addition to ignoring subject tags during sorting, you can also ask VM to
remove subject tags from the summary lines in the Summary buffer.
The variable vm-summary-strip-subject-tags should be set to a non-nil
value to achieve this effect.
Once the subject has been normalized, the variable
vm-subject-significant-chars controls how much of what
remains is considered significant for matching purposes. The
first vm-subject-significant-chars will be considered
significant. Characters beyond this point in the subject string
will be ignored. A nil value for this variable means all
characters in the subject are significant.
The sorting by spam-score is done by extracting spam scores
listed in the headers of the message, which are usually placed there by
external spam scoring programs such as SpamAssassin. Spam scores are
expected to be numbers, either integers or real numbers. The headers
that should be used for extracting spam scores are listed in the variable
vm-spam-score-headers. The variable is a list of triples, where each
triples contains a regular expression identifying the name of the header, a
regular expression matching the spam-score string on that header and a
function that VM can invoke to convert the spam-score string to a number.
Here is an example triple:
("X-Spam-Status:" "[-+]?[0-9]*\\.?[0-9]+" string-to-number)
This triple causes VM to extract a spam-score from
X-Spam-Status headers. The first string on the header line that
matches the second regular expression is extracted and converted to a number
using the string-to-number function. The order in which the headers
are listed in vm-spam-score-headers is significant. The first header
that is found in the message is used as the spam score.
If you want to move messages around by hand, use C-M-n
(vm-move-message-forward) and C-M-p
(vm-move-message-backward). The default is to move the current
message forward or backward by one message in the message list. A
prefix argument n can specify a longer move. The value of
vm-move-messages-physically applies to these commands.
A thread is a group of messages that are either related by subject or that have a common ancestor. Threading is the process of determining the relationship between such messages and displaying them so that those relationships are evident.
To enable and disable threading, type C-t
(vm-toggle-threads-display). You will find that, in the
summary buffer, all related messages are grouped together and the
subject titles are indented to show hierarchical relationships.
Message relationships are discovered by examining the
References, In-Reply-To, and Subject headers.
The first two headers are more reliable sources of information but not
all mailers provide them. Therefore, all messages with similar
Subject headers are also grouped into threads. If you don’t
want VM to use Subject headers for threading, set the variable
vm-thread-using-subject to nil.
Unlike in previous versions of VM, threading is not a form of sorting. You can sort threads by the usual sort keys and the sort order will apply to at least the root messages of threads. Sorting threads by subject, for instance, can be a quick way to find threads with similar subject lines. Sorting them by date would sort them chronologically according to when the threads were initiated. Sorting them by activity is a variant of the chronological order where the dates of latest activity are given prominence instead of the dates of the initial messages.
Normally, thread-based grouping applies to entire threads as well as
all their subthreads. You can block subthread grouping by
setting the variable vm-sort-subthreads to nil. In that
case, all the internal messages of the threads are sorted by the
chosen sort order, e.g., by date, author etc. instead of being grouped
into subthreads.
The value of the variable vm-move-messages-physically applies
to threading just as it applies to sorting.
A digest is one or more mail messages encapsulated within another message.
VM supports digests by providing a command to “burst” them into their individual messages. These messages can then be handled like any other messages under VM.
The command (vm-burst-digest) bursts a digest into its individual
messages and appends them to the current folder, where they are assimilated
as new messages. The original digest message is not altered, and the
messages extracted from it are not part of the on-disk copy of the folder
until a save is done. You are prompted for the type of digest to burst,
vm-digest-burst-type giving the default:
The three formats VM understands.
Let VM work out which of them it is, for a digest you know nothing about. It is usually right where the digest is properly formatted.
One line of a message body is not returned as it was sent when it travels in an RFC 1153 digest. RFC 1153 defines no way to quote a separator that appears in a body, so VM quotes one by writing a space where its first hyphen was, and writes the hyphen back when bursting. A body line that already reads as a space followed by 29 hyphens comes back as a separator line of 30 hyphens. VM does not escape such a line, because any escape it invented would be misread by every other RFC 1153 reader, older versions of VM among them. RFC 934 digests do not have this limit: they quote every line that begins with a hyphen, so the quoting quotes itself.
Typing h (vm-summarize, vm-headers-summary) causes VM to
display a summary of contents of the current folder. The information in the
summary is automatically updated as changes are made to the current folder.
An arrow ‘->’ appears to the left of the line summarizing the current
message. The variable vm-auto-center-summary controls whether VM
will keep the summary arrow vertically centered within the summary window.
A value of t causes VM to always keep the arrow centered. A value of
nil (the default) means VM will never bother centering the arrow. A
value that is not nil and not t causes VM to center the arrow
only if the summary window is not the only existing window. You can change
what the summary arrow looks like by setting vm-summary-arrow to a
string depicting the new arrow. You should set this variable before VM
creates the summary buffer.
A summary is generated at startup, which is what
vm-startup-with-summary says and is its default. Set it to
nil for a folder window alone, or to a number to have the summary
only for a folder holding at least that many messages.
See Starting Up.
All VM commands are available in the summary buffer just as they are in the folder buffer itself, and the cursor can say which message they act on:
Non-nil value causes VM to select the message under the cursor in the summary window before executing commands that operate on the current message. This occurs only when the summary buffer window is the selected window.
Default value: t
The variable vm-summary-format controls the format of each
message’s summary. Its value should be a string. This string should
contain printf-like “%” conversion specifiers which substitute
information about the message into the final summary.
Recognized specifiers are:
aattribute indicators, always four characters wide, a space in each column where nothing applies:
| first | ‘D’ deleted, ‘N’ new, ‘U’ unread, ‘!’ flagged. A message can be several of those at once and the column holds one character, so it shows the first that applies, in that order (see Message Attributes). |
| second | ‘F’ filed (saved), ‘W’ written. |
| third | ‘R’ replied to, ‘Z’ forwarded, ‘B’ redistributed. |
| fourth | ‘E’ edited. |
Athe same, seven characters wide, one column to each attribute rather than several sharing a column. The first is ‘a’’s first, and then, in lower case, ‘r’ replied to, ‘z’ forwarded, ‘b’ redistributed, ‘f’ filed, ‘w’ written, ‘e’ edited.
b‘a’’s first column on its own, one character wide: ‘D’, ‘N’, ‘U’, ‘!’ or a space.
*message mark, ‘*’ where the message is marked and a space where it is not
p ¶indicator for a postponed message, ‘P’ by default and
vm-summary-postponed-indicator otherwise, and nothing for a message
that is not one
P ¶indicator for a message carrying attachments, and nothing for a message
with none. vm-summary-attachment-indicator says what it is: a
string is shown as it stands, ‘$’ by default, and a symbol is shown
followed by the number of attachments, so the symbol $ gives
‘$2’ for a message of two.
Ithread indentation
nmessage number
imessage ID
cnumber of characters in message (ignoring headers)
Shuman readable size of the message
lnumber of lines in message (ignoring headers)
dnumeric day of month message sent
wday of the week message sent
mmonth message sent
Mnumeric month message sent (January = 1)
yyear message sent
hhour:min:sec message sent
Hhour:min message sent
ztimezone of date when the message was sent
fauthor’s address
Fauthor’s full name (same as f if full name not found)
temail addresses of the addressees of the message (listed in the “To” header), in a comma-separated list
Tfull names of the addressees of the message (listed in the “To” header), in a comma-separated list
raddresses of the recipients of the message (listed in the “To” or “Cc” headers), in a comma-separated list
Rfull names of the recipients of the message, in a comma-separated list (or their email addresses if full names are not given)
smessage subject
Llabels (as a comma list)
Uuser defined specifier. The next character in the format string should be a letter. VM will call the function vm-summary-function-<letter> (e.g. vm-summary-function-A for “%UA”) in the folder buffer with the message being summarized bracketed by (point-min) and (point-max). The function will be passed a message struct as an argument. The function should return a string, which VM will insert into the summary as it would for information from any other summary specifier.
(starts a group, terminated by %). Useful for specifying the field width and precision for the concatenation of group of format specifiers. Example: \"%.35(%I%s%)\" specifies a maximum display width of 35 characters for the concatenation of the thread indentation and the subject.
)ends a group.
Use “%%” to get a single “%”. A “%” before anything VM does not recognise is left as it stands, so a mistyped specifier costs you the specifier and not the summary.
A specifier may carry a field width and a maximum, which is what
‘%-17.17F’ in the default format is. Both work as they do in
printf:
A number between the ‘%’ and the specifier pads the substitution to that many columns on the left, so that it is right justified. A negative number pads on the right instead. A width beginning with ‘0’ fills with zeros rather than spaces, for the specifiers whose substitution is a number: ‘%c’, ‘%d’, ‘%l’, ‘%M’, ‘%n’ and ‘%y’. A negative width fills with spaces whatever the ‘0’ says, zeros to the right of a number being a different number. A folder summary fills ‘%n’ with spaces even so: it is written as a token and filled in as the line is displayed, which is what keeps the number right when messages are expunged, and a token is padded with spaces.
A ‘.’ and a number after that is the most of the substitution that is used, and anything longer is cut. A negative number keeps the last columns rather than the first: ‘%.-20s’ is the end of a long subject.
The maximum is applied first and the width after it, so ‘%20.4s’ is four columns of the subject in a column twenty wide. The two are usually written with the same number, as ‘%-17.17F’ is, which makes a column of exactly that width.
If you save copies of all your outbound messages in a folder and
later visit that folder, the ‘%F’ format specifier will normally
display your own name. If you would rather see the recipient
addresses in this case, set the variable
vm-summary-uninteresting-senders. This variable’s value,
if non-nil, should be a regular expression that matches
addresses that you don’t consider interesting enough to appear in
the summary. When such senders would be displayed by the ‘%F’ or
‘%f’ summary format specifiers VM will substitute the value of
vm-summary-recipient-marker (default "To: ")
followed by what would be shown by the ‘%T’ and ‘%t’ specifiers
respectively.
If the recipients of the message are also “uninteresting” in this way,
then VM will substitute the value of vm-summary-principal-marker
(default "For: ") followed by the name or address in the ‘Reply-To’
header.
(For compatibility with older versions, the variable
vm-summary-recipient-marker is also referred to by its old name,
vm-summary-recipient-marker.)
The summary format need not be one line per message but it must end with a newline, otherwise the message pointer will not be displayed correctly in the summary window.
Summary lines are pre-computed and cached in the folder buffer. If you
change the vm-summary-format, you need to force the cache to be
updated. You can do this by the commandvm-fix-my-summary.
Every folder can have its own summary format. The format is written
into the folder and saved on the disk. When you visit the folder
again, you can reuse the saved summary format. Set the variable
vm-restore-saved-summary-formats to t to achieve this effect.
When message threading is enabled (see Threading),
you will find that the
Summary buffer has all related messages are grouped together and the
subject titles are indented to show hierarchical relationships.
Parent messages are displayed before their children and children are
indented by a default two spaces to the right. The amount of
indentation per level is controlled by the variable
vm-summary-thread-indent-level. The default is two spaces.
The variable vm-summary-maximum-thread-indentation says how
many levels should be displayed via indentation. The default is 20.
If you want VM to always display summaries using threads, you should
set the default value of the variable vm-summary-show-threads
non-nil in your VM init file. Example:
(setq-default vm-summary-show-threads t)
Do not use setq, as this will only set the value of
the variable in a single buffer. Once you’ve started VM you should
not change the value of this variable. Rather you should use
C-t to control the thread display. See Threading.
When you deal with long discussions in mailing lists or newsgroups, you would find that threads get very deep and their indentation in the Summary window is not entirely helpful. You can temporarily promote the subthreads to higher level so that you can view the threading relationships more clearly.
Decrease the thread indentation of the current message and its subthread by N steps, N being the prefix argument.
A prefix argument of 0 decreases the indentation all the way to 0, so the message reads as the root of a thread.
Its < binding is one of the optional ones, installed by
(vm-current-key-bindings) and described under Paging; without
that, run it with M-x.
Increase the thread indentation of the current message and its subthread by N steps, N being the prefix argument.
A prefix argument of 0 puts the indentation back to the one the message’s thread level gives it, with no offset.
That one is > with the same optional bindings installed.
Both of these commands alter the thread indentation for the current session only. The next time you visit the folder, the threads will be displayed using the standard indentation.
VM can “fold” a message thread in the summary window, collapsing all the messages in it into a single line, so that you can see a more compact summary of the folder.
Thread folding is enabled by setting the variable
vm-summary-enable-thread-folding to a non-nil value. The summary
window then has a folding indicator in the first column: with -
for threads that are expanded and + for threads that are
collapsed. The command T
(vm-toggle-thread) allows you to expand a collapsed thread or
collapse an expanded thread. The commands vm-expand-thread and
vm-collapse-thread implement the more specific versions of the
function.
When threads are folded, not all messages in the threads are hidden.
New messages that are yet unread continue to be visible. Which
messages remain visible in folded threads is controlled by the
variable vm-summary-visible, whose value must be a list of VM
selectors in the same format as those in
vm-virtual-folder-alist. See Virtual Folders.
If non-nil and thread folding is enabled, invoking
vm-next/previous-message-no-skip (N or P respectively)
will expand a thread upon moving into the thread and collapse it when
you move out of the thread.
The commands it acts on are the usual motion ones, N and P
(vm-next-message-no-skip and vm-previous-message-no-skip).
If non-nil, thread folding displays the count of messages in a thread along with the message number of the thread root. Note that this takes up 3 extra characters in each summary line.
Default value: t
The count costs 3 extra columns in every summary line.
When thread folding is enabled, the Summary window starts out with all
the threads folded. You can expand all the threads in the folder
using the command E (vm-expand-all-threads). The command
C (vm-collapse-all-threads) does the reverse.
When you have thread-folding enabled, you can execute VM operations
such as saving and deleting messages on entire threads. To obtain
this functionality, set the variable
vm-enable-thread-operations to a non-nil value in your
vm-init-file. t enables thread operations unconditionally,
and ask asks before each one. M-x vm-toggle-thread-operations
turns them on and off in a running session.
As an example, doing an s (vm-save-message) operation on
an ordinary message saves just the single message. However, if thread
operations are enabled and you invoke s on the
root message of a collapsed thread, then the entire thread is saved.
The same effect can be obtained using message marking. See Marking Messages. The following sequence of key strokes can achieve the
effect of saving an entire thread:
MuMTMNsMu
However, the thread-operation is simpler and more convenient.
All operations that can be sensibly invoked on multiple messages extend to thread operations in this way. They include deleting, undeleting, marking, unmarking, forwarding, saving/deleting attachments etc. Replying to messages cannot be invoked as a thread operation. This is to avoid accidentally sending replies to unintended recipients.
The thread operations can give rise to surprising behavior. Even though it
appears that an operation was invoked on a single message, it actually
applies to all the messages in a thread. So, care and practice are
warranted before you enable thread operations unconditionally. A safer
option is to set vm-enable-thread-operations to ask, which
asks for confirmation every time an operation is applicable to all the
messages in a collapsed thread.
A prefix argument is not the way past that question. A numeric prefix makes
a command act on that many messages from the current one, which is not a
thread operation at all: C-u s saves four messages rather than the
thread, and nothing is asked because nothing is being done to a thread.
t is what stops the asking.
By default, the summary of a folder is shown in a black-and-white
window with plain text. This is suitable for terminal mode Emacs
users. The variable vm-summary-highlight-face, which is set to
the standard Emacs bold face by default, is used to highlight
the currently selected message. You can set the variable to any other
face, or to nil if you wan to turn off highlighting.
You can turn on more elaborate faces support, suitable for color
graphics terminals, by setting the variable
vm-summary-enable-faces to t in your vm-init-file. You can
also run M-x vm-summary-faces-mode in the middle of a VM
session to turn on summary faces. Then VM decorates the summary lines
with different faces based on the attributes of the message.
See Faces in the GNU Emacs Manual, for basic information on
faces. The predefined faces used to highlight the summary window are
listed below. It is possible for you to change the definitions of
these faces in your vm-init-file as well as to define new faces of
your own.
The variable vm-summary-faces-alist defines a list of
condition-action pairs for decorating the summary with faces.
It has the following form:
( ((SELECTOR [ARG ...]) vm-summary-FACE) ... )
The first element of each pair is a VM selector in the same
format as used for vm-virtual-folder-alist. See Virtual Folders. The second element is a face name of the form
vm-summary-FACE where FACE is one of the face types
listed below. The first condition
satisfied by the message wins, and the face listed there is used to
decorate its summary line.
The faces vm-summary-selected, vm-summary-collapsed and
vm-summary-expanded are special. They are added to the face
specified by vm-summary-faces-alist instead of replacing it.
This allows VM to add highlighting for the selected message and the
collapsed/expanded thread roots, without scrubbing the natural face
determined by the message attributes.
Non-nil value means highlight summary lines as the mouse passes over them.
Default value: t
The command vm-summary-faces-hide allows you to hide the
summary lines of messages with a particular face type. By default, it
hides messages with the deleted face type. By invoking it with
a prefix argument, you can specify other face types that you might
like to hide. (Note that deleted face type does not necessarily
mean deleted messages. Whatever messages satisfy the condition
associated with the vm-summary-deleted face in
vm-summary-faces-alist will be hidden.)
A virtual folder is a mapping of messages from one or more real folders into a container that in most ways acts like a real folder but has no real existence outside of VM. You can have a virtual folder that contains a subset of messages in a real folder or several real folders. A virtual folder can also contain a subset of messages from another virtual folder.
There are two ways of working with virtual folders. When you are visiting a folder, you can use one or more selectors or search keys to interactively create a virtual folder. We call such folders search folders. You can browse through the messages in the search folder and carry out actions on them which will be reflected back to the original folder. When you are done, you can quit the search folder and return to the original folder.
A second way of using virtual folders is to define them through the
variable vm-virtual-folder-alist. You can visit such virtual
folders by typing V V (vm-visit-virtual-folder). Any
actions carried out on the virtual folder messages will be reflected
back to the underlying real folders. When you quit a virtual folder, all
its underlying real folders will also be quit, unless they were previously
visited in the Emacs session. We call such virtual folders
defined virtual folders.
A virtual message keeps its text in the buffer of the real folder it came
from, so a virtual folder cannot outlive that buffer: killing a real folder
buffer therefore quits the virtual folders over it as well. If any of them
has unsaved changes, VM names it and asks before going ahead, and answering no
leaves everything as it was. Quitting the real folder with q
(vm-quit) instead does not take the virtual folders with it; it takes
that folder’s messages out of them and leaves them open.
Create a new virtual folder from messages in the current folder.
The messages will be chosen by applying the selector you specify,
which is normally read from the minibuffer. See vm-vs-interactive
for the list of selectors.
Prefix arg means the new virtual folder should be visited read only.
It is bound to V C, so V C header RET greeting gives you a
folder of the messages with ‘greeting’ somewhere in their headers.
See Virtual Selectors, for the selectors you can use. The variants
vm-create-search-folder-other-frame and
vm-create-search-folder-other-window do the same in another frame or
window.
Create a new virtual folder of threads in the current folder. The threads will be chosen by applying the selector you specify, which is normally read from the minibuffer. If any message in a thread matches the selector then the thread is chosen.
Prefix arg means the new virtual folder should be visited read only.
It is bound to V T, so V T author RET Peter gives you every thread holding a message Peter wrote.
Apply the selectors of a named virtual folder to the current folder and create a virtual folder containing the selected messages.
Prefix arg means the new virtual folder should be visited read only.
Three commands take the selector from the current message, bound to V S, V A and V R:
Create a virtual folder (search folder) for all messages with the same subject as the current message.
Create a virtual folder (search folder) for all messages from the same author as the current message.
Create a virtual folder (search folder) for all messages that have
as a recipient the To addressee as the current message. If there are
multiple addressees, only the first one is chosen.
There are also short-cut key bindings for a number of frequently used selectors:
vm-create-author-virtual-folder)vm-create-author-or-recipient-virtual-folder)vm-create-subject-virtual-folder)vm-create-text-virtual-folder)vm-create-date-virtual-folder)vm-create-label-virtual-folder)vm-create-flagged-virtual-folder)vm-create-new-virtual-folder)vm-create-unseen-virtual-folder)Running vm-quit on a search folder makes its selected message the
current message in the underlying folder, which is what makes a search folder
a way of finding one message among many. To find the one about a hotel among
the messages whose subject is ‘greeting’:
vm-goto-message-last-seen goes back to the message you were reading
in the original folder before that.
vm-quit-no-change leaves the original folder’s current message where
it was.
Search folders also form an efficient way to search for some string in the
text of messages. The key binding V t
(vm-create-text-virtual-folder) can be used to find all messages with
the string. This is more efficient than the vm-isearch-forward
command (see Navigating) because it only searches in the text part
of message bodies, not inside MIME attachments.
A defined virtual folder is defined by its name, the folders that it
contains and its selectors. The variable
vm-virtual-folder-alist is a list of the definitions of all
such virtual folders. You can visit a virtual folder listed in
vm-virtual-folder-alist with the
vm-visit-virtual-folder (V V) command.
Each virtual folder definition should have the following form:
(VIRTUAL-FOLDER-NAME
( (FOLDER ...)
(SELECTOR [ARG ...]) ... )
... )
VIRTUAL-FOLDER-NAME is the name of the virtual folder being defined. This is the name by which you and VM will refer to this folder.
FOLDER should be the specification of a real folder: a file path for a local folder or a maildrop specification for a POP/IMAP folder. There may be more than one FOLDER listed, the SELECTORs within that sublist will apply to them all. If FOLDER is a directory, VM will assume this to mean that all the folders in that directory should be searched.
The SELECTOR is a Lisp symbol that tells VM how to decide whether a message should be included in the virtual folder. (See below for a complete list of the possible selectors.) Some SELECTORs require an argument ARG; unless otherwise noted, ARG may be omitted. When several selectors are listed, messages matching any one of them are included.
The text selector provides a particularly effective way to search
for strings in messages. It is better than the
vm-isearch-forward/backward functions because it avoids searching
inside encoded attachments, hence faster.
Here is an example that you may find useful as a template for creating virtual folder definitions.
(setq vm-virtual-folder-alist
'(
;; start virtual folder definition
("virtual-folder-name"
(("/path/to/folder" "/path/to/folder2")
(header "foo")
(header "bar")
)
(("/path/to/folder3" "/path/to/folder4")
(and (header "baz") (header "woof"))
)
)
;; end of virtual folder definition
)
)
When you visit a defined virtual folder, all the underlying folders that it depends on will be visited automatically. Likewise, when you quit the virtual folder, all the underlying folders that were purposely visited as part of the virtual folder will be closed automatically. But any other underlying folders that you might have previously visited for independent reasons will remain open.
anymatches any message.
headermatches message if ARG matches any part of the header portion of the message; ARG should be a regular expression.
textmatches message if ARG matches any part of the text portion of the message; ARG should be a regular expression.
header-or-textmatches message if ARG matches any part of the headers or the text portion of the message; ARG should be a regular expression.
header-fieldmatches messages if the header field named ARG1 has text matching ARG2.
authormatches message if ARG matches the author; ARG should be a regular expression.
author-or-recipientmatches message if ARG matches the author of the message or any of its recipients; ARG should be a regular expression.
recipientmatches message if ARG matches any part of the recipient list of the message. ARG should be a regular expression.
principalmatches message if ARG matches any part of the ‘Reply-To’ header of the message. ARG should be a regular expression.
addresseematches message if ARG matches any part of the ‘To’ header of the
message, either an address or a full name. ARG should be a regular
expression. Unlike recipient, this does not consider the ‘Cc’ or
‘Bcc’ headers.
uninteresting-sendersmatches message if its author matches
vm-summary-uninteresting-senders, which is normally set to match
yourself. This is the selector behind outgoing, and takes no
ARG.
outgoingmatches message if your are the author of it, i.e. if the author matches
vm-summary-uninteresting-senders.
in-bbdbmatches message if its addresses are in the BBDB. With an optional
first argument you can specify the address class (authors or
recipients) . With an optional second argument t, the
selector checks only the first address specified in the message.
Examples:
(in-bbdb authors)
(in-bbdb recipients t)
subjectmatches message if ARG matches any part of the message’s subject; ARG should be a regular expression.
sortable-subjectmatches message if ARG matches the subject as sorting reads it, with
the prefixes, suffixes and insignificant characters left out that
vm-subject-ignored-prefix, vm-subject-ignored-suffix,
vm-subject-tag-prefix, vm-subject-tag-prefix-exceptions and
vm-subject-significant-chars describe. So a reply and the message it
answers match alike, whatever ‘Re:’ the reply carries.
sent-aftermatches message if it was sent after the date ARG. A fully specified date looks like this:
``31 Dec 1999 23:59:59 GMT''
although the parts can appear in any order. You can leave out any part and it will default to the current date’s value for that part, with the exception of the ‘hh:mm:ss’ part which defaults to midnight.
sent-beforematches message if it was sent before the date ARG. A fully specified date looks like this:
``31 Dec 1999 23:59:59 GMT''
although the parts can appear in any order. You can leave out any part and it will default to the current date’s value for that part, with the exception of the hh:mm:ss part which defaults to midnight.
older-thanmatches message if it is more than ARG days old (today = 0)
newer-thanmatches message if it is at most ARG days old (today = 0)
message-idmatches message if its Message ID has a string matching ARG
uidmatches message if its IMAP UID is ARG (for IMAP folders)
uidlmatches message if its POP UIDL is ARG (for POP folders)
spam-scorematches message if its spam score is at least ARG. See
vm-spam-score-headers for configuration.
deletedmatches message if it is flagged for deletion.
undeletedmatches message if it has not been deleted.
editedmatches message if it has been edited.
uneditedmatches message if it has not been edited.
filedmatches message if it has been saved with its headers.
unfiledmatches message if it has not been saved with its headers.
writtenmatches message if it has been saved without its headers.
newrecentmatches message if it is new. Two names for one selector.
readmatches message if it is neither new nor unread.
unreadunseenmatches message if it is not new and hasn’t been read. Two names for one selector.
flaggedmatches message if it is flagged (see Message Attributes).
unflaggedmatches message if it is not flagged.
repliedansweredmatches message if it has been replied to. Two names for one selector.
unrepliedunansweredmatches message if it has not been replied to. Two names for one selector.
forwardedmatches message if it has been forwarded using
a variant of vm-forward-message, vm-send-digest or one
of their variants.
unforwardedmatches message if it has not been forwarded using
vm-forward-message, vm-send-digest or one
of their variants.
redistributedmatches message if it has been redistributed using
vm-resend-message.
unredistributedmatches message if it has not been redistributed using
vm-resend-message.
markedmatches message if it is marked, as with
vm-mark-message.
unmarkedmatches message if it is not marked.
selectedmatches the message the folder is looking at, and no other.
unwrittenmatches message if it has not been saved without its headers.
labelmatches message if ARG is one of its labels (see Message Attributes).
ARG is a label name, matched in full rather than as a regular
expression, so ‘(label "todo")’ selects the messages labelled
‘todo’ and not those labelled ‘todo-later’. The command
vm-create-label-virtual-folder (V l) is a short cut for using
this selector interactively.
collapsedmatches message if it is the root of a thread that is currently collapsed in the summary (see Threading). Takes no ARG.
expandedmatches message if it is the root of a thread that is currently expanded in the summary. Takes no ARG.
attachment ¶matches if a message contains an attachment, i.e., its text matches
vm-vs-attachment-regexp.
spam-wordmatches message if it contains one of the words listed in the file
vm-spam-words-file. ARG says where to look, and is one of
‘header’, ‘text’ or ‘header-or-text’; it defaults to
‘header-or-text’. As with text, a message held in an external
source must have been loaded for its body to be searched.
less-chars-thanmatches message if message has less than ARG characters. ARG should be a number.
less-lines-thanmatches message if message has less than ARG lines. ARG should be a number.
more-chars-thanmatches message if message has more than ARG characters. ARG should be a number.
more-lines-thanmatches message if message has more than ARG lines. ARG should be a number.
sexpmatches message if the argument “s-expression” yields t. For
example, to find all the messages from ‘Jenny’ with attachments, you
can type V C sexp RET (and (author "Jenny") attachment) RET.
(This selector is available for creating interactive virtual folders. The
argument “s-expression” can involve selectors combined using the logical
connectives listed below. There would be no need to use the sexp
selector in defining predefined virtual folders because those definitions
can directly use “s-expressions”.)
evalmatches message if evaluating the Lisp expression ARG yields t.
The Lisp expression can refer to the message by the name
vm-virtual-message. This is more flexible than the sexp
selector because it allows arbitrary Lisp expressions, not only the built-in
selectors. However, you would need some knowledge of the Lisp functions
that manipulate VM messages to use this selector.
andmatches the message if all its argument selectors match the message. Example:
(and (author "Derek McGinty") (new))
matches all new messages from Derek McGinty.
and takes any number of arguments.
notmatches message only if its selector argument does NOT match the message. Example:
(not (deleted))
matches messages that are not deleted.
ormatches the message if any of its argument selectors match the message. Example:
(or (author "Dave Weckl") (subject "drum"))
matches messages from Dave Weckl or messages
with the string “drum” in their Subject header.
or takes any number of arguments.
threadmatches a message thread if any message in the thread matches the argument selector. Example:
(thread (outgoing))
matches all threads that have an outgoing message, i.e., a message authored by you.
thread-allmatches a message thread if all messages in the thread match the argument selector. Example:
(thread (less-chars-than 1000))
matches threads if all their messages contain fewer than 1000 characters.
folder-namematches message if it is from a folder matching ARG
virtual-folder-membermatches message if the message is already a member of some virtual folder currently being visited.
vm-modematches the message if the current-buffer is in vm-mode and one of its argument selectors matches the message.
mail-modematches the message if the current-buffer is in mail-mode and one of its argument selectors matches the message.
Once you’ve
visited a virtual folder most VM commands work as they do in a
normal folder. There are exceptions. If you use S
(vm-save-folder), the folder save command will be invoked
on each real folder in turn. Similarly if you use g
(vm-get-new-mail) in a virtual folder, mail is retrieved
from the spool files associated with each of the real folders.
If any of the retrieved messages are matched by the virtual
folder’s selectors, they will be added to the virtual folder.
These commands will signal an error when invoked in a virtual folder:
vm-save-buffer
vm-write-file
vm-backup-folder
vm-change-folder-type
vm-expunge-imap-messages
vm-expunge-pop-messages
Normally messages in a virtual folder share attributes with the
underlying real messages. For example, if you delete a message
in a virtual folder, it is also flagged as deleted in the real
folder. If you then run vm-expunge-folder in the virtual folder,
the deleted message is expunged from the virtual folder as well as
the real folder. Labels are shared between virtual and real
messages. However virtual folders have their own set of message
marks.
To make virtual folders not share message attributes with real
folders by default, set the variable vm-virtual-mirror to nil.
This should be done in your VM init file and you should use
setq-default, as this variable is automatically local to all
buffers.
(setq-default vm-virtual-mirror nil)
If you want to change virtual mirror status of a particular
virtual folder, use the command vm-toggle-virtual-mirror (bound
to V M). If the virtual folder is currently sharing attributes
with real folders, it will no longer be. If it is not sharing
attributes with the underlying folders then it will be.
The ‘vm-avirtual’ add-on package created by Robert Widhopf-Fenk provides various automatic operations based on virtual selectors. These facilities are only partially documented.
The command M-x vm-virtual-omit-message (bound to V O in
version 8) will omit a message from a virtual folder, irrespective of
whether it satisfies the definition of the virtual folder. The command
M-x vm-virtual-update-folders (bound to V U in version 8) will
add the current message to all visited virtual folders that it logically
belongs to. This is useful for adding newly arrived messages or newly
marked messages to virtual folders.
The command M-x vm-virtual-check-selector-interactive (bound to V ? in version 8) allows you to test a selector, i.e., a virtual folder definition, interactively by applying it to the current message. With a prefix argument, it will print diagnostic information in a separate buffer. This feature is useful because virtual folder selectors can get quite complicated and it is important to make sure that they work correctly.
The vm-avirtual packages allows you to use virtual selectors to carry out automatic deletion of messages (e.g., for spam) and for automatic saving of messages to folders.
Automatic deletion of messages based on the virtual folder facility can be
achieved with the command vm-virtual-auto-delete-message (bound to
V D in version 8). First, set the variable
vm-virtual-auto-delete-message-selector to the name of a virtual
folder whose members should be normally deleted. Then invoking the command
on the current message (or a COUNT number of messages with a prefix
argument) deletes all those messages among them that belong to the virtual
folder vm-virtual-auto-delete-message-selector. There is no need to
separately view the virtual folder before deleting such messages.
Mark all messages from the current up to the last for (spam-)deletion.
Add this to vm-arrived-messages-hook.
See the function vm-virtual-auto-delete-message for details.
(add-hook ’vm-arrived-messages-hook #’vm-virtual-auto-delete-messages)
Add it to vm-arrived-messages-hook and the messages it matches are
deleted before you ever see them.
The commands M-x vm-virtual-save-message and
M-x vm-virtual-auto-archive-messages provide variants of
vm-save-message and vm-auto-archive-messages based on the
virtual folder facility. To use them, you must first set the variable
vm-virtual-auto-folder-alist to an association-list of the form
((VIRTUAL-FOLDER-NAME . FOLDER) ... )
where VIRTUAL-FOLDER-NAME is a string and FOLDER is
either a string or an expression that evaluates to a string. If the message
being saved is a member of VIRTUAL-FOLDER-NAME, as per its definition
in vm-virtual-folder-alist, then FOLDER is regarded as the
place where it should be saved. The command vm-virtual-save-message
suggests this folder as the default location for saving. The command
vm-virtual-auto-archive-messages archives all matching messages in
the corresponding FOLDERs, as suggested by
vm-virtual-auto-folder-alist.
Automatic deletion applies one action list to one selector. The variable
vm-virtual-filter-alist is a table of them, so that different kinds of
incoming mail can be treated differently. Its value is an association-list of
the form
((VIRTUAL-FOLDER-NAME . ACTIONS) ... )
where VIRTUAL-FOLDER-NAME names a virtual folder in
vm-virtual-folder-alist, whose selector says which messages the rule
applies to, and ACTIONS is a property list saying what to do with them:
:label STRINGAttach the labels named in STRING, a space separated list, as
vm-add-message-labels takes them.
:attributes STRINGSet the attributes named in STRING, a space separated list, as
vm-set-message-attributes takes them.
:save FOLDERSave a copy of the message in FOLDER, which is a string or an expression evaluating to one.
:skip-inbox tKeep the message out of the folder. It is flagged deleted and expunged once every rule has run.
Every rule whose selector matches is applied, in the order they appear, so one message can be labelled by one rule and saved by another. A rule naming a virtual folder that does not exist is an error rather than a rule that matches nothing.
Add vm-virtual-filter-new-messages to vm-arrived-messages-hook
to have the rules applied to incoming mail:
(setq vm-virtual-folder-alist
'(("from-arik" (("inbox") (author "arik")))
("spam" (("inbox") (spam-word)))))
(setq vm-virtual-filter-alist
'(("from-arik" :label "arik" :attributes "read")
("spam" :save "spam-folder" :skip-inbox t)))
(add-hook 'vm-arrived-messages-hook #'vm-virtual-filter-new-messages)
Messages are written into the folder before any arrival hook runs, so
:skip-inbox removes a message again rather than preventing its arrival.
The command M-x vm-virtual-filter-messages applies the same table to
the current message, or to a COUNT of them with a prefix argument, which
is a convenient way to test a table before hooking it up.
This chapter covers the additional features of IMAP server folders, i.e., folders on an IMAP server that you access using VM. See IMAP Folders. Do not use these features if you just download mail from IMAP mail boxes into local folders.
Synchronize the current folder with the IMAP mailbox. Changes made to the buffer are uploaded to the server first before downloading the server data. Deleted messages are not expunged.
Prefix argument FULL says to write every message’s attributes to the server, rather than only those of the messages whose attributes changed in this session, and to fetch a message the cache no longer holds rather than leaving it alone. This is useful for saving offline work on the cache folder, whose expunges are sent whether FULL is given or not: VM records them as the reader makes them.
FULL used to delete on the server every message the mailbox had and the cache did not. A damaged cache says the same thing as a reader who expunged, so that destroyed mail nobody asked it to (emacs-vm/vm#752).
Recall that vm-get-new-mail and vm-save-folder each do half of
that, in one direction.
A folder whose server could not be reached is read and changed in its cache on disk, and the changes go out when the server is there again. Run C-u M-x vm-imap-synchronize then, that is with a prefix argument, which writes all the message attributes and labels to the server: which of them changed while the server was away is not recorded.
The messages you expunged while the server was away are expunged on it whether you give the prefix argument or not: VM records each one as you expunge it and keeps the record in the folder, so it survives a session that could not reach the server. A prefix argument used to mean something more than that: every message the mailbox had and the cache did not was deleted on the server, so a cache that had been truncated, restored from a partial backup or read under the wrong folder type looked exactly like a folder you had expunged, so the mail went with no confirmation.
Messages on an IMAP server have unique id numbers called UID’s. In addition, a second id number called UIDVALIDITY allows the server to renumber messages when the id numbers within a particular UIDVALIDITY are exhausted. All the messages on the server at any given time have the same UIDVALIDITY value. When the server needs to renumber the messages, it changes the UIDVALIDITY value and issues new UID numbers for all the messages with new UIDVALIDITY. This happens but rarely because there are over two billion UID’s within each UIDVALIDITY.
When the UIDVALIDITY changes on the IMAP server, VM has
no easy way to identify the new UID’s for the messages in its cache. So, it
marks all the messages in the cache as invalid and refreshes the cache with
new copies of messages from the server. This is a time-consuming operation
but it happens only rarely. VM warns you before it refreshes the cache and
asks for confirmation. You can abort the operation if you cannot spare the
time, but note that it is not possible to perform any changes to the
IMAP folder until the cache is refreshed. You might consider
setting the vm-enable-external-messages flag to (imap) before
you refresh the cache so that it will be quicker. see External Messages.
The command vm-list-imap-folders lists the folders available on the
IMAP server, along with the total number of messages and recent
(new) messages in each of them. If you run it with a prefix argument, it
lists only those folders that have new messages.
Use the command vm-create-imap-folder for creating a new folder on
the IMAP server and vm-delete-imap-folder for deleting an
existing folder. You can rename a folder using
vm-rename-imap-folder.
VM uses Emacs frames and windows to display messages and summaries and to provide a place for you to compose messages. Using VM’s frame configuration facilities you can control when VM creates new frames and the size and attributes associated with new frames. Inside each frame you can associate different window setups with commands and classes of commands by using VM’s window configuration facilities.
To use VM’s frame configuration features, the variable
vm-mutable-frame-configuration must be set non-nil. This is
the default. If vm-mutable-frame-configuration is set to nil
VM will only use the current frame, and VM will not create, delete or resize
frames.
To use window configurations, the variable
vm-mutable-window-configuration must be set non-nil. If
vm-mutable-window-configuration is set to nil, VM will only
use the selected window, and will not create, delete or resize windows.
VM has a set of variables that let you specify when VM creates frames and what attributes the new frames will have.
Non-nil value causes the folder visiting commands to visit in a new frame. Nil means the commands will use the current frame. This variable does not apply to the VM commands whose names end in -other-frame, which always create a new frame.
This variable has no meaning if you’re not running under an Emacs capable of displaying multiple real or virtual frames. Note that Emacs supports multiple virtual frames on dumb terminals, and VM will use them.
Default value: t
Non-nil value causes VM to display the folder summary in its own frame.
Nil means the vm-summarize command will use the current frame.
This variable does not apply to vm-summarize-other-frame, which
always create a new frame.
This variable has no meaning if you’re not running under an Emacs capable of displaying multiple real or virtual frames. Note that Emacs supports multiple virtual frames on dumb terminals, and VM will use them.
This works best with a full-screen window configuration assigned to
vm-summarize.
Non-nil value causes the mail composition commands to open a new frame. Nil means the commands will use the current frame. This variable does not apply to the VM commands whose names end in -other-frame, which always create a new frame.
This variable has no meaning if you’re not running under an Emacs capable of displaying multiple real or virtual frames. Note that Emacs supports multiple virtual frames on dumb terminals, and VM will use them.
Default value: t
Non-nil value causes vm-edit-message to open a new frame.
Nil means the vm-edit-message will use the current frame. This
variable does not apply to vm-edit-message-other-frame, which
always create a new frame.
This variable has no meaning if you’re not running under an Emacs capable of displaying multiple real or virtual frames. Note that Emacs support multiple virtual frames on dumb terminals, and VM will use them.
Default value: t
Non-nil value causes VM to open a new frame to display help buffers. Nil means the VM will use the current frame.
This variable has no meaning if you’re not running under an Emacs capable of displaying multiple real or virtual frames. Note that Emacs supports multiple virtual frames on dumb terminals, and VM will use them.
Non-nil value causes VM to open a new frame on mouse initiated completing reads. A mouse initiated completing read occurs when you invoke a VM command using the mouse, either with a menu or a toolbar button. That command must then prompt you for information, and there must be a limited set of valid responses.
If these conditions are met and vm-frame-per-completion’s value
is non-nil, VM will create a new frame containing a list of
responses that you can select with the mouse.
A nil value means the current frame will be used to display the list of choices.
This variable has no meaning if you’re not running Emacs native under X Windows or some other window system that allows multiple real Emacs frames. Note that Emacs supports virtual frames under ttys but VM will not use these to display completion information.
Default value: t
When VM is deciding whether to create a new frame, it checks
other existing frames to see if a buffer that it wants to display in a
frame is already being displayed somewhere. If so, then VM will
not create a new frame. If you don’t want VM to search other
frames, set the variable vm-search-other-frames to nil. VM will
still search the currently selected frame and will not create a
new frame if the buffer that it wants to display is visible there.
Non-nil value is an alist of types and lists of frame parameters. This list tells VM what frame parameters to associate with each new frame it creates of a specific type.
The alist should be of this form
((SYMBOL PARAMLIST) (SYMBOL2 PARAMLIST2) ...)
SYMBOL must be one of ‘completion’, ‘composition’, ‘edit’,
‘folder’, ‘primary-folder’ or ‘summary’. It specifies the type
of frame that the following PARAMLIST applies to.
‘completion’ specifies parameters for frames that display lists of
choices generated by a mouse-initiated completing read. (See ‘vm-frame-per-completion’.)
‘composition’ specifies parameters for mail composition frames.
‘edit’ specifies parameters for message edit frames
(e.g. created by vm-edit-message-other-frame)
‘folder’ specifies parameters for frames created by vm and the
‘vm-visit-’ commands.
‘primary-folder’ specifies parameters for the frame created by running
vm without any arguments.
‘summary’ specifies parameters for frames that display a summary buffer
(e.g. created by vm-summarize-other-frame)
PARAMLIST is a list of pairs as described in the documentation for
the function make-frame.
The value of vm-frame-parameter-alist should be of this form
((SYMBOL PARAMLIST) (SYMBOL2 PARAMLIST2) ...)
SYMBOL must be one of “completion”, “composition”, “edit”, “folder”, “primary-folder” or “summary”. It specifies the type of frame that the following PARAMLIST applies to.
completionspecifies parameters for frames that display lists of
choices generated by a mouse-initiated completing read.
(See vm-frame-per-completion.)
compositionspecifies parameters for mail composition frames.
editspecifies parameters for message edit frames
(e.g. created by vm-edit-message-other-frame)
folderspecifies parameters for frames created by vm and the
vm-visit- commands.
primary-folderspecifies parameters for the frame created by running
vm without any arguments.
summaryspecifies parameters for frames that display a summary buffer
(e.g. created by vm-summarize-other-frame)
PARAMLIST is a list of pairs as described in the documentation for
the function make-frame.
Window configurations allow you to specify how the windows within
a frame should look for a particular command or class of
commands. Each command can have a configuration associated with
it and you can also associate a configuration with command
classes like “reading-message” or “composing-message”. To
setup a window configuration, first use Emacs’ window management
commands (split-window, enlarge-window, etc.) to make the
windows in the frame look the way you want. Then use the
switch-to-buffer command to put the buffers you want to see into
the windows. Next type W S, which invokes the
vm-save-window-configuration command. Type the name of the
command or class of commands to which you want the configuration
to apply. Nearly all VM commands can be entered here. Valid
classes are:
default
startup
quitting
reading-message
composing-message
marking-message
searching-message
When a VM command is executed, the configuration to use is looked for in this order, and the first one found is the one used:
vm-quit* command is in “quitting”, the commands that
set and clear message marks are in “marking-message”, and so on.
Note that when a window configuration is saved the selected
window at that time will be the selected window when that window
configuration is used. So if you prefer for the cursor to be in
a particular window, make sure you invoke
vm-save-window-configuration window from that window. Remember
that you can invoke the command with M-x if VM’s normal
key map is not in effect.
To delete a window configuration, use W D which is bound to
vm-delete-window-configuration. You will be prompted for the
name of the configuration to delete.
To see what an existing configuration looks like, type W W
which invokes vm-apply-window-configuration.
VM saves information about your window configurations in the file
named by the variable vm-window-configuration-file. The default
location of the configuration file is "~/.vm.windows".
Do not make vm-window-configuration-file point to the same
location as vm-init-file, as the window configuration save
commands will then overwrite the content of your init file.
VM can display a toolbar that allows you to run VM commands with a single mouse click. By default the toolbar is displayed on the left of the Emacs frame and is only visible if you’re running under a window system like X Windows or Microsoft Windows.
To make VM not display the toolbar, set vm-use-toolbar to nil.
To configure what buttons are displayed on the toolbar, you must
change the value of vm-use-toolbar. If non-nil, the value of
vm-use-toolbar should be a list of symbols and integers, which
specify which buttons appear on the toolbar and the layout of the
buttons. These are the allowed symbols along with the buttons
they represent.
autofileThe AutoFile button. Clicking on this button runs the command
vm-toolbar-autofile-message. This command will save the current
message into the folder matched by vm-auto-folder-alist, if there
is a match.
composeThe Compose button. Clicking on this button runs the command
vm-toolbar-compose-command. This command is normally just an
alias for the vm-mail command. If you want the Compose button to
do something else, redefine vm-toolbar-compose-command using
either fset or defun.
delete/undeleteThe Delete/Undelete button. If the current message is marked for deletion, this button displays as an Undelete button. Otherwise it displays as a Delete button.
fileThe File button. Clicking on this button runs the command
vm-toolbar-file-command. This command is normally just an
alias for the vm-mail command. If you want the File button to
do something else, redefine vm-toolbar-file-command using
either fset or defun.
getmailThe Get Mail button. Clicking on this button runs the command
vm-toolbar-getmail-command. This command is normally just an
alias for the vm-get-new-mail command. If you want the
Get Mail button to
do something else, redefine vm-toolbar-getmail-command using
either fset or defun.
helpThe Helper button. Clicking on this button runs the command
vm-toolbar-helper-command. This command normally just runs
vm-help, but it also does context specific things under certain
conditions. If the current message is a MIME message that needs
decoding, the Helper button becomes the Decode MIME button. If the
current folder has an auto-save file that appears to be the result
of an Emacs or system crash, the Helper button becomes the Recover
button. Clicking on the Recover button runs vm-recover-folder,
so you can recover your folder from an existing auto-save file.
mimeThe Decode MIME button. Clicking on this button runs the command
vm-toolbar-helper-command. This command is normally just an
alias for the vm-decode-mime-message command.
nextThe Next button. Clicking on this button runs the command
vm-toolbar-next-command. This command is normally just an
alias for the vm-next-message command. If you want the Next button to
do something else, redefine vm-toolbar-next-command using
either fset or defun.
previousThe Previous button. Clicking on this button runs the command
vm-toolbar-previous-command. This command is normally just an
alias for the vm-previous-message command. If you want the Previous button to
do something else, redefine vm-toolbar-previous-command using
either fset or defun.
printThe Print button. Clicking on this button runs the command
vm-toolbar-print-command. This command is normally just an
alias for the vm-print-message command. If you want the
Print button to
do something else, redefine vm-toolbar-print-command using
either fset or defun.
quitThe Quit button. Clicking on this button runs the command
vm-toolbar-quit-command. This command is normally just an
alias for the vm-quit command. If you want the Quit button to
do something else, redefine vm-toolbar-quit-command using
either fset or defun.
replyThe Reply button. Clicking on this button runs the command
vm-toolbar-reply-command. This command is normally just an
alias for the vm-reply-include-text command. If you want
the Reply button to
do something else, redefine vm-toolbar-reply-command using
either fset or defun.
visitThe Visit button. Clicking on this button runs the command
vm-toolbar-visit-command. This command is normally just an
alias for the vm-visit-folder command. If you want the Visit button to
do something else, redefine vm-toolbar-visit-command using
either fset or defun.
A nil or a positive integer in the list is ignored. Both meant something to XEmacs, which VM no longer supports: nil made the buttons after it flushright, and an integer put that many pixels of space in. The Emacs toolbar has neither.
The toolbar goes where the frame parameter tool-bar-position says,
which is not VM’s to set. vm-toolbar-orientation used to
place it and is gone.
VM finds the images for the toolbar in the directory specified by
vm-toolbar-pixmap-directory. This variable should already be set
properly by whoever installed VM on your system, so you should
not need to set it.
VM uses Emacs’ menu bar and pop-up menus whenever they are available
using which you can readily access VM’s commands. By default, VM puts
a context-sensitive pop-up menu on mouse button 3 (usually the
rightmost mouse button). If you don’t want this menu, set the
variable vm-popup-menu-on-mouse-3 to nil.
If you set vm-use-menus to nil, VM will not generate a menu bar
for VM folder buffers and VM won’t use pop-up menus either. If you
set vm-use-menus to ‘1’, VM will add a single ‘VM’
menu to the existing menu bar and provide various submenus under it
for the VM operations.
By default, vm-use-menus is set to a list of symbols indicating
which menus should appear in the menu bar. These menus will replace
the standard Emacs menus whenever VM folder are being viewed. You can
switch to the Emacs menu bar when necessary by clicking on the menu
labelled [Emacs] (on some systems, there will be a drop-down
menu labelled Emacs). From the Emacs menu bar, you can return
to the VM menu bar by clicking on the menu labelled [VM] (or
under the drop-down menu labelled VM).
On some graphics toolkits, menu bar cannot have “buttons” that
invoke immediate actions (such as [Emacs]). VM knows about
some of those toolkits and automatically uses drop-down menus instead
of buttons. If your system shows buttons but they are not
operational, then you should set vm-use-menubar-buttons to nil
in your init file. That will cause VM use to drop-down menus instead
of buttons on the menu bar.
The available menus for the VM menubar are the following:
disposeThis is menu of commands that are commonly used to dispose of a message. E.g. reply, print, save, delete.
emacsThis provides a menu button labelled [Emacs] that causes the
menu bar to change to the global Emacs menu bar. On that menu bar you
will find a [VM] button that can return you to the VM menu
bar.
folderThis is a menu of folder related commands. You can visit a folder, save a folder, quit a folder and so on.
helpThis is a menu of commands that provide information for you if you don’t know what to do next.
labelThis is a menu of commands that let you add and remove message labels from messages.
markThis is a menu of commands that you can use to mark and unmark messages based on various criteria. See Selecting Messages.
motionThis is a menu of commands to move around inside messages and inside folders.
sendThis is a menu of commands you use to compose and send messages.
sortThis is a menu of commands to sort a folder by various criteria.
undoThis provides a menu button that invokes the vm-undo command.
virtualThis is a menu of commands that let you visit and create virtual folders.
nilIf nil appears in the list, it should appear exactly once. All menus after nil in the list will be displayed flushright in the menu bar.
VM uses Emacs faces to emphasize text in the folder and summary
buffers. In addition to using the predefined faces of Emacs, VM also
defines several faces of its own. You can do M-x list-faces
inside Emacs to see what faces have been defined. You can also define
your own faces using Emacs primitives for doing so.
See Faces in the GNU Emacs Manual.
In the folder or presentation buffer, the header contents of headers
matched by the vm-highlighted-header-regexp variable are
displayed using the face named by vm-highlighted-header-face.
URL’s that occur in message bodies are displayed using the face
named by vm-highlight-url-face. Typing Return on such URL’s or
clicking button-2 has the effect of sending the URL to an external web
browser. See Using the Mouse. Searching for URLs in a
large message can take a long time. Since URLs often occur near
the beginning and near the end of messages, VM offers a way to
search just those parts of a message for URLs. The variable
vm-url-search-limit specifies how much of a message to search.
If vm-url-search-limit has a positive numeric value N, VM
will search the first N / 2 characters and the last
N / 2 characters in the message for URLs.
Face used for text in buttons that trigger the display of MIME objects.
Default value: vm-mime-button
See Summary Faces, for the faces support in the Summary buffer.
VM uses the following layout for the mouse buttons in the folder and summary buffers.
Activate. If you click on a summary entry, that message will be
selected and become the current message. If you click on a
highlighted URL in the body of a message, that URL will
be sent
to the browser specified by vm-url-browser.
Context Menu. If the mouse pointer is over the contents of the From header, button-3 pops up a menu of actions that can be taken using the author of the message as a parameter. For instance, you may want to create a virtual folder containing all the messages in the current folder written by this author. If the mouse pointer is over the contents of the Subject header, a menu of actions to be performed on the current message’s subject is produced. If button-3 is clicked over a highlighted URL, a menu of Web browsers is produced. Otherwise the normal VM mode specific menu is produced.
These button assignments work only in plain text messages. For HTML
messages, you might use an internal web browser such as Emacs-w3m to display
the content, which will have its own button assignments. For instance,
Emacs-w3m binds button-2 to the browser function specified by the variable
w3m-goto-article-function. You will need to set that variable to
the desired browser function to get button-2 to work in HTML messages.
In mail composition buffers only mouse button-3 is affected. Context sensitive menus are produced when that button is clicked.
vm-url-browser is set to the Emacs function browse-url by
default, and which browser that opens is decided by
browse-url-browser-function, not by VM. Set that to choose a
browser, and every Emacs package that follows a link obeys the same
setting.
VM defines two handlers of its own that are not browsers, and either can be
the value of vm-url-browser:
vm-mouse-send-url-to-window-system passes the URL to the
window system’s copy mechanism, so it can be pasted elsewhere, and
vm-mouse-send-url-to-clipboard sends it to the X clipboard.
vm-url-browser can also be a string naming an external browser to
run.
VM has some five hundred user options. This chapter is about where to put a setting and how to make one apply to a single folder; Command and Variable Reference lists every option there is, with its default, and the chapters above explain the ones that need explaining.
VM reads two files of its own, the first time it is run in an Emacs session:
~/.vm and then ~/.vm.preferences. See Starting Up, for what
each is for. Both hold Lisp, so a setting in either is an ordinary
setq:
(setq vm-primary-inbox "~/Mail/inbox"
vm-mime-alternative-show-method 'best-internal)
Three things belong in your Emacs init file instead of in VM’s:
vm-init-file and vm-preferences-file.
load-path entry, a
key binding in a global map, mail-user-agent.
(vm-biff-mode 1), for instance.
A global key binding is the case that catches people. A
global-set-key in ~/.vm does nothing until something else has
already started VM, because until VM has run once the file has not been read.
Bound to vm-continue-what-message-other-window, say, C-x m stays
compose-mail and starts a new message, which looks like VM ignoring the
drafts it was asked about. Every press after the first is right, which makes
it a puzzling thing to debug.
A binding in one of VM’s own keymaps does belong in ~/.vm: the map has to exist before anything can be defined in it, which is exactly what being read after VM has started buys you.
;; in the Emacs init file: works from the first keystroke (global-set-key "\C-xm" 'vm-continue-what-message-other-window) ;; in ~/.vm: vm-mode-map exists by the time this is read (define-key vm-mode-map "m" 'vm-continue-what-message)
Settings made with Customize are written to your custom-file, which is
your init file unless you have said otherwise. Emacs loads that at startup
and VM reads its own files later, so a setting in ~/.vm wins over the
same setting in Customize. Keep a given variable in one place or the other,
not both.
M-x vm-load-init-file reads both files again, so you can try a change without restarting Emacs. With a prefix argument it reads ~/.vm and skips ~/.vm.preferences, which is the quick way to find out whether a preference is what broke something.
M-x vm-edit-init-file visits vm-init-file in another frame, and
M-x vm-customize opens VM’s own Customize group.
A folder is a buffer, so a setting can be local to it. Make it local from
vm-mode-hook, which runs in the folder’s buffer:
(add-hook 'vm-mode-hook
(lambda ()
(when (string-match "/spam\\'" (buffer-file-name))
(set (make-local-variable 'vm-summary-format)
"%n %*%a %-30.30F %-3.3m %2d %I\"%s\"\n"))))
The hook matters, not just the setting. VM builds the summary after
vm-mode-hook has run and before vm-visit-folder-hook, so a
summary format set in the latter has no effect on the summary you are looking
at: the lines have already been made, and each one is cached with its
message. Anything that decides how the folder is displayed goes in
vm-mode-hook. See Hooks, for the other hooks and their order.
A ‘Local Variables:’ list at the end of a folder file does not
work, and is not meant to: a folder is mail from strangers, and VM visits one
with enable-local-variables bound to nil rather than let a message
set variables in your Emacs. Use the hook.
VM has many hook variables that allow you to run functions when certain events occur. Here is each of them, as the code describes it. (If you don’t write Emacs-Lisp programs you can skip this chapter.)
Hook run every time a message with the new
attribute is made to be the current message. When the functions are run, the
current buffer is the folder containing the message and it is narrowed
to the start and end of the message.
Hook run every time a message with the unread
attribute is made to be the current message. When the functions are called,
the current buffer is the folder containing the message and it is narrowed to
the start and end of the message.
List of hook functions called every time a message is made to be the current message. When the hooks are run, the current buffer will be the folder containing the message and the start and end of the message will be bracketed by (point-min) and (point-max).
List of hook functions called every time a message is saved to a folder. When the hooks are called, the current buffer will be the folder containing the message and the start and end of the message will be bracketed by (point-min) and (point-max). The hooks are called with one argument, a string naming the folder the message was saved to: a file name, or the maildrop specification of an IMAP mailbox.
vm-save-message has run this hook since long before it was declared
anywhere, which is why it is documented in the manual and was not a variable.
List of hook functions called once for each message gathered from
the system mail spool, or from another folder with
vm-get-new-mail, or from a digest with vm-burst-digest. When the
hooks are run, the current buffer will be the folder containing
the message and the start and end of the message will be
bracketed by (point-min) and (point-max).
List of functions called when VM first notices mail is spooled for a folder. The folder buffer will be current when the hooks are run.
List of hook functions called after VM has gathered a group of
messages from the system mail spool, or from another folder with
vm-get-new-mail, or from a digest with vm-burst-digest. When the
hooks are run, the new messages will have already been added to
the message list but may not yet appear in the summary.
Also, the current buffer will be the folder containing
the messages.
List of hook functions to be run after a Mail mode
composition buffer has been created for a reply. VM runs this
hook and then runs vm-mail-mode-hook before leaving the user in
the Mail mode buffer.
List of hook functions to be run after a Mail mode
composition buffer has been created to forward a message. VM
runs this hook and then runs vm-mail-mode-hook before leaving the
user in the Mail mode buffer.
List of hook functions to be run after a Mail mode
composition buffer has been created to resend a bounced message.
VM runs this hook and then runs vm-mail-mode-hook before leaving
the user in the Mail mode buffer.
List of hook functions to be run after a Mail mode
composition buffer has been created to resend a message.
VM runs this hook and then runs vm-mail-mode-hook before leaving
the user in the Mail mode buffer.
List of hook functions to be run after a Mail mode
composition buffer has been created to send a digest.
VM runs this hook and then runs vm-mail-mode-hook before leaving
the user in the Mail mode buffer.
List of hook functions to be run after a Mail mode
composition buffer has been created to send a non specialized
message, i.e. a message that is not a reply, forward, digest,
etc. VM runs this hook and then runs vm-mail-mode-hook before
leaving the user in the Mail mode buffer.
List of hook functions called just after VM updates an existing entry a folder summary.
List of hook functions called just after VM adds or deletes entries from a folder summary.
List of hook functions to run once, when VM starts up.
Run at the end of vm-session-initialization, the first time any VM command
is used in an Emacs session – so once per Emacs, not once per folder. See
vm-visit-folder-hook for the per-folder equivalent.
By then VM is fully assembled: the init file has been read, menus and the mouse are installed and any timers are running. So a function here can override what VM has set up, which is the reason for running it last rather than first. VM commands may be called from it.
If what you want is to configure VM before it starts, set variables in your
init file or vm-init-file instead; and to run something when a particular
library is loaded, with-eval-after-load is simpler than a hook.
List of hook functions called just after VM visits a folder.
It doesn’t matter if the folder buffer already exists, this hook
is run each time vm or vm-visit-folder is called interactively.
It is NOT run after vm-mode is called.
List of hook functions called just after VM has retrieved a group of messages from your system mailbox(es). When these hooks are run, the messages have been added to the folder buffer but not the message list or summary. When the hooks are run, the current buffer will be the folder where the messages were incorporated.
List of hook functions to be run just before a message is edited.
This is the last thing vm-edit-message does before leaving the user
in the edit buffer.
List of hook functions to be run after a Mail mode composition buffer has been created. This is the last thing VM does before leaving the user in the Mail mode buffer.
List of hook functions to run when a buffer enters vm-mode.
These hook functions should generally be used to set key bindings
and local variables.
Old name for vm-mode-hook.
Supported for backward compatibility.
You should use the new name.
List of hook functions to run when a VM summary buffer is created. The current buffer will be that buffer when the hooks are run.
Old name for vm-summary-mode-hook.
Supported for backward compatibility.
You should use the new name.
List of hook functions to run when a VM virtual folder buffer is created. The current buffer will be that buffer when the hooks are run.
List of hook functions to run when a VM presentation buffer is created. The current buffer will be the new presentation buffer when the hooks are run. Presentation buffers are used to display messages when some type of decoding must be done to the message to make it presentable. E.g. MIME decoding.
List of hook functions to run when you quit VM. This applies to any VM quit command. The following global variables may be used in your hook function.
virtual - true if the current folder is a virtual folder no-expunge - true if no expunge was requested as part of quit no-change - true if the changes are being discarded ‘vm-expunge-before-quit’ - user option controlling auto-expunge
This applies to all VM quit commands, including vm-quit-no-change, so
a function here should not alter the folder. To expunge deleted messages
automatically on quitting, set vm-expunge-before-quit rather than
doing it from this hook.
List of hook functions to run when the VM summary pointer is updated. When the hooks are run, the current buffer will be the summary buffer.
List of hook functions that are run every time VM wants to display a buffer. When the hooks are run, the current buffer will be the buffer that VM wants to display. The hooks are expected to select a window and VM will display the buffer in that window.
If you use display hooks, you should not use VM’s builtin window configuration system as the result is likely to be confusing.
List of hook functions that are run every time VM wants to remove a buffer from the display. When the hooks are run, the current buffer will be the buffer that VM wants to disappear. The hooks are expected to do the work of removing the buffer from the display. The hook functions should not kill the buffer.
If you use undisplay hooks, you should not use VM’s builtin window configuration system as the result is likely to be confusing.
List of hook functions that are run whenever VM iconifies a frame.
If non-nil, this should name a function to be called inside
vm-decode-mime-message to do the MIME display the current
message. The function is called with no arguments, and at the
time of the call the current buffer will be the presentation
buffer for the folder, which is a temporary buffer that VM uses
for the display of MIME messages. A copy of the current message
will be in the presentation buffer at that time. The normal work
that vm-decode-mime-message would do is not done, because this
function is expected to subsume all of it.
List of hook functions to call just before sending a message.
The hooks are run after confirming that you want to send the
message (see vm-confirm-mail-send) but before MIME encoding and
FCC processing.
When VM was first written, the majority of users received their email and replied to them on Unix systems. These systems either ran permanent services for receiving and sending email, or they shared their file systems with other servers which provided such services. The local system administrators took care of all the configuration.
Today most users receive their email and reply to it on remote servers across the Internet, through a variety of protocols for downloading, sharing and transmitting mail that they have to know something about. Messages crossing the network are open to probes that violate privacy and security, which further protocols exist to protect against. VM runs inside Emacs and depends on it to implement these protocols, and Emacs in turn depends on other GNU tools for some of them.
This section brings together what configuring VM through all of them requires of you. It is introductory: the documentation of the protocols and the programs themselves goes further.
See Setting Up, for the settings themselves, one piece at a time, and M-x vm-check-configuration for which of them this Emacs is missing.
If you receive email on a remote server, that email will be made available via a mail reception protocol. The two commonly used protocols are:
POP was designed to receive and store your email in a “post office” until you are ready to download it to your own computer. Once you download it, the email gets deleted from the server’s “post office.” However, today, most POP servers also provide the ability to retain the email in the post office even after you downloaded it.
IMAP was designed to receive and store your email essentially permanently. However, the IMAP service providers are likely to give you a limit on how much disk space your account will be allowed to use. As long as you are within those limits, you can organize your email on the server as if it is your own computer, and create multiple folders etc.
VM provides two ways of working with mail servers:
To ensure privacy on the open Internet while you download email from mail
servers, some servers provide an additional secure communication layer.
Some servers insist that you can only use secure communication, and
refuse to provide an insecure channel. For your own security, you should
attempt to use the secure communication layer whenever it is available. You
can specify the secure mail servers using tags pop-ssl or
imap-ssl in defining maildrop specifications. Please make sure that
you specify an appropriate port number, as required by the documentation of
your mail server. (Normally port 995 is used for pop-ssl and
port 993 is used for imap-ssl.)
Secure channels are provided using a protocol called SSL (Secure Sockets Layer). A later version of the protocol is called TLS (Transport Layer Security), which is backward compatible with SSL.
Emacs does TLS itself, through GnuTLS, which most builds
have compiled in; (gnutls-available-p) says whether yours does. On
such a build VM opens the connection itself and needs no other program.
A build without GnuTLS needs an external stunnel program to
make the secure “tunnel” instead. Download it from the
stunnel.org web site and install it somewhere on the
exec-path. vm-stunnel-program decides which of the two is
used, and takes its default from the build: nil, meaning Emacs’s own
TLS, where GnuTLS is there, and "stunnel" where
it is not. Set it to "stunnel" to use the program on a build that
could do without it.
VM writes the configuration file stunnel requires, starts the
program, and talks to the mail server through it. You can look at the
generated configuration file by running:
M-: (find-file (vm-stunnel-configuration-file))
Depending on what is required by your mail server, you may need to
specify additional configuration options for stunnel. In that case,
you should create the required configuration file and set the variable
vm-stunnel-program-additional-configuration-file to its path name.
Configuration for sending email can be more complicated, partly because you are dependent on Emacs for the mail sending libraries. VM does not have its own mail sending functionality.
The original Emacs mail-sending library is called sendmail.el (also
referred to mail-mode because of its user interface for mail
composition). This library essentially assumes that the local machine has
mail sending capabilities.
When using remote servers for mail sending, the servers runs a protocol
called SMTP (Simple mail transfer protocol). A separate Emacs
library smtpmail.el has been written to intervene in the operation of
sendmail.el and hand the mail to the remote SMTP server
instead. See Emacs SMTP Library in Emacs SMTP Library.
Which port the server takes mail on says what kind of server it is:
smtpmail does SSL/TLS itself, so these two
settings are the whole of it.
Set smtpmail-stream-type to nil and
smtpmail-smtp-service to the port the server takes mail on, 587 or
25.
Set smtpmail-stream-type to ssl and
smtpmail-smtp-service to its port, usually 465.
The connection begins in plain text, the server says it wants
STARTTLS, and the mail program negotiates a secure channel before
handing over anything. Emacs does that itself, through GnuTLS,
which most builds have compiled in; (gnutls-available-p) says whether
yours does. Set smtpmail-stream-type to starttls and
smtpmail-smtp-service to 587.
starttls refuses to send where the server does not offer the upgrade.
nil, the default, takes the upgrade where it is offered and sends in
plain text where it is not.
A vm: link in an Org file names a folder and, after a ‘#’, a
message in it:
[[vm:inbox#87r0abc123.fsf@example.com][the note about the release]]
C-c C-o on it opens that folder and shows that message, and C-c l in a VM folder makes such a link to the message being read. A prefix argument on the follow opens the folder read-only.
Load it in your init file:
(require 'vm-org)
Org carries no support for VM of its own, so this is it. The folder is
written relative to vm-folder-directory where it is under it, so a
link made on one machine can be followed on another whose mail lives
somewhere else, and a folder reached over SSH or ftp is written
‘//user@host:file’ and opened through Tramp.
In earlier releases this was a file in a contrib directory that nothing built or documented, and the storing half had stopped working when Org changed how a link type registers.
Useful ways to customize VM.
Some messages come with huge lists of recipients, and one has to page through them before reaching the content. VM can show the first line of such a header and hide the rest behind a widget:
Non-nil means fold a header that runs onto more than one line.
A message with fifty recipients puts the subject a page down; with this set
VM shows the first line of such a header and hides the rest behind a widget
you can click, or vm-shrunken-headers-toggle on the lot.
This needs a presentation buffer, that is vm-always-use-presentation
non-nil: the overlays it uses would otherwise land in the folder buffer,
which is the file on disk.
Clicking the widget, or pressing RET on it, expands that one header;
vm-shrunken-headers-toggle expands or collapses all of them in the
message, and is worth a key of your own if you use it often.
Written by Robert Fenk, as part of vm-rfaddons.
A sender can ask to be told when you read their message. VM does not answer such a request unless you say so:
Non-nil means answer a message asking for a return receipt.
vm-handle-return-receipt-mode says whether the answer is sent as it
stands, asked about first, or left in a composition buffer for you.
A return receipt is a request, not an instruction: a sender cannot make your mail reader tell them you read something, and VM does not by default.
Tells vm-handle-return-receipt how to handle return receipts.
One can choose between ask, auto, edit, or an expression which should
return t if the return receipts should be sent.
Default value: edit
Written by Robert Fenk, as part of vm-rfaddons.
The default setting of VM for handling MIME alternatives is
best-internal, which means the best alternative that can be
displayed internally in VM is chosen. Many users have environments
where only text/plain parts can be displayed internally.
However, some messages come with text/html parts that are
expected to be more faithful to the sender’s composition. On
occasion, you might wish to see the text/html part even if it
has to be viewed externally.
VM has a command for changing the selection method for as long as you need it:
Toggle between best-internal and best mime decoding modes. (Alley Soughton)
(Thanks to Alley Stoughton for this contribution.)
Messages with attachments get bulky and increase the size of VM
folders, slowing down VM. The functions
vm-save-all-attachments and vm-save-attachments provide
ways to save attachments of messages on the file system and deleting
them from the mail folders.
A command files them for you, without being asked each time:
Save all attachments to a subdirectory.
Root directory for saving is vm-mime-attachment-save-directory.
You might add this to vm-select-new-message-hook in order to automatically
save attachments.
(add-hook ’vm-select-new-message-hook #’vm-mime-auto-save-all-attachments)
Subdirectory where to save the attachments of a message. This variable might be set to a string, a function or anything which evaluates to a string. If set to nil we use a concatenation of the from, subject and date header as subdir for the attachments.
To have it happen to every message as it arrives:
Non-nil means save the attachments of a message as it arrives.
vm-mime-auto-save-all-attachments does the saving, under
vm-mime-attachment-save-directory in a subdirectory named by
vm-mime-auto-save-all-attachments-subdir.
Written by Robert Fenk, as part of vm-rfaddons.
VM reports what it is doing in the echo area, and the variable
vm-verbosity decides how much of that you see. Every message VM
prints has a level of its own, and one is shown when its level is
vm-verbosity or lower, so a larger number means more talk. The
scale runs from 0 to 10:
Only what VM cannot stay silent about.
Errors, and warnings worth interrupting for.
Normal level, and the default: what a command did, and the progress of anything slow enough to be worth watching.
The steps within those operations.
Detail: threading, summary generation, parsing, header work.
More of the same, and VM’s own bookkeeping.
Debugging information.
So (setq vm-verbosity 3) leaves little more than warnings, and
(setq vm-verbosity 8) restores the level VM used in earlier releases,
which was chattier than the documented normal one.
Warnings use the same scale, so lowering vm-verbosity quiets warnings
along with progress; nothing above level 1 is a warning. A related variable,
vm-verbal-time, holds a number of seconds to leave each message on
screen, and should normally be 0, since anything else delays VM.
When an operation is slow, the question is which part of it is, and the echo area is no place to answer it: each message is gone as the next one arrives. Everything VM says is therefore kept in the buffer ‘*VM Log*’, timed, and M-x vm-show-log shows it. Nothing has to be turned on for that.
vm-log-level is for the messages that are not shown. It takes
a level on the scale above and records everything up to it, so
(setq vm-log-level 10)
leaves the display exactly as it was, what is recorded and what is shown being decided separately, and keeps the detail of a slow operation, which is what to send with a report of one. Each line says when, and how long since the line before it:
14:03:12.481 +2.140s +0.310cpu [6] INBOX: Retrieving message 400 (of 100000)...
The two numbers separate VM’s own work from waiting for a server: an interval that is all real time and no CPU went on the network. It is the time since the last recorded message, so it counts time VM sat idle as readily as time it worked, a long interval at the start of an operation is usually the wait before it, not the operation.
The log runs for as long as Emacs does, so it is bounded: vm-log-max-lines
lines are kept and the oldest go first.
vm-biff pops up a summary frame when mail arrives, in the manner of
xbiff, so you can see what has come in without leaving what you are
doing. Switch it on with (vm-biff-mode 1), which is autoloaded, and off
again with (vm-biff-mode -1). Something has to go looking for the mail for it to have anything to show,
which vm-auto-get-new-mail does by default; a folder that has it set
to nil shows nothing until g.
Loading the file no longer switches it on: it works by putting a function on
vm-arrived-messages-hook, and merely having a file loaded should not
change how Emacs behaves.
A composition is named after its recipient and subject, so a reply to
René Descartes opens a buffer called ‘reply to René Descartes’. The
name also names the auto-save file, so characters a file name cannot hold are
replaced by
‘_’: vm-drop-buffer-name-chars says which, and defaults to
‘[[:cntrl:]/]’, or on MS-Windows to the wider set that platform needs.
Set it to ‘[^ a-zA-Z0-9.,_"'+-]’ for the behaviour of earlier releases,
which replaced every accented letter as well.
VM was developed by Kyle Jones, starting in early 1989. The first public release of VM was version 4.10, released in June of that year. The original development environment was GNU Emacs 18.52.
The copyright for the code was retained by Kyle Jones. Hence, the package was never included in GNU releases, which only contain code copyrighted by the Free Software Foundation. However, Lucid/XEmacs shipped VM starting with version 19.9. Everyone else took VM from the Wonderworks web site, which hosted Kyle Jones’s work at http://www.wonderworks.com/vm.
The last version he released was 7.19, in September 2004.
After this release, Robert Widhopf-Fenk picked up the maintenance of
VM, by releasing a series of patches under a separate distribution. He
also acquired a number of add-on’s contributed by various developers,
including himself, and included them in his distribution. Kyle Jones
agreed to hand over the maintenance of VM to Robert Fenk in February,
2007. Further releases were made by Robert Fenk under the 8.0.x
series.
Those releases were made from the project page VM had at Savannah, https://savannah.nongnu.org/projects/viewmail/, which said that “this site exists to continue VM development after version 7.19 as a community project.” It still carries the mailing lists; the code moved.
VM was then maintained by a “VM Development Team” of Robert Widhopf-Fenk,
Ulrich Müller and Uday S Reddy, who made the releases numbered 8.1.0
and up. Robert Fenk had been inactive since November 2008 and remained an
official member of the team.
In 2024 a small team of new developers moved development to GitLab, https://gitlab.com/emacs-vm/vm/, where it is now.
The code is at https://gitlab.com/emacs-vm/vm/, and releases are on its tags page.
Each release’s changes are in numbered NEWS files in the repository. ‘NEWS-3.md’ covers 8.3.0 onwards, ‘NEWS-2.md’ 8.0.0 through 8.2.0b1, and ‘NEWS-1.md’ the releases up to 7.19. A file is never renamed, so the newest entries are always at the front of the highest-numbered one.
Two mailing lists, hosted at Savannah:
viewmail-info@nongnu.orgQuestions and discussion.
viewmail-bugs@nongnu.orgBug reports.
Subscribe to either from https://savannah.nongnu.org/projects/viewmail/.
Report a bug at https://gitlab.com/emacs-vm/vm/-/issues, which is where the developers work and where a report is acted on.
M-x vm-submit-bug-report prepares a message to
viewmail-bugs@nongnu.org carrying the state of your VM, which is what
lets a developer reproduce the problem. Passwords and other sensitive values
are left out. Say what you did and what happened; you may be asked for more,
or asked to try something that narrows it down.
VM is now supported and maintained by the user community. So, as an active user, your participation is key to keep the project going.
Contributions to the code from the following members of the VM community are gratefully acknowledged:
Please let us know if any contributors have been missed out.
Here are some of the VM features that its users find most valuable:
V C).
Ideas that have been considered for VM, and are recorded here so that they are not lost. None of them is being worked on, and none is promised.
If you would like one of these, or have an idea that is not here, please open an issue at https://gitlab.com/emacs-vm/vm/-/issues. A suggestion in the tracker is one that can be discussed, found by the next person to want it and worked on by anybody; one that reaches only this list is none of those.
VM has a sophisticated bug reporting system in order to provide the VM maintainers with adequate information about the state of VM when the error situation occurred. However, it is still important for the users to give as full an explanation of the problem as possible. See Bugs in the GNU Emacs Manual.
The command M-x vm-submit-bug-report should be invoked from the
VM folder buffer in which a problem is encountered. This creates a
mail buffer with information about the state of VM pre-filled. Insert
suitable text to explain the problem and send the bug-report message.
A problem with a POP or IMAP spool file or folder is often in the exchange with the server, which the maintainer has to see. To capture it:
vm-pop-start-bug-report or vm-imap-start-bug-report.
vm-pop-submit-bug-report or vm-imap-submit-bug-report.
Everything exchanged in between goes into the report on its own, a session still running included: nothing is closed to collect it, so a report can be made about a fetch while it is happening.
A session that read the flags of every message in a large mailbox leaves most
of a megabyte behind it, which is more than a bug report can carry. Beyond
vm-session-trace-max-size the middle of a trace is left out and the
report says how much: what is at the ends is what says anything, the start
naming the server and what was asked of it and the end showing where it went
wrong. Set it to nil to send the whole of every trace.
This section gives a sketchy overview of the VM internals for the developers/programmers.
VM stores mail folders in the Unix ‘mbox’ format (in all its variants). Internal to Emacs, the mbox is loaded into a text buffer (the Folder buffer) and individual messages are identified by remembering markers into the text buffer. See Message Internals.
The Unix mbox format has no specification. A folder is a text file holding a sequence of messages, each of them a series of headers followed by a body:
Three variants of the mbox format are recognized by VM:
From_Every message has a leading and a trailing separator line, as above.
BellFrom_The trailing separator line can be missing, which is how the mboxes of the old System V format are handled.
From_with-Content-LengthThe From separator line stores the length of the message, so no
trailing separator line is needed.
Since the separator line is just text, a body line that itself begins
with ‘From ’ is ambiguous. Many Unix tools resolve this by
From-stuffing: rewriting such a body line as ‘>From ’ when
writing the folder, and undoing it when reading. VM does not
From-stuff. It relies instead on a narrow separator pattern: for
From_ and BellFrom_ folders a line only starts a message
if it matches "^From .*[0-9]$", that is, it must also end in a
digit, as the timestamp of a real separator line does. An ordinary
body line beginning with ‘From ’ therefore does not usually end a
message. This is a heuristic, not a guarantee; a body line such as
‘From then on we had 3’ would be misread. For
From_with-Content-Length folders the question does not arise,
since the body length is taken from the ‘Content-Length:’ header
rather than by scanning.
VM does understand From-stuffing done by others: ‘>From ’ lines are skipped wherever they appear in a message’s header section, which is where some delivery agents insert them.
One place uses the looser test: vm-count-messages-in-file, which
runs grep -c "^From " to report a folder’s message count without
visiting it. A body line beginning with ‘From ’ inflates that
count, which affects only the reported total, not how the folder is
parsed.
In addition to these mbox formats, VM also handles the MMDF format and
the Emacs Rmail’s Babyl format. The variable vm-folder-type
stores the type of the folder being used.
To every message, VM adds a header with the field name “X-VM-v5-Data:” and stores in it the information about the message it wishes to remember between sessions.
The first message of the VM folder file contains additional headers used by VM for remembering information between sessions.
vm-visible-headers
and vm-invisible-header-regexp that were in effect when the
folder was saved. The messages in the folder would have their headers
arranged according to these variables.
Internal to Emacs, VM stores the folder as simply a text buffer. However, it remembers a variety of data about the message contents in the buffer through internal variables.
vm-message-list. A list of message data structures for all the
messages in the buffer.
vm-folder-type. The type of the current folder indicating how
the messages are stored: one of ’babyl, ’From_, ’BellFrom_, ’mboxcl2 and
’mmdf.
vm-folder-access-method. The method for accessing the server
message store: ’pop for pop-folders and ’imap for imap-folders, and nil
for all other folders.
vm-folder-access-data. A vector of data for accessing the server
message store. The first two elements of the vector are the maildrop
specification for the mail server and a reference to the process
connecting to the mail server. For the ’pop access method, that is all
there is. But, for the ’imap access method, the vector has 9 other
entries detailing various pieces of data about the IMAP server.
vm-folder-read-only. A boolean flag indicating whether the
folder is read-only. If so, no modifications are allowed, including
attribute changes. However, messages can be fetched from external
storage for viewing.
vm-virtual-folder-definition. If the current folder is virtual,
then this variable holds the data constituting its definition.
vm-real-buffers. If the current folder is virtual, then this
variable is a list of all the real folder buffers involved in
constructing it.
vm-virtual-buffers. A list of all the virtual folder buffers
that the current buffer is involved in.
vm-component-buffers. An a-list containing all the folder
buffers (real or virtual) that make up the components of the current
virtual folder, and a flag indicating whether those folders were
visited as part of visiting the virtual folder. When the virtual
folder is closed, all the folders purposely visited will also be closed..
vm-summary-buffer. The Summary buffer of the folder. (If the
Summary buffer gets killed for any reason, the value of this variable
becomes <killed buffer>, which is unfortunate. Therefore, most
interactive commands of VM check for killed Summary buffer and reset
this variable to nil in such a case. So, in the middle of code, this
variable can be regarded as a valid buffer pointer.)
vm-presentation-buffer-handle. The message Presentation buffer of the
folder. (Same proviso applies as for vm-summary-buffer.)
vm-presentation-buffer. This seems to be a copy of the
vm-presentation-buffer-handle. Its purpose is unknown.
The running state of the folder buffer is represented in a number of buffer-local variables:
vm-message-pointer. A sublist of vm-message-list starting from
the current message that the cursor is on. So, the first element of
vm-message-pointer is the current message.
vm-last-message-pointer. Whenever the cursor is moved, the
previous value of vm-message-pointer is remembered in this variable.
vm-summary-pointer. The message struct of the message which
has the summary pointer in the Summary buffer.
vm-fetched-messages. List of external messages whose
bodies were fetched for viewing or other operations.
vm-fetched-message-count. The number of messages in
vm-fetched-messages. An attempt is made to keep this below the
vm-external-fetched-message-limit.
vm-mime-decoded. The MIME decoding state of the current
message display: nil if the message is shown in undecoded plain
text form, decoded if the message is shown decoded, and
buttons if the message is shown as a series of buttons for all its
MIME components. The D command cycles through these states.
vm-system-state. The state of VM in a Folder buffer or
Presentation buffer:
previewing.
if a message is being previewed.
showing.
if a full message is being shown.
reading.
if message reading is in progress.
A message edit buffer is in state editing.
A message composition buffer may be in one of these states:
vm-spooled-mail-waiting. VM periodically checks if there is new
mail in the spool files of the current folder and set this flag to t if
there is new mail.
vm-undo-record-list. A list of undo records describing the
actions to be performed if an undo operation is invoked. Each undo
record has an action, the message, if any, to which the action
applies, and any arguments needed for the action.
vm-undo-record-pointer. A pointer into the
vm-undo-record-list indicating the current position of the
undoing cycle.
vm-label-obarray. An obarray storing all the labels that are
registered to be used in the current folder.
vm-folder-garbage-alist. An alist with items that constitute the
temporary storage used in displaying the folder and functions to
dispose them. These garbage items are disposed when the folder is quit.
vm-message-garbage-alist. An alist with items that constitute the
temporary storage used in displaying the current message and functions to
dispose them. These garbage items are disposed whenever a new message is
selected or if the folder is quit.
The variable vm-folder-access-data is a vector storing data about the
state of the mail server (for POP and IMAP servers). It
contains the following items:
pop-maildrop-spec or imap-maildrop-spec.
MAILDROP specification of the server folder.
pop-process or imap-process.
The Emacs process being used to communicate with the server for this
folder. (Each folder uses a separate process to avoid unwanted
interference.)
imap-uid-validity.
The UIDVALIDITY value of the IMAP folder.
imap-read-write.
A boolean flag indicating whether the folder is writable.
imap-can-delete.
A boolean flag indicating whether the folder allows deletions.
imap-body-peek.
A boolean flag indicating whether the folder allows the BODYPEEK
command of IMAP.
imap-permanent-flags.
The list of permanent flags that have been stored in the folder.
imap-mailbox-count.
The number of messages in the folder.
imap-recent-count.
The number of messages in the folder that are considered “recent” by the
server.
imap-retrieved-count.
The number of messages present in the folder when messages were last
retrieved. This would have been the value of imap-mailbox-count at
that time.
imap-uid-list.
The list of UID’s and flags of the messages in the folder,
using cons cells of the form (msg-num . uid . size . flags list). The cons
cells (size . flags list) are shared with imap-flags-obarray below.
imap-uid-obarray.
An obarray that binds all the UID’s of messages in the folder to their
message sequence numbers.
imap-flags-obarray. An obarray that binds all the UID’s of messages
in the folder to cons cells of the form (size . flags list). These cons
cells are the same as those occurring in the imap-uid-list field.
So, any updates will be shared through both the views. The two obarrays,
imap-uid-obarray and imap-flags-obarray, bind exactly the same
set of UID’s. Jointly, they are referred to as uid-and-flags-data.
The reason for their separation is historical.
The message data structure is a vector containing various pieces of data about the message, some of which is permanent and some that is calculated during a VM session. The data is organized into four sub-vectors:
The attributes vector and cached data vector are stored in the
folder on disk as the X-VM-v5-Data header of the first message.
This vector holds the data about the location of the various parts of the message in the folder buffer. Every folder buffer or folder-like buffer (such as a Presentation buffer) has variables that contain message data structures. The location data is normally expected to refer to locations in that very buffer. However, this condition is not actually required. (See below.)
start (0). Marker for the starting position of the message, at which a
leading separator line begins.
headers (1). Marker for the position in the buffer where the headers
of the message start.
vheaders (2). Marker for the position in the buffer where the
visible headers of the message start. (The headers are rearranged in
such a way that all the visible headers are towards the end of the
headers region.)
text (3). Marker for the position in the buffer where the text of the
message starts.
text-end (4). Marker for the position in the buffer where the text of
the message ends.
end (5). Marker for the position in the buffer where the message
ends.
Unfortunately, in the current versions of VM, the folder buffer to which the location data point is not itself part of this vector. This information is inferred from the context (which makes the code brittle). The Folder buffer of the message can be obtained from the soft data vector but the location data could also point to a Presentation buffer.
This vector contains other calculated data about the message that is specific to a VM session.
number (0). The message number as an integer.
mark (1). Flag that indicates if the message has been marked (via
vm-mark-message).
su-start (2). The position in the Summary buffer where the summary
line of the message starts.
su-end (3). The position in the Summary buffer where the summary line of
the message ends.
real-message-sym (4). If the message is in a virtual folder, then its
corresponding “real message” is the underlying message in another
folder which is described by a message data structure similar to the
current one. The real message data structures are represented by
uninterned symbols written as “<<>>”. This field stores the symbol
representing the real message of the current message. If the current
message is a real message then this field contains its own symbol.
The use of symbols for this purpose avoids the possibility of circular
data structures.
mirrored-message-sym (20). This is similar to the
real-message-sym, except that it points to the message that this
message directly mirrors (as a virtual message). If we follow the
“mirrored-message” links in succession we should eventually reach the
“real-message”.
unused (5). Formerly reverse-link-sym. The reverse link now
lives in vm-reverse-link-table; see vm-reverse-link-of. Stored in
the message it chained the whole folder for the garbage collector, one stack
frame per message, which crashed Emacs on large folders.
message-type (6). A symbol indicating the type of the message
according to its folder type, one of BellFrom_, From_ and
mboxcl2.
message-id-number (7). A number that uniquely identifies the message
within a VM session.
buffer (8). The Folder buffer of the message. (Messages in Presentation
buffers also have this field set to the corresponding Folder buffer.)
thread-indentation (9). Indentation level of the message in its message
thread.
thread-indentation-offset (21). Indentation added by the user for the
message, which is used in addition to the thread-indentation. This
is not “cached” data and should not be discarded.
thread-list (10). List of symbols from vm-thread-obarray that
give this message’s lineage.
thread-subtree (19). List of messages that form the subtree under
this message in a threaded summary display.
babyl-frob-flag (11).
saved-virtual-attributes (12). Saved attributes if the message
switched from unmirrored to mirrored.
saved-virtual-mirror-data (13). Saved mirror data, if the message was
switched from unmirrored to mirrored.
virtual-summary (14). Summary for unmirrored virtual message.
mime-layout (15). MIME layout information; types, ids,
positions, etc of all MIME entities. (See below.)
mime-encoded-header-flag (16). Flag that indicates if the headers of
the message are MIME encoded.
su-summary-mouse-track-overlay (17). The overlay on the summary of
this message used for selection by mouse.
message-access-method (18). The access-method to be used for the
message, inherited from its real folder.
All the hard-wired message attributes are stored in this
vector. They also get saved as part of the X-VM-v5-Data header
field when the folder is saved to disk.
new-flag (0). Flag to indicate if the message is “new”.
unread-flag (1). Flag to indicate if the message is unread.
deleted-flag (2). Flag to indicate if the message has been deleted.
filed-flag (3). Flag to indicate if the message has been filed.
replied-flag (4). Flag to indicate if the message has been replied to.
written-flag (5). Flag to indicate if the message has been saved.
forwarded-flag (6). Flag to indicate if the message has been forwarded.
edited-flag (7). Flag to indicate if the message has been edited.
redistributed-flag (8). Flag to indicate if the message has been
redistributed.
flagged-flag (9). Flag to indicate if the message has been
“flagged” as important.
folded-flag (10). Flag to indicate whether the summary of the
subthread rooted at this message has been “folded”, i.e., hidden from
view.
watched-flag (11). Flag that says that the user wants to “watch”
this thread. There are no functions that use this at present.
ignored-flag (12). Flag that says that the user wants to ignore this
thread. There are no functions that use this at present.
read-receipt-flag (13). Flag that says that the sender of this
message wishes to receive a read-receipt. There are no functions that use
this at present.
read-receipt-sent-flag (14). Flag that says that a read-receipt has
been sent for this message. There are no functions that use this at present.
attachments-flag (15). Flag that says that this message has
attachments. There are no functions that use this at present.
thread-root-flag (16). Flag that says that this message should be
regarded as the root of a message thread, even if its “parent” and
“references” headers say otherwise. This field is not used at present.
The vector is meant for data that is cached for each message and stored on
the disk as part of the X-VM-v5-Data header field. Cached data is
present in other parts of the message or its headers and, so can be freely
discarded and recalculated. That is history.
Over the years, this vector has also accumulated a number of fields that are not “cached” data in this sense. Some fields contain hard data that is not available elsewhere, such as the ID’s of external messages on mail servers. It also contains data provided by the user which should be preserved across VM sessions.
Some fields contain information from message headers. The header fields can have MIME-encoded words in them. The strings stored in the cached-data vector, however, are MIME-decoded versions of the header fields. So, when they are written to disk, they should be re-encoded because only MIME-encoded text can appear in mail folders. To facilitate this, they are given text properties that store the names of the original character sets used in the header fields. This allows the strings to be quickly re-encoded for storage on disk.
byte-count (0). The size of the message in bytes.
weekday, monthday, month, year, hour,
zone (1-6). Data indicating the date of
the message.
decoded-full-name (7). The full name of the author of the message.
This is a MIME-decoded string with text properties.
decoded-from (8). The email address of the author of the message.
This is a MIME-decoded string with text properties.
message-id (9). The unique id of the message.
line-count (10). The number of lines in the message.
decoded-subject (11). The subject string of the message. This is a
MIME-decoded string with text properties.
vheaders-regexp (12). A regular expression that can be used to find
the start of the visible headers. The headers must have been already
ordered so that the visible headers are at the bottom of the headers
section.
decoded-to (13). The email addresses of the addressees of the message
(listed in the “To” header) in a comma separated string. This is a
MIME-decoded string with text properties.
decoded-to-names (14). The full names of the addressees in a comma
separated string. Addresses are used if full names are not available. This
is a MIME-decoded string with text properties.
month-number (15). Numeric month of the sent date.
sortable-datestring (16). The date string of the “date” of the
message for sorting purposes (either the sent date or the delivery date,
depending on the value of vm-sort-messages-by-delivery-date).
decoded-sortable-subject (17). The subject string of the message for
sorting purposes. (Prefixes such as “re:” are removed and subject tags of
mailing lists might also be removed.) This is a MIME-decoded
string with text properties.
decoded-tokenized-summary (18). A tokenized summary for the message,
from which the actual summary line can be quickly calculated. This is a
list containing tokens, such as number and thread-indent, as
well as MIME-decoded strings with text properties.
parent (19). The message ID of the parent of the message in its
thread.
references (20). Message IDs listed in the References header of the
message.
body-to-be-retrieved (22). Flag that indicates whether the body of the
message has not been retrieved from the mail server.
body-to-be-discarded (21). Flag that indicates whether they body of
the message should be discarded before the folder is saved. (This is used
in conjunction with the body-to-be-retrieved above.)
pop-uidl (23). The UIDL id of the message on the
POP server.
imap-uid (23). The UID of the message on the
IMAP server.
imap-uid-validity (24). The UIDVALIDITY value of the
message on the IMAP server.
spam-score (25). The spam score of the message.
headers-to-be-retrieved (26). Flag that indicates whether the
headers of the message have not been retrieved from the mail server (for
external messages). This is not “cached” data and should not be
discarded. This field is unused at present.
headers-to-be-discarded (27). Flag that indicates whether the
headers of the message should be discarded before the folder is saved (for
external messages). This is not “cached” data and should not be
discarded. This field is unused at present.
decoded-summary-subject (28). Subject of the message as it appears
in the summary line of the message. (This optionally omits the subject tags
added by mailing lists.)
declared-parent (29). The message ID of the parent of the message,
as declared by the user. This may not be present in the headers of the
message. So, it is not “cached” data and should not be discarded. This
field is not used at present.
declared-duplicates (30). List of message ID’s that the user
declared as being duplicates of this message. The duplicate copies may not
be present in the folder, but they should be taken into account in
calculating threads. This is not “cached” data and should not be
discarded. This field is not used at present.
d-weekday, d-monthday, d-month, d-year,
d-hour, d-zone (31-36). Data indicating the delivery date of
the message. These fields are not used at present.
decoded-reply-to-name, decoded-reply-to (37-38). The full
name and the email address in the ‘Reply-To’ header of the message
(called the “principal” of the message.)
decoded-to-cc-name, decoded-to-cc (39-40). The full names and
the email addresses in the ‘To’ and ‘Cc’ headers of the message
(called the “recipients” of the message.)
Extra data shared by virtual messages if vm-virtual-mirror is non-nil.
edit-buffer (0). If the message is being edited, this is the buffer
being used.
virtual-messages-sym (1). List of virtual messages mirroring the
current real message, represented by an uninterned symbol written as
“<v>”.
stuff-flag (2). Flag to indicates if the attribute changes have been
“stuffed” into the folder buffer.
labels (3). List of labels attached to the message.
label-string (4). The string of labels attached to the message.
attribute-modflag (5). Flag to indicate if the attributes of the
message have been modified since the last save.
The MIME layout of a message, stored in the soft data of the message, is in turn a vector containing various pieces of data. Such a vector is used not only for the overall message, but for all its MIME parts and subparts as well.
type (0).
A list of strings consisting of the MIME type of the part along
with its attributes. This comes from “Content-Type” header. The type
could be of the form ‘type/subtype’. Quotation marks are stripped from
attribute values. An example is
("multipart/mixed" "boundary=----_=_NextPart_001_01AFE588.63E23840").
qtype (1). Like type, but the quotation marks are not stripped.
encoding (2). The MIME encoding used for the part. It comes
from the “Content-Transfer-Encoding” header.
id (3). The id obtained from the “Content-ID” header of the part.
description (4). A description string obtained from the
“Content-Description” header of the part.
disposition (5). A list of strings obtained from the
“Content-Disposition” header of the part. Quotation marks are
stripped from attribute values. (An example is (``attachment'',
``filename=mydocument.doc'').)
qdisposition (6). Like disposition, but the quotation marks are not
stripped.
header-start (7), header-end (8), body-start (9) and
body-end (10). Markers into the content buffer delineating the
headers/body of the MIME part.
parts (11). A list of MIME layouts for the individual subparts
of this part.
cache (12). A symbol that is unique to this MIME part. Other
data is stored as properties of this symbol:
vm-mime-display-external-generic.
This property stores the id of the process used to externally display
the MIME part as well as the name of the temporary file used.
vm-mime-display-internal-image-xxxx.
This property stores the name of the temporary file where the image is
stored.
vm-image-modified.
This property stores a boolean flag indicating that the image has been
modified.
vm-mime-display-internal-audio/basic.
This property stores the name of the temporary file where the audio
clip is stored.
vm-message-garbage. This property is a boolean flag indicating
whether the files used in this layout have been registered as message
garbage. (This feature is currently not in use.)
message-symbol (13). A reference to the message that contains the
MIME part. Represented as a symbol (that is, an interned key into
a hash table). This is a different symbol from the real-message-sym of the
message.
display-error (14). If the display of a MIME part fails, its
error string is stored here.
layout-is-converted (15). Flag indicating that MIME type
conversion has been performed on this part. see MIME type conversion.
unconverted-layout (16). If the MIME type conversion has been
performed on this part, then this holds the original unconverted layout.
Every Folder buffer has a vm-message-list and a
vm-message-pointer list containing message data vectors.
Every Presentation buffer also uses a vm-message-pointer list
with a single message (the one being presented). The message data
vector in the Presentation buffer has its own location data, but
shares all other components with the message in the Folder buffer.
This allows the Presentation buffer to, for example, change the
attributes of the message without having to switch context to the
Folder buffer.
Virtual folders, which contain only references to messages in other
folders, store just a single message body in the Folder buffer.
However, they have message descriptors for all the messages in
vm-message-list. All the message descriptors use the same
location data vector, because only one message body can be stored in
the Folder buffer, but have separate Soft data vectors. (This allows,
for instance, virtual folders to have their own threads, which could
in general be different from the threads in the underlying folders.)
The other sub-vectors are shared with the underlying real folders. (In
particular, the tokenized summary line is the same in the virtual
folders and their underlying folders.)
The format of the mail messages is as described in RFC 822.
It is not known whether the updates of RFC 5322 have been incorporated in VM.
The message bodies can be in the MIME format, as described in RFC 2045, 2046 and 2047.
The following updates that have been made to the original MIME standards have not been implemented in VM.
Generating a summary is quite a time-consuming operation. VM uses a variety of tricks to speed up the generation of summaries.
The format of the summary lines is specified in the variable
vm-summary-format. The information that needs to go into
the summary lines is divided into two classes:
A tokenized summary line is a list whose elements can be strings, representing fixed information in a message, and tokens, representing variable information. VM calculates a tokenized summary line for each message and caches it in the cached-data vector. The following forms of tokens are used in tokenized summary lines:
number.
Stands for the message number in the linear order of the summary.
mark.
Stands for an indicator of message mark (whether the message is marked
at present).
thread-indent.
Stands for the indentation to be used for the message’s summary
depending on its position in the message thread.
group-begin, group-end.
Brackets used to denote groups of items that might have particular
formatting constraints.
The function vm-tokenized-summary-insert converts a tokenized
summary line into a string and inserts it in the summary buffer. The
minibuffer message “Generating summary...” is used to show the
progress of generating summary lines from tokenized summaries.
Buffer local variables in each Folder buffer responsible for maintaining summary information:
vm-summary-pointer. The message selected by the cursor in the
Summary window.
vm-summary-redo-start-point. A pointer into the
vm-message-list indicating the first message for which the
summary line must be redisplayed. All the messages from here on are
assumed to require a summary redisplay. The assumption is usually valid
because the message numbers of all the succeeding messages might have
changed. But, if message numbers are not included in the summary lines,
then this results in unnecessary work.
vm-messages-needing-summary-update. The list of messages for
which summary lines must be redisplayed. Messages are included in this
list by calling the function vm-mark-for-summary-update.
vm-numbering-redo-start-point. A pointer into
vm-message-list indicating the first message whose message number
needs to be recalculated.
vm-numbering-redo-end-point. A pointer into
vm-message-list indicating the last message whose message number
needs to be recalculated.
The beginning and the ending positions of each message summary line are stored in the message’s soft data vector. see Message Internals. The positions within the summary line have text-properties set, which give the data about the message:
Message threads required for threaded summaries are calculated using message ID’s, which are unique when the message was originally composed. However, VM may need to deal with multiple copies of the same message received via possibly different routes. So, message ID’s are not unique for messages inside VM.
Messages composed as replies generally have an “In-Reply-To” header. The message mentioned in this header is referred to as the parent of the message. In addition, messages also arrive with a “References” header which lists all the ancestors of the message, with the oldest message being listed first. The last message listed in the “References” header is the direct parent of message. It is important to keep in mind that all the messages listed in the “References” header may not be present in the VM folder.
Thread trees are constructed using the “In-Reply-To” headers and “References” headers. Jamie Zawinski has done a good analysis of the information contained in these headers which can be found on the web. VM’s threading algorithm is currently based on these ideas. These trees are called reference-based threads.
In addition, VM also allows threads to be built using the subject
headers via the option vm-thread-using-subject. Subject-based
threading is used in addition to reference-based threading. So, in a
subject-based thread, the root message would be the oldest message
with that subject and, below it, would be reference-based threads all
of which share the same subject. The roots of these reference-based
threads are referred to as the “members” of the subject thread.
Subject threading is only one level deep, whereas reference threading
can be arbitrarily deep.
Threads are built using two hash tables vm-thread-obarray and
vm-thread-subject-obarray. The former keeps track of the thread
obtained by following parent and reference chains. The latter keeps track
of messages with the “same subject”. To prevent messages from jumping
from one thread to another within the same VM session, the subject used is
not the message’s own subject, but rather the subject of the oldest message
in the thread. This subject is retained even if the oldest message is
expunged.
The message ID’s are interned in vm-thread-obarray and the
following information is stored for each message ID:
nil.
nil
The vm-thread-subject-obarray interns each subject string found
in the folder and maps it to a vector containing the following elements:
id-sym is not included as a member.
Building threads involves calculating all the data stored with the
vm-thread-obarray and vm-thread-subject-obarray. These two
collections of data are calculated in sequence, because the subject
threads are based on the reference threads.
After the threads are built, the thread-list,
thread-indentation and the thread-subtree fields of the
Soft data vector are calculated as needed on demand and cached.
(See Soft data vector.) These fields cannot be calculated without
building threads first.
When new messages are assimilated, they are added to the threads that
might have been already built, and the thread-related fields in the
Soft data vector are erased so that they will be recalculated. The
thread-subtree field is erased for all the ancestors of the
assimilated message. The thread-list and
thread-indentation fields are erased for all the descendants of
the assimilated message.
Before messages in the folder are expunged, they are unthreaded.
This involves removing them from their respective thread trees. It
also involves the erasure of the thread-subtree field of all
their ancestors and the thread-list and
thread-indentation fields of the descendants.
The code for threading has to be robust in the presence of erroneous information in the message headers. We have no control over the mail clients that produce those messages and faulty information should not lead to VM hanging or producing errors. It should just do the best job it can in the presence of imperfect information.
It is possible that the information in the headers give rise to cycles in the thread trees. Kyle Jones’s original implementation allowed these cycles to exist, but all functions that traversed the thread trees were protected to detect cycles. However, since thread trees are updated when new messages are received or existing messages are expunged, this led to unstable results.
Following Jamie Zawinski’s recommendation, VM now avoids cycles in thread trees. Loop detection is still carried out during traversal as a double safeguard.
VM gives priority to the parent information contained in the “In-Reply-To” headers in preference to the information in the “References” headers. However, if an “In-Reply-To” header gives rise to a cycle, it is ignored, and then “References” headers might be used to fill in the missing information.
Sorting of messages in VM is carried out using the Emacs built-in
sorting function, which is generic in the comparison
operation to be used for sorting. The required comparison operation
is expressed as a sequence of basic comparison operations such as
comparison by date, by author, by subject etc. The dynamic
variable vm-key-functions is bound to a list of comparison
functions before calling the Emacs sort function.
The function vm-sort-compare-xxxxxx uses the functions listed
in vm-key-functions to do the overall comparison. It compares
the given messages using the key functions in sequence. If the first
key function decides one of the messages to precede the other, then
the comparison is over. If the messages are found to be equivalent
according to the first key function then the second key function is
tried and, if they are still equivalent, then the next key
function is tried and so on. This is called the lexicographic
combination of the given key functions.
Sorting by threads is special. When messages are to be sorted by
threads, all the messages belonging to a thread should appear
together. The required effect is achieved by using
vm-sort-compare-thread as the first key function in the
sequence. This function checks to see if the two messages belonging
to the same thread. If they do then the farthest ancestors of the two
messages that share the same parent are returned so that the remaining
comparison operations can be applied to these ancestors. The
rationale is that these ancestors are the roots of the thread subtrees
that the two messages belong to. So, the relative ordering of the
messages should be the same as the relative ordering of these
ancestors. If the two messages belong to different threads then the
thread roots of the two messages are returned, again with the same
rationale.
Threaded summaries can be sorted by any key, e.g., by author (full-name). It is most common to sort them by “activity,” i.e., the order of the most recent message in the thread or subthread. Sorting them by “date” means using the date of the root message of the thread or subthread.
When IMAP servers are used as mail spools (or “drop boxes”) for local folders, VM opens a session with the IMAP server each time it is asked to get new mail. These sessions are closed immediately after the downloading is completed.
When VM is used to handle IMAP folders, sessions are created with the server each time a synchronization is performed (for reading as well as saving). A separate session is created for each IMAP folder visited in VM. If, in addition, the IMAP folders have external messages, VM keeps an active session with the server (separately for each IMAP folder), which is used to fetch messages on demand.
When an IMAP session is inactive for a certain period, IMAP server is likely to forcibly close it. To ensure that an IMAP session is active when VM tries to talk to the server, it first checks that the session is active. If the server has forcibly closed the connection, it would not respond, and Emacs networking code times out after a certain period. During this process, VM will appear to “hang.” In reality, it is waiting for the Emacs networking code to come back with a response.
For each mail folder, VM creates three kinds of buffers in Emacs: the Folder buffer, the Presentation buffer and the Summary buffer. All three types of buffers have the same user interface as far as possible: the same key bindings, menu bars, tool bars and also the same commands. The functions implementing the commands must therefore work irrespective which of the three buffers they are invoked in. This makes VM quite different from most Emacs modes.
VM stores the identity of the Folder buffer in a buffer-local variable
vm-mail-buffer in each of the other types of buffers.
Conversely, each Folder buffer uses buffer-local variables
vm-summary-buffer and vm-presentation-buffer to store
the identity of the other buffers.
Whenever a VM command is invoked by the user, VM calls a function
called vm-select-folder-buffer-and-validate, which sets the
current-buffer to the Folder buffer. It also stores the identity of
the buffer with the user’s focus in a global variable called
vm-user-interaction-buffer. Thus, at every point during the
command execution, VM has knowledge of all the buffers involved as
well as the buffer in which the command execution was initiated.
[More to be filled in on vm-display etc.]
The default menu bar of VM contains VM-specific menus, replacing the
standard Emacs menus. This is achieved by setting the buffer-specific
menu bar to one in which the Emacs menus are undefined (at
least in GNU Emacs).
VM computes its standard menu bar and stores it internally:
This is stored in the keymap vm-mode-menu-map.
The menu bar also has a menu, or a menu item, to switch back to the
standard Emacs menu bar.
The computed menu bar is then installed depending on the setting of
vm-use-menus.
If the user selects the action to revert to the standard Emacs menu
bar, the installation is easily reverted.
The installation involves inserting a key binding for menu-bar.
When the user picks a menu item to revert to the
Emacs menu bar, the function vm-menu-toggle-menubar is invoked,
which installs a fresh menu bar retaining the standard Emacs menus.
The same function is used to reinstall the dedicated VM menu bar when
needed.
A Coding System is a way of encoding characters as bit patterns.
see Coding System Basics in Emacs Lisp
manual. US-ASCII is a coding system for English. Other coding systems are
used to encode the various languages of the world, e.g., ‘iso-latin-1’
(also called ‘iso-8859-1’ or simply ‘latin-1’) for Western
European languages, and hebrew-iso-8bit (also called
‘iso-8858-8’) for Hebrew. In addition to these standard coding
systems, Emacs uses its own internal coding system for characters, which can
encode all character sets currently in existence. But the internal coding
system can vary between different versions of Emacs.
MIME messages specify the character set that their content
is in, in the ‘Content-Type’ header. In reality, the “character set”
is a reference to a coding system, which has been used to encode the
characters in the particular character set as bit patterns. However, the
name that Emacs uses to refer to a coding system is often different from the
MIME character set name. The correspondence between the two is defined via
a property called mime-charset for each implemented coding system
inside Emacs. For example, the mime-charset property of
‘iso-latin-1’ is ‘iso-8859-1’, that of ‘hebrew-iso-8bit’ is
‘iso-8859-8’. The Emacs function coding-system-get can be used
to extract the mime-charset property of an Emacs coding system. VM
stores all the known coding systems and the corresponding MIME
charsets in its internal variables
vm-mime-mule-coding-to-charset-alist and
vm-mime-mule-charset-to-coding-alist.
VM uses this information to decode the content
to the Emacs internal coding system. This is done using the function
decode-coding-region. Conversely, VM encodes the outgoing messages
into the default or chosen MIME character set using the function
encode-coding-region.
The headers of email messages can only be in US-ASCII, so a header field in
another character set is encoded into ASCII and annotated with the name of
the character set it came from. An annotation looks like =?charset?B?
and applies to a word or to a run of words:
?B?The byte stream is base-64 encoded.
?Q?It is quoted-printable.
VM decodes such strings with decode-coding-string, and encodes the
headers of outgoing messages with encode-coding-string.
When header lines are MIME-decoded from the original character set into the
Emacs internal coding, the original character set is still remembered as a
text property of the strings. The strings in the X-VM-v5-Data header
have these text properties and, when the header is written to the disk,
these strings are converted back into their original MIME encodings.
VM displays messages in a “Presentation buffer” separate from the Folder buffer. This is done in two stages: Preview and Show.
The previewing is done by a function called
vm-present-current-message. It creates a Presentation buffer if it
is not present already, makes a copy of the message text in the Presentation
buffer and carries out any MIME decoding that may be necessary.
And, then, depending on the value of vm-preview-lines, it narrows the
buffer to show a selected portion of the message.
The full message display is done by vm-show-current-message. It does
nothing more than removing the narrowing done by
vm-present-current-message.
Prior to version 8.2.0, it was possible to see plain text messages directly in the Folder buffer. That mode of operation is now obsolete. For uniformity, VM assumes that the Presentation buffer is always used for displaying the message content.
The MIME layout of a message is stored in the mime-layout
field of the Soft data vector of the message. (See MIME layout.) The MIME layout is in general a tree structure of
“MIME parts”. The function vm-decode-mime-layout is
responsible for traversing the tree structure at each MIME part
and displaying it appropriately.
The function vm-decode-mime-layout goes through the following
sequence of decisions:
multipart type, then the subparts are
displayed as needed. If it is a single part, it proceeds as follows.
vm-mime-auto-displayed-content-types
but not listed in the corresponding exceptions.)
vm-mime-internal-content-types but not
listed in the corresponding exceptions.)
vm-mime-external-content-types-alist and it is invoked to
display the MIME part.
MIME parts of type ‘message/external-body’ need special
treatment. If they are not asked to be auto-displayed, then they are
displayed as buttons, but the button caption may use information from the
child part (the actual object that is in the external-body) such as its type
and description. If a message/external-body part is asked to be
auto-displayed, then the child part is fetched from the external source and
stored in an internal buffer. It may be auto-displayed if it is appropriate
to do so, or shown in turn as a button.
MIME buttons are displayed as regions of text displaying button labels. In addition, they have an overlay/extent placed on them, which has a number of properties associated with it:
vm-button.
Always t.
vm-mime-layout.
Gives the layout of the MIME part.
vm-mime-function.
The function that carries out the action represented by pressing the
button.
vm-mime-disposable.
Set to true if the button should be removed when it is replaced by the
MIME object.
face.
Set to the value of vm-mime-button-face.
local-map.
Set to a keymap that includes vm-mime-reader-map, binding the
$ keys.
A MIME message is composed just like a normal message. When objects
are attached using commands like vm-attach-file,
attachment buttons are created in the message composition buffer. An
attachment button is a region of text that looks like:
[Attachment mary.jpeg, image/jpeg]
Various text properties are associated with an attachment button, allowing it to be turned into an actual attachment when the message is sent.
The region of text is given text properties that represent the metadata about the object. Text properties and not an overlay, because only text properties are preserved under killing and yanking, and an attachment button has to survive both.
The following properties are defined for attachment buttons:
vm-mime-object.
The object denoting the MIME attachment. It is either
t indicating that the attachment is another MIME
object in a VM folder.
In the last case, the vm-mime-layout
property describes the rest of the metadata.
vm-mime-type.
A string denoting the MIME type of the object. (Note that it is a
single string, unlike the type component of a MIME layout.)
vm-mime-parameters.
A list of strings denoting the parameters of the MIME type.
vm-mime-description.
A string for the MIME description of the object.
vm-mime-disposition.
A list describing the MIME disposition.
vm-mime-encoded.
A boolean indicating whether the object has MIME headers.
vm-mime-encoding.
The MIME encoding used, if it is already encoded.
vm-mime-forward-local-refs.
Whether or not references to local external-body objects should be
forwarded as is.
fontified.
Standard text property.
front-nonsticky and rear-nonsticky.
Standard stickiness of text properties.
When a composed message is sent, the attachment buttons are replaced
by actual attachment objects. The buttons are first converted into
“fake” overlays before MIME encoding, in a function called
vm-mime-fake-attachment-overlays, so that the next stage has
overlays to work through rather than property runs.
The function vm-mime-encode-composition then encodes the composition
buffer, by selecting each attachment button and replacing it with the
corresponding object. The bodies of ‘external-body’ objects are also
retrieved at this stage. Unless the objects were already
MIME-encoded, they are MIME-encoded and made into
MIME parts by adding suitable headers. The message itself is
given MIME headers describing its content and then handed to Emacs
message-sending functions.
When another message is yanked or “included” in a message composition,
the handling of attachments depends on the variable
vm-include-mime-attachments. If the variable is nil, then
the attachments are displayed as token buttons in plain text that
appear similar to:
[DELETED ATTACHMENT mary.jpg, image/jpeg]
The function vm-decode-mime-layout is employed to
generate the yanked text along with such token buttons.
If vm-include-mime-attachments is t, then first the
vm-decode-mime-layout function is employed to generate proper
MIME buttons for all the attachments. In a second step, the
MIME buttons are replaced by attachment buttons using a function
called vm-mime-convert-to-attachment-buttons. These attachment
buttons are then handled as described above.
A virtual folder is characterized by its definition, which is stored in the
buffer-local variable virtual-folder-definition. The form of the
definition is as given in vm-virtual-folder-alist. See vm-virtual-folder-alist. It is a collection of clauses, with each
clause listing a collection of folders and a collection of virtual
selectors.
Each virtual selector X has a corresponding Lisp function
‘vm-vs-X’, whose purpose is to check whether a given message
matches the selector. The arguments for ‘vm-vs-X’ are a message
data structure m and all the arguments for the virtual selector
X.
For example, the virtual selector author has a string argument,
representing the author name. The corresponding Lisp function is defined
as:
(defun vm-vs-author (m author-name)
(or (string-match author-name (vm-su-full-name m))
(string-match author-name (vm-su-from m))))
The definition checks to see if the given author-name
pattern occurs in the full name of the author (vm-su-full-name) or
the email address of the author (vm-su-from).
The author selector is then registered in four places:
vm-vs-alist, which contains pairs
of the form ‘(SELECTOR . FUNCTION)’. For the author
selector, the pair is (author . vm-vs-author).
author is given a property
vm-virtual-selector-arg-type indicating the type of argument it
requires:
(put 'author 'vm-virtual-selector-arg-type 'string)
vm-vs-interactive, which
contains lists of strings, each string being the name of a virtual
selector. For the author selector, the list is ("author").
Including the selector in this variable allows it to be used in creating
interactive virtual folders (search folders).
author is given a property
vm-virtual-selector-clause indicating the prompt string for
interactive use:
(put 'author 'vm-virtual-selector-clause "with author matching")
Evidently, the last two registrations are only needed for interactive selectors that can be used with the V C command.
An extent was XEmacs’s single object for everything non-textual in a buffer, where Emacs has two: text properties and overlays. VM was written in the early days of that fork and carried both implementations until 2026.
What is left is the naming. vm-misc.el defines vm-make-extent,
vm-extent-property and a dozen others, each of which is now the
overlay function under VM’s own name.
The beginning and end of an overlay are markers, so a buffer holding many of them makes ordinary editing slower: every marker is updated. That cost shows in two places:
Composition buffers are the exception: their attachment buttons are text properties, because a button has to survive being killed and yanked and an overlay does not. See MIME Composition.
VM has been designed as mainly a sequential program. However, there are three timer tasks that get scheduled to occur at regular intervals:
vm-flush-itimer-function ¶Stores any needed message attributes in folder buffers so that they will be
saved when an autosave is done. This is controlled by the variable
vm-flush-interval.
This timer task switches to the folder buffers and inserts text in message headers. So, it moves the point and mark and invalidates any cached positions in the folder buffer.
vm-get-mail-itimer-functionMoves any new mail from maildrops into the folder buffers. This is
controlled by the variable vm-auto-get-new-mail.
This timer task switches to the folder buffers and appends text at the end.
It would extend the vm-message-list variables in these buffers.
It might also do various wholesale modifications such as sorting messages,
modifying the threads database, updating the summary and modeline etc. If
there are POP or IMAP folders, it would execute server commands in the
corresponding process buffers.
vm-check-mail-itimer-functionChecks the maildrops for any new mail. This is controlled by the
variable vm-mail-check-interval.
This timer task does not make any modifications to the folder buffers. However, it executes server command in the process buffers of POP or IMAP folders.
These timer tasks are scheduled with Emacs’s timer package.
The basic synchronization mechanism is a global variable
vm-global-block-new-mail. If set, it prohibits the
vm-get-mail-itimer-function and vm-check-mail-itimer-function
from running. All invocations of get-new-mail and
check-for-new-mail functions set this variable during their activity.
Every VM command and user option, as the code describes it. This appendix is generated from the docstrings when the manual is built, so it says what the code says; the chapters above explain what to do with it.
Each section lists what you can type, then the options that govern it, then what VM invokes for itself: a toolbar button, a menu entry, a mouse binding, a keymap entry or a hook function. The last are here because they can be called, not because a reader normally would, and which ones they are is marked in the code beside each definition.
An entry marked not autoloaded needs VM loaded before M-x will offer it, which for a command that only makes sense inside a folder is no hardship. The mark is worked out when the manual is built, so it says what is so rather than what was so.
Expunge messages with the deleted attribute.
For normal folders this means that the deleted messages are
removed from the message list and the message contents are
removed from the folder buffer.
For virtual folders, messages are removed from the virtual message list. If virtual mirroring is in effect for the virtual folder, the corresponding real messages are also removed from real message lists and the message contents are removed from real folders.
When invoked on marked messages (via vm-next-command-uses-marks),
only messages both marked and deleted are expunged, other messages are
ignored.
NOT-ON-THE-SERVER says these messages are being expunged because the server no longer has them, so their deletion is not queued for it. A synchronise passes it for the messages it found gone; without it the queue collected UIDs that no longer exist there, which is a no-op at best and a NO from some servers (emacs-vm/vm#757).
Delete duplicate messages in the current folder.
This command works by comparing the message ID’s. Messages that
are already deleted are not considered, so VM will never delete the last
copy of a message in a folder. Deleting means flagging for
deletion; you will have to expunge the messages with
vm-expunge-folder to really get rid of them, as usual.
When invoked on marked messages (via vm-next-command-uses-marks),
only duplicate messages among the marked messages are deleted;
unmarked messages are not considered for deletion.
Delete duplicate messages in the current folder.
This command works by computing an MD5 hash for the body of each
non-deleted message in the folder and deleting messages that have
a hash that has already been seen. Messages that are already deleted
are never hashed, so VM will never delete the last copy of a
message in a folder. Deleting means flagging for deletion; you
will have to expunge the messages with vm-expunge-folder to
really get rid of them, as usual.
When invoked on marked messages (via vm-next-command-uses-marks),
only duplicate messages among the marked messages are deleted,
unmarked messages are not hashed or considered for deletion.
Add the deleted attribute to the current message.
The message will be physically deleted from the current folder the next time the current folder is expunged.
With a prefix argument COUNT, the current message and the next COUNT - 1 messages are deleted. A negative argument means the current message and the previous |COUNT| - 1 messages are deleted.
When invoked on marked messages (via vm-next-command-uses-marks),
only marked messages are deleted, other messages are ignored. If
applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread are deleted.
Like vm-delete-message, except the deletion direction is reversed.
Expunge messages with the deleted attribute.
For normal folders this means that the deleted messages are
removed from the message list and the message contents are
removed from the folder buffer.
For virtual folders, messages are removed from the virtual message list. If virtual mirroring is in effect for the virtual folder, the corresponding real messages are also removed from real message lists and the message contents are removed from real folders.
When invoked on marked messages (via vm-next-command-uses-marks),
only messages both marked and deleted are expunged, other messages are
ignored.
NOT-ON-THE-SERVER says these messages are being expunged because the server no longer has them, so their deletion is not queued for it. A synchronise passes it for the messages it found gone; without it the queue collected UIDs that no longer exist there, which is a no-op at best and a NO from some servers (emacs-vm/vm#757).
Delete all messages with the same subject as the current message.
Message subjects are compared after ignoring parts matched by
the variables vm-subject-ignored-prefix and vm-subject-ignored-suffix.
The optional prefix argument ARG specifies the direction to move
if vm-move-after-killing is non-nil. The default direction is
forward. A positive prefix argument means move forward, a
negative argument means move backward, a zero argument means
don’t move at all.
Delete all messages in the thread tree rooted at the current message.
The optional prefix argument ARG specifies the direction to move if vm-move-after-killing is non-nil. The default direction is forward. A positive prefix argument means move forward, a negative argument means move backward, a zero argument means don’t move at all.
Toggle the flagged attribute to the current message, i.e., if it
has not been flagged then it will be flagged and, if it is already
flagged, then it will be unflagged.
With a prefix argument COUNT, the current message and the next COUNT - 1 messages are flagged/unflagged. A negative argument means the current message and the previous |COUNT| - 1 messages are flagged/unflagged.
When invoked on marked messages (via vm-next-command-uses-marks),
only marked messages are flagged/unflagged, other messages are
ignored. If applied to collapsed threads in summary and thread
operations are enabled via vm-enable-thread-operations then all
messages in the thread are flagged/unflagged.
Remove the deleted attribute from the current message.
With a prefix argument COUNT, the current message and the next COUNT - 1 messages are undeleted. A negative argument means the current message and the previous |COUNT| - 1 messages are deleted.
When invoked on marked messages (via vm-next-command-uses-marks),
only marked messages are undeleted, other messages are ignored. If
applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread are undeleted.
Burst the current message (a digest) into its individual messages. The digest’s messages are assimilated into the folder as new mail would be.
Optional argument DIGEST-TYPE is a string that tells VM what kind of digest the current message is. If it is not given the value defaults to the value of vm-digest-burst-type. When called interactively DIGEST-TYPE will be read from the minibuffer.
If invoked on marked messages (via vm-next-command-uses-marks),
all marked messages will be burst. If applied to collapsed
threads in summary and thread operations are enabled via
vm-enable-thread-operations then all messages in the thread are
burst.
Burst the current message (a digest) into a temporary folder.
The digest’s messages are copied to a buffer and vm-mode is
invoked on the buffer. There is no file associated with this
buffer. You can use vm-write-file to save the buffer, or
vm-save-message to save individual messages to a real folder.
Optional argument DIGEST-TYPE is a string that tells VM what kind of digest the current message is. If it is not given the value defaults to the value of vm-digest-burst-type. When called interactively DIGEST-TYPE will be read from the minibuffer.
If invoked on marked messages (via vm-next-command-uses-marks),
all marked messages will be burst. If applied to collapsed
threads in summary and thread operations are enabled via
vm-enable-thread-operations then all messages in the thread are
burst.
Burst a MIME digest
Burst an RFC 1153 style digest
Burst an RFC 934 style digest
Non-nil values means messages from a digest inherit the digest’s labels.
Labels are added to messages with vm-add-message-labels, normally
bound to l a.
Default value: t
Value specifies the default digest type offered by vm-burst-digest
when it asks you what type of digest you want to unpack. Allowed
values of this variable are:
"rfc934" "rfc1153" "mime" "guess"
rfc1153 digests have a preamble, followed by a line of exactly 70 dashes, with digested messages separated by lines of exactly 30 dashes.
rfc934 digests separate messages on any line that begins with a few dashes, but doesn’t require lines with only dashes or lines with a specific number of dashes. In the text of the message, any line beginning with dashes is textually modified to be preceded by a dash and a space to prevent confusion with message separators.
MIME digests use whatever boundary that is specified by the boundary parameter in the Content-Type header of the digest.
If the value is "guess", and you take the default
response when vm-burst-digest queries you, VM will try to guess
the digest type.
Default value: "guess"
Non-nil value means VM will center the preamble lines that precede the start of a digest. How the lines will be centered depends on the ambient value of fill-column. A nil value suppresses centering.
Default value: t
Header to insert into messages burst from a digest.
Value should be a format string of the same type as vm-summary-format
that describes a header to be inserted into each message burst from a
digest. The format string must end with a newline.
A value of nil inserts no such header.
Default value: "X-Digest: %s\n"
String which specifies the format of the preamble lines generated by
vm-send-digest when it is invoked with a prefix argument. One
line will be generated for each message put into the digest. See the
documentation for the variable vm-summary-format for information
on what this string may contain. The format should *not* end
with nor contain a newline.
Default value: "\"%s\" (%F)"
String that specifies the type of digest vm-send-digest will use.
Legal values of this variable are:
"rfc934" "rfc1153" "mime" nil
A nil value means to use plain text digests.
Default value: "mime"
Non-nil value should be a regular expression that tells
which headers should not appear in MIME digests created
by VM. This variable along with vm-mime-digest-headers
determines which headers are kept and which are discarded.
If the value of vm-mime-digest-discard-header-regexp is nil, the headers
matched by vm-mime-digest-headers are the only headers that will be
kept.
If vm-mime-digest-discard-header-regexp is non-nil, then only
headers matched by this variable will be discarded; all others
will be kept. vm-mime-digest-headers determines the order of
appearance in that case, with headers not matching any in the
vm-mime-digest-headers list appearing last in the headers
of the digestified messages.
List of headers that should be appear in MIME digests created by VM. These should be listed in the order you wish them to appear in the messages in the digest. Regular expressions are allowed. There’s no need to anchor patterns with "^", as searches always start at the beginning of a line. Put a colon at the end of patterns to get exact matches. (E.g. "Date" matches "Date" and "Date-Sent".) Header names are always matched case insensitively.
If the value of vm-mime-digest-discard-header-regexp is nil, the headers
matched by vm-mime-digest-headers are the only headers that will be
kept.
If vm-mime-digest-discard-header-regexp is non-nil, then only
headers matched by that variable will be discarded; all others
will be kept. vm-mime-digest-headers determines the order of
appearance in that case, with headers not matching any in the
vm-mime-digest-headers list appearing last in the headers
of the digestified messages.
Default value:
("Resent-" "From:" "Sender:" "To:" "Newsgroups:" "Cc:" "Subject:"
"Date:" "Message-ID:" "Keywords:" "MIME-Version:" "Content-")
Non-nil value should be a regular expression that tells
what headers should not appear in RFC 1153 digests created by VM. This
variable along with vm-rfc1153-digest-headers determines which headers
are kept and which headers are discarded.
If the value of vm-rfc1153-digest-discard-header-regexp is nil, the headers
matched by vm-rfc1153-digest-headers are the only headers that will be
kept.
If vm-rfc1153-digest-discard-header-regexp is non-nil, then only
headers matched by this variable will be discarded; all others
will be kept. vm-rfc1153-digest-headers determines the order of
appearance in that case, with headers not matching any in the
vm-rfc1153-digest-headers list appearing last in the headers of
the digestified messages.
Default value: "\\(X400-\\)?Received:"
List of headers that should be appear in RFC 1153 digests created by VM. These should be listed in the order you wish them to appear in the digest. Regular expressions are allowed. There is no need to anchor patterns with "^", as searches always start at the beginning of a line. Put a colon at the end of patterns to get exact matches. (E.g. "Date" matches "Date" and "Date-Sent".) Header names are always matched case insensitively.
If the value of vm-rfc1153-digest-discard-header-regexp is nil, the headers
matched by vm-rfc1153-digest-headers are the only headers that will be
kept.
If vm-rfc1153-digest-discard-header-regexp is non-nil, then only
headers matched by that variable will be discarded; all others
will be kept. vm-rfc1153-digest-headers determines the order of
appearance in that case, with headers not matching any in the
vm-rfc1153-digest-headers list appearing last in the headers of
the digestified messages.
Default value:
("Resent-" "Date:" "From:" "Sender:" "To:" "Newsgroups:" "Cc:"
"Subject:" "Message-ID:" "Keywords:")
Non-nil value should be a regular expression that tells
what headers should not appear in RFC 934 digests created by VM. This
variable along with vm-rfc934-digest-headers determines which headers
are kept and which are discarded.
If the value of vm-rfc934-digest-discard-header-regexp is nil, the headers
matched by vm-rfc934-digest-headers are the only headers that will be
kept.
If vm-rfc934-digest-discard-header-regexp is non-nil, then only
headers matched by this variable will be discarded; all others
will be kept. vm-rfc934-digest-headers determines the order of
appearance in that case, with headers not matching any in the
vm-rfc934-digest-headers list appearing last in the headers
of the digestified messages.
List of headers that should be appear in RFC 934 digests created by VM. These should be listed in the order you wish them to appear in the digest. Regular expressions are allowed. There’s no need to anchor patterns with "^", as searches always start at the beginning of a line. Put a colon at the end of patterns to get exact matches. (E.g. "Date" matches "Date" and "Date-Sent".) Header names are always matched case insensitively.
If the value of vm-rfc934-digest-discard-header-regexp is nil, the headers
matched by vm-rfc934-digest-headers are the only headers that will be
kept.
If vm-rfc934-digest-discard-header-regexp is non-nil, then only
headers matched by that variable will be discarded; all others
will be kept. vm-rfc934-digest-headers determines the order of
appearance in that case, with headers not matching any in the
vm-rfc934-digest-headers list appearing last in the headers
of the digestified messages.
Default value:
("Resent-" "From:" "Sender:" "To:" "Newsgroups:" "Cc:" "Subject:"
"Date:" "Message-ID:" "Keywords:")
Attach the file at point in the dired buffer to a VM composition buffer as a mime attachment.
The file is not inserted into the buffer and MIME encoded until
you execute vm-mail-send or vm-mail-send-and-exit. A visible tag
indicating the existence of the object is placed in the
composition buffer. You can move the object around or remove
it entirely with normal text editing commands. If you remove the
object tag, the object will not be sent.
First argument COMPOSITION is the buffer into which the object will be inserted. When this function is called interactively COMPOSITION’s name will be read from the minibuffer.
Attach all marked files in the dired buffer to a VM composition buffer as mime attachments.
The files are not inserted into the buffer and MIME encoded until
you execute vm-mail-send or vm-mail-send-and-exit. For each
file, a visible tag indicating the existence of the object is
placed in the composition buffer. You can move the objects around
or remove them entirely with normal text editing commands. If you
remove an object tag, the object will not be sent.
First argument COMPOSITION is the buffer into which the objects will be inserted. When this function is called interactively COMPOSITION’s name will be read from the minibuffer.
Non-nil value should be an alist that VM will use to choose a default folder name when messages are saved. The alist should be of the form ((HEADER-NAME-REGEXP
(REGEXP . FOLDER) ... ) ...)
where HEADER-NAME-REGEXP and REGEXP are strings, and FOLDER is a string or an s-expression that evaluates to a string.
HEADER-NAME-REGEXP matches header names rather than being one, so "To\|Cc" is a way of looking at both: the contents of every header whose name it matches are joined with a comma and a space. If any part of that is matched by the regular expression REGEXP, VM will evaluate the corresponding FOLDER and use the result as the default folder for saving the message.
If the resulting folder name is a relative pathname, then it will
be rooted in the directory named by vm-folder-directory, or the
default-directory of the currently visited folder if
vm-folder-directory is nil. If the resulting folder name is an IMAP
maildrop specification, then the corresponding IMAP folder is used for
saving.
When FOLDER is evaluated, the current buffer will contain only the contents of the header matched by HEADER-NAME-REGEXP. It is safe to modify this buffer. You can use the match data from any \( ... \) grouping constructs in REGEXP along with the function buffer-substring to build a folder name based on the header information. If the result of evaluating FOLDER is a list, then the list will be treated as another auto-folder-alist and will be descended recursively.
Whether REGEXP is matched case sensitively depends on the value
of the variable vm-auto-folder-case-fold-search. Header names
are always matched case insensitively.
Non-nil value means VM will ignore case when matching header
contents while doing automatic folder selection via the variable
vm-auto-folder-alist.
Default value: t
Non-nil value causes VM to ask for confirmation when
vm-auto-archive-messages is invoked.
Default value: t
Non-nil value causes VM to automatically mark messages for deletion
after successfully auto-archiving them with the vm-auto-archive-messages
command.
Non-nil value causes VM automatically to mark a message for deletion
after it has been successfully burst by the vm-burst-digest command.
Non-nil value causes VM automatically to mark messages for deletion after successfully saving them to a folder.
Major mode to use when editing messages in VM.
Default value: text-mode
Non-nil value causes VM to expunge deleted messages before saving a folder.
Non-nil value means that VM will suggest folders for saving
messages automatically using the setting of vm-auto-folder-alist.
Default value: t
Value determines whether VM will visit folders when saving messages.
Visiting means that VM will read the folder into Emacs and append the
message to the buffer instead of appending to the folder file directly.
This behavior is ideal when folders are encrypted or compressed since
appending plaintext directly to such folders is a ghastly mistake.
A value of t means VM will always visit folders when saving.
A nil value means VM will never visit folders before saving to them, and VM will generate an error if you attempt to save messages to a folder that is being visited. The latter restriction is necessary to insure that the buffer and disk copies of the folder being visited remain consistent.
A value other than nil or t means that VM will save to the folder buffer if it is visited or to the file otherwise.
Default value: not-always
Discard cached information about the current message. When VM gathers information from the headers of a message, it stores it internally for future reference. This command causes VM to forget this information, and VM will be forced to search the headers of the message again for these data. VM will also have to decide again which headers should be displayed and which should not. Therefore this command is useful if you change the value of vm-visible-headers or vm-invisible-header-regexp in the midst of a VM session.
Numeric prefix argument N means to discard data from the current message plus the next N-1 messages. A negative N means discard data from the current message and the previous N-1 messages.
When invoked on marked messages (via vm-next-command-uses-marks),
data is discarded only from the marked messages in the current folder.
If applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread have their cached data discarded.
Edit the current message. Prefix arg means mark as unedited instead. If editing, the current message is copied into a temporary buffer, and this buffer is selected for editing. The major mode of this buffer is controlled by the variable vm-edit-message-mode. The hooks specified in vm-edit-message-hook are run just prior to returning control to the user for editing.
Use C-c ESC when you have finished editing the message. The message will be inserted into its folder replacing the old version of the message. If you don’t want your edited version of the message to replace the original, use C-c C-] and the edit will be aborted.
Abort the edit of a message, forgetting changes to the message.
End the edit of a message and copy the result to its folder.
Like vm-edit-message, but run in a newly created frame.
Ask whether to sign or encrypt outgoing messages with PGP/MIME.
Add to vm-mail-send-hook to be asked each time you send a message.
vm-epg-ask-function controls what is asked: by default
vm-epg-prompt-for-action offers a choice of actions, but it can also name
a single action to confirm, or your own function.
This hook must be last in vm-mail-send-hook, and signals an error if it is
not: signing covers the message as it stands, so a later hook that modified
the message would invalidate the signature. Add it with the APPEND argument
to add-hook:
(add-hook ’vm-mail-send-hook #’vm-epg-ask-hook t)
Attach a public key to the composition as an application/pgp-keys part.
The key exported is the author’s, taken from the headers listed in
vm-epg-get-author-headers. When that yields no address, or the variable
is nil, prompt for a user ID – so any key in your keyring can be sent, not
only your own.
Decrypt the inline PGP message in the current message.
Replace the ASCII armor in a presentation copy with the plaintext, leaving
the folder unmodified, and report the outcome in the modeline. A decryption
failure inserts the error text instead, faced with vm-epg-error.
If the plaintext is itself an inline signed message, verify it as well with
vm-epg-cleartext-verify.
Refuses to run on a read-only folder even though only the presentation copy
is written, unlike vm-epg-cleartext-verify, which does not check.
Encrypt the composition body in place as inline PGP ASCII armor. With a prefix argument, SIGN non-nil, sign it as well.
This replaces the body with the armor rather than building a MIME structure
around it, so it cannot cover attachments; prefer vm-epg-encrypt, which
produces PGP/MIME. Also used internally by vm-epg-encrypt to armor the
body it then wraps.
Every recipient must have a usable encryption key: with no recipient key
this signals an error rather than falling back to symmetric (passphrase)
encryption, which is never what is wanted for mail. As with
vm-epg-encrypt, your own key is not added; an encrypt-to line in gpg.conf
is what adds it.
Sign the composition body in place as inline PGP ASCII armor.
This uses the OpenPGP cleartext signature framework, which leaves the text
readable and appends the signature to the body, rather than building a
multipart/signed MIME structure around it. It therefore cannot cover
attachments; prefer vm-epg-sign, which produces PGP/MIME.
Verify the inline PGP signature in the current message. Replace the ASCII armor in a presentation copy of the message with a description of the signature, faced according to whether it verified, and report the outcome in the modeline. The folder itself is not modified.
If the signing key is not in your keyring and vm-epg-fetch-missing-keys
is non-nil, try to fetch it from a keyserver first.
Minor mode for composing PGP/MIME messages with EPG.
Toggle the mode when ARG is nil, enable it when ARG is a positive number and disable it otherwise. Enabling makes the bindings below and the PGP/MIME menu available in the composition buffer.
Key Binding ------------------------------------------------------------------------------- C-c # C-e vm-epg-cleartext-encrypt C-c # C-s vm-epg-cleartext-sign C-c # E vm-epg-sign-and-encrypt C-c # a vm-epg-ask-hook C-c # e vm-epg-encrypt C-c # k vm-epg-attach-public-key C-c # s vm-epg-sign
Encrypt the composition as PGP/MIME, a multipart/encrypted message.
With a prefix argument, SIGN non-nil, sign it as well, which is what
vm-epg-sign-and-encrypt does.
Every recipient address found in the headers listed in
vm-epg-get-recipients-headers must have a usable encryption key in your
keyring; otherwise this signals an error and leaves the composition
untouched. Note that the message is never encrypted to a passphrase: if no
recipient key can be found, it refuses rather than falling back to symmetric
encryption.
Encryption is to those recipients and to nobody else, so a copy filed with FCC: is one you cannot read back. To encrypt to yourself as well, put a line reading encrypt-to followed by your key id in ~/.gnupg/gpg.conf. VM passes GnuPG no –no-encrypt-to, so that setting is honoured.
Insert a public key as ASCII armor into the composition at point.
The key is selected as for vm-epg-attach-public-key, but is inserted
inline rather than attached as a MIME part.
Sign the composition with PGP/MIME, as a multipart/signed message.
RFC 3156 forbids 8bit content transfer encoding in signed messages, and lines beginning with "From " must be armored, because a mail gateway that re-encodes either one would invalidate the signature.
If the composition is not yet MIME-encoded, this encodes it in a
signature-safe way, using vm-epg-sign-text-transfer-encoding in place of
vm-mime-8bit-text-transfer-encoding and forcing
vm-mime-composition-armor-from-lines on; your normal settings for those
two variables therefore do not matter here.
If the composition has *already* been MIME-encoded – for instance because
you encoded it yourself with vm-mime-encode-composition – this cannot
re-encode it safely, so it checks for the two hazards above and refuses to
sign rather than produce a signature that breaks in transit.
Sign and encrypt the composition as PGP/MIME.
Equivalent to vm-epg-encrypt with a prefix argument.
Import into your keyring the public keys in the body of the current message.
This treats the whole message body as key material, so it is meant for
messages that are an inline PGP public key block. Keys arriving as an
application/pgp-keys MIME part are handled by
vm-mime-display-internal-application/pgp-keys instead.
What vm-epg-ask-hook should do before sending a message.
The value is either an action symbol or a function:
nil do nothing;
‘sign’ ask whether to sign;
‘encrypt’ ask whether to encrypt;
‘sign-and-encrypt’ ask whether to sign and encrypt;
a function called with no arguments, returning one of the action
symbols above, or nil for no action.
An action symbol ACTION selects the command vm-epg-ACTION, so any value
other than those listed must name an existing vm-epg- command.
Default value: vm-epg-prompt-for-action
If non-nil, decrypt encrypted messages automatically when displaying them. When nil, a button is shown instead and decryption happens only when you activate it.
Default value: t
If non-nil, snarf public keys automatically. Snarfing means importing the public keys found in a message into your GnuPG keyring. When nil, a button is shown instead and keys are imported only when you activate it.
Default value: t
Number of bytes to search into the message for a PGP clear text armor.
Default value: 4096
If non-nil, fetch missing keys from a keyserver when verifying signatures. When a signature was made by a key that is not in your keyring, contact the keyserver configured for GnuPG to retrieve it and then verify again. This makes displaying a signed message reach out to the network.
Default value: t
The list of headers used to identify the author of an outgoing message. The first address found in these headers is used to select the signing key. If nil, the default EPG signing key is used.
Default value: ("From:" "Sender:")
The list of headers used to identify the recipients of an outgoing message. Every address found in these headers must have a usable encryption key, or encryption fails.
Default value: ("To:" "CC:" "BCC:")
The content transfer encoding used for signed MIME parts of type text.
RFC 3156 forbids 8bit encoding in signed messages, because a gateway that
re-encodes the body would invalidate the signature. vm-epg-sign
therefore binds vm-mime-8bit-text-transfer-encoding to this value while
it encodes the composition, overriding your normal setting for the duration
of the signing operation.
Both choices are signature-safe; quoted-printable keeps mostly-ASCII text
readable to humans and to non-MIME tools, while base64 is more compact for
text that is largely non-ASCII.
Default value: quoted-printable
These are invoked by a toolbar button, a menu entry, a mouse binding, a keymap entry or a hook rather than typed by name. Nothing stops you calling one.
Prompt for a PGP action and return it.
The choices come from vm-epg-prompt-action-alist; RET repeats the previous
choice, and q aborts sending with an error.
Not autoloaded: VM has to be loaded before M-x offers this one.
Non-nil value should be a list of contexts in which VM may use message bodies stored externally. External messages are those stored in external sources such as the file system or remote mail servers. In some cases, VM is able to work with minimal header information of the messages, without loading the entire message bodies into the folder buffers.
This allows faster start-up times and smaller memory images of Emacs sessions, at the cost of short delays when messages are viewed.
As of version 8.2.0, this facility is only available for IMAP
folders (context name imap). Messages larger than
vm-imap-max-message-size are treated as external messages.
Non-nil value indicates that external message bodies should be
automatically fetched for message presentation. If it is nil, then
messages will be presented with only the headers and vm-load-message
must be used to load the externally stored message bodies.
Default value: t
Should be an integer representing the maximum number of messages that VM should keep in the Folder buffer when the messages are fetched on demand, or nil to signify no limit.
Default value: 10
Face used for text in buttons that trigger the display of MIME objects.
Default value: vm-attachment-button
Face used for text in MIME buttons when mouse is hovering.
Default value: vm-attachment-button-mouse
Faces for quoted text, one per level of quoting. The first is for text quoted once, the second for text quoted twice, and so on. Text quoted deeper than there are faces here wears the last of them, so a list of one face colours every level alike and a list of none turns citation colouring off while leaving the signature face alone.
Default value:
(vm-citation-1 vm-citation-2 vm-citation-3 vm-citation-4 vm-citation-5)
Non-nil colours quoted text and the signature in a message body.
Quoted text wears the faces of vm-citation-faces, one per level, and the
signature wears vm-signature-face. Headers are a separate matter, decided
by vm-highlighted-header-regexp.
Set this in the init file. Off by default because it changes how every message looks. In earlier releases the same colouring came from the bundled u-vm-color add-on, which had to be wired up by hand and is gone (emacs-vm/vm#811).
Non-nil value should be a face to use display URLs found in messages. Nil means don’t highlight URLs.
Default value: vm-highlight-url
Face to be used to highlight headers.
The headers to highlight are specified by the vm-highlighted-header-regexp
variable.
Default value: vm-highlighted-header
Face used for text in buttons that trigger the display of MIME objects.
Default value: vm-mime-button
Face used for text in MIME buttons when mouse is hovering.
Default value: vm-mime-button-mouse
Face for the signature at the end of a message body. The signature is what follows a line of exactly "– ", the separator RFC 3676 describes, which is what mail readers write. Nil colours it not at all.
Default value: vm-signature
A non-NIL value enables the use of faces in the summary buffer.
You should set this variable in the init-file. For interactive use,
the command vm-summary-faces-mode should be used.
Face to use to highlight the summary entry for the current message. Nil means don’t highlight the current message’s summary entry.
Default value: vm-summary-highlight
Keep a copy of this folder as it is on disk.
Emacs backs a file up on the first save of its buffer and not again, so a
folder saved earlier in this session has no copy of what is on disk now.
This makes one whatever make-backup-files says.
The copy is named as Emacs would name a backup: backup-directory-alist
decides where it goes and the numbered-backup settings how many are kept, so
it lands where your other backups are.
It copies the file and not the buffer, so changes you have not saved are not in it. Save the folder first to keep those.
Run it from anywhere in a folder, the summary included. backup-buffer
does nothing in a summary or presentation buffer, those visiting no file,
which is what makes a command of VM’s own worth having.
Change folder type to TYPE.
The old name From_-with-Content-Length is accepted for mboxcl2.
TYPE may be one of the following symbol values:
From_
mboxcl2
BellFrom_
mmdf
babyl
Interactively TYPE will be read from the minibuffer.
With a prefix argument, or with FILE given, convert a folder on disk that VM
is not visiting. That is how to repair a folder VM will not read – see
vm-change-folder-type-of-file.
With two prefix arguments, or with OUTPUT given, the converted folder is written to a file of your naming and the one converted is left as it was. OUTPUT wants FILE: to convert the folder you are in into a new file, save it and convert that. A name that cannot hold TYPE is refused rather than written, here and on disk both – a folder called out.mbox cannot hold mboxcl2 (emacs-vm/vm#763).
The folder’s current type is offered as well as the others: converting a
folder to what it already is rewrites every message in it, which for mboxcl2
recomputes every Content-Length. That is the repair for a folder whose
lengths are wrong – and a wrong length is not a missing one, so such a folder
opens without complaint and the reader quietly falls back on searching for the
next separator.
Without FILE the folder in the current buffer is converted, and a buffer whose visit failed partway is refused: it holds only the messages read before the error, and the on-disk conversion is what such a folder wants.
Report this folder’s type and check that it is sound, writing nothing.
With a prefix argument, or with FILE given, check a folder on disk that VM is
not visiting – see vm-check-folder-of-file. That is how to check a folder
VM will not read, which is the folder most likely to want it.
Says what type the folder is, what its name says it is, what its contents say
and what the default is, how many messages it holds against how many the
reader finds by walking the separators, and for an mboxcl2 folder whether every
message’s Content-Length matches its body.
What the contents say is counted over every message, and the name is not consulted for it: the reader takes the type from the name, so a folder carrying a length on every message under a name that does not say mboxcl2 is read as From_ and split wherever a body line begins "From ". Nothing else tells the reader that, and it is the question the warning at visit time leaves open.
A wrong length is the fault this is for, because it is the one that gives no other sign. A missing one is refused when the folder is visited, but a length that is merely wrong opens without complaint: the reader falls back on searching for the next separator when the count does not land on one, so VM reads the folder correctly while anything that believes the header – which is what the format is for – takes the wrong bytes.
A POP or IMAP cache whose name states no type is reported too, and
vm-convert-caches-to-mboxcl2 named as what converts it. Nothing in such a
cache is wrong, so this is the one place a reader is told: it is read as From_,
where a message whose body holds a line beginning "From " can split in two.
Nothing is written. vm-change-folder-type is the repair: converting a
folder to the type it already is recomputes every length.
Convert every POP and IMAP cache whose name does not state its type.
A cache VM creates now is named for its type and written as mboxcl2, where the
end of a message is a byte count rather than a line that has to be recognised.
A cache from before that has no such name and is read as From_, so a message
whose body holds a line beginning "From " can still split it in two. This
converts each of those and renames it, which is vm-change-folder-type-of-file
once per cache: the previous contents are kept in a backup file, and a cache
that is already mboxcl2 in all but its name is only renamed.
It asks once before starting, and then once per cache about deleting the copy left under the old name – that one is a file on disk and a decision of its own, so it is asked rather than assumed either way. With a prefix argument it asks about each cache before converting it as well.
A cache being visited cannot be converted and is reported; quit that folder
with vm-quit and run this again. Nothing is refetched, and a cache that
cannot be read is left exactly as it was. Where anything could not be
converted the faults are listed in a buffer, since a run of them in the echo
area cannot be read.
The caches are looked for where their names are built, which is
vm-imap-folder-cache-directory, vm-pop-folder-cache-directory,
vm-folder-directory and the home directory.
Show the line vm-totals-blurb answers, and answer with it.
Say which file holds the local cache of this POP or IMAP folder.
Answers nil for a folder that is a file in the first place. BUFFER is the folder to ask about, the current one by default – and a summary or presentation buffer counts as its folder, since that is where the reader is when the question occurs to them. In a virtual folder the answer is about the folder the message being looked at really lives in.
A cache file is named after the MD5 of the maildrop, so it can be neither read nor typed by hand.
Return the current folder’s name (local file name, or POP/IMAP maildrop string).
Move any new mail that has arrived in any of the spool files for the current folder into the folder. New mail is appended to the disk and buffer copies of the folder.
Prefix arg means to gather mail from a user specified folder, instead of the usual spool files. The file name will be read from the minibuffer. Unlike when getting mail from a spool file, the source file is left undisturbed after its messages have been copied.
Two prefix args (C-u C-u) mean to fetch everything an IMAP mailbox
has and this folder has not, including the messages vm-imap-retrieved-messages
records as fetched once already. That record is what stops a message deleted
here on purpose from coming back, so this is not the way to read mail day to
day; it is how to refill a folder whose cache lost messages the record still
names. It gathers from no other folder, and other access methods ignore it.
When applied to a virtual folder, this command runs itself on each of the underlying real folders associated with this virtual folder. A prefix argument has no effect when this command is applied to virtual folder; mail is always gathered from the spool files.
Display help for various VM activities.
Load the message by retrieving its body from its permanent location. Currently this facility is only available for IMAP folders.
With a prefix argument COUNT, the current message and the next COUNT - 1 messages are loaded. A negative argument means the current message and the previous |COUNT| - 1 messages are loaded.
When invoked on marked messages (via vm-next-command-uses-marks),
only marked messages are loaded, other messages are ignored. If
applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread are loaded.
Mark the current message as read, i.e., set the unread and new
attributes to nil. If the message is already marked as read, then
it is left unchanged.
Numeric prefix argument N means to unread the current message plus the next N-1 messages. A negative N means mark the current message and the previous N-1 messages as read.
When invoked on marked messages (via vm-next-command-uses-marks),
all marked messages are affected, other messages are ignored. If
applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread are affected.
Mark the current message as unread. If the message is already new or unread, then it is left unchanged.
Numeric prefix argument N means to mark the current message plus the next N-1 messages as unread. A negative N means mark the current message and the previous N-1 messages as unread.
When invoked on marked messages (via vm-next-command-uses-marks),
all marked messages are affected, other messages are ignored. If
applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread are affected.
Quit visiting the current folder, saving changes. If the folder is
being visited read-only then changes are not saved. This behavior
can be customized using vm-preserve-read-only-folders-on-disk.
If the customization variable vm-expunge-before-quit is set to
non-nil value then deleted messages are expunged.
Giving a prefix argument overrides the variable and no expunge is done.
When called internally, the optional argument NO-EXPUNGE says
that the deleted messages should not be expunged (irrespective of
the value of vm-expunge-before-quit. NO-CHANGE says that
changes should be discarded.
Bury the current VM folder and its auxiliary buffers. The folder is not altered and Emacs is still visiting it. You can switch back to it with switch-to-buffer or by using the Buffer Menu.
Iconify the frame and bury the current VM folder and summary buffers. The folder is not altered and Emacs is still visiting it.
Quit visiting the current folder and discard any changes made to the folder.
Quit visiting the current folder without expunging deleted messages.
The setting of vm-expunge-before-quit is ignored.
Recover the autosave file for the current folder. Same as M-x vm-recover-folder.
Recover the autosave file for the current folder. Same as M-x vm-recover-folder.
Reload the message body from its permanent location. Currently this facility is only available for IMAP folders.
Revert the current folder to its version on the disk. The summary and presentation buffers are killed, the file is read again, and the folder is visited afresh with the access method it had, so an IMAP or POP folder comes back connected rather than as a plain file.
Also available as vm-revert-folder.
Revert the current folder to its version on the disk. The summary and presentation buffers are killed, the file is read again, and the folder is visited afresh with the access method it had, so an IMAP or POP folder comes back connected rather than as a plain file.
Also available as vm-revert-folder.
Expunge folder, then save it to disk.
Prefix arg is handled the same as for the command save-buffer.
Expunge won’t be done if folder is read-only.
When applied to a virtual folder, this command works as if you had
run vm-expunge-folder followed by vm-save-folder.
Not documented.
Save current folder to disk.
Prefix arg is handled the same as for the command save-buffer.
If the customization variable vm-expunge-before-save is set to
non-nil value then deleted messages are expunged.
When applied to a virtual folder, this command runs itself on each of the underlying real folders associated with the virtual folder.
Save current folder to disk.
Prefix arg is handled the same as for the command save-buffer.
Deleted messages are _not_ expunged irrespective of the variable
vm-expunge-before-save.
When applied to a virtual folder, this command runs itself on each of the underlying real folders associated with the virtual folder.
If the current VM folder is read-only, make it modifiable.
This command can also be used to make a modifiable folder read-only. However it is unsafe to do so because any previous modifications will be discarded when the folder is quit. You should first save the current changes of the folder before making it read-only.
Unload the message body, i.e., delete it from the folder buffer. It can be retrieved again in future from its permanent external location. Currently this facility is only available for IMAP folders.
With a prefix argument COUNT, the current message and the next COUNT - 1 messages are unloaded. A negative argument means the current message and the previous |COUNT| - 1 messages are unloaded.
When invoked on marked messages (via vm-next-command-uses-marks), only
marked messages are unloaded, other messages are ignored. If
applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in
the thread are unloaded.
If the optional argument PHYSICAL is non-nil, then the message is physically discarded. Otherwise, the discarding may be delayed until the folder is saved.
Mark the current message as unread. If the message is already new or unread, then it is left unchanged.
Numeric prefix argument N means to mark the current message plus the next N-1 messages as unread. A negative N means mark the current message and the previous N-1 messages as unread.
When invoked on marked messages (via vm-next-command-uses-marks),
all marked messages are affected, other messages are ignored. If
applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread are affected.
Write this folder to a file of another name, as write-file does.
Three things write-file does not do. The file is created with
vm-default-folder-permission-bits, so a folder does not become
world-readable through being written somewhere new. The message totals
are stored against the new name for the folders summary, so it does not
have to open the folder to know them. And the summary and presentation
buffers are renamed to follow the folder.
Refuses on a virtual folder, which has no file of its own.
Non-nil value causes VM to automatically move mail from spool files
to a mail folder when the folder is first visited. Nil means
you must always use vm-get-new-mail to pull in newly arrived messages.
If the value is a number, then it specifies how often (in seconds) VM should check for new mail and try to retrieve it. This is done asynchronously using a timer task and may occur while you are editing other files. It should not disturb your editing, except perhaps for a pause while the check is being done.
Default value: t
Non-nil means to read and write BSD Mail(1) style Status: headers. This makes sense if you plan to use VM to read mail archives created by Mail.
Non-nil value causes VM to check folder and message types for compatibility before it performs certain operations.
Before saving a message to a folder, VM will check that the destination folder is of the same type as the message to be saved.
Before incorporating message into a visited folder, VM will check that the messages are of the same type as that folder.
A nil value means don’t do the checks.
If non-nil, VM will either convert the messages to the appropriate
type before saving or incorporating them, or it will signal an
error. The value of vm-convert-folder-types determines which
action VM will take.
Default value: t
Non-nil value causes interactive calls to vm-save-message
to ask for confirmation before creating a new folder.
Non-nil value means that when VM checks folder types and finds
a mismatch (see vm-check-folder-types), it will convert the
source messages to the type of the destination folder, if it can.
If vm-check-folder-types is nil, then this variable isn’t
consulted.
Default value: t
File in which to store mail temporarily while it is transferred from the system mailbox to the primary inbox. If a crash occurs during this mail transfer, any missing mail will be found in this file. VM will do crash recovery from this file automatically at startup, as necessary.
If the variable is to nil, a crash box name is created by appending
vm-primary-inbox and vm-crash-box-suffix.
String suffix used to create possible crash box file names for folders.
When VM uses vm-spool-file-suffixes to create a spool file name,
it will append the value of vm-crash-box-suffix to the folder’s
file name to create a crash box name.
Default value: ".crash"
Value must be a symbol that tells VM which From-style folder type is used by your local mail delivery system. Valid values are
From_
BellFrom_
Messages in From_ folders are separated by the two newlines followed by the string "From" and a space. Messages in BellFrom_ folders are only required to have a single newline before the "From" string.
Since BellFrom_ and From_ folders cannot be reliably distinguished
from each other, you must tell VM which one your system uses by
setting the variable vm-default-From_-folder-type to either From_
or BellFrom_.
Default value: From_
Default UNIX permission bits for newly created folders.
Default value: 384
Default folder type for empty folders. If VM has to add messages that have no specific folder type to an empty folder, the folder will become this default type.
It decides a folder VM creates, and nothing else: an existing folder is read
as what its name says, per vm-folder-type-by-extension-alist, or, where the
name says nothing, as what VM can work out from its contents. So changing
this cannot change how a folder you already have is read.
Set to mboxcl2 it decides the name as well: a folder VM creates is created as
NAME.mboxcl2. A folder’s type is read back from its name, so mboxcl2 written
under a name that says nothing would be read as From_ next time and split
wherever a body line begins "From ". See vm-new-folder-file-name.
It was mboxcl2 on Solaris, AIX and System V and mmdf on SCO until 2026: a guess about what the local delivery agent writes, made when VM could not be told. Say what you want in the name of the folder, or here.
Allowed types are:
From_ mboxcl2 mmdf babyl
mboxcl2 was called From_-with-Content-Length until 2026 and is still
accepted under that name.
BellFrom_ is not among them, and has not been offered since 2026. VM reads
one it is handed, and creates none: that format is From_ without the blank
line between messages, so it has no signature of its own, and a folder VM
wrote as one is read back as From_ with its messages run together. Setting
it here still works and still has that result, so VM says so as it starts.
Issue #787. It is the one mbox variant that stores a message
exactly as it arrived, and so the one to choose for a folder kept as a
record.
Value must be a symbol, not a string. i.e. write
(setq vm-default-folder-type ’From_)
in your .emacs or .vm file.
If you set this variable’s value to mboxcl2 you
must set vm-trust-content-length non-nil.
Default value: From_
Value must be a symbol that specifies the line ending convention to use for new folders. Text files under UNIXish and Windows systems use different characters to indicate the end of a line. UNIXish systems use a single linefeed character, Windows uses a carriage return followed by a line feed. The value of this variable tells VM which to use.
nil means use the line ending convention of the local system;
CRLF if you’re on a Windows system, LF for UNIXish systems.
crlf means use CRLF.
lf mean use LF.
cr means use CR (old Macs use this).
Non-nil value means remove empty (zero length) folders after saving. A value of t means always remove the folders. A value of nil means never remove empty folders. A value that’s not t or nil means ask before removing empty folders.
Default value: t
Non-nil value specifies how often VM flushes its cached internal data using a timer task. A numeric value gives the number of seconds between flushes. A value of t means flush every time there is a change. Nil means don’t do flushing until a message or folder is saved.
Normally when a message attribute is changed. VM keeps the record of the change in its internal memory and doesn’t insert the changed data into the folder buffer until a particular message or the whole folder is saved to disk. This makes normal Emacs auto-saving useless for VM folder buffers because the information you’d want to auto-save, i.e. the attribute changes are not in the buffer when it is auto-saved.
Setting vm-flush-interval to a numeric value will cause the VM’s
internal memory caches to be periodically flushed to the folder
buffer. This is done non-obtrusively, so that if you type
something while flushing is occurring, the flush will abort
cleanly and Emacs will respond to your keystrokes as usual.
Default value: 90
Directory where folders of mail are kept.
Value that file-precious-flag should have in visited folders.
A non-nil value causes folders to be saved by writing to a
temporary file and then replacing the folder with that file. A
nil value causes folders to be saved by writing directly to the
folder without the use of a temporary file.
The default protects a folder against a crash part way through a save, which would otherwise leave it truncated. It has one cost: replacing the folder replaces its name, so a folder that is a *hard link* is left with the other names pointing at the old contents – see issue #532. Nothing can preserve a hard link and replace a file atomically at the same time, so set this to nil for folders kept as hard links, accepting the weaker guarantee against an interrupted save.
Symbolic links are not affected; VM keeps those either way.
Default value: t
Alist of (EXTENSION . TYPE): the folder type a folder’s name asks for.
EXTENSION is matched literally against the file name’s extension, without
the dot, and TYPE is one of the types vm-default-folder-type accepts.
This is consulted where a folder cannot say for itself what it is:
- a folder that does not exist yet, or is empty, is created in the type
its name asks for rather than in ‘vm-default-folder-type’;
- a From_ folder is read as the type its name gives. From_ and mboxcl2
are the same folder but for the ‘Content-Length’ header, so looking
like one is no evidence: a folder named mboxcl2 is mboxcl2, and a
message in it that has no length is then something the reader
complains about -- which is the use of saying so in the name.
What a folder’s own contents say is never overridden where they settle the question: a name ending .mboxcl2 does not make VM read a BABYL file as one.
.mbox is From_, which is what the rest of the world means by an mbox file.
From_ is also the type a folder has when its name says nothing about it, so it
is the one type an extension names without being the name that type is written
under: a folder called sent.mbox keeps that name when converted to From_, and
one called INBOX is not renamed INBOX.mbox by the same conversion. See
vm-folder-type-with-no-name-of-its-own.
Not .mboxcl: VM has no mboxcl type, and mboxcl quotes "From " lines in bodies where mboxcl2 does not, so reading one as the other would misread exactly those bodies.
An extension and not a pattern over the name. A pattern can be written so
that it matches nothing, silently, and it can be written so that it claims
every folder in a directory – and a directory of nine From_ folders claimed
as mboxcl2 is nine folders VM then refuses to read. The cost is that a
folder which cannot be renamed cannot be typed by its name; that is what
vm-default-folder-type is for.
Set it to nil to have names mean nothing, which is what VM did before.
Default value: (("mboxcl2" . mboxcl2) ("mbox" . From_))
List of IMAP mailboxes and values specifying whether messages should be automatically deleted from the mailbox after retrieval. The format of the list is
((MAILBOX . VAL) (MAILBOX . VAL) ...)
MAILBOX should be an IMAP mailbox specification as described in
the documentation for the variable vm-spool-files. If you have
the IMAP password specified in the vm-spool-files entry, you do
not have to specify it here as well. Use * instead; VM will
still understand that this mailbox is the same as the one in
vm-spool-files that contains the password.
VAL should be nil if retrieved messages should be left in the corresponding IMAP mailbox, t if retrieved messages should be deleted from the mailbox immediately after retrieval.
Non-nil value means that, when an IMAP mailbox is used as a
spool file, messages should be deleted after retrieving them. A
nil value means messages will be left in the IMAP mailbox until
you run vm-expunge-imap-messages.
This variable only affects IMAP mailboxes not listed in
vm-imap-auto-expunge-alist (which is the recommended method for
customizing this behavior).
Suffix used to construct VM index file names, e.g., ".inx". When VM visits a folder, it checks for the existence of a file whose name is the folder’s file name with the value of this variable appended to it. If found, the file’s contents will be used to tell VM about the contents of the folder. This is faster than parsing the folder itself.
When you save a folder, the index file will be rewritten with updated information about the folder.
A nil value means VM should not read or write index files.
Non-nil value should be a string specifying a directory where
your crash boxes should be moved after VM has copied new mail
out of them. This is a safety measure. In at least one case a
pointer corruption bug inside Emacs has caused VM to believe that
it had copied information out of the crash box when it in fact
had not. VM then deleted the crash box, losing the batch of
incoming mail. This is an exceedingly rare problem, but if you
want to avoid losing mail if it happens, set vm-keep-crash-boxes
to point to a directory in the same filesystem as all your
crash boxes. Each saved crash box will have a unique name based
on the current date and time the box was saved. You will need to
clean out this directory from time to time; VM does not do so.
A nil value means VM should just delete crash boxes after it has copied out the mail.
Set this variable to t if you want VM’s mail-check to run
continuously and take into account multiple mail clients reading from
the same mail spool.
Numeric value specifies the number of seconds between checks for new mail, carried out using a timer task. The maildrops for all visited folders are checked.
A nil value means don’t check for new mail.
Note that if new mail is found, it is not retrieved. The
buffer local variable vm-spooled-mail-waiting is set non-nil in
the buffers of those folders that have mail waiting. VM
displays "Mail" in the mode line of folders that have mail
waiting.
Default value: 300
Non-nil value should be a function that returns a crash box file name for a folder. The function will be called with one argument, the folder’s file name. If the folder does not have a file name, the function will not be called.
Non-nil value should be a function that returns a spool file name for a folder. The function will be called with one argument, the folder’s file name. If the folder does not have a file name, the function will not be called.
Non-nil means refuse to read an mboxcl2 message that has no length.
An mboxcl2 folder stores each message’s length in a Content-Length header
and that is how the next message is found. A message written into such a
folder without one – by another mailer, or by VM before this was checked –
leaves the folder saying one thing and containing another.
With this set, reading such a folder signals an error naming the message and
saying how to repair it: vm-change-folder-type with a prefix argument
converts a folder on disk, without visiting it, and gives every message a
length.
With it nil, VM warns and falls back on looking for the next line beginning "From ", which is what it used to do silently. Turning it off to get at a broken folder is not necessary and is easy to forget about; the repair does not need it.
Default value: t
Non-nil value causes VM’s commands that change the message order of a folder to always move the physical messages involved and not just change the presentation order. Nil means that commands just change the order in which VM displays messages and leave the folder itself undisturbed.
List of POP mailboxes and values specifying whether messages should be automatically deleted from the mailbox after retrieval. The format of the list is
((MAILBOX . VAL) (MAILBOX . VAL) ...)
MAILBOX should be a POP mailbox specification as described in
the documentation for the variable vm-spool-files. If you have
the POP password specified in the vm-spool-files entry, you do
not have to specify it here as well. Use * instead; VM will
still understand that this mailbox is the same as the one in
vm-spool-files that gives the password.
VAL should be nil if retrieved messages should be left in the corresponding POP mailbox, t if retrieved messages should be deleted from the mailbox immediately after retrieval.
VM can only support a non-nil setting of this variable if the remote POP server supports the UIDL command. If the server does not support UIDL and you’ve asked to VM leave messages on the server, VM will complain about the lack of UIDL support and not retrieve messages from the server.
Non-nil value means that, when a POP mailbox is used as a
spool file, messages should be deleted after retrieving them. A
nil value means messages will be left in the POP mailbox until
you run vm-expunge-pop-messages. VM can only support a nil
value for this variable if the remote POP server supports the
UIDL command. If the server does not support UIDL and you’ve
asked VM leave messages on the server, VM will complain about the
lack of UIDL support and not retrieve messages from the server.
This variable only affects POP mailboxes not listed in
vm-pop-auto-expunge-alist (which is the recommended method for
customizing this behavior).
Mail is moved from the system mailbox to this file for reading.
Default value: "~/INBOX"
The value should be a list of lists, with each sublist of the form
(HEADER-REGEXP SCORE-REGEXP SCORE-FN)
- HEADER-REGEXP is a regular expression matching the spam score header line in email messages,
- SCORE-REGEXP is a regular expression matching the score, and
- SCORE-FN is a function that converts the score string into a number.
Default value:
(("X-Spam-Score:" "[-+]?[0-9]*\\.?[0-9]+" string-to-number)
("X-Spam-Status:" "[-+]?[0-9]*\\.?[0-9]+" string-to-number)
("X-Spam-Level:" "\\*+" length))
A file storing a list of words contained in spam messages.
Default value: worked out when VM is loaded, from this system.
List of suffixes to be used to create possible spool file names for folders. Example:
(setq vm-spool-file-suffixes ’(".spool" "-"))
If you visit a folder ~/mail/beekeeping, when VM attempts to
retrieve new mail for that folder it will look for mail in
~/mail/beekeeping.spool and ~/mail/beekeeping- in addition to
scanning vm-spool-files for matches.
The value of vm-spool-file-suffixes will not be used unless
vm-crash-box-suffix is also defined, since a crash box is
required for all mail retrieval from spool files.
If non-nil this variable’s value should be a list of strings or a list of lists.
If the value is a list of strings, the strings should name files
that VM will check for incoming mail instead of the default place
VM thinks your system mailbox is. Mail will be moved from these
mailboxes to your primary inbox as specified by vm-primary-inbox,
using vm-crash-box as a waystation.
If the value is a list of lists, each sublist should be of the form
(INBOX SPOOLNAME CRASHBOX)
INBOX, SPOOLNAME and CRASHBOX are all strings.
INBOX is the folder where you want your new mail to be moved when
you type g (running vm-get-new-mail) in VM. It is where you
will read the mail.
SPOOLNAME is where the mail system leaves your incoming mail, e.g. /var/spool/mail/kyle. It can also be a mailbox specification of the form, "po:USER", where USER is a user name. VM will pass this specification to the movemail program. It is up to movemail to interpret it and figure out where to find your mailbox. Some systems use special authentication methods that are only accessible via the movemail program.
SPOOLNAME can also be a POP maildrop.
A POP maildrop specification has the following format:
"pop:HOST:PORT:AUTH:USER:PASSWORD"
or
"pop-ssl:HOST:PORT:AUTH:USER:PASSWORD"
or
"pop-ssh:HOST:PORT:AUTH:USER:PASSWORD"
The second form is used to speak POP over an SSL connection.
For this to work you should either have a version of Emacs
with SSL capability or you have the stunnel program installed
and set the variable ‘vm-stunnel-program’. The SSL version
of the POP server will not use the same port as the non-SSL
version.
The third form is used to speak POP over an SSH connection.
You must have the ssh program installed and the variable
‘vm-ssh-program’ must name it in order for POP over SSH to
work. SSH must be able to authenticate without a password,
which means you must be using either .shosts authentication
or RSA authentication.
HOST is the host name of the POP server
PORT is the TCP port number to connect to. This should
normally be 110, unless you’re using POP over SSL in which
case the standard port is 995.
USER is the user name sent to the server.
PASSWORD is the secret shared by you and the server for
authentication purposes. How is it used depends on the value of
the AUTH parameter. If the PASSWORD is "*", VM will prompt
you for the password the first time you try to retrieve mail from
maildrop. If the password is valid, VM will not ask you for the
password again during this Emacs session.
AUTH is the authentication method used to convince the server you
should have access to the maildrop. Acceptable values are
"pass" and "apop". For "pass", the PASSWORD is sent to
the server with the POP PASS command. For "apop", an MD5 digest
of the PASSWORD appended to the server timestamp will be sent to
the server with the APOP command. In order to use "apop" you
will have to set the value of ‘vm-pop-md5-program’ appropriately to
point at the program that will generate the MD5 digest that VM
needs.
SPOOLNAME can also be an IMAP maildrop.
An IMAP maildrop specification has the following format:
"imap:HOST:PORT:MAILBOX:AUTH:USER:PASSWORD"
or
"imap-ssl:HOST:PORT:MAILBOX:AUTH:USER:PASSWORD"
or
"imap-ssh:HOST:PORT:MAILBOX:AUTH:USER:PASSWORD"
The second form is used to speak IMAP over an SSL connection.
For this to work, you should either be using a version of
Emacs with SSL capability or you must have the stunnel
program installed and the variable ‘vm-stunnel-program’
naming it.
The third form is used to speak IMAP over an SSH connection.
You must have the ssh program installed and the variable
‘vm-ssh-program’ must name it in order for IMAP over SSH to
work. SSH must be able to authenticate without a password,
which means you must be using .shosts authentication or
public key user authentication.
HOST is the host name of the IMAP server.
PORT is the TCP port number to connect to. This should
normally be 143. For IMAP over SSL, the standard port is
993. There is no special port for IMAP over SSH.
MAILBOX is the name of the mailbox on the IMAP server. Should
be "inbox", to access your default IMAP maildrop on the
server.
AUTH is the authentication method used to convince the server
you should have access to the maildrop. Acceptable values
are "preauth", "login" and "cram-md5". "preauth"
causes VM to skip the authentication stage of the protocol
with the assumption that the session was authenticated in some
external way. "login", tells VM to use the IMAP LOGIN
command for authentication, which sends your username and
password in cleartext to the server. "cram-md5" is a
challenge response system that convinces the server of your
identity without transmitting your password in the clear.
Not all servers support "cram-md5"; if you’re not sure, ask
your mail administrator or just try it.
USER is the user name used with authentication methods that
require such an identifier. "login" and "cram-md5"
use it currently.
PASSWORD is the secret shared by you and the server for
authentication purposes. If the PASSWORD is "*", VM
will prompt you for the password the first time you try to
retrieve mail from maildrop. If the password is valid, VM
will not ask you for the password again during this Emacs
session.
CRASHBOX is the temporary file that VM uses to store mail in transit between the SPOOLNAME and the INBOX. If the system crashes or Emacs dies while mail is being moved, and the new mail is not in the SPOOLNAME or the INBOX, then it will be in the CRASHBOX.
There can be multiple entries with the same INBOX value, but a particular SPOOLNAME should appear only once. CRASHBOXes should not be shared among different INBOXes, but you can use the same CRASHBOX/INBOX pair with a different SPOOLNAME.
vm-spool-files will default to the value of the shell
environmental variables MAILPATH or MAIL if either of these
variables are defined and no particular value for vm-spool-files
has been specified.
If set to t, VM synchronizes its headers with the headers of
Thunderbird so that full interoperation with Thunderbird becomes
possible. If it is set to read-only then VM reads the Thunderbird
status flags, but refrains from updating them. If it is set to nil
then VM makes no attempt to read or write the Thunderbird status
flags.
Default value: t
Directory where Thunderbird’s local folders are kept. This
setting is used in vm-visit-thunderbird-folder.
Note that only Thunderbird’s local folders can be visited in VM, not its IMAP folders.
Non-nil means decide that a From_ folder is mboxcl2 by looking at it.
Deprecated, and the last release to do the looking. Say the type in
vm-folder-type-by-extension-alist instead, which is a folder being told
what it is rather than VM guessing, and which VM warns about once per folder
while this is still on.
What it does: VM reads the start of the folder, and takes a Content-Length
on each of the first two messages as saying that every message in the folder
has one. That is the whole evidence available, From_ and mboxcl2 being the
same folder but for the header, and it was wrong on a 1.1 GB IMAP cache where
6394 of 6459 messages had no length.
Why it existed: vm-default-folder-type set to mboxcl2 says what new folders
are written as, and until a folder could be told its type, a folder VM had
written as mboxcl2 read back as From_ and was half-written on the next save.
Turning this on was the only compensation. Naming the folder is the answer
now.
List of headers that should be forwarded by vm-forward-message.
The headers should be listed in the order you wish them to appear
in the forwarded message. Regular expressions are allowed.
There’s no need to anchor patterns with "^", as searches always
start at the beginning of a line. Put a colon at the end of
patterns to get exact matches. (E.g. "Date" matches "Date"
and "Date-Sent".) Header names are always matched
case-insensitively.
If the value of vm-unforwarded-header-regexp is nil, the headers
matched by vm-forwarded-headers are the only headers that will be
forwarded.
If vm-unforwarded-header-regexp is non-nil, then the headers
matched by that variable will be omitted and all the others will
be forwarded. vm-forwarded-headers determines the forwarding
order in that case, with headers not matching any in the
vm-forwarded-headers list appearing last in the header section
of the forwarded message.
List of headers that should be forwarded by vm-forward-message-plain.
The headers should be listed in the order you wish them to appear in the
forwarded message. Regular expressions are allowed. There’s no need to
anchor patterns with "^", as searches always start at the beginning of a
line. Put a colon at the end of patterns to get exact matches. (E.g.,
"Date" matches "Date" and "Date-Sent".) Header names are always
matched case-insensitively.
If the value of vm-unforwarded-header-regexp-plain is nil, the headers
matched by vm-forwarded-headers are the only headers that will be
forwarded.
If vm-unforwarded-header-regexp-plain is non-nil, then the headers
matched by that variable will be omitted and all the others will be
forwarded. In this case, vm-forwarded-headers-plain determines the
forwarding order in that case, with headers not matching any in the
vm-forwarded-headers-plain list appearing last in the header section
of the forwarded message.
Default value:
("From:" "To:" "Newsgroups:" "Cc:" "Subject:" "Date:" "In-Reply-To:")
Non-nil value should be a string that specifies the type of message encapsulation format to use when forwarding messages. Legal values of this variable are:
"mime" "rfc934" "rfc1153" nil
A nil value means to use plain text forwarding.
Default value: "mime"
String which specifies the format of the contents of the Subject
header that is generated for a forwarded message. See the documentation
for the variable vm-summary-format for information on what this string
may contain. The format should *not* end with nor contain a newline.
Nil means leave the Subject header empty when forwarding.
Default value: "forwarded message from %F"
Non-nil value should be a regular expression that tells
what headers should not appear in a resent bounced message. This
variable along with vm-resend-bounced-headers determines which headers
are kept and which headers are discarded.
If the value of vm-resend-bounced-discard-header-regexp is nil,
the headers matched by vm-resend-bounced-headers are the only
headers that will be kept.
If vm-resend-bounced-discard-header-regexp is non-nil, then only
headers matched by this variable will be discarded; all others
will be kept. vm-resend-bounced-headers determines the order of
appearance in that case, with headers not matching any in the
vm-resend-bounced-headers list appearing last in the headers of
the message.
List of headers that should be appear in messages resent with
vm-resend-bounced-message. These should be listed in the order you wish them
to appear in the message. Regular expressions are allowed.
There is no need to anchor patterns with "^", as searches always
start at the beginning of a line. Put a colon at the end of
patterns to get exact matches. (E.g. "Date" matches "Date"
and "Date-Sent".) Header names are always matched case
insensitively.
If the value of vm-resend-bounced-discard-header-regexp is nil, the headers
matched by vm-resend-bounced-headers are the only headers that will be
kept.
If vm-resend-bounced-discard-header-regexp is non-nil, then only
headers matched by that variable will be discarded; all others
will be kept. vm-resend-bounced-headers determines the order of
appearance in that case, with headers not matching any in the
vm-resend-bounced-headers list appearing last in the headers of
the message.
Default value:
("MIME-Version:" "Content-" "From:" "Sender:" "Reply-To:" "To:"
"Newsgroups:" "Cc:" "Subject:" "Newsgroups:" "In-Reply-To:"
"References:" "Keywords:" "X-")
Non-nil value should be a regular expression that tells
what headers should not appear in a resent message. This
variable along with vm-resend-headers determines which
headers are kept and which headers are discarded.
If the value of vm-resend-discard-header-regexp is nil,
the headers matched by vm-resend-headers are the only
headers that will be kept.
If vm-resend-discard-header-regexp is non-nil, then only
headers matched by this variable will be discarded; all others
will be kept. vm-resend-headers determines the order of
appearance in that case, with headers not matching any in the
vm-resend-headers list appearing last in the headers of
the message.
Default value: "\\(\\(X400-\\)?Received:\\|Resent-\\)"
List of headers that should appear in messages resent with
vm-resend-message. These should be listed in the order you wish them
to appear in the message. Regular expressions are allowed.
There is no need to anchor patterns with "^", as searches always
start at the beginning of a line. Put a colon at the end of
patterns to get exact matches. (E.g. "Date" matches "Date"
and "Date-Sent".) Header names are always matched case
insensitively.
If the value of vm-resend-discard-header-regexp is nil, the headers
matched by vm-resend-headers are the only headers that will be
kept.
If vm-resend-discard-header-regexp is non-nil, then only
headers matched by that variable will be discarded; all others
will be kept. vm-resend-headers determines the order of
appearance in that case, with headers not matching any in the
vm-resend-headers list appearing last in the headers of
the message.
Non-nil value should be a regular expression that tells what
headers should not be forwarded by vm-forward-message and
vm-send-digest. This variable along with vm-forwarded-headers
determines which headers are forwarded.
If the value of vm-unforwarded-header-regexp is nil, the headers
matched by vm-forwarded-headers are the only headers that will be
forwarded.
If vm-unforwarded-header-regexp is non-nil, then only the
headers matched by this variable will be omitted; all the others will
be forwarded. vm-forwarded-headers determines the forwarding
order in that case, with headers not matching any in the
vm-forwarded-headers list appearing last in the header section
of the forwarded message.
Default value: "none-to-be-dropped"
Non-nil value should be a regular expression that tells what
headers should not be forwarded by vm-forward-message-plain. This
variable along with vm-forwarded-headers-plain determines which headers
are forwarded.
If the value of vm-unforwarded-header-regexp-plain is nil, the
headers matched by vm-forwarded-headers-plain are the only
headers that will be forwarded.
If vm-unforwarded-header-regexp-plain is non-nil, then only the
headers matched by this variable will be omitted; all the others
will be forwarded. vm-forwarded-headers-plain determines the
forwarding order in that case, with headers not matching any in
the vm-forwarded-headers-plain list appearing last in the
header section of the forwarded message.
Name of program to use to run grep. This is used to count message separators in folders. Set this to nil and VM will not use it.
Default value: "grep"
Program to convert Sun icon data to a PBM file. This program is needed to support the display of X-Faces under Emacs 21 if the uncompface program can’t convert X-Face image data to XBM data.
Default value: worked out when VM is loaded, from this system.
Path to ImageMagick program.
For ImageMagick 7, this should point to the magick executable.
For ImageMagick 6 or earlier, this can point to convert.
VM will automatically use the appropriate subcommand (convert, identify)
when calling ImageMagick 7’s magick program.
Default value: worked out when VM is loaded, from this system.
Name of program to use to run lynx. This is used to retrieve URLs.
Default value: "lynx"
Name of program to use to move mail from the system spool to another location. If you use another program, it must accept as its last two arguments the spool file (or maildrop) from which mail is retrieved, and the local file where the retrieved mail should be stored.
A nil value, the default, means the movemail distributed with Emacs, in
exec-directory. If this Emacs has none, getting new mail from a local
spool file signals an error saying so, rather than making do with another
movemail found along exec-path.
It has to be that one, and not simply the first movemail on the path.
Emacs’s copies the spool byte for byte, which is all VM wants of it; other
implementations move mail by *parsing and rewriting* it, and what comes out
is not what the mail server put in. GNU Mailutils’ movemail, which is
/usr/bin/movemail on Debian and Ubuntu when the mailutils package is
installed, rewrites the From separator line, adds X-IMAPbase and
X-UID headers of its own, and – given a message whose body is empty, so
that the blank line ending its headers is the only one before the next
From line – reads the following message as body text and writes the two
out as one. That is issue #538: two messages arrive in the folder merged
into one, the second one’s headers showing up as the first one’s body with
its From line quoted to >From . Setting this variable to Mailutils’
movemail knowingly is fine for a maildrop it does not mangle; the point is
that it should not be picked up by accident.
VM asks movemail for local spool files only. POP and IMAP retrieval are VM’s own, in vm-pop.el and vm-imap.el, so the protocol support that other movemail implementations offer is of no use here.
List of command line flags to pass to the movemail program
named by vm-movemail-program.
The most of one session trace a bug report carries, in characters.
A session that fetched the UID and flags of every message in a large mailbox leaves most of a megabyte in its trace, and a bug report of that size cannot be sent. Beyond this, the middle of the trace is left out and the report says how much: the start says what the server is and what was asked of it, the end says where it went wrong, and the thousands of identical FETCH lines between them say nothing twice.
Nil carries every trace whole.
Default value: 100000
Name of program to use to run SSH. This is used to build an SSH tunnel to remote POP and IMAP servers. Set this to nil and VM will not use it.
Default value: "ssh"
List of command line switches to pass to SSH.
Shell command to run to hold open the SSH connection. This command must generate one line of output and then sleep long enough for VM to open a port-forwarded connection. The default should work on UNIX systems.
Default value: "echo ready; sleep 15"
Name of program to use to run stunnel, or nil for Emacs’s own TLS. This is how VM makes an SSL connection to a POP or IMAP server. The default is nil where Emacs was built with GnuTLS, since Emacs can make the connection itself, and "stunnel" where it was not. An Emacs without GnuTLS on a machine without stunnel cannot reach a server that requires SSL at all.
If you do use an stunnel program, then see also the related variables
vm-stunnel-program-switches and
vm-stunnel-program-additional-configuration-file.
Name of a configuration file to append to the config file VM creates when using stunnel version 4 or later. Leave this set to nil unless you understand how VM uses stunnel and know that you need to change something to get stunnel working.
For stunnel version 4 and beyond stunnel relies on a configuration file to tell it what to do. VM builds the necessary configuration file for each instance of stunnel that it runs. If you have extra configuration options you want stunnel to use, put them in a file and set this variable to the name of that file.
This variable is ignored for stunnel versions prior to version 4 as VM uses command line argument to control stunnel in those cases.
List of command line switches to pass to stunnel. Leave this set to nil unless you understand how VM uses stunnel and know that you need to change something to get stunnel working. This variable is ignored if you’re running stunnel version 4 or later versions, since those versions of stunnel are configurable only with a configuration file.
Specifies what VM should do about sending the PRNG. The stunnel program uses the OpenSSL library which requires a certain amount of random data to seed its pseudo-random number generator. VM can generate this data using Emacs’ random number generator or it can rely on stunnel to find the data by itself somehow. Some systems have a /dev/urandom device that stunnel can use. Some system have a entropy gathering daemon that can be tapped for random data. If sufficient random data cannot be found, the OpenSSL library will refuse to work and stunnel will not be able to establish an SSL connection.
Setting vm-stunnel-random-data-method to the symbol generate
tells VM to generate the random data.
A nil value tells VM to do nothing and let stunnel find the data if it can.
Default value: generate
Non-nil if stunnel version is controlled by a configuration file. This is needed for stunnel version 4 or later. Older versions of stunnel used command line arguments instead.
Default value: t
Program used to convert X-Face data to Sun icon format. Or if the program version is new enough, it will be called with -X to produce XBM data. This program is needed to support he display of X-Faces under Emacs 21.
Default value: worked out when VM is loaded, from this system.
Name of program to use to run w3m. This is used to retrieve URLs.
Default value: "w3m"
List of hook functions called once for each message gathered from
the system mail spool, or from another folder with
vm-get-new-mail, or from a digest with vm-burst-digest. When the
hooks are run, the current buffer will be the folder containing
the message and the start and end of the message will be
bracketed by (point-min) and (point-max).
List of hook functions called after VM has gathered a group of
messages from the system mail spool, or from another folder with
vm-get-new-mail, or from a digest with vm-burst-digest. When the
hooks are run, the new messages will have already been added to
the message list but may not yet appear in the summary.
Also, the current buffer will be the folder containing
the messages.
List of hook functions that are run every time VM wants to display a buffer. When the hooks are run, the current buffer will be the buffer that VM wants to display. The hooks are expected to select a window and VM will display the buffer in that window.
If you use display hooks, you should not use VM’s builtin window configuration system as the result is likely to be confusing.
List of hook functions to be run just before a message is edited.
This is the last thing vm-edit-message does before leaving the user
in the edit buffer.
List of hook functions to be run after a Mail mode
composition buffer has been created to forward a message. VM
runs this hook and then runs vm-mail-mode-hook before leaving the
user in the Mail mode buffer.
List of hook functions that are run whenever VM iconifies a frame.
List of hook functions to call to generate an preauthenticated
IMAP session process. This hook is only run if the
authentication method for the IMAP mailbox is ‘preauth’. Each
hook is called with five arguments: HOST, PORT, MAILBOX, USER,
PASSWORD. (See the documentation for vm-spool-files to find out
about these arguments.) It is the responsibility of the hook
function to create an Emacs process whose input/output streams
are connected to an authenticated IMAP session, and to return
this process. If the hook cannot accomplish this,
it should return nil. If all the hooks return nil, VM will
signal an error.
At the time the hook is run, the current buffer will be the buffer any created process should be associated with. (The BUFFER argument to start-process or open-network-stream should be (current-bfufer).)
List of hook functions to be run after a Mail mode
composition buffer has been created to send a non specialized
message, i.e. a message that is not a reply, forward, digest,
etc. VM runs this hook and then runs vm-mail-mode-hook before
leaving the user in the Mail mode buffer.
List of hook functions to be run after a Mail mode composition buffer has been created. This is the last thing VM does before leaving the user in the Mail mode buffer.
List of hook functions to call just before sending a message.
The hooks are run after confirming that you want to send the
message (see vm-confirm-mail-send) but before MIME encoding and
FCC processing.
List of hook functions to run when a buffer enters vm-mode.
These hook functions should generally be used to set key bindings
and local variables.
Old name for vm-mode-hook.
Supported for backward compatibility.
You should use the new name.
List of hook functions to run when a VM presentation buffer is created. The current buffer will be the new presentation buffer when the hooks are run. Presentation buffers are used to display messages when some type of decoding must be done to the message to make it presentable. E.g. MIME decoding.
List of hook functions to run when you quit VM. This applies to any VM quit command. The following global variables may be used in your hook function.
virtual - true if the current folder is a virtual folder no-expunge - true if no expunge was requested as part of quit no-change - true if the changes are being discarded ‘vm-expunge-before-quit’ - user option controlling auto-expunge
List of hook functions to be run after a Mail mode
composition buffer has been created for a reply. VM runs this
hook and then runs vm-mail-mode-hook before leaving the user in
the Mail mode buffer.
List of hook functions to be run after a Mail mode
composition buffer has been created to resend a bounced message.
VM runs this hook and then runs vm-mail-mode-hook before leaving
the user in the Mail mode buffer.
List of hook functions to be run after a Mail mode
composition buffer has been created to resend a message.
VM runs this hook and then runs vm-mail-mode-hook before leaving
the user in the Mail mode buffer.
List of hook functions called just after VM has retrieved a group of messages from your system mailbox(es). When these hooks are run, the messages have been added to the folder buffer but not the message list or summary. When the hooks are run, the current buffer will be the folder where the messages were incorporated.
List of hook functions called every time a message is saved to a folder. When the hooks are called, the current buffer will be the folder containing the message and the start and end of the message will be bracketed by (point-min) and (point-max). The hooks are called with one argument, a string naming the folder the message was saved to: a file name, or the maildrop specification of an IMAP mailbox.
vm-save-message has run this hook since long before it was declared
anywhere, which is why it is documented in the manual and was not a variable.
List of hook functions called every time a message is made to be the current message. When the hooks are run, the current buffer will be the folder containing the message and the start and end of the message will be bracketed by (point-min) and (point-max).
Hook run every time a message with the new
attribute is made to be the current message. When the functions are run, the
current buffer is the folder containing the message and it is narrowed
to the start and end of the message.
Hook run every time a message with the unread
attribute is made to be the current message. When the functions are called,
the current buffer is the folder containing the message and it is narrowed to
the start and end of the message.
List of hook functions to be run after a Mail mode
composition buffer has been created to send a digest.
VM runs this hook and then runs vm-mail-mode-hook before leaving
the user in the Mail mode buffer.
List of hook functions called every time a message is showed. When the hooks are run, the current buffer will be the folder containing the message and the start and end of the message will be bracketed by (point-min) and (point-max).
List of functions called when VM first notices mail is spooled for a folder. The folder buffer will be current when the hooks are run.
List of hook functions to run once, when VM starts up.
Run at the end of vm-session-initialization, the first time any VM command
is used in an Emacs session – so once per Emacs, not once per folder. See
vm-visit-folder-hook for the per-folder equivalent.
By then VM is fully assembled: the init file has been read, menus and the mouse are installed and any timers are running. So a function here can override what VM has set up, which is the reason for running it last rather than first. VM commands may be called from it.
If what you want is to configure VM before it starts, set variables in your
init file or vm-init-file instead; and to run something when a particular
library is loaded, with-eval-after-load is simpler than a hook.
List of hook functions to run when a VM summary buffer is created. The current buffer will be that buffer when the hooks are run.
Old name for vm-summary-mode-hook.
Supported for backward compatibility.
You should use the new name.
List of hook functions to run when the VM summary pointer is updated. When the hooks are run, the current buffer will be the summary buffer.
List of hook functions called just after VM adds or deletes entries from a folder summary.
List of hook functions called just after VM updates an existing entry a folder summary.
List of hook functions that are run every time VM wants to remove a buffer from the display. When the hooks are run, the current buffer will be the buffer that VM wants to disappear. The hooks are expected to do the work of removing the buffer from the display. The hook functions should not kill the buffer.
If you use undisplay hooks, you should not use VM’s builtin window configuration system as the result is likely to be confusing.
List of hook functions to run when a VM virtual folder buffer is created. The current buffer will be that buffer when the hooks are run.
List of hook functions called just after VM visits a folder.
It doesn’t matter if the folder buffer already exists, this hook
is run each time vm or vm-visit-folder is called interactively.
It is NOT run after vm-mode is called.
Create a folder on an IMAP server.
First argument FOLDER is read from the minibuffer if called
interactively. Non-interactive callers must provide an IMAP
maildrop specification for the folder as described in the
documentation for vm-spool-files.
Delete a folder on an IMAP server.
First argument FOLDER is read from the minibuffer if called
interactively. Non-interactive callers must provide an IMAP
maildrop specification for the folder as described in the
documentation for vm-spool-files.
Deletes all messages from IMAP mailbox that have already been retrieved into the current folder. VM sets the \Deleted flag on all such messages on all the relevant IMAP servers and then immediately expunges.
Create a folder on an IMAP server.
First argument FOLDER is read from the minibuffer if called
interactively. Non-interactive callers must provide an IMAP
maildrop specification for the folder as described in the
documentation for vm-spool-files.
Delete a folder on an IMAP server.
First argument FOLDER is read from the minibuffer if called
interactively. Non-interactive callers must provide an IMAP
maildrop specification for the folder as described in the
documentation for vm-spool-files.
List all folders on an IMAP account ACCOUNT, along with the
counts of messages in them. The account must be one declared in
vm-imap-account-alist.
With a prefix argument, it lists only the folders with new messages in them.
Rename a folder on an IMAP server.
Argument SOURCE and DEST are read from the minibuffer if called
interactively. Non-interactive callers must provide full IMAP
maildrop specifications for SOURCE and DEST as described in the
documentation for vm-spool-files.
Begin to compose a bug report for IMAP support functionality.
Submit a bug report for VM’s IMAP support functionality.
It is necessary to run vm-imap-start-bug-report before the problem
occurrence and this command after the problem occurrence, in
order to capture the trace of IMAP sessions during the occurrence.
The session still running is included, so a report can be made about a fetch while it is happening; nothing is closed to collect it.
Synchronize the current folder with the IMAP mailbox. Changes made to the buffer are uploaded to the server first before downloading the server data. Deleted messages are not expunged.
Prefix argument FULL says to write every message’s attributes to the server, rather than only those of the messages whose attributes changed in this session, and to fetch a message the cache no longer holds rather than leaving it alone. This is useful for saving offline work on the cache folder, whose expunges are sent whether FULL is given or not: VM records them as the reader makes them.
FULL used to delete on the server every message the mailbox had and the cache did not. A damaged cache says the same thing as a reader who expunged, so that destroyed mail nobody asked it to (emacs-vm/vm#752).
List all folders on an IMAP account ACCOUNT, along with the
counts of messages in them. The account must be one declared in
vm-imap-account-alist.
With a prefix argument, it lists only the folders with new messages in them.
Prune the X-VM-IMAP-Retrieved header of the current folder by examining which messages are still present in SOURCE. SOURCE should be a maildrop folder on an IMAP server. USR, 2011-04-06
Nothing waits: the mailbox is asked for the UID of every message it holds and the header is pruned when the answer comes. That is the same round trip a synchronisation makes, and it used to be just as frozen.
Rename a folder on an IMAP server.
Argument SOURCE and DEST are read from the minibuffer if called
interactively. Non-interactive callers must provide full IMAP
maildrop specifications for SOURCE and DEST as described in the
documentation for vm-spool-files.
Alist of IMAP account specifications and names that refer to them. The alist format is:
((IMAPDROP NAME) ...)
IMAPDROP is a IMAP maildrop specification in the same format used
by vm-spool-files (which see).
NAME is a string that should give a less cumbersome name that you
will use to refer to this maildrop when using vm-visit-imap-folder.
Example: (setq vm-imap-account-alist
'(("imap-ssl:mail.foocorp.com:993:inbox:login:becky:*" "becky")
("imap:crickle.lex.ky.us:143:inbox:login:becky:*" "crickle")))
Set this variable to a string denoting the name of an IMAP account
(short name) declared in vm-imap-account-alist. The account
specified here will be regarded as the default account for
various purposes, e.g., for saving copies of outgoing mail.
Directory where VM stores cached copies of IMAP folders. When VM visits a IMAP folder (really just a IMAP server where you have a mailbox) it stores the retrieved message on your computer so that they need not be retrieved each time you visit the folder. The cached copies are stored in the directory specified by this variable.
The number of IMAP session trace buffers that should be
retained for debugging purposes. If it is nil, then no trace buffers are kept.
Default value: 1
The largest IMAP message VM retrieves.
Nil, the default, means no limit. A message larger than this is handled as follows:
- In an IMAP folder, it is retrieved as its headers alone where
vm-enable-external-messages includes imap, and its body is fetched from
the server when the message is read. Otherwise it is retrieved whole.
- From a maildrop, into a local folder, it is left on the server and VM says
how large it was and what the limit is. A local folder cannot go back to the
server for a body later, so headers alone would leave a message that could
never be read. Raise the limit and the next vm-get-new-mail brings it in.
Number of messages to be bunched together in IMAP server operations. This permits faster interaction with the IMAP servers. To disable bunching, set it to 1.
Default value: 10
If set to non-nil, the INBOX folders on IMAP accounts are
referred to by their account names instead of as "INBOX". The
account names are those declared in vm-imap-account-alist.
This is useful if one wants to handle multiple IMAP accounts
during the same VM session, all of which might have an "INBOX"
folder.
This variable controls the behavior of the vm-save-message
command. If it is non-NIL, then messages from IMAP folders
are saved to other IMAP folders on the server, instead of
local folders. Messages from local folders are still saved to local
folders.
The specialized commands vm-save-message-to-local-folder and
vm-save-message-to-imap-folder can be used to obtain particular
behavior independent of this variable.
Number of seconds to wait for output from the IMAP server before timing out. It can be set to nil to never time out.
Level of tolerance that vm should use for IMAP servers that don’t follow the IMAP specification. Default of NIL or 0 means no tolerance. Level 1 allows possibly harmless violations of prohibitions. (But these violations could also be symptomatic of deeper problems.) Use this level carefully. Higher levels of violations are not currently permitted.
Attach a buffer to a VM composition buffer to be sent along with the message.
The buffer contents are not inserted into the composition
buffer and MIME encoded until you execute vm-mail-send or
vm-mail-send-and-exit. A visible tag indicating the existence
of the attachment is placed in the composition buffer. You
can move the attachment around or remove it entirely with
normal text editing commands. If you remove the attachment
tag, the attachment will not be sent.
First argument, BUFFER, is the buffer or name of the buffer to attach. Second argument, TYPE, is the MIME Content-Type of the file. Optional third argument CHARSET is the character set of the attached document. This argument is only used for text types, and it is ignored for other types. Optional fourth argument DESCRIPTION should be a one line description of the file. Nil means include no description.
When called interactively all arguments are read from the minibuffer.
This command is for attaching files that do not have a MIME
header section at the top. For files with MIME headers, you
should use vm-attach-mime-file to attach such a file. VM
will extract the content type information from the headers in
this case and not prompt you for it in the minibuffer.
Attach a file to a VM composition buffer to be sent along with the message.
The file is not inserted into the buffer and MIME encoded until
you execute vm-mail-send or vm-mail-send-and-exit. A visible tag
indicating the existence of the attachment is placed in the
composition buffer. You can move the attachment around or remove
it entirely with normal text editing commands. If you remove the
attachment tag, the attachment will not be sent.
First argument, FILE, is the name of the file to attach. Second argument, TYPE, is the MIME Content-Type of the file. Optional third argument CHARSET is the character set of the attached document. This argument is only used for text types, and it is ignored for other types. Optional fourth argument DESCRIPTION should be a one line description of the file. Nil means include no description. Optional fifth argument NO-SUGGESTED-FILENAME non-nil means that VM should not add a filename to the Content-Disposition header created for the object.
When called interactively all arguments are read from the minibuffer.
This command is for attaching files that do not have a MIME
header section at the top. For files with MIME headers, you
should use vm-attach-mime-file to attach such a file. VM
will extract the content type information from the headers in
this case and not prompt you for it in the minibuffer.
Attach all files in DIRECTORY matching REGEXP. The optional argument MATCH might specify a regexp matching all files which should be attached, when empty all files will be attached.
When called with a prefix arg it will do a literal match instead of a regexp match.
Attach a message from a VM folder to the current VM composition.
The message is not inserted into the buffer and MIME encoded until
you execute vm-mail-send or vm-mail-send-and-exit. A visible tag
indicating the existence of the attachment is placed in the
composition buffer. You can move the attachment around or remove
it entirely with normal text editing commands. If you remove the
attachment tag, the attachment will not be sent.
First argument, MESSAGE, is either a VM message struct or a list of message structs. When called interactively a message number is read from the minibuffer. The message will come from the parent folder of this composition. If the composition has no parent, the name of a folder will be read from the minibuffer before the message number is read.
If this command is invoked with a prefix argument, the name of a folder is read and that folder is used instead of the parent folder of the composition.
If this command is invoked on marked message (via
vm-next-command-uses-marks) the marked messages in the selected
folder will be attached as a MIME message digest. If
applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread are attached.
Optional second argument DESCRIPTION is a one-line description of the message being attached. This is also read from the minibuffer if the command is run interactively.
Attach the current message from the current VM folder to a VM composition.
The message is not inserted into the buffer and MIME encoded until
you execute vm-mail-send or vm-mail-send-and-exit. A visible tag
indicating the existence of the attachment is placed in the
composition buffer. You can move the attachment around or remove
it entirely with normal text editing commands. If you remove the
attachment tag, the attachment will not be sent.
First argument COMPOSITION is the buffer into which the object will be inserted. When this function is called interactively COMPOSITION’s name will be read from the minibuffer.
If this command is invoked on marked message (via
vm-next-command-uses-marks) the marked messages in the selected
folder will be attached as a MIME message digest. If
applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread are attached.
Optional second argument DESCRIPTION is a one-line description of the message being attached. This is also read from the minibuffer if the command is run interactively.
Attach a MIME encoded file to a VM composition buffer to be sent along with the message.
The file is not inserted into the buffer until you execute
vm-mail-send or vm-mail-send-and-exit. A visible tag indicating
the existence of the attachment is placed in the composition
buffer. You can move the attachment around or remove it entirely
with normal text editing commands. If you remove the attachment
tag, the attachment will not be sent.
The first argument, FILE, is the name of the file to attach. When called interactively the FILE argument is read from the minibuffer.
The second argument, TYPE, is the MIME Content-Type of the object.
This command is for attaching files that have a MIME
header section at the top. For files without MIME headers, you
should use vm-attach-file to attach the file.
Decode the MIME objects in the current message.
The first time this command is run on a message, decoding is done. The second time, buttons for all the objects are displayed instead. The third time, the raw, undecoded data is displayed.
The optional argument STATE can specify which decode state to display:
decoded, button, or undecoded.
If decoding, the decoded objects might be displayed immediately, or buttons might be displayed that you need to activate to view the object. See the documentation for the variables
vm-mime-auto-displayed-content-types
vm-mime-auto-displayed-content-type-exceptions
vm-mime-internal-content-types
vm-mime-internal-content-type-exceptions
vm-mime-external-content-types-alist
to see how to control whether you see buttons or objects.
If the variable vm-mime-display-function is set, then its value
is called as a function with no arguments, and none of the
actions mentioned in the preceding paragraphs are taken. At the
time of the call, the current buffer will be the presentation
buffer for the folder and a copy of the current message will be
in the buffer. The function is expected to make the message
MIME presentable to the user in whatever manner it sees fit.
Delete all attachments from the next COUNT messages or marked
messages. For the purpose of this function, an "attachment" is
a mime part part which has "attachment" as its disposition or
simply has an associated filename. Any mime types that match
vm-mime-deletable-types but not vm-mime-deletable-type-exceptions
are also included.
Delete the contents of the MIME object at point. The MIME object is replaced by a text/plain object that briefly describes what was deleted.
List mime part structure of the current message.
Attach a buffer to a VM composition buffer to be sent along with the message.
The buffer contents are not inserted into the composition
buffer and MIME encoded until you execute vm-mail-send or
vm-mail-send-and-exit. A visible tag indicating the existence
of the attachment is placed in the composition buffer. You
can move the attachment around or remove it entirely with
normal text editing commands. If you remove the attachment
tag, the attachment will not be sent.
First argument, BUFFER, is the buffer or name of the buffer to attach. Second argument, TYPE, is the MIME Content-Type of the file. Optional third argument CHARSET is the character set of the attached document. This argument is only used for text types, and it is ignored for other types. Optional fourth argument DESCRIPTION should be a one line description of the file. Nil means include no description.
When called interactively all arguments are read from the minibuffer.
This command is for attaching files that do not have a MIME
header section at the top. For files with MIME headers, you
should use vm-attach-mime-file to attach such a file. VM
will extract the content type information from the headers in
this case and not prompt you for it in the minibuffer.
Attach a file to a VM composition buffer to be sent along with the message.
The file is not inserted into the buffer and MIME encoded until
you execute vm-mail-send or vm-mail-send-and-exit. A visible tag
indicating the existence of the attachment is placed in the
composition buffer. You can move the attachment around or remove
it entirely with normal text editing commands. If you remove the
attachment tag, the attachment will not be sent.
First argument, FILE, is the name of the file to attach. Second argument, TYPE, is the MIME Content-Type of the file. Optional third argument CHARSET is the character set of the attached document. This argument is only used for text types, and it is ignored for other types. Optional fourth argument DESCRIPTION should be a one line description of the file. Nil means include no description. Optional fifth argument NO-SUGGESTED-FILENAME non-nil means that VM should not add a filename to the Content-Disposition header created for the object.
When called interactively all arguments are read from the minibuffer.
This command is for attaching files that do not have a MIME
header section at the top. For files with MIME headers, you
should use vm-attach-mime-file to attach such a file. VM
will extract the content type information from the headers in
this case and not prompt you for it in the minibuffer.
Attach a message from a VM folder to the current VM composition.
The message is not inserted into the buffer and MIME encoded until
you execute vm-mail-send or vm-mail-send-and-exit. A visible tag
indicating the existence of the attachment is placed in the
composition buffer. You can move the attachment around or remove
it entirely with normal text editing commands. If you remove the
attachment tag, the attachment will not be sent.
First argument, MESSAGE, is either a VM message struct or a list of message structs. When called interactively a message number is read from the minibuffer. The message will come from the parent folder of this composition. If the composition has no parent, the name of a folder will be read from the minibuffer before the message number is read.
If this command is invoked with a prefix argument, the name of a folder is read and that folder is used instead of the parent folder of the composition.
If this command is invoked on marked message (via
vm-next-command-uses-marks) the marked messages in the selected
folder will be attached as a MIME message digest. If
applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread are attached.
Optional second argument DESCRIPTION is a one-line description of the message being attached. This is also read from the minibuffer if the command is run interactively.
Attach the current message from the current VM folder to a VM composition.
The message is not inserted into the buffer and MIME encoded until
you execute vm-mail-send or vm-mail-send-and-exit. A visible tag
indicating the existence of the attachment is placed in the
composition buffer. You can move the attachment around or remove
it entirely with normal text editing commands. If you remove the
attachment tag, the attachment will not be sent.
First argument COMPOSITION is the buffer into which the object will be inserted. When this function is called interactively COMPOSITION’s name will be read from the minibuffer.
If this command is invoked on marked message (via
vm-next-command-uses-marks) the marked messages in the selected
folder will be attached as a MIME message digest. If
applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread are attached.
Optional second argument DESCRIPTION is a one-line description of the message being attached. This is also read from the minibuffer if the command is run interactively.
Attach a MIME encoded file to a VM composition buffer to be sent along with the message.
The file is not inserted into the buffer until you execute
vm-mail-send or vm-mail-send-and-exit. A visible tag indicating
the existence of the attachment is placed in the composition
buffer. You can move the attachment around or remove it entirely
with normal text editing commands. If you remove the attachment
tag, the attachment will not be sent.
The first argument, FILE, is the name of the file to attach. When called interactively the FILE argument is read from the minibuffer.
The second argument, TYPE, is the MIME Content-Type of the object.
This command is for attaching files that have a MIME
header section at the top. For files without MIME headers, you
should use vm-attach-file to attach the file.
Save all attachments to a subdirectory.
Root directory for saving is vm-mime-attachment-save-directory.
You might add this to vm-select-new-message-hook in order to automatically
save attachments.
(add-hook ’vm-select-new-message-hook #’vm-mime-auto-save-all-attachments)
Change the disposition of the attachment at point in this composition.
Reads inline, attachment or unspecified. The disposition tells the
recipient’s mail reader whether the part is meant to be shown as part of
the message or offered as a file to save; unspecified sends no
Content-Disposition header and leaves the choice to them.
Replace all mime buttons in the current buffer by attachment buttons.
MIME encode the current mail composition buffer.
This function chooses the MIME character set(s) to use, and transforms the message content from the Emacs-internal encoding to the corresponding octets in that MIME character set.
It then applies some transfer encoding to the message. For details of the
transfer encodings available, see the documentation for
vm-mime-8bit-text-transfer-encoding.
Finally, it creates the headers that are necessary to identify the message as one that uses MIME.
Under MULE, it explicitly sets buffer-file-coding-system to a binary
(no-transformation) coding system, to avoid further transformation of the
message content when it’s passed to the MTA (that is, the mail transfer
agent; under Unix, normally sendmail.)
Attachment tags added to the buffer with vm-attach-file are expanded
and the appropriate content-type and boundary markup information is added.
List mime part structure of the current message.
Show how the current composition buffer might be displayed
in a MIME-aware mail reader. VM copies and encodes the current
mail composition buffer and displays it as a mail folder.
Type q to quit this temp folder and return to composing your
message.
Attach the MIME object at point to a message being composed. The buffer for message composition is queried from the minibuffer.
Convert the MIME object at point to text and display it.
Display the MIME object at point as some other type.
Display the MIME object at point using the default face.
Display the MIME object at point with an external viewer.
Pipe the MIME object at point to a shell command.
Pipe the MIME object at point to a shell command.
Print the MIME object at point.
Write the MIME object at point to a file.
Save the MIME object at point to a folder.
Give the attachment at point a different file name. The name is the one the recipient sees, and the one their mailer will suggest when they save it; the file the attachment was read from is not touched.
Run the vm-mime-function for the MIME button at point.
If optional argument FUNCTION is given, run it instead.
USR, 2011-03-07
Removes the text/html part of all multipart/alternative message parts.
This is a destructive operation and cannot be undone!
Save all attachments in the next COUNT messages or marked
messages. For the purpose of this function, an "attachment" is
a mime part part which has "attachment" as its disposition or
simply has an associated filename. Any mime types that match
vm-mime-saveable-types but not vm-mime-saveable-type-exceptions
are also included.
The attachments are saved to the specified DIRECTORY. The
variables vm-mime-all-attachments-directory or
vm-mime-attachment-save-directory can be used to set the
default location. When directory does not exist it will be
created.
Save all attachments in the next COUNT messages or marked
messages. For the purpose of this function, an "attachment" is
a mime part part which has "attachment" as its disposition or
simply has an associated filename. Any mime types that match
vm-mime-saveable-types but not vm-mime-saveable-type-exceptions
are also included.
The attachments are saved in file names input from the
minibuffer. (This is the main difference from
vm-save-all-attachments.)
The variables vm-mime-all-attachments-directory or
vm-mime-attachment-save-directory can be used to set the
default location. When directory does not exist it will be
confirmed before creating a new directory.
Toggle between best-internal and best mime decoding modes. (Alley Soughton)
The default charset used for attached files of type text.
If set to nil you will be asked for the charset.
If set to guess it will be determined by vm-determine-proper-charset, but
this may take some time, since the file needs to be visited.
Default value: guess
The default MIME-type for attached files.
If set to nil you will be asked for the type if it cannot be guessed.
For guessing mime-types we use vm-mime-attachment-auto-type-alist.
Non-nil value causes MIME decoding to occur automatically
when a message containing MIME objects is exposed. A nil value
means that you will have to run the vm-decode-mime-message
command (normally bound to D) manually to decode and display
MIME objects.
Default value: t
Non-nil means save the attachments of a message as it arrives.
vm-mime-auto-save-all-attachments does the saving, under
vm-mime-attachment-save-directory in a subdirectory named by
vm-mime-auto-save-all-attachments-subdir.
Non-nil value means VM should display messages using MIME. MIME (Multipurpose Internet Mail Extensions) is a set of extensions to the standard Internet message format that allows reliable transmission and reception of arbitrary data including images, audio and video as well as ordinary text.
A non-nil value for this variable means that VM will recognize MIME encoded messages and display them as specified by the various MIME standards specifications.
A nil value means VM will not display MIME messages any differently than any other message.
Default value: t
Flag to allow minibuffer messages about the progress of MIME decoding of messages. Only nontrivial decodings are normally reported. So there is normally no need to change this from the default.
Default value: t
How many lines of a calendar part’s DESCRIPTION to show, or nil for all.
Default value: 10
Whether a calendar part’s DESCRIPTION is shown along with the rest. The description of an invitation is often several screens of dial-in numbers and legal boilerplate, and the parts worth reading – what, when, where, who – come before it.
Default value: t
Non-nil value means that VM should try to infer a MIME object’s
type from its filename when deciding whether the object should be
displayed and how it should be displayed. This will be done only
for objects of type application/octet-stream. The object’s filename
is checked against the regexps in vm-mime-attachment-auto-type-alist
and the type corresponding to the first match found is used.
Non-nil value means VM should try to infer a MIME object’s
type from its filename also for text attachments, not only for application/octet-stream.
Coding systems to try on header text that arrives as raw 8-bit bytes. RFC 5322 allows only ASCII in a header and RFC 2047 provides encoded words for everything else, but plenty of mail carries 8-bit header text anyway, and RFC 6532 makes UTF-8 legal there. Such text says nothing about its own character set, so VM tries these coding systems in order and takes the first that decodes the whole of the text.
The order matters: UTF-8 first, because a byte sequence that is valid UTF-8 is almost never anything else, and a single-byte encoding after it, since that cannot fail and so nothing is left undecoded. Set this to nil to leave raw 8-bit header text exactly as it arrives, which is what VM did before.
Default value: (utf-8 iso-8859-1)
Symbol specifying what kind of transfer encoding to use on 8bit text. Characters with the high bit set cannot safely pass through all mail gateways and mail transport software. MIME has two transfer encodings that convert 8-bit data to 7-bit for safe transport. Quoted-printable leaves the text mostly readable even if the recipient does not have a MIME-capable mail reader. BASE64 is unreadable without a MIME-capable mail reader, unless your name is U3BvY2s=.
A value of quoted-printable, means to use quoted-printable encoding.
A value of base64 means to use BASE64 encoding.
A value of 8bit means to send the message as is.
Note that this variable usually only applies to textual MIME content types. Images, audio, video, etc. typically will have some attribute that makes VM consider them to be "binary", which moves them outside the scope of this variable. For example, messages with line lengths of 1000 characters or more are considered binary, as are messages that contain carriage returns (ascii code 13) or NULs (ascii code 0).
Default value: quoted-printable
Directory to where the attachments should go or come from.
Value tells how to choose which alternative to display when
it displays a message with "multipart/alternative" content.
Possible values are best, best-internal, all, or a
favorite-methods list as described below.
A MIME message of type multipart/alternative has multiple message parts containing the same information, but each part may be formatted differently. VM will typically display only one of the parts. This variable tells VM how to choose which part to display.
(There is a separate variable vm-mime-alternative-yank-method
for deciding the multipart/alternative to be used in replies.)
A value of best means choose the part that is the most
faithful to the sender’s original content that can be displayed.
A value of best-internal means choose the best part that can
be displayed internally, (i.e. with the built-in capabilities of
Emacs) and is allowed to be displayed internally (see
vm-mime-internal-content-types). If none of the parts can be
displayed internally, behavior reverts to that of best.
A value of all means that all the alternatives are displayed.
The value can also be a list of the form
(favorite TYPE ...)
with the first element of the list being the symbol favorite. The
remaining elements of the list are strings specifying MIME types.
VM will look for each TYPE in turn in the list of alternatives and
choose the first matching alternative found that can be displayed.
If the symbol favorite is favorite-internal instead, the first TYPE
that matches an alternative that can be displayed internally will be
chosen.
Default value: best-internal
Value tells how to choose which alternative to yank, i.e.,
include, in replies, when it yanks a message with
"multipart/alternative" content. (It is similar to
vm-mime-alternative-show-method used for displaying messages.)
Possible values are best, best-internal, all, or a
favorite-methods list as described below.
A value of best means choose the part that is the most faithful to
the sender’s original content that can be displayed.
A value of best-internal means choose the best part that can
be displayed internally, (i.e. with the built-in capabilities of
Emacs) and is allowed to be displayed internally (see
vm-mime-internal-content-types). If none of the parts can be
displayed internally, behavior reverts to that of best.
A value of all means that all the alternatives are yanked.
The value can also be a list of the form
(favorite TYPE ...)
with the first element of the list being the symbol favorite. The
remaining elements of the list are strings specifying MIME types.
VM will look for each TYPE in turn in the list of alternatives and
choose the first matching alternative found that can be displayed.
If the symbol favorite is favorite-internal instead, the first TYPE
that matches an alternative that can be displayed internally will be
chosen.
Alist used to select a filename suffix for MIME object temporary files. The list format is
((TYPE . SUFFIX) ...)
TYPE is a string specifying a MIME top-level type or a type/subtype pair. If a top-level type is listed without a subtype, all subtypes of that type are matched.
SUFFIX is a string specifying the suffix that should be used for the accompanying type.
When a MIME object is displayed using an external viewer VM must first write the object to a temporary file. The external viewer opens and displays that file. Some viewers will not open a file unless the filename ends with some extension that it recognizes such as ’.html’ or ’.jpg’. You can use this variable to map MIME types to extensions that your external viewers will recognize. VM will search the list for a matching type. The suffix associated with the first type that matches will be used.
Default value:
(("image/jpeg" . ".jpg") ("image/gif" . ".gif") ("image/png" . ".png")
("image/tiff" . ".tif") ("text/html" . ".html")
("audio/basic" . ".au") ("video/mpeg" . ".mpg")
("video/quicktime" . ".mov") ("application/zip" . ".zip")
("application/postscript" . ".ps") ("application/pdf" . ".pdf")
("application/msword" . ".doc") ("application/vnd.ms-excel" . ".xls")
("application/vnd.ms-powerpoint" . ".ppt")
("application/mac-binhex40" . ".hqx"))
Alist used to guess a MIME content type based on a file name. The list format is
((REGEXP . TYPE) ...)
REGEXP is a string that specifies a regular expression. TYPE is a string specifying a MIME content type.
When a file is attached to a MIME composition buffer using
vm-attach-file, this list will be scanned until a REGEXP
matches the file’s name. The corresponding TYPE will be
offered as a default when you are prompted for the file’s
type.
The value of this variable is also used to guess the MIME type of
application/octet-stream objects for display purposes if the
value of vm-infer-mime-types is non-nil.
A suffix that is not listed here is looked up in Emacs’s mailcap tables, which read the system’s /etc/mime.types: .org is text/x-org there and .patch text/x-patch. This list comes first, so an entry here overrides what the system says.
Default value:
(("\\.jpe?g$" . "image/jpeg") ("\\.gif$" . "image/gif")
("\\.png$" . "image/png") ("\\.tiff?$" . "image/tiff")
("\\.svg$" . "image/svg+xml") ("\\.pcx$" . "image/x-pcx")
("\\.txt$" . "text/plain") ("\\.html?$" . "text/html")
("\\.css$" . "text/css") ("\\.csv$" . "text/csv")
("\\.md$" . "text/markdown") ("\\.markdown$" . "text/markdown")
("\\.json$" . "application/json") ("\\.ya?ml$" . "application/yaml")
("\\.xml$" . "text/xml") ("\\.vcf$" . "text/x-vcard")
("\\.vcard$" . "text/x-vcard") ("\\.au$" . "audio/basic")
("\\.mp4$" . "audio/mp4") ("\\.m4[abpr]$" . "audio/mp4")
("\\.wma$" . "audio/x-ms-wma") ("\\.wax$" . "audio/x-ms-wax")
("\\.ram?$" . "audio/vnd.ra-realaudio") ("\\.ogg$" . "audio/vorbis")
("\\.oga$" . "audio/vorbis") ("\\.wav$" . "audio/vnd.wave")
("\\.mpe?g$" . "video/mpeg") ("\\.m4v$" . "video/mp4")
("\\.mov$" . "video/quicktime") ("\\.ogc$" . "video/ogg")
("\\.wmv$" . "video/x-ms-wmv") ("\\.webm$" . "video/webm")
("\\.zip$" . "application/zip") ("\\.gz$" . "application/x-gzip")
("\\.tar$" . "application/x-tar")
("\\.rar$" . "application/x-rar-compressed")
("\\.e?ps$" . "application/postscript")
("\\.pdf$" . "application/pdf") ("\\.dvi$" . "application/x-dvi")
("\\.tex$" . "application/x-latex")
("\\.ttf$" . "application/x-font-ttf")
("\\.swf$" . "application/x-shockwave-flash")
("\\.tex$" . "application/x-latex")
("\\.js$" . "application/javascript")
("\\.dtd$" . "application/xml-dtd") ("\\.pdf$" . "application/pdf")
("\\.rtf$" . "application/rtf") ("\\.doc$" . "application/msword")
("\\.xls$" . "application/vnd.ms-excel")
("\\.ppt$" . "application/vnd.ms-powerpoint")
("\\.mdb$" . "application/vnd.ms-access")
("\\.odt$" . "application/vnd.oasis.opendocument.text")
("\\.odp$" . "application/vnd.oasis.opendocument.presentation")
("\\.ods$" . "application/vnd.oasis.opendocument.spreadsheet")
("\\.odg$" . "application/vnd.oasis.opendocument.graphics")
("\\.odf$" . "application/vnd.oasis.opendocument.formulae")
("\\.odb$" . "application/vnd.oasis.opendocument.databases")
("\\.docx$"
. "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
("\\.docm$"
. "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
("\\.pptx$"
. "application/vnd.openxmlformats-officedocument.presentationml.presentation")
("\\.pptm$ "
. "application/vnd.openxmlformats-officedocument.presentationml.presentation")
("\\.xlsx$"
. "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
("\\.xlsm$"
. "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
("\\.hqx$" . "application/mac-binhex40"))
Non-nil value is a default directory for saving MIME attachments. When VM prompts you for a target file name when saving a MIME body, any relative pathnames will be relative to this directory.
Default value: worked out when VM is loaded, from this system.
Non-nil value is a default source directory for MIME attachments.
When vm-attach-file prompts you for the name of a file to
attach, any relative pathnames will be relative to this directory.
Default value: worked out when VM is loaded, from this system.
List of MIME content types that should not be displayed immediately
after decoding. These types will be displayed as a button that you
must activate to display the object. This is an exception list for
the types listed in vm-mime-auto-displayed-content-types; all types
listed there will be auto-displayed except those in the exception
list.
The value should be either nil or a list of strings. The strings should all be types or type/subtype pairs. Example:
(setq vm-mime-auto-displayed-content-type-exceptions ’("text/html"))
If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
List of MIME content types that should be displayed immediately after decoding. Other types will be displayed as a button that you must activate to display the object.
A value of t means that all types should be displayed immediately. A nil value means never display MIME objects immediately; only use buttons.
If the value is a list, it should be a list of strings, which should all be types or type/subtype pairs. Example:
(setq vm-mime-auto-displayed-content-types ’("text" "image/jpeg"))
If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
Note that all multipart types are processed specially, and this variable does not apply to them. In particular,
multipart/digest messages are always displayed as a button to avoid automatically visiting a new folder while you are moving around in the current folder. message/partial messages are always displayed as a button, because there always needs to be a way to trigger the assembly of the parts into a full message.
Any type that cannot be displayed internally or externally will be displayed as a button that allows you to save the body of the MIME object to a file.
Default value: ("text" "image" "message/rfc822")
Subdirectory where to save the attachments of a message. This variable might be set to a string, a function or anything which evaluates to a string. If set to nil we use a concatenation of the from, subject and date header as subdir for the attachments.
Non-nil means don’t send folded Content- headers in MIME messages.
Folded headers are headers broken into multiple lines as specified
in RFC822 for readability and to avoid excessive line lengths. At
least one major UNIX vendor ships a version of sendmail that believes
a folded Content-Type header is a syntax error, and returns any such
message to sender. A typical error message from such a sendmail
version is,
553 header syntax error, line " charset=us-ascii"
If you see one of these, setting vm-mime-avoid-folding-content-type
non-nil may let your mail get through.
Default value: t
List of types and formats for MIME buttons.
When VM does not display a MIME object immediately, it displays a
button or tag line in its place that describes the object and what you
have to do to display it. The value of vm-mime-button-format-alist
determines the format of the text in those buttons.
The format of the list is
((TYPE . FORMAT) (TYPE . FORMAT) ...)
The list is searched sequentially and the FORMAT corresponding to the first TYPE that matches the type of the button’s object is used.
TYPE should be a string specifying a top level type or a type/subtype pair. If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
FORMAT should be a string specifying the text of the button. The
string should not include a newline. The string may contain the
printf-like % conversion specifiers which substitute information
about the MIME object into the button.
Recognized specifiers are:
a - the default action of the button. E.g. "display image" for images,
"display text" for text objects and so on.
c - the character set of the object. Usually only specified
for text objects. Displays as "us-ascii" if the MIME object
does not specify a character set.
d - the content description of the object taken from the
Content-Description header, if present. If the header
isn’t present, a generic description is provided.
e - the content transfer encoding, either "base64" or
"quoted-printable".
f - the suggested file name to save the object into, as
specified either in the Content-Disposition header, or the
"name" parameter for objects of type "application".
k - how to activate the button. Usually "Press RETURN" or
"Click mouse-2".
n - for multipart types this is the number of bundled parts,
messages, whatever.
N - for message/partial objects, the part number.
s - an empty string if %n would display "1", otherwise
"s".
t - the content type of the object, e.g. "text/enriched".
T - for message/partial objects, the total number of expected
parts. "?" is displayed if the object doesn’t specify
the total number of parts expected.
x - the content type of the external body of a message/external-body
object.
( - starts a group, terminated by %). Useful for specifying
the field width and precision for the concatenation of
group of format specifiers. Example: "%.25(%d, %t, %f%)"
specifies a maximum display width of 25 characters for the
concatenation of the content description, content type and
suggested file name.
) - ends a group.
Use %% to get a single %.
A numeric field width may be given between the % and the specifier;
this causes right justification of the substituted string. A negative field
width causes left justification. A width beginning with 0 fills with
zeros rather than spaces, for the specifiers whose substitution is a
number (%n, %N and %T); a negative width fills with spaces whatever the
0 says, since zeros to the right of a number make a different number.
The field width may be followed by a . and a number specifying
the maximum allowed length of the substituted string. If the
string is longer than this value the right end of the string is
truncated. If the value is negative, the string is truncated on
the left instead of the right.
The maximum is applied first and the width after it, as in printf: "%20.4s" is four columns of the substitution in a column twenty wide. The two are usually written with the same number, which makes a column of exactly that width.
Default value:
(("text" . "%-60.60(%t (%c): %f, %d%) %10.10([%a]%)")
("multipart/alternative" . "%-50.50(%d%) %20.20([%a]%)")
("multipart/digest" . "%-50.50(%d, %n message%s%) %20.20([%a]%)")
("multipart" . "%-50.50(%d, %n part%s%) %20.20([%a]%)")
("message/partial" . "%-50.50(%d, part %N (of %T)%) %20.20([%a]%)")
("message/external-body" . "%-55.55(%d%) [%a (%x)]")
("message" . "%-50.50(%d%) %20.20([%a]%)")
("audio" . "%-55.55(%t: %f, %d%) %10.10([%a]%)")
("video" . "%-55.55(%t: %f, %d%) %10.10([%a]%)")
("image" . "%-55.55(%t: %f, %d%) %10.10([%a]%)")
("application" . "%-55.55(%t: %f, %d%) %10.10([%a]%)"))
The completion alist of MIME charsets known to VM. The default
information is derived from vm-mime-mule-charset-to-coding-alist (which see).
Default value:
(("us-ascii") ("unknown") ("windows-1256") ("windows-1256")
("iso-8859-6") ("windows-1258") ("windows-1258") ("viscii")
("viscii") ("iso-8859-11") ("cp874") ("cp874") ("iso-2022-kr")
("iso-2022-kr") ("euc-kr") ("euc-kr") ("euc-kr") ("euc-kr")
("euc-jis-2004") ("euc-jis-2004") ("iso-2022-jp-2004")
("iso-2022-jp-2004") ("euc-jp") ("euc-jp") ("euc-jp") ("euc-jp")
("shift_jis") ("shift_jis") ("shift_jis") ("iso-2022-jp-2")
("iso-2022-jp") ("iso-2022-jp") ("cp862") ("cp862") ("windows-1255")
("windows-1255") ("iso-8859-8") ("iso-8859-8") ("iso-8859-8")
("iso-8859-8") ("cp869") ("cp869") ("cp851") ("cp851") ("cp737")
("windows-1253") ("windows-1253") ("iso-8859-7") ("iso-8859-7")
("iso-8859-16") ("iso-8859-16") ("iso-8859-16")
("adobe-standard-encoding") ("hp-roman8") ("hp-roman8") ("next")
("macintosh") ("macintosh") ("cp437") ("cp437") ("cp865") ("cp865")
("cp863") ("cp863") ("cp861") ("cp861") ("cp860") ("cp860") ("cp858")
("cp857") ("cp857") ("cp852") ("cp852") ("cp850") ("cp850") ("cp775")
("cp775") ("windows-1257") ("windows-1257") ("windows-1254")
("windows-1254") ("windows-1252") ("windows-1252") ("windows-1250")
("windows-1250") ("iso-8859-15") ("iso-8859-15") ("iso-8859-15")
("iso-8859-15") ("iso-8859-14") ("iso-8859-14") ("iso-8859-14")
("iso-8859-13") ("iso-8859-13") ("iso-8859-13") ("iso-8859-10")
("iso-8859-10") ("iso-8859-10") ("iso-8859-9") ("iso-8859-9")
("iso-8859-9") ("iso-8859-4") ("iso-8859-4") ("iso-8859-4")
("iso-8859-3") ("iso-8859-3") ("iso-8859-3") ("iso-8859-2")
("iso-8859-2") ("iso-8859-2") ("cp855") ("cp855") ("windows-1251")
("windows-1251") ("koi8-t") ("cp866") ("koi8-u") ("koi8-r")
("koi8-r") ("koi8-r") ("koi8-r") ("iso-8859-5") ("iso-8859-5")
("gb18030") ("gb18030") ("gbk") ("gbk") ("gbk") ("gbk") ("euc-tw")
("euc-tw") ("big5-hkscs") ("big5-hkscs") ("big5-hkscs") ("big5")
("big5") ("big5") ("big5") ("hz-gb-2312") ("hz-gb-2312")
("hz-gb-2312") ("gb2312") ("gb2312") ("gb2312") ("gb2312") ("gb2312")
("gb2312") ("iso-2022-cn-ext") ("iso-2022-cn") ("iso-2022-cn")
("utf-7") ("us-ascii") ("us-ascii") ("us-ascii") ("x-ctext")
("x-ctext") ("x-ctext") ("x-ctext") ("x-ctext") ("x-ctext")
("utf-16") ("utf-16") ("utf-16") ("utf-16") ("utf-16") ("utf-16be")
("utf-16le") ("utf-8") ("utf-8") ("utf-8") ("iso-8859-1")
("iso-8859-1") ("iso-8859-1"))
Alist of MIME charsets and programs that can convert between them. Consulted for a charset Emacs has no coding system for, such as "windows-874", "x-mac-roman" or "unknown-8bit": text declaring one of those is guessed at rather than decoded, and a command named here converts it first. A charset Emacs can decode is left alone, whatever this says.
The alist format is
( ( START-CHARSET END-CHARSET COMMAND-LINE ) ... )
START-CHARSET is a string specifying a MIME charset, one Emacs has no coding system for. Example "windows-874" or "x-mac-roman".
END-CHARSET is a string specifying the charset to which START-CHARSET will be converted.
COMMAND-LINE is a string giving a command line to be passed to the shell. The characters in START-CHARSET will be written to the standard input of the shell command and VM expects characters encoded in END-CHARSET to appear at the standard output of the COMMAND-LINE. COMMAND-LINE is passed to the shell, so you can use pipelines, shell variables and redirections.
Example:
(setq vm-mime-charset-converter-alist ’(("windows-874" "utf-8" "iconv -f cp874 -t utf-8 -c")))
The first matching list element will be used.
Whether to complete an HTML part before an external viewer sees it.
Plenty of mail carries text/html that is a fragment rather than a document:
it opens with a <span> or a <div> and has no <html> and no <head>.
Nothing in such a file says what character set its bytes are in – the
message said so in the part’s Content-Type header, which the file does not
have – so a browser handed it guesses, and gets an accented letter or a
curly quote wrong.
With this set, VM wraps a fragment in a document that declares the part’s
charset before handing it over. A part with an <html> tag of its own, or
one that declares a charset itself, is written out untouched. The text is
never re-encoded; only the wrapper is added.
Issue #387.
Default value: t
Non-nil value means "From " lines should be armored before sending. A line beginning with "From " is considered a message separator by many mail delivery agents. These agents will often insert a > before the word "From" to prevent mail readers from being confused. This is proper behavior, but it breaks digitally signed messages, which require bit-perfect transport in order for the message contents to be considered genuine.
If vm-mime-composition-armor-from-lines is non-nil, a line
beginning with "From " will cause VM to encode the message
using either quoted-printable or BASE64 encoding so that the From
line can be protected.
Non-nil value causes VM to request confirmation from the user before
deleting a MIME object with vm-delete-mime-object.
Default value: t
Non-nil value causes partial MIME decoding to happen when a message
is previewed, instead of when it is displayed in full. The point of
this is if vm-preview-lines is set to a non-nil, non-zero
value you can see readable text instead of a potentially inscrutable
MIME jumble. vm-auto-decode-mime-messages must also be set non-nil
for this variable to have effect.
Default value: t
List of MIME types which should not be deleted.
Default value: ("text")
List of MIME types which should be deleted.
Default value: ("application" "x-unknown" "application/x-gzip")
Non-nil value causes VM to delete MIME body contents from a folder after the MIME object has been saved to disk. The MIME object is replaced with a message/external-body object that points to the disk copy of the object.
Non-nil value causes VM to kill external MIME viewer processes when you switch to a different message or quit the current message’s folder.
Default value: t
The label that will be inserted instead of the original mime object.
See vm-mime-compile-format-1 for valid format specifiers.
Default value: "[Deleted %f (%t)]\n"
If non-nil, this should name a function to be called inside
vm-decode-mime-message to do the MIME display the current
message. The function is called with no arguments, and at the
time of the call the current buffer will be the presentation
buffer for the folder, which is a temporary buffer that VM uses
for the display of MIME messages. A copy of the current message
will be in the presentation buffer at that time. The normal work
that vm-decode-mime-message would do is not done, because this
function is expected to subsume all of it.
Non-nil means display image strips as they are created
rather than waiting until all the strips are created and displaying
them all at once. See vm-mime-use-image-strips.
Default value: t
A regexp matching the headers whose words should be MIME-encoded.
A header holding a character outside US-ASCII cannot be sent as it stands;
the words carrying those characters are encoded as RFC 2047 words instead.
By default Subject, Organization, From, To, CC, BCC and their Resent- forms
are encoded. vm-mime-encode-headers-type says with which encoding.
Default value:
"Subject\\|\\(\\(Resent-\\)?\\(From\\|To\\|CC\\|BCC\\)\\)\\|Organization"
The encoding to use for the words of a header, Q or B. Q is quoted-printable, which leaves the ASCII part of the word readable to someone whose mail reader does not decode it; B is base64, which does not but is shorter for a word that is mostly non-ASCII. A regexp value picks base64 for the words it matches and quoted-printable for the rest.
Default value: Q
A regexp matching the run of words to encode as one RFC 2047 word. A word here is delimited by whitespace or a comma, and a run of them is encoded together rather than one at a time, which is shorter and is what the standard asks for. What makes a word need encoding is a character outside US-ASCII, which this regexp matches for itself.
Default value:
"[ , \\15]\\(\\([^ , \\15]*[^\\0-\\177]+[^ , \\15]*\\)+\\(\\s-+\\([^ , \\15]*[^\\0-\\177]+[^ , \\15]*\\)+\\)*\\)"
List of MIME content types that should not be displayed externally
without a manual request from the user. This is an exception list
for the types specified in vm-mime-external-content-types-alist;
types listed there will not be displayed using the specified viewer
unless you explicitly request it by menu or $ e from the keyboard.
The value should be a list of strings. Example:
(setq vm-mime-external-content-type-exceptions ’("text/html"))
If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
Alist of MIME content types and the external programs used to display them.
If VM cannot display a type internally or has been instructed not
to (see the documentation for the vm-mime-internal-content-types
variable) it will try to launch an external program to display that
type.
The alist format is a list of lists, each sublist having the form
(TYPE FUNCTION ARG ... )
or
(TYPE PROGRAM ARG ARG ... )
or
(TYPE COMMAND-LINE)
TYPE is a string specifying a MIME type or type/subtype pair. For example "text" or "image/jpeg". If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
In the first form, FUNCTION is a lisp function that is responsible for displaying the attachment in an external application. Any ARGS will be passed to the function as arguments. The octets that compose the object will be written into a temporary file and the name of the file is passed as an additional argument.
In the second form, PROGRAM is a string naming a program to run to
display an object. Any ARGS will be passed to the program as
arguments. The octets that compose the object will be written
into a temporary file and the name of the file can be inserted
into an ARG string by writing %f. In earlier versions of VM the
filename was always added as the last argument; as of VM 6.49 this
is only done if %f does not appear in any of the ARG strings.
The filename inserted by %f will be quoted by shell-quote-argument
and thus no single quotes should be used, i.e. do not use the following
"...’%f’...".
If the COMMAND-LINE form is used, the program and its arguments are specified as a single string and that string is passed to the shell for execution. Since the command line will be passed to the shell, you can use shell variables and redirection if needed. As with the PROGRAM/ARGS form, the name of the temporary file that contains the MIME object will be appended to the command line if %f does not appear in the command line string.
In either the PROGRAM/ARG or COMMAND-LINE forms, all the
program and argument strings will have any %-specifiers in
them expanded as described in the documentation for the
variable vm-mime-button-format-alist. The only difference
is that %f refers to the temporary file VM creates to store
the object to be displayed, not the filename that the sender
may have associated with the attachment.
Example:
(setq vm-mime-external-content-types-alist
'(("text/html" browse-url-of-file)
("image/gif" "xv")
("image/jpeg" "xv")
("video/mpeg" "mpeg_play")
("video" w32-shell-execute "open")))
The first matching list element will be used.
No multipart message will ever be sent to an external viewer.
Whether to give an external viewer the images an HTML part refers to.
A sender who puts a picture in an HTML message attaches it as another part and
refers to it as cid:something (RFC 2392). VM shows such a part to an
external viewer by writing it to a file, and a browser handed that one file has
no way to reach the rest of the message – so it draws a broken image where the
picture should be.
With this set, the parts an HTML file refers to are written beside it and the references are rewritten to name them, so the message looks as it was meant to. That means the images reach the disk in the temporary directory, along with the HTML itself, until VM deletes them with the rest of a message’s temporary files. Set it to nil to send the HTML alone, as VM used to.
Default value: t
Non-nil value means that any attachments saved to local files
using, for example vm-save-all-attachments, will be
retrieved and re-attached to forwarded messages.
Nil value means that the messages will be forwarded with external references to the saved attachments. The recipients will need to fetch the attachments themselves if they have access to your file system.
This replaces the variable vm-mime-forward-local-external-bodies in
previous versions of VM. If you had set that variable to nil then
you should set this variable to t.
Default value: t
Non-nil value means use information from the Content-Disposition
header to display MIME messages. Possible values are t, to mean that the
Content-Disposition header should always be honored or internal-only,
to mean that an "inline" disposition should be honored only for
internally-displayable types.
The Content-Disposition header specifies whether a MIME object should be displayed inline or treated as an attachment. For VM, "inline" display means displaying the object in the Emacs buffer, if possible. Attachments will be displayed as a button that you can use mouse-2 to activate or mouse-3 to pull up a menu of options.
Non-nil means VM should ignore transfer encoding declarations of base64 and quoted-printable for object of type message/* or multipart/*. The MIME spec requires that these composite types use either 7bit, 8bit, or binary transfer encodings but some mailers declare quoted-printable and base64 even when they are not used. Set this variable non-nil if you want VM to be lax and ignore this problem and try to display the object anyway.
Default value: t
Non-nil value means ignore the version number in the MIME-Version
header. VM only knows how to decode and display MIME version 1.0
messages. Some systems scramble the MIME-Version header, causing
VM to believe that it cannot display a message that it actually
can display. You can set vm-mime-ignore-mime-version non-nil if
you use such systems.
Default value: t
Non-nil means VM should treat a missing MIME boundary marker as if the marker were at the end of the current enclosing MIME object or, if there is no enclosing object, at the end of the message. A nil value means VM will complain about missing boundaries and refuse to parse such MIME messages.
Default value: t
List of MIME content types that should not be displayed internally.
This is an exception list for the types specified in
vm-mime-internal-content-types; all types listed there will be
displayed internally except for those in the exception list.
The value should be a list of strings. Example:
(setq vm-mime-internal-content-type-exceptions ’("image/jpeg"))
If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
List of MIME content types that should be displayed internally
if Emacs is capable of doing so. A value of t means that VM
displays all types internally if possible. A list of exceptions
can be specified via vm-mime-internal-content-type-exceptions.
A nil value means never display MIME objects internally, which
means VM must run an external viewer to display MIME objects.
If the value is a list, it should be a list of strings. Example:
(setq vm-mime-internal-content-types ’("text" "message" "image/jpeg"))
If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
Note that all multipart types are always handled internally. There is no need to list them here.
Default value: t
Largest MIME message that VM should send without fragmentation. The value should be an integer which specifies the size in bytes. A message larger than this value will be split into multiple parts for transmission using the MIME message/partial type.
Longest line VM sends in a text part without encoding it.
A longer line is sent quoted-printable, which carries it as several
physical lines each ending in = and has the recipient’s mail reader put
it back together, so the line arrives as the one line you wrote.
998 is the default because it is the limit RFC 5322 sets: a longer line cannot be sent unencoded whatever anyone would prefer. The same RFC asks for 78, which is what most mail readers wrap to, and setting this to 78 makes VM encode anything longer – which is what Gmail does with every message it sends.
A nil value means never to encode a line for its length alone. The 998 limit still applies, since a line past it cannot go out as it stands.
This is not the same as wrapping the text. vm-fill-long-lines-in-reply
rewrites long lines before sending, and vm-send-using-flowed-text marks
VM’s own wrapping as undoable by the recipient; both change where the line
breaks are. This one keeps them exactly where you put them.
Default value: 998
Value tells how to handle "multipart/related" attachments in
email messages. The possible values are mixed and related.
The value of mixed asks VM to treat "multipart/related"
attachments the same way as "multipart/mixed" attachments, i.e., all
of them will be displayed either as buttons or as content.
The value of related asks VM to use them as related parts which means
that they will be embedded in rendered "text/html" parts.
Some mail messages arrive with wrong placement of the
"multipart/related" content, inhibiting the html viewers from
accessing them. In that case, setting this variable to mixed will
allow you to view them separately.
Default value: related
Separator string to insert between mime parts when displayed one after another.
Default value:
" ---------------------------------------------------------------------- "
Non-nil means a message must contain MIME-Version to be considered MIME. The MIME standard requires that MIME messages contain a MIME-Version, but some mailers ignore the standard and do not send the header. Set this variable to nil if you want VM to be lax and parse such messages as MIME anyway.
List of MIME types which should not be saved.
Default value: ("text")
List of MIME types which should be saved.
Default value: ("application" "x-unknown" "application/x-gzip")
Non-nil means the shr HTML handler displays no images.
A remote image in a message is fetched from the sender’s server, which then knows the message was opened and when. That is why this is on by default, and why VM binds it while rendering rather than leaving it to the shr settings a reader has chosen for the web.
Default value: t
The library used for displaying HTML messages. The possible values are:
emacs-w3m The emacs interface to the w3m viewer, w3m The w3m viewer used externally to convert to plain text, lynx The lynx viewer used externally to convert to plain text, shr Emacs's own renderer, which needs nothing installed, auto-select Automatic selection among these alternatives, and nil No internal display of HTML messages.
Only shr is always available; the others need a package or a program.
auto-select takes the first this machine has and falls back to shr.
Default value: auto-select
If thumbnails should be displayed as part of MIME buttons, then set this variable to a string describing the geometry, e.g., "80x80". Otherwise, set it to nil. USR, 2011-03-25
Default value: "80x80"
Alist of MIME types and programs that can convert between them. If VM cannot display a content type, it will scan this list to see if the type can be converted into a type that it can display.
The alist format is
( (START-TYPE END-TYPE COMMAND-LINE ) ... )
START-TYPE is a string specifying a MIME type or type/subtype pair. Example "text" or "image/jpeg". If a top-level type is listed without a subtype, all subtypes of that type are assumed to be included.
END-TYPE must be an exact type/subtype pair. This is the type to which START-TYPE will be converted.
COMMAND-LINE is a string giving a command line to be passed to the shell. The octets that compose the object will be written to the standard input of the shell command.
Example:
(setq vm-mime-type-converter-alist
'(("image/jpeg" "image/gif" "jpeg2gif")
("text/html" "text/plain" "striptags")))
The first matching list element will be used.
List of coding systems that can encode all characters known to emacs.
Default value: (utf-8 iso-2022-jp ctext escape-quoted)
Non-nil means honour the format=flowed parameter of RFC 3676.
A sender that does not know how wide your window is can wrap the text itself
and mark each break it invented by leaving a space at the end of the line.
With this set, VM joins those lines back together, so that
vm-fill-paragraphs-containing-long-lines can wrap the paragraph to the width
you actually have; breaks the author meant are kept either way.
A nil value shows the text with the sender’s own line breaks, which is what VM did before it knew about the format.
Default value: t
Non-nil means chop an image into horizontal strip for display.
Emacs treats a displayed image as a single large character and cannot
scroll vertically within an image. To work around this limitation VM
can display an image as a series of contiguous horizontal strips that
Emacs’ scrolling routines can better handle. To do this VM needs to
have the ImageMagick programs convert and identify installed;
vm-imagemagick-convert-program and vm-imagemagick-identify-program
must point to them.
A nil value means VM should display images without cutting them into strips.
Default value: t
Non-nil value means that VM should attempt to verify signatures attached in "multipart/signed" parts.
Non-nil means send plain text as format=flowed, per RFC 3676. Each line of a paragraph but the last is sent with a space at the end of it, which tells the reader that the break was VM’s choice rather than yours and may be undone – so the recipient sees the text wrapped to their own window instead of to your fill column. Breaks you made yourself, at the end of a paragraph or a line you deliberately kept short, are sent as they are.
This is off by default: it changes what goes out on the wire, and a reader
that does not know the format shows the trailing spaces as trailing spaces.
Receiving the format is controlled separately, by
vm-mime-unflow-flowed-text.
Non-nil value means VM should support sending messages using MIME. MIME (Multipurpose Internet Mail Extensions) is a set of extensions to the standard Internet message format that allows reliable transmission and reception of arbitrary data including images, audio and video as well as traditional text.
A non-nil value for this variable means that VM will
- allow you to attach files and messages to your outbound message.
- analyze the composition buffer when you send off a message and
encode it as needed.
A nil value means VM will not offer any support for composing MIME messages.
Default value: t
The method by which VM should find the certificates to use in encrypting this S/MIME encoded composition. Valid valus are as follows:
‘ask’ - Ask the user to specify the files manually each time. The
user will be prompted for a file name and whether they want
to specify another thereafter and so on.
‘links’ - This method assumes that there exist links under
‘smime-certificate-directory’ given by the recipient address
to the appropriate PEM encoded certificate, i.e.
~/CERTS/bob@somewhere.com -> ~/CERTS/bob_johnstons_certificate.pem
If any recipient in the message does not have such a link
the sender will be asked if they would like to supply an
alternative file
Default value: ask
Non-nil means VM may retrieve a URL over the network.
VM needs to when it supports the message/external-body MIME type, which
gives a reference to an object instead of the object itself. Emacs does the
retrieving, through url-retrieve-synchronously, so nothing need be
installed and no program is named here.
Set it to nil to refuse: an external-body URL is fetched from a server that then knows the message was opened, which is not always wanted.
Earlier releases took a list of external programs to try, such as ’(lynx wget fetch curl w3m). Such a value still reads as non-nil and so still permits retrieval; which program it names is now ignored.
Default value: t
Seconds to wait for a URL that VM is retrieving, or nil for no limit. A message/external-body part whose server does not answer would otherwise hold up Emacs for as long as the server cared to take.
Default value: 30
These are invoked by a toolbar button, a menu entry, a mouse binding, a keymap entry or a hook rather than typed by name. Nothing stops you calling one.
Major mode for reading mail.
This is VM.
Use M-x vm-submit-bug-report to submit a bug report.
Commands:
Key Binding ------------------------------------------------------------------------------- 0 .. 9 digit-argument C-d vm-delete-message-backward TAB vm-goto-message-last-seen RET vm-goto-message C-t vm-toggle-threads-display C-_ vm-undo SPC vm-scroll-forward ! vm-toggle-flag-message - negative-argument . vm-mark-message-read < vm-promote-subthread > vm-demote-subthread ? vm-help @ vm-send-digest A vm-auto-archive-messages B vm-resend-message C vm-collapse-all-threads D vm-decode-mime-message E vm-expand-all-threads F vm-followup-include-text G vm-sort-messages K vm-kill-thread-subtree N vm-next-message-no-skip O vm-unload-message P vm-previous-message-no-skip R vm-reply-include-text S vm-save-folder T vm-toggle-thread U vm-mark-message-unread Z vm-forward-message-plain [ vm-move-to-previous-button ] vm-move-to-next-button ^ vm-goto-parent-message c vm-continue-composing-message d vm-delete-message f vm-followup g vm-get-new-mail h vm-summarize j vm-discard-cached-data k vm-kill-subject m vm-mail-from-folder n vm-next-message o vm-load-message p vm-previous-message q vm-quit r vm-reply s vm-save-message t vm-expose-hidden-headers u vm-undelete-message v vm-visit-folder x vm-quit-no-change z vm-forward-message DEL vm-scroll-backward C-/ vm-undo <backspace> vm-scroll-backward <delete> vm-scroll-backward C-c C-d vm-delete-all-attachments C-c C-e vm-edit-message C-c C-s vm-save-all-attachments C-x C-q vm-toggle-read-only C-x C-s vm-save-folder C-x C-w vm-write-file C-x u vm-undo C-M-n vm-move-message-forward C-M-p vm-move-message-backward M-C vm-show-copying-restrictions M-W vm-show-no-warranty M-n vm-next-unread-message M-p vm-previous-unread-message M-r vm-resend-bounced-message M-s vm-isearch-forward M ? vm-mark-help M A vm-mark-messages-same-author M C vm-mark-messages-by-selector M M vm-mark-message M N vm-next-command-uses-marks M R vm-mark-summary-region M S vm-mark-messages-same-subject M T vm-mark-thread-subtree M U vm-unmark-message M V vm-toggle-all-marks M X vm-mark-messages-by-virtual-folder M a vm-unmark-messages-same-author M c vm-unmark-messages-by-selector M m vm-mark-all-messages M n vm-next-command-uses-marks M r vm-unmark-summary-region M s vm-unmark-messages-same-subject M t vm-unmark-thread-subtree M u vm-clear-all-marks M x vm-unmark-messages-by-virtual-folder V ! vm-create-flagged-virtual-folder V ? vm-virtual-help V A vm-create-virtual-folder-same-author V C vm-create-virtual-folder V D vm-virtual-auto-delete-message V M vm-toggle-virtual-mirror V O vm-virtual-omit-message V R vm-create-virtual-folder-same-recipient V S vm-create-virtual-folder-same-subject V T vm-create-virtual-folder-of-threads V U vm-virtual-update-folders V V vm-visit-virtual-folder V X vm-apply-virtual-folder V a vm-create-author-virtual-folder V d vm-create-date-virtual-folder V l vm-create-label-virtual-folder V n vm-create-new-virtual-folder V r vm-create-author-or-recipient-virtual-folder V s vm-create-subject-virtual-folder V t vm-create-text-virtual-folder V u vm-create-unseen-virtual-folder W ? vm-window-help W D vm-delete-window-configuration W S vm-save-window-configuration W W vm-apply-window-configuration l a vm-add-message-labels l d vm-delete-message-labels l e vm-add-existing-message-labels | d vm-pipe-message-to-command-discard-output | n vm-pipe-messages-to-command-discard-output | s vm-pipe-messages-to-command | | vm-pipe-message-to-command # # # vm-expunge-folder
Customize VM by setting variables and store them in the vm-init-file.
Not autoloaded: VM has to be loaded before M-x offers this one.
Not documented.
Not autoloaded: VM has to be loaded before M-x offers this one.
Encodes the headers of a message.
Only the words containing a non-ASCII characters are encoded, but not the whole header as this will cause trouble for the recipient and author headers.
Whitespace between encoded words is trimmed during decoding and thus those should be encoded together.
A run too long for one encoded word becomes several in a row, RFC 2047
allowing 75 characters each, and a header line longer than
vm-mime-header-line-limit is folded at whitespace. Both are undone by the
reader: a folded line is joined back up, and the whitespace between two
adjacent encoded words is dropped.
Not autoloaded: VM has to be loaded before M-x offers this one.
Major mode for reading mail.
This is VM.
Use M-x vm-submit-bug-report to submit a bug report.
Commands:
Key Binding ------------------------------------------------------------------------------- 0 .. 9 digit-argument C-d vm-delete-message-backward TAB vm-goto-message-last-seen RET vm-goto-message C-t vm-toggle-threads-display C-_ vm-undo SPC vm-scroll-forward ! vm-toggle-flag-message - negative-argument . vm-mark-message-read < vm-promote-subthread > vm-demote-subthread ? vm-help @ vm-send-digest A vm-auto-archive-messages B vm-resend-message C vm-collapse-all-threads D vm-decode-mime-message E vm-expand-all-threads F vm-followup-include-text G vm-sort-messages K vm-kill-thread-subtree N vm-next-message-no-skip O vm-unload-message P vm-previous-message-no-skip R vm-reply-include-text S vm-save-folder T vm-toggle-thread U vm-mark-message-unread Z vm-forward-message-plain [ vm-move-to-previous-button ] vm-move-to-next-button ^ vm-goto-parent-message c vm-continue-composing-message d vm-delete-message f vm-followup g vm-get-new-mail h vm-summarize j vm-discard-cached-data k vm-kill-subject m vm-mail-from-folder n vm-next-message o vm-load-message p vm-previous-message q vm-quit r vm-reply s vm-save-message t vm-expose-hidden-headers u vm-undelete-message v vm-visit-folder x vm-quit-no-change z vm-forward-message DEL vm-scroll-backward C-/ vm-undo <backspace> vm-scroll-backward <delete> vm-scroll-backward C-c C-d vm-delete-all-attachments C-c C-e vm-edit-message C-c C-s vm-save-all-attachments C-x C-q vm-toggle-read-only C-x C-s vm-save-folder C-x C-w vm-write-file C-x u vm-undo C-M-n vm-move-message-forward C-M-p vm-move-message-backward M-C vm-show-copying-restrictions M-W vm-show-no-warranty M-n vm-next-unread-message M-p vm-previous-unread-message M-r vm-resend-bounced-message M-s vm-isearch-forward M ? vm-mark-help M A vm-mark-messages-same-author M C vm-mark-messages-by-selector M M vm-mark-message M N vm-next-command-uses-marks M R vm-mark-summary-region M S vm-mark-messages-same-subject M T vm-mark-thread-subtree M U vm-unmark-message M V vm-toggle-all-marks M X vm-mark-messages-by-virtual-folder M a vm-unmark-messages-same-author M c vm-unmark-messages-by-selector M m vm-mark-all-messages M n vm-next-command-uses-marks M r vm-unmark-summary-region M s vm-unmark-messages-same-subject M t vm-unmark-thread-subtree M u vm-clear-all-marks M x vm-unmark-messages-by-virtual-folder V ! vm-create-flagged-virtual-folder V ? vm-virtual-help V A vm-create-virtual-folder-same-author V C vm-create-virtual-folder V D vm-virtual-auto-delete-message V M vm-toggle-virtual-mirror V O vm-virtual-omit-message V R vm-create-virtual-folder-same-recipient V S vm-create-virtual-folder-same-subject V T vm-create-virtual-folder-of-threads V U vm-virtual-update-folders V V vm-visit-virtual-folder V X vm-apply-virtual-folder V a vm-create-author-virtual-folder V d vm-create-date-virtual-folder V l vm-create-label-virtual-folder V n vm-create-new-virtual-folder V r vm-create-author-or-recipient-virtual-folder V s vm-create-subject-virtual-folder V t vm-create-text-virtual-folder V u vm-create-unseen-virtual-folder W ? vm-window-help W D vm-delete-window-configuration W S vm-save-window-configuration W W vm-apply-window-configuration l a vm-add-message-labels l d vm-delete-message-labels l e vm-add-existing-message-labels | d vm-pipe-message-to-command-discard-output | n vm-pipe-messages-to-command-discard-output | s vm-pipe-messages-to-command | | vm-pipe-message-to-command # # # vm-expunge-folder
Customize VM by setting variables and store them in the vm-init-file.
Not autoloaded: VM has to be loaded before M-x offers this one.
Removes all message marks in the current folder.
Mark all messages in the current folder.
Show the mark commands and their keys in the echo area.
Mark messages matching a virtual selector.
You can use any of the virtual folder selectors, except for the
and, or and not selectors. See the documentation for the
variable vm-virtual-folder-alist for more information.
Mark messages that are matched by the selectors of virtual folder NAME.
Mark the current message. Numeric prefix argument N means mark the current message and the next N-1 messages. A negative N means mark the current message and the previous N-1 messages.
Mark messages matching a virtual selector.
You can use any of the virtual folder selectors, except for the
and, or and not selectors. See the documentation for the
variable vm-virtual-folder-alist for more information.
Mark messages that are matched by the selectors of virtual folder NAME.
Mark all messages with the same author as the current message.
Mark all messages with the same subject as the current message.
Mark all messages with summary lines contained in the region.
Mark all messages in the thread tree rooted at the current message.
Does nothing except insure that the next VM command will operate only on the marked messages in the current folder. This only works for commands bound to key, menu or button press events. M-x vm-command will not work.
Toggles all message marks in the current folder. Messages that are unmarked will become marked and messages that are marked will become unmarked.
Unmark messages matching a virtual selector.
You can use any of the virtual folder selectors, except for the
and, or and not selectors. See the documentation for the
variable vm-virtual-folder-alist for more information.
Unmark messages that are matched by the selectors of virtual folder NAME.
Remove the mark from the current message. Numeric prefix argument N means unmark the current message and the next N-1 messages. A negative N means unmark the current message and the previous N-1 messages.
Unmark messages matching a virtual selector.
You can use any of the virtual folder selectors, except for the
and, or and not selectors. See the documentation for the
variable vm-virtual-folder-alist for more information.
Unmark messages that are matched by the selectors of virtual folder NAME.
Unmark all messages with the same author as the current message.
Unmark all messages with the same subject as the current message.
Remove marks from messages with summary lines contained in the region.
Unmark all messages in the thread tree rooted at the current message.
Customize VM options.
View the VM manual.
View the newest of VM’s NEWS files.
These are invoked by a toolbar button, a menu entry, a mouse binding, a keymap entry or a hook rather than typed by name. Nothing stops you calling one.
Visit a virtual folder of every message by this one’s author.
The menu’s way to vm-create-virtual-folder, with the selector and the
author filled in from the current message rather than prompted for.
Not autoloaded: VM has to be loaded before M-x offers this one.
Visit a virtual folder of every message with this one’s subject.
The menu’s way to vm-create-virtual-folder, with the selector and the
subject filled in from the current message rather than prompted for.
Not autoloaded: VM has to be loaded before M-x offers this one.
Makes a menu with the mail folders of the directory vm-folder-directory.
Not autoloaded: VM has to be loaded before M-x offers this one.
Compose a message to the author of this one.
The menu’s way to vm-mail, with the From: header of the current message
as the recipient. Not a reply: no subject, no references, no citation.
Not autoloaded: VM has to be loaded before M-x offers this one.
Toggle between the VM’s dedicated menu bar and the standard Emacs menu bar. USR, 2011-02-27
Not autoloaded: VM has to be loaded before M-x offers this one.
Yank every message being replied to into this composition.
The menu’s way to vm-yank-message. Where that command yanks one message,
this yanks all of vm-reply-list one after another, which is what a reply
to several messages at once is replying to.
Not autoloaded: VM has to be loaded before M-x offers this one.
Select the previous message in the current folder’s history. With prefix ARG, select the ARG’th previous message.
Select a message from a popup menu of the current folder’s history.
Select the next message in the current folder’s history. With prefix ARG, select the ARG’th next message.
Move backward and forward through the messages selected in each folder.
Like a web browser’s history: selecting a message forgets the ones selected
after it, except where vm-goto-message-last-seen or one of this file’s own
commands did the selecting.
Turning this on binds M-x vm-message-history-backward,
M-x vm-message-history-forward and M-x vm-message-history-browse in
vm-mode-map, adds three entries to the Motion menu, and records each message
as it is selected. Turning it off undoes all three, and leaves
vm-message-history alone: turning it back on picks up where it left off.
Loading this file switched it on until 2026 (emacs-vm/vm#788). Customize loads it whenever it is asked about a VM option, so loading no longer enables: say so here.
This is a global minor mode. If called interactively, toggle the
Vm-Message-History mode mode. If the prefix argument is positive,
enable the mode, and if it is zero or negative, disable the mode.
If called from Lisp, toggle the mode if ARG is toggle. Enable the
mode if ARG is nil, omitted, or is a positive number. Disable the mode
if ARG is a negative number.
To check whether the minor mode is enabled in the current buffer,
evaluate (default-value 'vm-message-history-mode).
The mode’s hook is called both when the mode is enabled and when it is disabled.
The number of read or previewed messages in each folder’s history.
Default value: 32
Hook run after entering or leaving vm-message-history-mode.
No problems result if this variable is not bound.
add-hook automatically binds it. (This is true for all hook variables.)
These are invoked by a toolbar button, a menu entry, a mouse binding, a keymap entry or a hook rather than typed by name. Nothing stops you calling one.
Select the message below the cursor.
Not autoloaded: VM has to be loaded before M-x offers this one.
These are invoked by a toolbar button, a menu entry, a mouse binding, a keymap entry or a hook rather than typed by name. Nothing stops you calling one.
Not documented.
Not autoloaded: VM has to be loaded before M-x offers this one.
Complete the word before point and leave the minibuffer at once.
vm-minibuffer-complete-word and then exit-minibuffer, for a prompt
where one word is the whole answer.
Not autoloaded: VM has to be loaded before M-x offers this one.
Show the completions of the word around point. Unlike ordinary minibuffer completion, which works on the whole of the input, this completes one word of it – so a prompt that takes a space separated list, as the label and attribute prompts do, can complete each item in turn.
Not autoloaded: VM has to be loaded before M-x offers this one.
These are invoked by a toolbar button, a menu entry, a mouse binding, a keymap entry or a hook rather than typed by name. Nothing stops you calling one.
The immediate action event in VM buffers, depending on where the
mouse is clicked. See Info node (VM) Using the Mouse.
Brings up the context-sensitive menu in VM buffers, depending on where the mouse is clicked. See Info node ‘(VM) Using the Mouse’.
Not documented.
Not documented.
Not documented.
Not documented.
Go to the message last previewed.
Go to the message numbered N. Interactively N is the prefix argument. If no prefix arg is provided N is prompted for in the minibuffer.
If vm-follow-summary-cursor is non-nil this command will go to the message under the cursor in the summary buffer if the summary window is selected. This only happens if no prefix argument is given.
Go to the message last previewed.
Go to the parent of the current message.
Go forward one message and preview it. With prefix arg (optional first argument) COUNT, go forward COUNT messages. A negative COUNT means go backward. If the absolute value of COUNT is greater than 1, then the values of the variables vm-skip-deleted-messages and vm-skip-read-messages are ignored.
When invoked on marked messages (via vm-next-command-uses-marks)
this command "sees" marked messages as it moves.
Like vm-next-message but will not skip deleted or read messages.
Move forward to the nearest message with the same subject.
The prefixes and suffixes matching vm-subject-ignored-prefix,
vm-subject-ignored-suffix and vm-subject-tag-prefix (but not
vm-subject-tag-prefix-exceptions) will apply to the subject
comparisons.
Move forward to the nearest new or unread message, if there is one.
Go back one message and preview it. With prefix arg COUNT, go backward COUNT messages. A negative COUNT means go forward. If the absolute value of COUNT > 1 the values of the variables vm-skip-deleted-messages and vm-skip-read-messages are ignored.
Like vm-previous-message but will not skip deleted or read messages.
Move backward to the nearest message with the same subject.
The prefixes and suffixes matching vm-subject-ignored-prefix,
vm-subject-ignored-suffix and vm-subject-tag-prefix (but not
vm-subject-tag-prefix-exceptions) will apply to the subject
comparisons.
Move backward to the nearest new or unread message, if there is one.
Not documented.
Jumps to the frame containing the folder for the selected message.
1) Your Emacs frame needs to have the folder name in its title, see the
variable frame-title-format on how to set this up.
2) You need to define the FVWM2 function SelectWindow and start the
FvwmCommandS module. Therefore, you will need the following lines in your .fvwm2rc file.
AddToFunc InitFunction + I Module FvwmCommandS
AddToFunc RestartFunction + I Module FvwmCommandS
AddToFunc SelectWindow + I Next ($0) Iconify false + I Next ($0) Raise + I Next ($0) WarpToWindow 10p 10p
A xlbiff like tool for VM: pop up a summary frame when mail arrives.
You should also set vm-auto-get-new-mail, since otherwise nothing goes
looking for new mail and this has nothing to pop up about.
This is a global minor mode. If called interactively, toggle the
Vm-Biff mode mode. If the prefix argument is positive, enable the
mode, and if it is zero or negative, disable the mode.
If called from Lisp, toggle the mode if ARG is toggle. Enable the
mode if ARG is nil, omitted, or is a positive number. Disable the mode
if ARG is a negative number.
To check whether the minor mode is enabled in the current buffer,
evaluate (default-value 'vm-biff-mode).
The mode’s hook is called both when the mode is enabled and when it is disabled.
Scan the current VM folder for new messages and popup a summary frame.
Put focus on the folder frame and select the appropriate message.
Full qualified path to FvwmCommand.
Default value: "/usr/bin/FvwmCommand"
Number of seconds after the popup window is automatically removed.
Maximum number of characters to peek into the body of a message.
Default value: 50
Non-nil means the pop-up window takes the focus when it appears.
List of folders to generate a popup for.
The default is all spool files listed in vm-spool-files.
Testing is done by string-matching it against the current buffer-file-name.
Another form is an alist of elements (FODERNAME SELECTOR),
where SELECTOR is a virtual folder selector matching the
messages which should be displayed. See vm-biff-selector
for an example and vm-virtual-folder-alist on how virtual
folder selectors work.
Maximum hight of the popup window.
Default value: 10
Hook run after entering or leaving vm-biff-mode.
No problems result if this variable is not bound.
add-hook automatically binds it. (This is true for all hook variables.)
Function that sets the popup frame position and size.
Default value: vm-biff-place-frame
Position of the popup-frame.
Default value: center
List of hook functions to be run when selection a message.
You may want to add vm-biff-fvwm-focus-vm-folder-frame.
List of hook functions to be run when selection a message.
Virtual folder selector matching the messages the pop-up shows.
Default value: (and (new) (not (deleted)) (not (outgoing)))
Like vm-summary-format but for popup buffers.
Width of the popup-frame.
Default value: 120
Install the key bindings VM 8 gives its own commands.
Nothing needs to call this: the bindings are in vm-mode-map and
vm-mode-virtual-map to begin with. It is here because the manual told
readers to put it in their preferences file, back when these keys were not
bound and typing one reported that it had an optional binding
(emacs-vm/vm#632). Calling it binds what is bound already.
Not autoloaded: VM has to be loaded before M-x offers this one.
Load the VM’s initialization files, normally named ".vm" and ".vm.preferences". If a prefix argument is given, then only the ".vm" file is loaded (which is useful testing or debugging the preferences file).
The file names may be customized via the variables vm-init-file and
vm-preferences-file.
Not autoloaded: VM has to be loaded before M-x offers this one.
Replace marked region or current line with vm-mail-mode-elide-reply-region.
B and E are the beginning and end of the marked region or the current line.
Show the log of what VM has been doing, and when.
It holds everything VM has said this session, timed, and whatever more
vm-log-level asks for.
Toggle the current composition for S/MIME encryption. This only sets a flag and will not do the encryption immediately. Actual encryption is done upon sending the message. If the message is already set for encryption this function will clear the flag so that no encryption is done
Toggle the current composition for S/MIME signing. This only sets a flag and will not do the signing immediately. The signing itself is done upon sending the message. If the message is already set for signing this function will clear the flag so that no signing is done
Install the key bindings VM 8 gives its own commands.
Nothing needs to call this: the bindings are in vm-mode-map and
vm-mode-virtual-map to begin with. It is here because the manual told
readers to put it in their preferences file, back when these keys were not
bound and typing one reported that it had an optional binding
(emacs-vm/vm#632). Calling it binds what is bound already.
Not autoloaded: VM has to be loaded before M-x offers this one.
View FILE in View mode in another frame. When done, kill the buffer visiting FILE if unmodified and if it wasn’t visited before; also, maybe delete other frame and/or return to previous buffer.
Emacs commands editing the buffer contents are not available; instead, a special set of commands (mostly letters and punctuation) are defined for moving around in the buffer. Space scrolls forward, Delete scrolls backward. For a list of all View commands, type H or h while viewing.
This command runs the normal hook view-mode-hook.
Value of t causes VM to always ask for confirmation before quitting a VM visit of a folder. A nil value means VM will ask only when messages will be lost unwittingly by quitting, i.e. not removed by intentional delete and expunge. A value that is not nil and not t causes VM to ask only when there are unsaved changes to message attributes, or when messages will be unwittingly lost.
Default value: if-something-will-be-lost
Non-nil value causes VM to expunge deleted messages before
quitting. You can use vm-quit-no-expunge and vm-quit-no-change
to override this behavior.
Tells vm-handle-return-receipt how to handle return receipts.
One can choose between ask, auto, edit, or an expression which should
return t if the return receipts should be sent.
Default value: edit
Number of characters from the original message body to be returned.
Default value: 500
Non-nil means answer a message asking for a return receipt.
vm-handle-return-receipt-mode says whether the answer is sent as it
stands, asked about first, or left in a composition buffer for you.
A return receipt is a request, not an instruction: a sender cannot make your mail reader tell them you read something, and VM does not by default.
The directory where VM finds the pixmaps for mime objects.
Startup file for VM that is loaded the first time you run VM in an Emacs session.
Default value: "~/.vm"
Level up to which VM records what it is doing, beyond what it shows.
Everything VM says is recorded in the buffer *VM Log* whatever this is set
to; a nil value means nothing more than that. M-x vm-show-log shows the
buffer.
The scale is vm-verbosity’s. Recording at 10 and leaving vm-verbosity
alone is how to keep the detail of a slow operation without the echo area
churn, and without vm-verbal-time pausing for each message.
Each line says when VM said it, how long it is since the previous line and how much CPU VM used in between:
14:03:12.481 +2.140s +0.310cpu [6] INBOX: Retrieving message 400...
An interval that is all real time and no CPU was spent waiting for a server, which is what says whether something slow is VM’s own doing. The interval is simply the time since the last recorded message, so it counts time VM sat idle as readily as time it worked.
vm-log-max-lines bounds the buffer.
How many lines of *VM Log* to keep, or nil to keep all of them. The log runs for as long as Emacs does, so something has to bound it, and what a reader wants is the end: the oldest lines go first.
Default value: 20000
Secondary startup file for VM, loaded after vm-init-file. It is
meant for specifying the preferred settings for VM variables.
Default value: "~/.vm.preferences"
Non-nil value means that VM will not attempt to save read-only
folders to disk and discards changes during vm-quit.
Default value: t
Boolean flag that controls whether VM should report errors from running commands in subprocesses.
Default value: t
Non-nil value causes VM’s search command to interpret user input as a regular expression instead of as a literal string.
Non-nil means say once per session that the configuration is incomplete. One line in the echo area at the first VM start, naming vm-check-configuration, where that command would have something to report. It never runs the check itself and never puts up a buffer: someone who has deliberately left a setting alone should not be shown a report they did not ask for.
Nil says nothing. Nothing is said either way once the settings VM checks are in place, so this is quiet on a working configuration.
Default value: t
Name of a directory where VM can put temporary files.
Default value: worked out when VM is loaded, from this system.
Number of seconds for which to display VM’s minibuffer messages. This number should be normally 0. Otherwise, it will delay VM’s operation.
Default value: 0
Level of chattiness in progress messages displayed in the minibuffer. A message is shown when its own level is this or lower, so a larger number here means more talk. The scale runs from 0 to 10:
0 - only what VM cannot stay silent about
1 - errors, and warnings worth interrupting for
5 - normal level: what a command did, and the progress of anything slow
enough to be worth watching
6 - the steps within those operations
7 - detail: threading, summary generation, parsing, header work
8 - more of the same, and VM’s own bookkeeping
10 - debugging information
vm-warn uses the same scale, so lowering this hides warnings as well as
progress. Nothing above 1 is a warning.
Default value: 5
These are invoked by a toolbar button, a menu entry, a mouse binding, a keymap entry or a hook rather than typed by name. Nothing stops you calling one.
The name says it all. Sometimes you may want to save a message unencoded, specifically not to waste storage for attachments which are stored on disk anyway.
Not autoloaded: VM has to be loaded before M-x offers this one.
Deletes all messages from POP mailbox that have already been retrieved into the current folder. VM sends POP DELE commands to all the relevant POP servers to remove the messages.
Begin to compose a bug report for POP support functionality.
Submit a bug report for VM’s POP support functionality.
It is necessary to run vm-pop-start-bug-report before the problem
occurrence and this command after the problem occurrence, in
order to capture the trace of POP sessions during the occurrence.
The session still running is included, so a report can be made about a fetch while it is happening; nothing is closed to collect it.
Alist of POP maildrop specifications and names that refer to them. The alist format is:
((POPDROP NAME) ...)
POPDROP is a POP maildrop specification in the same format used
by vm-spool-files (which see).
NAME is a string that should give a less cumbersome name that you
will use to refer to this maildrop when using vm-visit-pop-folder.
Directory where VM stores cached copies of POP folders. When VM visits a POP folder (really just a POP server where you have a mailbox) it stores the retrieved message on your computer so that they need not be retrieved each time you visit the folder. The cached copies are stored in the directory specified by this variable.
The number of POP session trace buffers that should be
retained for debugging purposes. If it is nil, then no trace buffers are kept.
Default value: 1
If VM is about to retrieve via POP a message larger than this size (in bytes) it will ask the you whether it should retrieve the message.
If VM is retrieving mail automatically because vm-auto-get-new-mail
is set to a numeric value then you will not be prompted about large
messages. This is to avoid prompting you while you’re typing in
another buffer. In this case the large message will be skipped with a
warning message. You will be able to retrieved any skipped messages
later by running vm-get-new-mail interactively.
A nil value for vm-pop-max-message-size means no size limit.
Number of seconds to wait for output from the POP server before timing out. It can be set to nil to never time out.
Change contents of the current mail message based on its own headers.
Unless vm-pcrisis-current-state is no-automorph, headers and
signatures can be
changed; pre-signatures added; functions called.
Call vm-pcrisis-no-automorph to disable it for the current buffer.
Build a list of the actions to run. These are the true conditions mapped to actions. Duplicates will be eliminated. You may run it in a composition buffer in order to see what actions will be run.
Build list of true conditions and store it in the variable
vm-pcrisis-true-conditions.
Say what is wrong with your Personality Crisis rules, and what to do about it.
Checks that every rule is keyed on a condition that exists and names actions
that exist, that no name is defined twice, that each entry has the form the
variables want, and that a vm-pcrisis-none-true-yet fallback is last.
The mistake worth the command is a rule keyed on a name no condition has.
Nothing reports it and nothing runs: a fallback rule written as
("default" "from-work") with no condition called "default" leaves the
composition with user-mail-address, which is the address most people would
have got anyway, so it can go years unnoticed.
Change vm-pcrisis-auto-profiles-file to the format used by v0.82+.
Initialise vm-pcrisis-auto-profiles from vm-pcrisis-auto-profiles-file.
Migrate the profiles stored in vm-pcrisis-auto-profiles-file to the BBDB.
This will automatically create records if they do not exist and add the new
field vmpc-profile to the records which is a sexp not meant to be edited.
Personality Crisis: vary the headers and body of a message you send.
Which headers, and how, is decided by vm-pcrisis-conditions and
vm-pcrisis-actions;
see the commentary at the top of vm-pcrisis.el.
Turning this on advises VM’s composition commands – replying, forwarding, resending and starting a new message – so that the rules are consulted as each composition begins. Turning it off removes the advice, leaving those commands as VM defines them.
This is a global minor mode. If called interactively, toggle the
Vm-Pcrisis mode mode. If the prefix argument is positive, enable the
mode, and if it is zero or negative, disable the mode.
If called from Lisp, toggle the mode if ARG is toggle. Enable the
mode if ARG is nil, omitted, or is a positive number. Disable the mode
if ARG is a negative number.
To check whether the minor mode is enabled in the current buffer,
evaluate (default-value 'vm-pcrisis-mode).
The mode’s hook is called both when the mode is enabled and when it is disabled.
Find a profile or prompt for it and add its actions to the list of actions.
A profile is an association between a recipient address and a set of the
actions named in vm-pcrisis-actions. When entering the list of actions,
one has
to press ENTER after each action and finish adding action by pressing ENTER
without an action.
The association is stored in vm-pcrisis-auto-profiles-file and in the
future the
stored actions will automatically run for messages to that address.
REMEMBER can be set to t or prompt. When set to prompt you will be asked
if you want to store the association. When set to t a new profile will be
stored without asking.
Storing one writes vm-pcrisis-auto-profiles-file, which is
~/.vmpc-auto-profiles unless you have said otherwise, and that file is then
consulted by every later composition. The question names it, and so does the
message after any profile is written or removed, since with REMEMBER t there
is no question to name it. To be rid of a profile, answer with no actions,
or edit the file.
Set PROMPT to t and you will be prompted each time, i.e. not only for unknown profiles. If you want to change the profile only explicitly, then omit the PROMPT argument and call this function interactively in the composition buffer.
Run all actions with names matching the ACTION-REGEXP. If called interactively it prompts for the regexp. You may also use completion.
Run the argument actions, or the actions stored in vm-pcrisis-actions-to-run.
If verbose is supplied, it should be a STRING, indicating the name of a
buffer to which to write diagnostic output.
Disable automorph for the current buffer. When automorph is not doing the right thing and you want to disable it for the current composition, then call this function.
Return a list of all true conditions. Run this function in order to test/check your conditions.
List of actions.
Actions are associated with conditions from vm-pcrisis-conditions by one of
vm-pcrisis-default-rules, vm-pcrisis-reply-rules,
vm-pcrisis-forward-rules, vm-pcrisis-resend-rules,
vm-pcrisis-mail-rules, vm-pcrisis-newmail-rules or
vm-pcrisis-automorph-rules.
These are also the actions from which you can choose when using the newmail
features of Personality Crisis, or the vm-pcrisis-prompt-for-profile action.
You may also define an action without associated commands, e.g. "none".
Number of days after which to expunge old address-profile associations.
Performance may suffer noticeably if this file becomes enormous, but in other
respects it is preferable for this value to be fairly high. The value that is
right for you will depend on how often you send email to new addresses using
vm-pcrisis-prompt-for-profile.
Default value: 100
File in which to save information used by vm-pcrisis-prompt-for-profile.
When set to the symbol BBDB, profiles will be stored there.
Default value: "~/.vmpc-auto-profiles"
Alist associating conditions with actions from vm-pcrisis-actions
when automorphing.
List of conditions which will be checked by pcrisis.
The default profile to select if no profile was found.
Default value: "default"
A default list of condition-action rules used for replying, forwarding,
resending, composing and automorphing, unless overridden by more
specific variables such as vm-pcrisis-reply-rules.
Whether a signature is inserted by something other than Personality Crisis.
Emacs inserts one when mail-signature is set, taking it from that variable or
from the file mail-signature-file names, and VM does that as it builds a
composition. Personality Crisis can only act on a signature whose extent it
knows, so with this unset vm-pcrisis-signature neither replaces nor deletes
that one: it looked to two readers of #540 like an action that had run and done
nothing. Set, which is the default, the signature already in a composition is
found and comes under the same control as one Personality Crisis inserted
itself.
What is looked for is a line of exactly "– ", the separator Emacs writes,
and the signature is everything from there to the end of the composition. A
signature in quoted text is prefixed by vm-included-text-prefix and so is not
that line. Unset this to keep a signature action off a signature Personality
Crisis did not insert.
Default value: t
A list of condition-action rules used when forwarding.
An alist associating conditions with actions from vm-pcrisis-actions
when composing a message starting from a folder.
Hook run after entering or leaving vm-pcrisis-mode.
No problems result if this variable is not bound.
add-hook automatically binds it. (This is true for all hook variables.)
An alist associating conditions with actions from vm-pcrisis-actions
when composing.
List of headers to check for email addresses.
vm-pcrisis-prompt-for-profile will scan the given headers in the given order.
Default value:
((composition ("To" "CC" "BCC"))
(default ("From" "Sender" "Reply-To" "From" "Resent-From")))
A list of condition-action rules used during reply.
An alist associating conditions with actions from vm-pcrisis-actions
when resending.
These are invoked by a toolbar button, a menu entry, a mouse binding, a keymap entry or a hook rather than typed by name. Nothing stops you calling one.
Wrapper for vm-pcrisis-tab-header-or-tab-stop with BACKWARD set.
Not autoloaded: VM has to be loaded before M-x offers this one.
Read a list of actions to run and store it in vm-pcrisis-actions-to-run.
The special action "none" will result in an empty action list.
Not autoloaded: VM has to be loaded before M-x offers this one.
If in a mail header field, moves to next useful header or body.
When moving to the message body, calls the vm-pcrisis-automorph function.
If within the message body, runs tab-to-tab-stop.
If BACKWARD is specified and non-nil, moves to previous useful header
field, whether point is in the body or the headers.
"Useful header fields" are currently, in order, "To" and
"Subject".
Not autoloaded: VM has to be loaded before M-x offers this one.
Continue composing of the currently selected message.
Before continuing the composition you may decode the presentation as
you like, by pressing [D] and viewing part of the message!
Then current message is copied to a new buffer and the vm-mail-mode is
entered. When every thing is finished the hook functions in
vm-mail-mode-hook and vm-continue-postponed-message-hook are
executed. When called with a prefix argument it will not switch to
the composition buffer, this may be used for automatic editing of
messages.
The variables vm-postponed-message-headers and
vm-postponed-message-discard-header-regexp control which
headers are copied to the composition buffer.
If optional argument SILENT is positive then act in background (no frame creation). If DRAFT is non-nil, then do not delete the draft message.
Continue compositions or postponed messages if there are some.
With a prefix arg, call vm-continue-postponed-message, i.e. continue the
currently selected message.
Declining the offer of the drafts folder starts a new message instead, as
does vm-continue-what-message nil with drafts on disk: the drafts stay
where they are. With no drafts anywhere, a new message is started only
when vm-zero-drafts-start-compose is t.
See vm-continue-what-message and vm-zero-drafts-start-compose for
configuration.
Ask for continuing of postponed messages if there are some.
Ask for continuing of postponed messages if there are some.
Delete the source message belonging to the continued composition.
Add a new FCC field, with file name guessed by vm-mail-folder-alist.
You likely want to add it to vm-reply-hook by
(add-hook ’vm-reply-hook #’vm-mail-auto-fcc)
or if sure about what you are doing you can add it to mail-send-hook.
Insert the FCC-header into a VM composition buffer.
Like mail-fcc, but honors VM variables and offers a default folder
according to vm-mail-folder-alist.
Called with prefix ARG it just removes the FCC-header.
Notice-Requested-Upon-Delivery-To:
Insert priority headers into a VM composition buffer.
See the variable vm-mail-priority.
Insert the "Return-Receipt-To" header into a VM composition buffer.
See the variable vm-mail-return-receipt-to.
Return a folder according to FOLDER-ALIST for the current message.
This function is a slightly changed version of vm-auto-select-folder.
Insert a FCC-header into a VM composition buffer.
Like mail-fcc, but honors VM variables and inserts the first email
address (or the like matched by vm-mail-to-regexp) found in the headers
listed in vm-mail-to-headers.
Called with prefix ARG it just removes the FCC-header.
If optional argument RETURN-ONLY is t just returns FCC.
Save the current composition as a draft.
Before saving the composition the vm-postpone-message-hook functions
are executed and it is written into the FOLDER vm-postponed-folder.
When called with a prefix argument you will be asked for
the folder.
With DONT-KILL, keep the composition buffer rather than killing it, and insert an FCC header naming FOLDER so that sending it later files it there again. The source message is deleted either way.
With NO-POSTPONE-HEADER, leave out the vm-postponed-header line that
records the reply, forward and redistribute lists. The draft is then an
ordinary message, and vm-continue-what-message offers to continue only a
message carrying that header.
Postpone a composition and continue it later, as Pine does.
C-c C-d in a composition files it in
vm-save-killed-messages-folder; visit that folder and type
M-x vm-continue-postponed-message to take it up again. That
key is bound by VM itself and works whether this mode is on or off.
What turning this on adds is four keys that insert a header field. Turning it off takes them away again and leaves any postponed folder where it is.
It used to arrange for a composition killed unsent to be kept as a draft as
well, which meant a reader who had not switched it on lost the writing to any
key bound to kill-buffer. Every composition arranges that now; see
vm-save-killed-message (emacs-vm/vm#824).
Loading this file switched it on until 2026 (emacs-vm/vm#788). Customize loads it whenever it is asked about a VM option, so loading no longer enables: say so here.
This is a global minor mode. If called interactively, toggle the
Vm-Postpone mode mode. If the prefix argument is positive, enable the
mode, and if it is zero or negative, disable the mode.
If called from Lisp, toggle the mode if ARG is toggle. Enable the
mode if ARG is nil, omitted, or is a positive number. Disable the mode
if ARG is a negative number.
To check whether the minor mode is enabled in the current buffer,
evaluate (default-value 'vm-postpone-mode).
The mode’s hook is called both when the mode is enabled and when it is disabled.
Like vm-reply but preserves attachments.
Return the recipient or newsgroup for uninteresting senders. If the "From:" header contains the user login or full name then this function returns the "To:" or "Newsgroups:" header field with a "To:" as prefx.
For example the outgoing message box will now list to whom you sent the
messages. Use vm-fix-my-summary to update the summary of a folder! With
loaded BBDB it uses vm-summary-function-B to obtain the full name of the
sender. The only difference to VM’s default behavior is the honoring of
messages sent to news groups.)
See also: vm-summary-uninteresting-senders
List of hook functions to be run after a message has been postponed. They run in the composition buffer, after the draft is in the folder and the source message has been dealt with, and before the composition is killed. So the buffer is still there to be read, and changing it changes nothing: what was filed is already filed.
vm-postpone-message-hook is the one that runs before, where a change still
reaches the folder.
If non-nil, the postponed-folder is auto-expunged whenever postponed messages are continued and sent out.
List of hook functions to be run after continuing a postponed message.
A list which is evaluated to return a folder name.
By reordering the elements of this list or adding own functions you
can control the behavior of vm-mail-fcc and vm-mail-auto-fcc.
You may allow a sophisticated decision for the right folder for your
outgoing message.
Default value:
(or (vm-mail-select-folder vm-mail-folder-alist)
(vm-mail-to-fcc nil t) mail-archive-file-name)
Like vm-auto-folder-alist but for outgoing messages.
It should be fed to vm-mail-select-folder.
A list of headers for finding the email address to use as FCC-folder.
Default value: ("To:" "CC:" "BCC:")
A regexp matching the part of an email address to use as FCC-folder. The string enclosed in "\\(\\)" is used as folder name.
Default value: "\\([^<\11\n ]+\\)@"
List of hook functions to be run before postponing a message.
They run in the composition buffer, before it is written to the folder, so a
function here can still change what is filed. See
vm-after-postpone-message-hook for after it is filed.
Hook run after entering or leaving vm-postpone-mode.
No problems result if this variable is not bound.
add-hook automatically binds it. (This is true for all hook variables.)
The name of the folder where postponed messages are saved.
Default value: "postponed"
Additional header which is inserted to postponed messages.
It is used for internal things and should not be modified.
It is a lisp list which currently contains the following items:
<date of the postponing>
<reply references list>
<forward references list>
<redistribute references list>
while the last three are set by vm-get-persistent-message-ids-for.
Default value: "X-VM-postponed-data: "
Similar to vm-unforwarded-header-regexp.
A regular expression matching all headers that should be discard when
when continuing a postponed message.
Similar to vm-forwarded-headers.
A list of headers that should be kept, when continuing a postponed message.
The following mime headers should not be kept, since this breaks things: Mime-Version, Content-Type, Content-Transfer-Encoding.
Default value:
("From:" "Organization:" "Reply-To:" "To:" "Newsgroups:" "CC:" "BCC:"
"FCC:" "In-Reply-To:" "References:" "Subject:" "X-Priority:"
"Priority:")
What killing a composition with writing in it does with the writing.
always, the default, files it in vm-save-killed-messages-folder and says
so. Nothing is lost by killing a composition, which is what a reader who has
lost drafts to a keystroke needs (emacs-vm/vm#824).
ask asks whether to keep it. Nil neither keeps it nor asks, and then
vm-confirm-killing-a-composition is what stands between a keystroke and the
writing.
A composition nothing has been written in is not kept and is not asked about, whichever this is.
Default value: always
The name of the folder where killed messages are saved.
Default value: "postponed"
When t and there are no drafts, vm-continue-what-message call vm-mail.
Command VM uses to print messages.
Default value: "lpr"
List of command line flags passed to the command named by
vm-print-command. VM uses vm-print-command to print
messages.
See ps-header-lines.
Default value: 2
This variable should contain an ELisp expression returning a
valid ps-left-header.
The default is to have the folder name and a summary according to the
variable vm-ps-print-each-message-summary-format in the left header.
See vm-ps-print-message-left-header for a list of variables it can use.
Default value:
(list (format "(Folder `%s')" folder-name)
(format "(%s)"
(vm-ps-print-tokenized-summary msg
(vm-summary-sprintf
vm-ps-print-each-message-summary-format
msg t))))
This variable should contain an Elisp expression returning a
valid ps-right-header.
The default is the number of pages and the date of the printout.
See vm-ps-print-message-left-header for a list of variables it can use.
Default value: (list "/pagenumberstring load" 'dd-mon-yyyy)
The summary line for the postscript header.
See vm-summary-format for a description of the conversion specifiers.
Default value: "Message# %n, Lines %l, Characters %c"
The font size for the PS-output of the message text.
Default value: 10
This should point to the function which is used for ps-printing. The function should accept one optional argument which is a filename.
Default value: ps-print-buffer-with-faces
See ps-header-lines.
Default value: 2
This variable should contain an ELisp expression returning a
valid ps-left-header.
The following variables are available when evaluating the value:
‘dd-mon-yyyy’ The current date ‘folder-name’ The name of the folder ‘mcount’ The number of messages to print ‘msg’ A pointer to a VM message
Default value:
(list (format "(Folder `%s')" folder-name)
(format "(%d message%s printed)" mcount (if (= mcount 1) "" "s")))
This variable should contain an ELisp expression returning a
valid ps-right-header.
The default is the number of pages and the date of the printout.
See vm-ps-print-message-left-header for a list of variables it can use.
Default value: (list "/pagenumberstring load" 'dd-mon-yyyy)
The separator between messages when printing multiple messages.
Default value: "\n"
The summary line before a message.
See vm-summary-format for a description of the conversion specifiers.
Default value:
"****************************************************************************** %3n %*%a %-17.17F %-3.3m %2d %4l/%-5c %I\"%s\" ****************************************************************************** "
PS-Print the current message. A positive COUNT arg N means print the current message and the next N-1 messages and a negative one print the current message and the previous N-1 messages.
If FILENAME is specified then write PS into that file.
This function acts like vm-ps-print-message, but it will generate a
separate print job for each message and it does not generate the
summary lines between messages.
See: vm-ps-print-message-function
‘vm-ps-print-message-font-size’
‘vm-ps-print-each-message-left-header’
‘vm-ps-print-each-message-right-header’
‘vm-ps-print-each-message-summary-format’
for customization of the output.
Postscript print all marked emails in mail Summary. If no messages marked,
print just the current message.
Optionally write postscript output to FILENAME (default is to spool
to printer).
Optionally force SEPARATE printing of each message by setting to t.
Optionally also print NUP pages per sheet.
Optionally also print in COLOR by setting to non-nil.
Note when run interactively setting a positive prefix number prints NUP pages per sheet to the printer, while negative number prints NUP pages per sheet to queried FILENAME. No prefix prints 1 page per sheet to printer while prefix without numerical argument simply queries for filename and formats 1 page per sheet. (JJK)
PS-Print the current message.
A positive COUNT arg N means print the current message and the next N-1 messages and a negative one print the current message and the previous N-1 messages.
If FILENAME is specified then write PS into that file.
When printing a single message it acts like vm-ps-print-each-message.
When printing multiple messages it will insert a summary line according
to the variable vm-ps-print-message-summary-format and a separator
according to the variable vm-ps-print-message-separator between
messages. You might force the printing of one job per message, by
giving a t EACH argument.
See: vm-ps-print-message-function
‘vm-ps-print-message-font-size’
‘vm-ps-print-message-summary-format’
‘vm-ps-print-message-separator’
‘vm-ps-print-message-left-header’
‘vm-ps-print-message-right-header’
for customization of the output.
Call this function to hook the ps-printing functions into VM.
Arranges that the usual VM printing commands in menus and the toolbar
use vm-ps-print-message or vm-ps-print-each-message (when EACH is
t) instead of vm-print-message.
PS-Print the currently presented message. When called with a numeric prefix argument, prompts the user for the name of a file to save the PostScript image in, instead of sending it to the printer.
More specifically, the FILENAME argument is treated as follows: if it is nil, send the image to the printer. If FILENAME is a string, save the PostScript image in a file with that name. If FILENAME is a number, prompt the user for the name of the file to save in.
See: vm-ps-print-message-function
‘vm-ps-print-message-font-size’
‘vm-ps-print-each-message-left-header’
‘vm-ps-print-each-message-right-header’
‘vm-ps-print-each-message-summary-format’
for customization of the output.
Moves to the beginning of the current message.
Moves to the end of the current message, exposing and flagging it read as necessary.
Not documented.
Not documented.
Toggle exposing and hiding message headers that are normally not visible.
Switches to the Presentation buffer and starts isearch.
Moves to the next button in the current message. Prefix argument N means move to the Nth next button. Negative N means move to the Nth previous button. If there is no next button, an error is signaled and point is not moved.
A button is a highlighted region of text where pressing RETURN will produce an action. If the message is being previewed, it is exposed and marked as read.
Moves to the previous button in the current message. Prefix argument N means move to the Nth previous button. Negative N means move to the Nth next button. If there is no previous button, an error is signaled and point is not moved.
A button is a highlighted region of text where pressing RETURN will produce an action. If the message is being previewed, it is exposed and marked as read.
Moves to the next button in the current message. Prefix argument N means move to the Nth next button. Negative N means move to the Nth previous button. If there is no next button, an error is signaled and point is not moved.
A button is a highlighted region of text where pressing RETURN will produce an action. If the message is being previewed, it is exposed and marked as read.
Moves to the previous button in the current message. Prefix argument N means move to the Nth previous button. Negative N means move to the Nth next button. If there is no previous button, an error is signaled and point is not moved.
A button is a highlighted region of text where pressing RETURN will produce an action. If the message is being previewed, it is exposed and marked as read.
Scroll backward a screenful of text. Prefix N scrolls backward N lines.
Scroll backward one line. Prefix arg N means scroll backward N lines. Negative arg means scroll forward.
Scrolls forward a screenful of text. If the current message is being previewed, the message body is revealed. If at the end of the current message, moves to the next message iff the value of vm-auto-next-message is non-nil. Prefix argument N means scroll forward N lines.
Scroll forward one line. Prefix arg N means scroll forward N lines. Negative arg means scroll backward.
Hide or show headers which occupy more than one line. Well, one might do it more precisely with only some headers, but it is sufficient for me!
If the optional argument TOGGLE, then hiding is toggled.
The face used for the visible hidden regions is vm-shrunken-headers-face and
the keymap used within that region is vm-shrunken-headers-keymap.
Toggle display of shrunken headers.
Toggle display of shrunken headers.
When enabled new messages will be inserted in current sort order. Otherwise they are appended to the folder, which is VM default.
Non-nil means display images as specified in X-Face headers.
It needs the uncompface program, named by vm-uncompface-program, which is
what decodes the header into an image.
Non-nil means fold a header that runs onto more than one line.
A message with fifty recipients puts the subject a page down; with this set
VM shows the first line of such a header and hides the rest behind a widget
you can click, or vm-shrunken-headers-toggle on the lot.
This needs a presentation buffer, that is vm-always-use-presentation
non-nil: the overlays it uses would otherwise land in the folder buffer,
which is the file on disk.
This variable can be set to nil, a numeric value N, the
symbol window-width. If it is numeric, it causes VM to fill
paragraphs that contain lines spanning that many columns or more.
Setting it to window-width has the effect of using the width of
the Emacs window.
Only plain text messages and text/plain MIME parts will be filled. The message itself is not modified; its text is copied into a presentation buffer before the filling is done.
This variable determines which paragraphs are filled,
but vm-paragraph-fill-column determines the fill column.
Note that filling is carried out only if word wrapping is not in
effect. The variable vm-word-wrap-paragraphs controls word
wrapping.
Value specifies which headers to highlight. This is a regular expression that matches the names of headers that should be highlighted when a message is first presented. For example setting this variable to "From:\\|Subject:" causes the From and Subject headers to be highlighted.
Non-nil value causes VM to honor page delimiters (as specified by the Emacs page-delimiter variable) when scrolling through a message. This means that when VM encounters a page delimiter when displaying a message all the screen lines below that delimiter will be blank until you scroll past that delimiter. When you scroll past the delimiter the text lines between the delimiter and the next delimiter will be displayed. Scrolling backward past a page delimiter reverses this process.
A nil value means ignore page-delimiters.
Non-nil value should be a regular expression that tells what headers
VM should NOT normally display when presenting a message. All other
headers will be displayed. The variable vm-visible-headers specifies
the presentation order of headers; headers not matched by
vm-visible-headers are displayed last.
Nil value causes VM to display ONLY those headers specified in
vm-visible-headers.
Glyph VM uses to indicate there is more text on the next page.
When VM honors page delimiters (see vm-honor-page-delimiters)
and when VM is previewing a message (see vm-preview-lines) VM
indicates that there is more text by placing the glyph specified
by this variable at the end of the displayed text.
The value is a string.
Default value: "...press SPACE to see more..."
Column beyond which automatic line-wrapping should happen when
re-filling lines longer than the value of
vm-fill-paragraphs-containing-long-lines.
Default value: 70
An association list mapping message presentation methods, such as emacs-w3m, to the corresponding minor modes to be used in the presentation buffer.
Default value: ((emacs-w3m w3m-minor-mode))
Non-nil value N causes VM to display the visible headers + N lines of text of a message when it is first presented. The message is not actually flagged as read until it is exposed in its entirety.
A value of t causes VM to display as much of the message as will fit in the window associated with the folder buffer.
A nil value causes VM not to preview messages; no text lines are hidden and messages are immediately flagged as read.
Default value: 0
Non-nil value means to preview messages even if they’ve already been read. A nil value causes VM to preview messages only if new or unread.
Asks VM to use minor modes for the message presentation text when appropriate, e.g., when the text is prepared using the emacs-w3m package.
Customize vm-presentation-minor-modes to set the appropriate minor modes.
List of headers that should be visible when VM first displays a message. These should be listed in the order you wish them presented. Regular expressions are allowed. There’s no need to anchor patterns with "^", as searches always start at the beginning of a line. Put a colon at the end of patterns to get exact matches. For example, "Date" matches "Date" and "Date-Sent". Header names are always matched case insensitively.
If the value of vm-invisible-header-regexp is nil, only the
headers matched by vm-visible-headers will be displayed.
Otherwise all headers are displayed except those matched by
vm-invisible-header-regexp. In this case vm-visible-headers
specifies the order in which headers are displayed. Headers not
matching vm-visible-headers are displayed last.
Default value:
("Resent-" "From:" "Sender:" "To:" "Newsgroups:" "Apparently-To:"
"Cc:" "Subject:" "Date:")
If non-nil, causes VM to word wrap the long lines of a message. Every line break already there is kept, which is the difference from vm-fill-paragraphs-containing-long-lines: filling joins the lines of a paragraph before breaking them again, and so loses where the breaks were. The column wrapped to is vm-paragraph-fill-column.
Needs nothing installed. Earlier releases used the longlines library, obsolete since Emacs 24.4.
These are invoked by a toolbar button, a menu entry, a mouse binding, a keymap entry or a hook rather than typed by name. Nothing stops you calling one.
Prints a minibuffer message when the end of message is reached, but
it is suppressed if the variable vm-auto-next-message is nil.
Not autoloaded: VM has to be loaded before M-x offers this one.
Not documented.
Not autoloaded: VM has to be loaded before M-x offers this one.
Toggle display of shrunken headers.
Find and select the most recently used mail composition buffer. If the selected buffer is already a Mail mode buffer then it is buried before beginning the search. Non Mail mode buffers and unmodified Mail buffers are skipped. Prefix arg means unmodified Mail mode buffers are not skipped. If no suitable buffer is found, the current buffer remains selected.
Fill lines in the message composition in the current buffer,
provided it has lines longer than the line length specified by
vm-fill-paragraphs-containing-long-lines-in-reply. If that variable
is nil then it uses the width of the window as the maximum line
length.
Reply to all recipients of the current message. See the documentation for the function vm-reply for details.
Reply to all recipients of the current message and include text from the message. See the documentation for the function vm-reply for details.
Like vm-followup-include-text, but run in a newly created frame.
Like vm-followup, but run in a newly created frame.
Forward the current message to one or more recipients. You will be placed in a Mail mode buffer as you would with a reply, but you must fill in the "To:" header and perhaps the "Subject:" header manually.
See vm-forward-message-plain for forwarding messages in plain text.
Like vm-forward-message but forwards all the headers.
Like vm-forward-message-all-headers, but run in a newly created frame.
Like vm-forward-message, but run in a newly created frame.
Forward the current message in plain text to one or more recipients. You will be placed in a Mail mode buffer as you would with a reply, but you must fill in the "To:" header and perhaps the "Subject:" header manually.
Any MIME attachments in the forwarded message will be attached to the outgoing message.
See vm-forward-message for other forms of forwarding.
Like vm-forward-message-plain, but run in a newly created frame.
Remove doubly-cited text and extra lines in a mail message.
Hides and protects headers listed in vm-mail-mode-hidden-headers.
With a prefix arg, call vm-mail-mode-show-headers instead.
Display any hidden headers in a composition buffer.
Just like mail-send except that VM flags the appropriate message(s) as replied to, forwarded, etc, if appropriate.
Send message and maybe delete the composition buffer.
The value of vm-keep-sent-messages determines whether the composition buffer
is deleted. If the composition is a reply to a message in a currently visited
folder, that message is marked as having been replied to.
Creates a message composition buffer to send mail to the URL. This command can be invoked from external agents via an emacsclient.
Show how the current composition buffer might be displayed
in a MIME-aware mail reader. VM copies and encodes the current
mail composition buffer and displays it as a mail folder.
Type q to quit this temp folder and return to composing your
message.
Reply to the sender of the current message. Numeric prefix argument N means to reply to the current message plus the next N-1 messages. A negative N means reply to the current message and the previous N-1 messages.
If invoked on marked messages (via vm-next-command-uses-marks),
all marked messages will be replied to.
You will be placed into a standard Emacs Mail mode buffer to compose and
send your message. See the documentation for the function mail for
more info.
Note that the normal binding of C-c C-y in the reply buffer is
automatically changed to vm-yank-message during a reply. This
allows you to yank any message from the current folder into a
reply.
Normal VM commands may be accessed in the reply buffer by prefixing them with C-c C-v.
Reply to the sender (only) of the current message and include text from the message. See the documentation for function vm-reply for details.
Like vm-reply-include-text, but run in a newly created frame.
Like vm-reply, but run in a newly created frame.
Extract the original text from a bounced message and resend it. You will be placed in a Mail mode buffer with the extracted message and you can change the recipient address before resending the message.
Like vm-resend-bounced-message, but run in a newly created frame.
Resend the current message to someone else. The current message will be copied to a Mail mode buffer and you can edit the message and send it as usual.
NOTE: since you are doing a resend, a Resent-To header is provided for you to fill in the new recipient list. If you don’t fill in this header, what happens when you send the message is undefined. You may also create a Resent-Cc header.
Like vm-resend-message, but run in a newly created frame.
Extract the original text from a bounced message and resend it. You will be placed in a Mail mode buffer with the extracted message and you can change the recipient address before resending the message.
Send a digest of all messages in the current folder to recipients.
The type of the digest is specified by the variable vm-digest-send-type.
You will be placed in a Mail mode buffer as is usual with replies, but you
must fill in the "To:" and "Subject:" headers manually.
Prefix arg means to insert a list of preamble lines at the beginning of
the digest. One line is generated for each message being digestified.
The variable vm-digest-preamble-format determines the format of the
preamble lines.
If invoked on marked messages (via vm-next-command-uses-marks),
only marked messages will be put into the digest. If applied to
collapsed threads in summary and thread operations are enabled via
vm-enable-thread-operations then all messages in the thread are
included in the digest.
Like vm-send-digest, but run in a newly created frame.
Like vm-send-digest but always sends an MIME (multipart/digest) digest.
Like vm-send-mime-digest, but run in a newly created frame.
Like vm-send-digest but always sends an RFC 1153 digest.
Like vm-send-rfc1153-digest, but run in a newly created frame.
Like vm-send-digest but always sends an RFC 934 digest.
Like vm-send-rfc934-digest, but run in a newly created frame.
Yank message number N into the current buffer at point. When called interactively N is always read from the minibuffer. When called non-interactively the first argument is expected to be a message struct.
This command is meant to be used in VM created Mail mode buffers; the yanked message comes from the mail buffer containing the message you are replying to, forwarding, or invoked VM’s mail command from.
The whole message is inserted, headers and all, with point left
before it and the mark after it, which is where a function on
mail-citation-hook looks for what it is to cite. Anything on
that hook is then run.
With nothing on the hook VM cites the message itself: the yanked
headers are trimmed as specified by vm-included-text-headers and
vm-included-text-discard-header-regexp, which between them keep
none by default, and the value of vm-included-text-prefix is
prepended to every line that is left.
Like vm-yank-message except the message is yanked from a folder other than the one that spawned the current Mail mode buffer. The name of the folder is read from the minibuffer.
Don’t call this function from a program.
Non-nil means refuse to send a message whose Bcc could reach the recipients.
VM refuses when a composition carries a Bcc header and send-mail-function
is not one of vm-senders-that-remove-bcc. Such a function hands the
header to a program outside Emacs and trusts it to remove it, so the privacy
of the Bcc rests on that program being right. Where it is not, everyone on
the message learns who was blind copied (emacs-vm/vm#815).
Set this to nil where you know your transport removes it, and VM sends as it did before. The check costs nothing when a composition has no Bcc.
Default value: t
Non-nil means ask before sending a message with an empty Subject.
Default value: t
Non-nil means check the recipient headers before sending a message.
A missing comma turns two addresses into one that goes nowhere, which is
what vm-mail-check-recipients looks for.
Non-nil means tidy the Subject prefixes of a new composition.
vm-mail-subject-cleanup does the work, by
vm-mail-subject-prefix-replacements.
List of coding systems for VM to use, for outgoing mail, in order of preference.
Nil lets Emacs choose. Set it where Emacs picks a coding system your
recipients cannot read: a list such as (utf-8), or ‘(iso-8859-1
iso-8859-15 utf-8)’ to prefer the narrower ones where they will do, puts your
own order on the choice.
Whether VM asks before a composition with writing in it is killed.
A composition buffer belongs to no file, so Emacs kills it without the
question it asks about an unsaved file: kill-buffer and everything bound to
it, kill-this-buffer included, took an unsent reply with no warning
(emacs-vm/vm#824). Nil restores that.
The question is not asked for a composition nothing has been written in, nor for one that has been sent.
Default value: t
Non-nil means ask before sending a mail message.
This affects vm-mail-send and vm-mail-send-and-exit in Mail mode.
A list of minor modes to disable before encoding a message. These modes may slow down (font-lock and *spell) encoding and may cause trouble (abbrev-mode).
Default value:
(auto-fill-mode font-lock-mode ispell-minor-mode flyspell-mode abbrev-mode adaptive-fill-mode)
The functions to call when a drag and drop into a message
composition buffer is done.
See dnd-protocol-alist for more information. When nil, behave
as in other buffers.
Default value:
(("^file:///" . vm-dnd-attach-file) ("^file://" . dnd-open-file)
("^file:" . vm-dnd-attach-file))
Regexp matching chars to replace by "_" in composition buffer names. A composition buffer is named after its recipient and subject, and that name is what the auto-save file is named after, so characters a file name cannot hold are replaced. Set to nil to leave names alone.
The default matches control characters and the directory separator. On MS-Windows it also matches the rest of the set that platform forbids in a file name: backslash, colon, asterisk, question mark, double quote, less-than, greater-than and vertical bar. That larger set is not used elsewhere because it includes the colon, which would turn every "Re:" in a subject into "Re_".
This used to be a US-ASCII whitelist, which replaced every accented letter as well: a reply to "Ren’e" was named "reply to Ren_". To get that back, set this to "[^ a-zA-Z0-9.,_\"’+-]".
Default value: "[[:cntrl:]/]"
Fill lines spanning that many columns or more in replies.
Default value: 70
This variable can be set to nil, a numeric value N, the
symbol window-width. If it is numeric, it causes VM to fill
included text in replies provided it has lines spanning that many
columns or more. Setting it to window-width has the effect of
using the width of the Emacs window.
This variable determines which paragraphs are filled,
but vm-fill-long-lines-in-reply-column determines the fill column.
Note that filling is carried out only if word wrapping is not in
effect. The variable vm-word-wrap-paragraphs-in-reply controls word
wrapping.
Column at which HTML quoted in a reply is broken into lines. An HTML part carries no line breaks of its own: whatever converts it to text decides where its lines end, and asked for nothing in particular each converter uses a width of its own – emacs-w3m the width of the window the message happened to be displayed in, lynx 72 columns. So a reply quoted lines of one length today and another tomorrow.
A number asks for lines of that width, whatever window the message was read
in; 80, the default, is conventional. window-width is the old behaviour,
the width of the window at the time.
There is no setting for text that is not broken at all. No converter takes such an instruction, and asking for a page wide enough that no line would reach the end of it means a page laid out that wide: a centred table, which is the layout of most HTML mail, then comes back indented by hundreds of columns.
This governs quoted text only. Displaying a message still fills to the window, which is what a window is for.
Default value: 80
String which specifies the format of the contents of the In-Reply-To
header that is generated for replies. See the documentation for the
variable vm-summary-format for information on what this string may
contain. The format should *not* end with a newline.
Nil means don’t put an In-Reply-To header in replies.
If the format includes elements with non-ASCII characters, then
"In-Reply-To" should be added to vm-mime-encode-headers-regexp.
Default value: "%i"
Non-nil value enables attachments to be included in quoted text in a reply message. Otherwise only the button label will be included.
If true a reply will include the basic text of a message. This is an old method for citing messages and should not be used normally.
If non-nil, the list of mime type/subtype pairs that should be included in quoted text in a reply message in addition to the default types.
This variable currently has an effect only if vm-include-text-basic
is true. It has no effect for the default text quotation mechanism
based on MIME decoding.
The default value is nil.
String which specifies the format of the attribution that precedes the
included text from a message in a reply. See the documentation for the
variable vm-summary-format for information on what this string may contain.
Nil means don’t attribute included text in replies.
Default value: "%F writes:\n"
Non-nil value should be a regular expression that tells what
headers should not be retained in a message included in a reply.
This variable along with vm-included-text-headers determines
which headers are retained.
If the value of vm-included-text-discard-header-regexp is nil,
the headers matched by vm-included-text-headers are the only headers
that will be retained.
If vm-included-text-discard-header-regexp is non-nil, then only
headers matched by this variable will not be retained; all
others will be included. vm-included-text-headers determines the
header order in that case, with headers not matching any in
the vm-included-text-headers list appearing last in the header
section of the included text.
List of headers that should be retained in a message included in a reply. These should be listed in the order you wish them to appear in the included text. Regular expressions are allowed. There’s no need to anchor patterns with "^", as searches always start at the beginning of a line. Put a colon at the end of patterns to get exact matches. (E.g. "Date" matches "Date" and "Date-Sent".) Header names are always matched case insensitively.
If the value of vm-included-text-discard-header-regexp is nil,
the headers matched by vm-included-text-headers are the only
headers that will be retained.
If vm-included-text-discard-header-regexp is non-nil, then the
headers matched by that variable will be omitted; all the others
will be included. vm-included-text-headers determines the
header order in that case, with headers not matching any in the
vm-included-text-headers list appearing last in the header
section of the included text.
String used to prefix included text in replies.
Default value: " > "
Non-nil value N causes VM to keep the last N messages sent from within VM.
Keep means that VM will not kill the composition buffer after
you send a message with C-c C-c (vm-mail-send-and-exit). A
value of 0 or nil causes VM never to keep such buffers. A value
of t causes VM never to kill such buffers.
Note that these buffers will vanish once you exit Emacs. To keep a permanent
record of your outgoing mail, use the mail-archive-file-name variable.
Default value: 1
Directory where messages being composed are auto-saved. If it is
nil, vm-folder-directory is used for this purpose.
Non-nil value causes vm-mail-send to check multi-line recipient
headers of outbound mail for lines that don’t end with a
comma. If such a line is found, an error is signaled and the
mail is not sent.
Default value: t
Non-nil value should be a string that will be appear as the body
of the From header in outbound mail messages. A nil value means don’t
insert a From header. This variable also controls the inclusion and
format of the Resent-From header, when resending a message with
vm-resend-message.
Non-nil value causes VM to insert a Date header into a message when it is sent. If the message has a Date header, it will be removed before the new one is inserted. If the message being sent is a resent message (i.e. has a Resent- recipient header) then the Resent-Date header will be removed/inserted instead.
This is useful if you set mail-archive-file-name,
because your archived message will contain a Date header.
A nil value means don’t insert a Date header.
Default value: t
Non-nil value causes VM to insert a Message-ID header into a message when it is sent. If the message has a Message-ID header, it will be removed before the new one is inserted. If the message being sent is a resent message (i.e. has a Resent- recipient header) a Resent-Message-ID header will be removed/inserted instead.
This is useful if you set mail-archive-file-name, because your
archived messages will contain a Message-ID header, which may be
useful later for threading messages.
A nil value means don’t insert a Message-ID header.
Default value: t
Order of headers when calling vm-reorder-message-headers interactively
in a composition buffer.
Default value:
("From:" "Organization:" "Subject:" "Date:" "Priority:" "X-Priority:"
"Importance:" "Message-ID:" "MIME-Version:" "Content-Type:" "To:"
"Newsgroups:" "CC:" "BCC:" "Reply-To:")
Regexp replacement pairs for cleaning of replies.
Default value:
(("^\\( > [|{}>:;][^
]*
\\)+"
. "[...]
")
("^\\([^|{}>:;]+.*\\)
> [|{}>:;]*$"
. "\\1")
("^ > [|{}>:;]*
\\([^|{}>:;]\\)"
. "\\1")
("^ > [|{}>:;]*\\s-*
\\( > [|{}>:;]*\\s-*
\\)+"
. " >
")
("
+"
. "
")
("^ > --[^
]*
\\( > [^
]*
\\)+"
. "
")
("^ > ________[^
]*
\\( > [^
]*
\\)+"
. "
"))
Non-nil means vm-mail-mode-insert-date-maybe keeps an existing date header.
Otherwise, overwrite existing date headers
Default value: t
A list of headers to hide in a VM composition buffer.
Default value: ("References" "X-Mailer")
Prompt for a subject when empty.
Default value: t
Reorder message headers before sending.
Non-nil means, add a number [N] after the reply prefix. The number reflects the number of references.
List of subject prefixes which should be replaced. Matching will be done case insensitively.
Default value:
(("\\(\\(re\\|aw\\|antw\\)\\(\\[[0-9]+\\]\\)?:[ ]*\\)+"
. "Re: ")
("\\(\\(fo\\|wg\\)\\(\\[[0-9]+\\]\\)?:[ ]*\\)+" . "Fo: "))
If this set to t, M-x vm-mail will use the sender of the current
message as the recipient for the new message composition.
Non-nil means make room when you type inside quoted text. Typing in the middle of a citation otherwise leaves your words inside the quotation; with this set VM opens a line for them.
Non-nil value should be a list of regular expressions that match addresses that VM should automatically remove from the recipient headers of replies. These addresses are removed from the headers before you are placed in the message composition buffer. So if you see an address in the header you don’t want you should remove it yourself.
Case is ignored when matching the addresses.
Non-nil value should be a list of regular expressions that match addresses that, if VM finds in a message’s Reply-To header, VM should ignore the Reply-To header and not use it for replies. VM will use the From header instead.
Case is ignored when matching the addresses.
This variable exists solely to provide an escape chute from mailing lists that add a Reply-To: mailing list header, thereby leaving no way to reply to just the author of a message.
Non-nil value should be a string that VM should add to the beginning of the Subject header in replies, if the string is not already present. Nil means don’t prefix the Subject header.
Non-nil value causes VM to strip away all comments and extraneous text from the headers generated in reply messages. If you use the "fakemail" program as distributed with Emacs, you probably want to set this variable to t, because as of Emacs v18.52 "fakemail" could not handle unstripped headers.
If non-nil, causes VM to word wrap the long lines of a composition. As vm-word-wrap-paragraphs does for a message being read, and for the same reason: quoted text keeps its own line breaks. The column wrapped to is vm-fill-long-lines-in-reply-column.
These are invoked by a toolbar button, a menu entry, a mouse binding, a keymap entry or a hook rather than typed by name. Nothing stops you calling one.
Generate a reply to the current message if it requests a return receipt
and has not been replied so far.
See the variable vm-handle-return-receipt-mode for customization.
Ask before sending if this composition’s Bcc could reach the other recipients.
A Bcc header is a promise: the addresses in it are told nothing to the people
who receive the message. With send-mail-function set to
sendmail-send-it, VM and Emacs keep the header in the message they hand
to sendmail-program and trust that program to take it out, because with
-t those addresses are also how it learns whom to deliver to. When it does
not take it out, everyone on the message reads who was blind copied, and
nothing has failed anywhere that anyone can see (emacs-vm/vm#815).
Asks rather than refuses because a working sendmail, postfix or exim does remove it, and those are a great many of the people sending mail this way. Declining says what to change and where it is written down.
Not autoloaded: VM has to be loaded before M-x offers this one.
Check if the subject line is empty and issue an error if so.
Not autoloaded: VM has to be loaded before M-x offers this one.
Check if the recipients are specified correctly. Actually it checks only if there are any missing commas or the like in the headers.
Not autoloaded: VM has to be loaded before M-x offers this one.
Do some subject line clean up.
- Replace subject prefixes according to vm-mail-subject-prefix-replacements.
- Add a number after replies is vm-mail-subject-number-reply is t.
You might add this function to vm-mail-mode-hook in order to clean up the
Subject header.
Not autoloaded: VM has to be loaded before M-x offers this one.
Save all unfiled messages that auto-match a folder via
vm-auto-folder-alist to their appropriate folders. Messages that
are flagged for deletion are not saved. Messages with a "filed"
flag are not saved.
This command asks for confirmation before proceeding. Set
vm-confirm-for-auto-archive to nil to turn off the confirmation
dialogue.
Prefix arg means to prompt user for confirmation for each message separately.
When invoked on marked messages (via vm-next-command-uses-marks),
only marked messages are checked against vm-auto-folder-alist.
The saved messages are flagged as filed.
Runs a shell command with contents from the current message as input. By default the headers and the text are used, without the folder’s message separators. The prefix argument selects a part instead:
With one C-u the text portion of the message is used. With two C-u’s the header portion of the message is used. With three C-u’s the visible header portion of the message plus the text portion is used.
When invoked on marked messages (via vm-next-command-uses-marks),
each marked message is successively piped to the shell command, one
message per command invocation. If applied to collapsed threads in
summary and thread operations are enabled via
vm-enable-thread-operations then all messages in the thread are piped.
Output, if any, is displayed. The message is not altered.
Run a shell command with contents from the current message as input.
This function is like vm-pipe-message-to-command, but will not display the
output of the command.
Run a shell command with contents from messages as input.
Similar to vm-pipe-message-to-command, but it will call process
just once and pipe all messages to it. For bulk operations this
is much faster than calling the command on each message. This is
more like saving to a pipe.
With one C-u the text portion of the messages is used. With two C-u’s the header portion of the messages is used. With three C-u’s the visible header portion of the messages plus the text portion is used.
Leading and trailing separators are included with each message
depending on the settings of vm-pipe-messages-to-command-start
and vm-pipe-messages-to-command-end.
Output, if any, is displayed unless DISCARD-OUTPUT is t.
If NO-WAIT is t, then do not wait for process to finish, if it is a function then call it with the COMMAND and OUTPUT-BUFFER as arguments after the command finished.
Runs a shell command with contents from the current message as input.
This function is like vm-pipe-messages-to-command, but will not display the
output of the command.
Runs a shell command with contents from the current message as input.
This function is like vm-pipe-messages-to-command, but will not display the
output of the command, but return it as a string.
Print the current message Prefix arg N means print the current message and the next N - 1 messages. Prefix arg -N means print the current message and the previous N - 1 messages.
The variable vm-print-command controls what command is run to
print the message, and vm-print-command-switches is a list of switches
to pass to the command.
When invoked on marked messages (via vm-next-command-uses-marks),
each marked message is printed, one message per vm-print-command
invocation. If applied to collapsed threads in summary and thread
operations are enabled via vm-enable-thread-operations then all messages
in the thread are printed.
Output, if any, is displayed. The message is not altered.
Save the current message to another FOLDER, queried via the
mini-buffer. The FOLDER may be a local file system folder or an
IMAP folder. You can specify a preference by setting the
variable vm-imap-save-to-server.
Prefix arg COUNT means save this message and the next COUNT-1 messages. A negative COUNT means save this message and the previous COUNT-1 messages.
When invoked on marked messages (via vm-next-command-uses-marks),
all marked messages in the current folder are saved; other messages are
ignored. If applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread are saved.
Save the current message to a file, without its header section. If the file already exists, the message body will be appended to it. Prefix arg COUNT means save the next COUNT message bodies. A negative COUNT means save the previous COUNT bodies.
When invoked on marked messages (via vm-next-command-uses-marks),
only the next COUNT marked messages are saved; other intervening
messages are ignored. If applied to collapsed threads in summary and
thread operations are enabled via vm-enable-thread-operations then all
messages in the thread are saved.
The saved messages are flagged as written.
This command should NOT be used to save message to mail folders; use
vm-save-message instead (normally bound to s).
Save the current message to an IMAP folder. Prefix arg COUNT means save this message and the next COUNT-1 messages. A negative COUNT means save this message and the previous COUNT-1 messages.
When invoked on marked messages (via vm-next-command-uses-marks),
all marked messages in the current folder are saved; other messages are
ignored. If applied to collapsed threads in summary and thread
operations are enabled via vm-enable-thread-operations then all
messages in the thread are saved.
The saved messages are flagged as filed.
Save the current message to a mail folder. If the folder already exists, the message will be appended to it.
Prefix arg COUNT means save this message and the next COUNT-1 messages. A negative COUNT means save this message and the previous COUNT-1 messages.
When invoked on marked messages (via vm-next-command-uses-marks),
all marked messages in the current folder are saved; other messages are
ignored. If applied to collapsed threads in summary and thread
operations are enabled via vm-enable-thread-operations then all messages
in the thread are saved.
The saved messages are flagged as filed.
Incrementally search backward through the current folder’s messages. Usage is identical to the standard Emacs incremental search. When the search terminates the message containing point will be selected.
If the variable vm-search-using-regexps is non-nil, regular expressions are understood; nil means the search will be for the input string taken literally. Specifying a prefix ARG interactively toggles the value of vm-search-using-regexps for this search.
Incrementally search forward through the current folder’s messages. Usage is identical to the standard Emacs incremental search. When the search terminates the message containing point will be selected.
If the variable vm-search-using-regexps is non-nil, regular expressions are understood; nil means the search will be for the input string taken literally. Specifying a prefix ARG interactively toggles the value of vm-search-using-regexps for this search.
A not so excellent interface to grepmail. Grepmail is a fast perl-script for finding mails which got lost in the folder jungle. End your input or folders and directories with an empty sting or the default folder.
ARGUMENTS the command line arguments to grepmail. FOLDERS should be a list of files/directories to search in.
Expand all tokens within the current mail.
This means we search for the vm-serial-cookie and if it is followed by a
regexp of "[a-zA-Z][a-zA-Z0-9_-]" we treat this as a symbol to look up in
our vm-serial-token-alist. Optionally one may enclose the symbol by curly
parenthesis. See the test mail in vm-serial-mails-alist for examples.
If the cookie is followed by a parenthesis then it is treated as a lisp
expression which is evaluated
Results evaluating to a string are inserted all other return values are ignored. For non existing tokens or errors during evaluation one will get a warning.
RSTART and REND bound the text to expand. Given neither, the whole message body is expanded.
Return value of vm-serial TOKEN.
Reads a valid token, inserts it at point and expands it.
Compose one message from a template and send it to many recipients.
Turning this on advises vm-mail-send-and-exit so that a composition sent
from a source buffer is killed with it; turning it off removes that advice.
vm-serial-expand-tokens and vm-serial-send-mail are commands and work
either way.
The bindings and the compose hook are yours to add, as the commentary at the top of this file says: this mode does not take them over.
Loading this file switched the advice on until 2026 (emacs-vm/vm#788). Customize loads it whenever it is asked about a VM option, so loading no longer enables: say so here.
This is a global minor mode. If called interactively, toggle the
Vm-Serial mode mode. If the prefix argument is positive, enable the
mode, and if it is zero or negative, disable the mode.
If called from Lisp, toggle the mode if ARG is toggle. Enable the
mode if ARG is nil, omitted, or is a positive number. Disable the mode
if ARG is a negative number.
To check whether the minor mode is enabled in the current buffer,
evaluate (default-value 'vm-serial-mode).
The mode’s hook is called both when the mode is enabled and when it is disabled.
Send an expanded mail to each recipient listed in the To-header. This will create a new buffer for expanding the tokens and user interaction. You may send each mail interactively, that means you may send the message as it is, or you may edit it before sending or you may skip it.
If called with a prefix argument or NON-INTERACTIVE set to non nil, no questions will bother you!
Like vm-serial-send-mail but kills the buffer after sending all.
Set vm-serial TOKEN to NEWVALUE with DOC. You may remove a token by specifying just the TOKEN as argument.
Yank the template associated with MAIL.
If MAIL is nil search for a default template, i.e. the first one which evaluates its condition to true. When called with a prefix argument ask for a template and with another prefix argument or if NO-EXPAND is non nil no tokens will be expanded after yanking.
You may bind this to [C-c C-t] in mail-mode in order to automatically yank the right mail into the composition buffer and move the cursor to the editing point.
I try to be clever when to delete the existing buffer contents and when to expand the tokens, however if this does not satisfy you please report it to me.
The string which begins a token or Lisp expression.
See vm-serial-expand-tokens for information about valid tokens.
Default value: "$"
Whether to keep a FCC from the source mail within each serial mail.
If the function vm-postpone-message (from vm-postpone) is present it will
also save the source message in the specified folder otherwise there is
no way to save the source message.
Text inserted at the sig-token of a mail buffer.
The semantics are equal to those of variable mail-signature, however you
should disable variable mail-signature, since it interacts badly with
vm-serial, i.e. set vm-serial-mail-signature to the value of variable
mail-signature and set variable mail-signature to nil!
Alist of default mail templates.
Set this by calling vm-serial-set-mails!
Format:
((SYMBOLIC-NAME CONDITION MAIL-FORM)
...)
When calling vm-serial-yank-mail interactively one will be prompted for
a SYMBOLIC-NAME of a mail from. If called non interactively it will
search for the first condition which evaluates to true and inserts the
corresponding mail. If CONDITION is a string it is matched against the
To-header otherwise it is evaluated.
Default value:
(("honey" "girlfriend" "$dear $babe,
$point$reply
$inlove $your
$forward")
("german-reply"
(and vm-reply-list
(string-match "\\.\\(de\\|at\\|ch\\)>?$"
(vm-mail-mode-get-header-contents "To:")))
"$reply
$point
$ciao$i")
("german-default" "\\.\\(de\\|at\\|ch\\)>?$" "$hallo $you,
$point$reply
$ciao$i
$forward
$sig")
("german-serious" "\\.\\(de\\|at\\|ch\\)>?$" "$sg $sir,
$point$reply
$mfg
$me
$forward
$sig")
("english-reply" vm-reply-list "$reply
$point
$bye$i")
("english-default" t "$hi $you,
$point$reply
$bye$i
$forward
$sig
")
("doc" nil "
A LECTURE ON VM-SERIAL
The `vm-serial-mails-alist' contains a list of templates and associated
conditions and names for these templates.
When doing a `vm-serial-yank-mail' it will check for the first condition
which matches and inserts this template. Tokens in the template are
expanded by the function called `vm-serial-expand-tokens'.
There are default tokens for various things. Tokens start with the
string specified in `vm-serial-cookie' which is \"$(eval vm-serial-cookie)\" followed by a
string matching the regexp \\([a-zA-Z][a-zA-Z0-9_-]*\\) which may be
enclosed by {} or a lisp expressions. The first type is a named token
and has to be listed in the variable `vm-serial-token-alist'. It will be
expanded and if evaluating to a non nil object then it is inserted. In
order to get just the `vm-serial-cookie' \"$(eval vm-serial-cookie)\" simply write it twice.
You may also embed any kind of lisp expression. If they return a string, it
will be inserted.
Do [M-x vm-serial-expand-tokens] in order to see how things change ...
Example of a embedded lisp expression:
the current date is $$(format-time-string \"%D %r\").
$$(center-line) Center this line
$$$no expansion
The following tokens are currently defined:
Token Documentation (the example follows in the next line)
$(mapconcat
(function (lambda (tk)
(concat (car tk) \"\\t\" (caddr tk) \"
$\" (car tk))))
vm-serial-token-alist \"
\")
If you thing there are other tokens which should be added to this list, please
let me know!
mailto:Robert Fenk"))
Hook run after entering or leaving vm-serial-mode.
No problems result if this variable is not bound.
add-hook automatically binds it. (This is true for all hook variables.)
Alist for mapping tokens to real things, i.e., strings.
Set this by calling vm-serial-set-tokens!
The format of each record is:
(TOKENNAME SEXPRESSION DOCUMENTATION)
TOKENNAME and DOCUMENTATION have to be strings. SEXPRESSION one of - a list starting with a string, which might be followed by other string, functions or Lisp expressions - a function returning a string - a Lisp expression which evaluates to a string
When a list starting with a string then vm-serial-expand-tokens will
randomly select one of them during expansion.
Default value:
(("to" (vm-serial-get-to) "to header of the mail")
("sir" (vm-serial-get-name 'last) "the last name of the recipient")
("you" (vm-serial-get-name 'first) "the first name of the recipient")
("mr" (vm-serial-get-name) "the full name of the recipient")
("bbdbsir" (vm-serial-get-bbdb-name 'last)
"the last name of the recipient as returned by the BBDB")
("bbdbyou" (vm-serial-get-bbdb-name 'first)
"the first name of the recipient as returned by the BBDB")
("bbdbmr" (vm-serial-get-bbdb-name)
"the full name of the recipient as returned by the BBDB")
("me" (user-full-name) "your full name")
("i" (vm-serial-get-name 'first (user-full-name)) "your first name")
("I" (vm-serial-get-name 'last (user-full-name)) "your last name")
("point" (and (setq vm-serial-point (point)) nil)
"the position of point after expanding tokens")
("reply"
(if (and vm-reply-list vm-serial-body-contents)
(insert vm-serial-body-contents))
"set to the message body when replying")
("forward"
(if (and vm-forward-list vm-serial-body-contents)
(insert vm-serial-body-contents))
"set to the message body when forwarding")
("body" (if vm-serial-body-contents (insert vm-serial-body-contents))
"set to the message body before yanking a mail template")
("sig"
(cond ((not vm-serial-mail-signature) nil)
((stringp vm-serial-mail-signature) vm-serial-mail-signature)
((eq t vm-serial-mail-signature)
(insert-file mail-signature-file))
((functionp vm-serial-mail-signature)
(funcall vm-serial-mail-signature))
(t (eval vm-serial-mail-signature)))
"the signature obtained from `vm-serial-mail-signature'")
("fifosig" (concat "--
"
(shell-command-to-string
(concat "cat " mail-signature-file)))
"a signature read from a FIFO")
("hi" ("Hi" "Hello" "Dear") "a randomly selected hi-style salutation")
("dear" ("Lovely" "Hello" "Dear" "Sweetheart")
"a randomly selected dear-style salutation")
("bye" ("" "Bye " "Cheers " "CU ")
"a randomly selected bye-style greeting")
("br" ("Best regards" "Sincerly" "Yours")
"a randomly selected best-regards-style greeting")
("babe" ("honey" "sugar pie" "darling" "babe")
"a randomly selected honey-style salutation")
("inlove" ("In love" "Dreaming of you" "1 billion kisses")
"a randomly selected inlove-style greeting")
("your"
("honey" "sugar pie" "darling" "babe"
(vm-serial-get-name 'first (user-full-name)))
"a randomly selected your-style greeting")
("hallo" ("Hi" "Griass di" "Servus" "Hallo") "ein Hallo-Gruß")
("mausl" ("Mausl" "Liebling" "Schatzi" "Hallo") "die Freundin")
("ciao"
("" "Ciao " "Tschüß " "Servus " "Mach's gut " "Bis denn "
"Bis die Tage mal ")
"Verabschiedung")
("sg" ("Sehr geehrte Frau/Herr") "förmliche Anrede")
("mfg" ("Mit freundlichen Grüßen") "förmliche Verabschiedung")
("salut" ("Salut" "Bonjour") "Une salutation au hasard")
("merci" ("Merci" "Au revoir" "A+" "Amicalement")
"Un au revoir au hasard"))
The string displayed for recipients without a real name. If set to something different than a string it will be evaluated in order to return a string.
Default value: "unknown"
Move a message backward in a VM folder. Prefix arg COUNT causes the current message to be moved COUNT messages backward. A negative COUNT causes movement to be forward instead of backward. COUNT defaults to 1. The current message remains selected after being moved.
If vm-move-messages-physically is non-nil, the physical copy of the message in the folder is moved. A nil value means just change the presentation order and leave the physical order of the folder undisturbed.
Like vm-move-message-backward but always move the message physically.
Move a message forward in a VM folder. Prefix arg COUNT causes the current message to be moved COUNT messages forward. A negative COUNT causes movement to be backward instead of forward. COUNT defaults to 1. The current message remains selected after being moved.
If vm-move-messages-physically is non-nil, the physical copy of the message in the folder is moved. A nil value means just change the presentation order and leave the physical order of the folder undisturbed.
Like vm-move-message-forward but always move the message physically.
Sort message in a folder by the specified KEYS. KEYS is a string of sort keys, separated by spaces or tabs. If messages compare equal by the first key, the second key will be compared and so on. When called interactively the keys will be read from the minibuffer. Valid keys are
"date" the date the message was sent "activity" the date of the newest message in its thread "author" the address in the From header "full-name" the name in the From header "subject" the subject, normalized "recipients" the To and Cc headers together "addressees" the To header alone "line-count" the number of lines "byte-count" the number of bytes "physical-order" the order the messages are stored in "spam-score" the spam score of the headers
Each has a "reversed-" form that sorts the other way, as in "reversed-date".
Optional second arg (prefix arg interactively) means the sort should change the physical order of the messages in the folder. Normally VM changes presentation order only, leaving the folder in the order in which the messages arrived.
Toggle visibility of a particular vm-summary-face. By default, the deleted face is toggled (with the effect that all deleted messages will be hidden or unhidden).
With a prefix argument, the property name identifying the face is
queried interactively. The property is a keyword such as edited,
collapsed or outgoing which has an associated face such as
vm-summary-edited. See vm-summary-faces-alist for a list
of available face names.
Toggle vm-summary-faces-mode. Optional argument ARG should be 0
or 1, indicating whether the summary faces should be off or on.
When it is on, the VM summary buffers are decorated with faces, i.e., fonts and colors, for easy recogniton of the message status.
Regexp matching prefix of quoted text at line start.
Default value: "[ \11]*>"
List of condition-face pairs for deciding the faces for summary
lines. Each element of the list is a pair, i.e., a two-element list.
The first element is a virtual folder condition as described in the
documentation of vm-virtual-folder-alist. The second element is a
face name.
The order matters. The first condition that matches the message will decide the face.
Default value:
(((deleted) vm-summary-deleted) ((new) vm-summary-new)
((marked) vm-summary-marked)
((or (header "Priority: urgent") (header "Importance: high")
(header "X-Priority: 1") (flagged) (label "!")
(label "\\flagged") (header "X-VM-postponed-data:"))
vm-summary-high-priority)
((unread) vm-summary-unread) ((replied) vm-summary-replied)
((or (filed) (written)) vm-summary-saved)
((or (forwarded) (redistributed)) vm-summary-forwarded)
((edited) vm-summary-edited) ((outgoing) vm-summary-outgoing)
((any) vm-summary-default))
Collapse (fold) all threads in the folder so that only the roots of the threads are shown in the Summary window.
Collapse the thread associated with the message at point. This will make invisible all read and non-new elements of the thread tree and will place a ’+’ character at the pointer position indicating the thread can be expanded. Optional argument nomove directs vm-collapse-thread to not take the default action of moving the pointer to the thread root after collapsing.
In a Lisp program, you should call it with an additional argument ROOT, which is the root of the thread you want collapsed.
Expand all threads in the folder, which might have been collapsed (folded) earlier.
Expand the thread associated with the message at point. This will make visible all invisible elements of the thread tree and place a ’-’ character at the pointer position indicating that the thread can be collapsed.
In a Lisp program, you should call it with an argument ROOT, which is the root of the thread you want expanded.
Rebuild the summary.
Call this function if you made changes to vm-summary-format.
Summarize the contents of the folder in a summary buffer.
The format is as described by the variable vm-summary-format. Generally
one line per message is most pleasing to the eye but this is not
mandatory.
Like vm-summarize, but run in a newly created frame.
Summarize the contents of the folder in a summary buffer.
The format is as described by the variable vm-summary-format. Generally
one line per message is most pleasing to the eye but this is not
mandatory.
Like vm-summarize, but run in a newly created frame.
Trace this message while summary lines are being built.
A debugging aid: vm-summary-debug enters the debugger for a message on
this list, and only when vm-debug is set, so tracing a message costs
nothing until then. Prints the list of messages being traced.
Toggle collapse/expand thread associated with message at point.
see vm-expand-thread and vm-collapse-thread for a description
of action.
Value controls whether VM will keep the summary arrow vertically centered within the summary window. A value of t causes VM to always keep arrow centered. A value of nil means VM will never bother centering the arrow. A value that is not nil and not t causes VM to center the arrow only if the summary window is not the only existing window.
Non-nil value causes VM to use vm-next-message to advance to the next
message in the folder if the user attempts to scroll past the end of the
current messages. A nil value disables this behavior.
Default value: t
Value determines whether VM folders will be considered circular by
various commands. Circular means VM will wrap from the end of the folder
to the start and vice versa when moving the message pointer, or deleting,
undeleting or saving messages before or after the current message.
A value of t causes all VM commands to consider folders circular.
A value of nil causes all of VM commands to signal an error if the start or end of the folder would have to be passed to complete the command. For movement commands, this occurs after the message pointer has been moved as far as possible in the specified direction. For other commands, the error occurs before any part of the command has been executed, i.e. no deletions, saves, etc. will be done unless they can be done in their entirety.
A value that is not nil and not t causes only VM’s movement commands to consider folders circular. Saves, deletes and undelete commands will behave the same as if the value is nil.
If non-nil, VM operations on root messages of collapsed threads will apply to all the messages in the threads.
"Operations" in this context include deleting, saving, setting attributes, adding/deleting labels etc.
If the variable is set to t then thread operations are always
carried out. If it is set to ask, then the user is asked for
confirmation whether the operation should apply to all the
messages in the thread. This can be overridden by invoking the
operation with a prefix argument using C-u and no questions will be
asked.
Non-nil value causes VM to select the message under the cursor in the summary window before executing commands that operate on the current message. This occurs only when the summary buffer window is the selected window.
Default value: t
Non-nil value causes VM to jump to the first new message whenever such messages arrive in a folder or the first time a folder is visited.
See also vm-jump-to-unread-messages.
Default value: t
Non-nil value causes VM to jump to the first unread message whenever such messages arrive in a folder or the first time a folder is visited. New messages are considered unread in this context so new messages will be jumped to as well.
The value of vm-jump-to-new-messages takes precedence over the
setting of this variable. So if there are unread messages and
new messages VM will jump to the first new message, even if an
unread message appears before it in the folder, provided
vm-jump-to-new-messages is non-nil.
Default value: t
Non-nil value means highlight summary lines as the mouse passes over them.
Default value: t
Non-nil value causes VM’s d command to automatically invoke
vm-next-message or vm-previous-message after deleting, to move
past the deleted messages. A value of t means motion should
honor the value of vm-circular-folders. A value that is not t
and not nil means that motion should be done as if
vm-circular-folders is set to nil.
Non-nil value causes VM’s k command to automatically invoke
vm-next-message or vm-previous-message after killing messages, to try
to move past the deleted messages. A value of t means motion
should honor the value of vm-circular-folders. A value that is
not t and not nil means that motion should be done as if
vm-circular-folders is set to nil.
Non-nil value causes VM’s . command to automatically invoke
vm-next-message or vm-previous-message after killing messages, to try
to move past the read messages. A value of t means motion
should honor the value of vm-circular-folders. A value that is
not t and not nil means that motion should be done as if
vm-circular-folders is set to nil.
Non-nil value causes VM’s u command to automatically invoke
vm-next-message or vm-previous-message after undeleting, to move
past the undeleted messages. A value of t means motion should
honor the value of vm-circular-folders. A value that is not t
and not nil means that motion should be done as if
vm-circular-folders is set to nil.
If t, the summary format is stored in each folder and restored after visiting it again.
Non-nil value causes VM’s n and p commands to skip over
deleted messages. A value of t causes deleted messages to always be skipped.
A value that is not nil and not t causes deleted messages to be skipped only
if there are other messages that are not flagged for deletion in the desired
direction of motion.
Default value: t
Non-nil value causes VM’s n and p commands to skip over
messages that have already been read, in favor of new or unread messages.
A value of t causes read messages to always be skipped. A value that is
not nil and not t causes read messages to be skipped only if there are
unread messages in the desired direction of motion.
If set to t, VM will use the "Delivery-Date" header instead of the "Date" header for sorting messages.
Non-nil values causes VM to sort threads as well as their subthreads by chosen sorting criteria. Nil value causes it to sort all the messages in a thread without grouping them into subthreads. This might be useful for very long threads.
Default value: t
Value tells VM whether to generate a summary when a folder is visited. Nil means don’t automatically generate a summary.
A value of t means always generate a summary.
A positive numeric value N means only generate a summary if there are N or more messages.
A negative numeric value -N means only generate a summary if there are N or less messages.
Default value: t
Non-nil value should be a regular expression that matches strings at the beginning of the Subject header that you want VM to ignore when threading, sorting, marking, and killing messages by subject.
Matches are done case-insensitively.
Default value: "^\\(re: *\\)+"
Non-nil value should be a regular expression that matches strings at the end of the Subject header that you want VM to ignore when threading, sorting, marking and killing messages by subject.
Matches are done case-insensitively.
Default value: "\\( (fwd)\\| \\)+$"
Number of characters in the normalized message subject considered
significant in message threading and sorting. The normalized
subject is the contents of the Subject header after ignored
prefixes and suffixes have been removed and after consecutive
whitespace has been collapsed into single spaces. The first
vm-subject-significant-chars will be considered significant.
Characters beyond this point in the subject string will be
ignored.
A nil value for this variable means all characters in the message subject are significant.
Non-nil value should be a regular expression that matches the "subject tags" included in subject lines by mailing lists. Subject tags are always enclosed in square brackets and have white space following them. For example "M-x [^:]*][ ]*" matches all subject tags enclosed in square brackets along with the trailing white space following it.
Subject tags matching this regular expression will be ignored when
threading, sorting, marking and killing messages by subject. They are
also removed from message summary lines if
vm-summary-strip-subject-tags is set to t.
Matches are done case-insensitively.
Non-nil value should be a regular expression that matches the
"subject tags" included in subject lines by mailing lists. See
vm-subject-tag-prefix. Subject tags matching this pattern are not
removed during threading, sorting, summarizing, marking and
killing messages by subject.
Matches are done case-insensitively.
String that is displayed to the left of the summary of the message VM consider to be the current message. The value takes effect when the summary buffer is created. Changing this variable’s value has no effect on existing summary buffers.
Default value: "->"
Indicator shown in the summary for a message carrying attachments. A string is shown as it stands. A symbol is shown followed by the number of attachments, so the symbol $ gives "$2" for a message of two. A message with none shows nothing either way.
The symbol is a symbol and not a character: ?$ is the integer 36, and what the summary would then show is "362".
Default value: "$"
List of MIME types which should not be listed as attachment.
List of MIME types which should be listed as attachment. Mime parts with a disposition of attachment or a filename/name disposition parameter will be automatically considered as attachment.
If non-nil, enables folding of threads in VM summary windows.
String which specifies the message summary line format.
The string may contain the printf-like % conversion specifiers which
substitute information about the message into the final summary line.
Recognized specifiers are:
a - attribute indicators, four characters wide. Each column shows the
first of its states that the message is in, and a space for none:
- column 1: D deleted, N new, U unread, ! flagged, space read
- column 2: F filed, W written, space neither
- column 3: R replied to, Z forwarded, B redistributed, space none
- column 4: E edited, space not edited
A - attribute indicators, seven characters wide. The first column is the
one above; each of the rest is its own letter or a space:
- column 1: D deleted, N new, U unread, ! flagged, space read
- column 2: r replied to
- column 3: z forwarded
- column 4: b redistributed
- column 5: f filed
- column 6: w written
- column 7: e edited
b - attribute indicators, one character wide, the first column of the
four above:
- D deleted, N new, U unread, ! flagged, space read
c - number of characters in message (ignoring headers)
d - numeric day of month message sent
f - author’s address
F - author’s full name (same as f if full name not found)
h - hour:min:sec message sent
H - hour:min message sent
i - message ID
I - thread indentation
l - number of lines in message (ignoring headers)
L - labels (as a comma list)
m - month message sent
M - numeric month message sent (January = 1)
n - message number
p - indicator for postponed messages
P - indicator for attachments, see ‘vm-summary-attachment-indicator’
r - addresses of the recipients of the message, in a comma-separated list
R - full names of the recipients of the message, in a comma-separated list
If a full name cannot be found, the corresponding address is used
instead.
s - message subject
S - human readable size of the message
t - addresses of the addressees of the message, in a comma-separated list
T - full names of the addressees of the message, in a comma-separated list
If a full name cannot be found, the corresponding address is used
instead.
U - user defined specifier. The next character in the format
string should be a letter. VM will call the function
vm-summary-function-<letter> (e.g. vm-summary-function-A for
"%UA") in the folder buffer with the message being summarized
bracketed by (point-min) and (point-max). The function
will be passed a message struct as an argument.
The function should return a string, which VM will insert into
the summary as it would for information from any other summary
specifier.
w - day of the week message sent
y - year message sent
z - timezone of date when the message was sent
* - ‘*’ if the message is marked, ‘ ’ otherwise
( - starts a group, terminated by %). Useful for specifying
the field width and precision for the concatenation of
group of format specifiers. Example: "%.35(%I%s%)"
specifies a maximum display width of 35 characters for the
concatenation of the thread indentation and the subject.
) - ends a group.
Use %% to get a single %.
A numeric field width may be given between the % and the specifier;
this causes right justification of the substituted string. A negative field
width causes left justification. A width beginning with 0 fills with
zeros rather than spaces, for the specifiers whose substitution is a
number (%c, %d, %l, %M, %n and %y); a negative width fills with spaces
whatever the 0 says, since zeros to the right of a number make a
different number.
The field width may be followed by a . and a number specifying
the maximum allowed length of the substituted string. If the
string is longer than this value the right end of the string is
truncated. If the value is negative, the string is truncated on
the left instead of the right.
The maximum is applied first and the width after it, as in printf: "%20.4s" is four columns of the substitution in a column twenty wide. The two are usually written with the same number, which makes a column of exactly that width.
The summary format need not be one line per message but it must end with a newline, otherwise the message pointer will not be displayed correctly in the summary window.
Default value: "%3n %*%a %-17.17F %-3.3m %2d %4l/%-5c %I\"%s\"\n"
The maximum number of thread nesting levels that should be displayed by indentation in the folder summary.
Default value: 20
Indicator shown for postponed messages.
Default value: "P"
String to display before the principal when displayed instead of an
"uninteresting" sender. See vm-summary-uninteresting-senders.
Default value: "For: "
String to display before the recipients when displayed instead of an
"uninteresting" sender. See vm-summary-uninteresting-senders.
Default value: "To: "
If non-nil, thread folding displays the count of messages in a thread along with the message number of the thread root. Note that this takes up 3 extra characters in each summary line.
Default value: t
Non-nil value means VM should display and maintain
message thread trees in the summary buffer. This means that
messages with a common ancestor will be displayed contiguously in
the summary. (If you have vm-move-messages-physically set
non-nil the folder itself will be reordered to match the thread
ordering.) If you use the %I summary format specifier in your
vm-summary-format, indentation will be provided as described in the
documentation for vm-summary-thread-indent-level (which see).
A nil value means don’t display thread information. The %I
specifier does nothing in the summary format.
This variable automatically becomes buffer-local when set in any
fashion. You should set this variable only in your .vm or .emacs
file. Use setq-default. Once VM has been started, you should not
set this variable directly, rather you should use the command
vm-toggle-threads-display, normally bound to C-t.
Set this to a non-nil value to ask VM to strip "subject tags" added by mailing lists when displaying subjects in summary lines.
The subject tags that will be stripped are those matching
vm-subject-tag-prefix but not matching vm-subject-tag-prefix-exceptions.
If non-nil and thread folding is enabled, invoking
vm-next/previous-message-no-skip (N or P respectively)
will expand a thread upon moving into the thread and collapse it when
you move out of the thread.
Value should be a number that specifies how much
indentation the ’%I’ summary format specifier should provide per
thread level. A message’s thread level refers to the number of
direct ancestors from the message to the oldest ancestor the
message has that is in the current folder. For example, the
first message of a thread is generally a message about a new
topic, e.g. a message that is not a reply to some other message.
Therefore it has no ancestor and would cause %I to generate no
indentation. A reply to this message will be indented by the value
of vm-summary-thread-indent-level. A reply to that reply will be
indented twice the value of vm-summary-thread-indent-level.
Default value: 2
If non-nil, threaded messages are indented according to their nesting level determined by their references headers. This is likely to be their original nesting level in the discussion. If it is nil, then the indentation level is determined by the number of thread ancestors within the folder. When some messages in the thread are missing or deleted, this is likely to be less than the original nesting level.
Default value: t
Non-nil value should be a regular expression that matches
addresses that you don’t consider interesting enough to
appear in the summary. When such senders would be displayed by
the %F or %f summary format specifiers VM will substitute the
value of vm-summary-recipient-marker (default "To: ") followed
by what would be shown by the %T and %t specifiers respectively.
List of selectors identifying messages that should be visible in
folded thread summaries, i.e., such messages remain visible even if
their threads are shown collapsed. The selectors are the same as
those used in vm-virtual-folder-alist.
Default value: ((new))
Non-nil value causes VM to use the Subject header to thread messages. Messages with the same subject will be grouped together.
A nil value means VM will disregard the Subject header when threading messages.
Default value: t
Non-nil value means VM should provide context-sensitive menus on mouse-3. A nil value means VM should not change the binding of mouse-3.
Default value: t
The directory VM should find its toolbar pixmaps.
Non-nil value means that VM should use buttons on menubars, such as [Emacs] and [VM], in environments that support such buttons.
Default value: t
Non-nil value causes VM to provide a menu interface. A value that is a list causes VM to install its own menubar. A value of 1 causes VM to install a "VM" item in the Emacs menubar.
If the value of vm-use-menus is a list, it should be a list of
symbols. The symbols and the order in which they are listed
determine which menus will be in the menubar and how they are
ordered. Valid symbol values are:
dispose
emacs
folder
help
label
mark
motion
send
sort
undo
virtual
nil
If nil appears in the list, it should appear exactly once. All menus after nil in the list will be displayed flushright in menubar.
This variable only has meaning in Emacs environments where menus are provided, which usually means Emacs has to be running under a window system.
Default value:
(folder motion send mark label sort virtual undo dispose emacs nil help)
Non-nil value causes VM to provide a toolbar interface. Value should be a list of symbols and integers that will determine which toolbar buttons will appear and in what order.
A nil or an integer in the list is ignored. Both meant something to
XEmacs, which VM no longer supports: nil made what followed it flushright,
and an integer put that many pixels of space in. The Emacs toolbar has
neither, and its position is tool-bar-position, a frame parameter.
Default value:
(getmail next previous delete/undelete autofile file reply followup forward compose print visit quit help)
These are invoked by a toolbar button, a menu entry, a mouse binding, a keymap entry or a hook rather than typed by name. Nothing stops you calling one.
Save this message to the folder vm-auto-folder-alist chooses for it.
The toolbar’s autofile button. Signals if no entry in that list matches
the message, rather than prompting for a folder.
Return the folder the current message would be auto-filed to, or nil. What decides whether the toolbar’s autofile button is enabled. Never signals: no folder, no message, and a folder buffer that has been killed all give nil.
Send a mail message from within VM, or from without. Optional argument TO is a string that should contain a comma separated recipient list.
Not autoloaded: VM has to be loaded before M-x offers this one.
Decode the MIME objects in the current message.
The first time this command is run on a message, decoding is done. The second time, buttons for all the objects are displayed instead. The third time, the raw, undecoded data is displayed.
The optional argument STATE can specify which decode state to display:
decoded, button, or undecoded.
If decoding, the decoded objects might be displayed immediately, or buttons might be displayed that you need to activate to view the object. See the documentation for the variables
vm-mime-auto-displayed-content-types
vm-mime-auto-displayed-content-type-exceptions
vm-mime-internal-content-types
vm-mime-internal-content-type-exceptions
vm-mime-external-content-types-alist
to see how to control whether you see buttons or objects.
If the variable vm-mime-display-function is set, then its value
is called as a function with no arguments, and none of the
actions mentioned in the preceding paragraphs are taken. At the
time of the call, the current buffer will be the presentation
buffer for the folder and a copy of the current message will be
in the buffer. The function is expected to make the message
MIME presentable to the user in whatever manner it sees fit.
Not autoloaded: VM has to be loaded before M-x offers this one.
Not documented.
Save the current message to another FOLDER, queried via the
mini-buffer. The FOLDER may be a local file system folder or an
IMAP folder. You can specify a preference by setting the
variable vm-imap-save-to-server.
Prefix arg COUNT means save this message and the next COUNT-1 messages. A negative COUNT means save this message and the previous COUNT-1 messages.
When invoked on marked messages (via vm-next-command-uses-marks),
all marked messages in the current folder are saved; other messages are
ignored. If applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread are saved.
Not autoloaded: VM has to be loaded before M-x offers this one.
Reply to all recipients of the current message. See the documentation for the function vm-reply for details.
Not autoloaded: VM has to be loaded before M-x offers this one.
Forward the current message to one or more recipients. You will be placed in a Mail mode buffer as you would with a reply, but you must fill in the "To:" header and perhaps the "Subject:" header manually.
See vm-forward-message-plain for forwarding messages in plain text.
Not autoloaded: VM has to be loaded before M-x offers this one.
Move any new mail that has arrived in any of the spool files for the current folder into the folder. New mail is appended to the disk and buffer copies of the folder.
Prefix arg means to gather mail from a user specified folder, instead of the usual spool files. The file name will be read from the minibuffer. Unlike when getting mail from a spool file, the source file is left undisturbed after its messages have been copied.
Two prefix args (C-u C-u) mean to fetch everything an IMAP mailbox
has and this folder has not, including the messages vm-imap-retrieved-messages
records as fetched once already. That record is what stops a message deleted
here on purpose from coming back, so this is not the way to read mail day to
day; it is how to refill a folder whose cache lost messages the record still
names. It gathers from no other folder, and other access methods ignore it.
When applied to a virtual folder, this command runs itself on each of the underlying real folders associated with this virtual folder. A prefix argument has no effect when this command is applied to virtual folder; mail is always gathered from the spool files.
Not autoloaded: VM has to be loaded before M-x offers this one.
Run whatever command vm-toolbar-helper-command currently holds.
The toolbar’s helper button changes with the context: what it does is
decided by reassigning this variable before the button is drawn, rather
than by having a button per command.
Go forward one message and preview it. With prefix arg (optional first argument) COUNT, go forward COUNT messages. A negative COUNT means go backward. If the absolute value of COUNT is greater than 1, then the values of the variables vm-skip-deleted-messages and vm-skip-read-messages are ignored.
When invoked on marked messages (via vm-next-command-uses-marks)
this command "sees" marked messages as it moves.
Not autoloaded: VM has to be loaded before M-x offers this one.
Go back one message and preview it. With prefix arg COUNT, go backward COUNT messages. A negative COUNT means go forward. If the absolute value of COUNT > 1 the values of the variables vm-skip-deleted-messages and vm-skip-read-messages are ignored.
Not autoloaded: VM has to be loaded before M-x offers this one.
Print the current message Prefix arg N means print the current message and the next N - 1 messages. Prefix arg -N means print the current message and the previous N - 1 messages.
The variable vm-print-command controls what command is run to
print the message, and vm-print-command-switches is a list of switches
to pass to the command.
When invoked on marked messages (via vm-next-command-uses-marks),
each marked message is printed, one message per vm-print-command
invocation. If applied to collapsed threads in summary and thread
operations are enabled via vm-enable-thread-operations then all messages
in the thread are printed.
Output, if any, is displayed. The message is not altered.
Not autoloaded: VM has to be loaded before M-x offers this one.
Quit visiting the current folder, saving changes. If the folder is
being visited read-only then changes are not saved. This behavior
can be customized using vm-preserve-read-only-folders-on-disk.
If the customization variable vm-expunge-before-quit is set to
non-nil value then deleted messages are expunged.
Giving a prefix argument overrides the variable and no expunge is done.
When called internally, the optional argument NO-EXPUNGE says
that the deleted messages should not be expunged (irrespective of
the value of vm-expunge-before-quit. NO-CHANGE says that
changes should be discarded.
Not autoloaded: VM has to be loaded before M-x offers this one.
Reply to all recipients of the current message and include text from the message. See the documentation for the function vm-reply for details.
Not autoloaded: VM has to be loaded before M-x offers this one.
Visit a mail file. VM will parse and present its messages to you in the usual way.
First arg FOLDER specifies the mail file to visit. When this command is called interactively the file name is read from the minibuffer.
Prefix arg or optional second arg READ-ONLY non-nil indicates that the folder should be considered read only. No attribute changes, messages additions or deletions will be allowed in the visited folder.
The optional third arg JUST-VISIT (not available interactively) says that the folder should be visited with as little initial processing as possible. No summary generation, no moving of the message-pointer, no retrieval of new mail.
Not autoloaded: VM has to be loaded before M-x offers this one.
Attach the current message as a child of the message last visited.
Check that all messages are members of their thread subtrees. Conversely, all members of thread subtrees should actually belong to the thread. Used for testing purposes.
Increase the thread indentation of the current message and its subthread by N steps, N being the prefix argument.
A prefix argument of 0 puts the indentation back to the one the message’s thread level gives it, with no offset.
Decrease the thread indentation of the current message and its subthread by N steps, N being the prefix argument.
A prefix argument of 0 decreases the indentation all the way to 0, so the message reads as the root of a thread.
Toggle the threads display on and off. When the threads display is on, the folder will be sorted by thread activity and thread indentation (via the %I summary format specifier) will be visible.
Trace this message by Message-ID while threads are being built.
A debugging aid, with vm-trace-message-subject: the threading code walks
these lists to decide when to stop and report. Prints the list.
Trace this message by subject while threads are being built.
The subject is the sortable one, so it matches the way threading groups
messages by subject. See vm-trace-message-id.
Attach some already existing labels to a message. Only labels that are currently attached to some message in this folder or labels that have previously been attached to messages in this folder will be added. Other labels will be silently ignored.
These are arbitrary user-defined labels, not to be confused with
message attributes like new and deleted. Interactively you
will be prompted for the labels to be added. You can use
completion to expand the label names, with the completion list
being all the labels that have ever been used in this folder.
The names should be entered as a list separated by spaces or commas.
Label names are compared case-insensitively.
(Only ASCII strings are at present allowed as message labels.)
A numeric prefix argument COUNT causes the current message and the next COUNT-1 messages to have the labels added. A negative COUNT arg causes the current message and the previous COUNT-1 messages to be altered. COUNT defaults to one.
Attach some labels to a message.
These are arbitrary user-defined labels, not to be confused with
message attributes like new and deleted. Interactively you
will be prompted for the labels to be added. You can use
completion to expand the label names, with the completion list
being all the labels that have ever been used in this folder.
The names should be entered as a list separated by spaces or commas.
Label names are compared case-insensitively.
(Only ASCII strings are at present allowed as message labels.)
A numeric prefix argument COUNT causes the current message and the next COUNT-1 message to have the labels added. A negative COUNT arg causes the current message and the previous COUNT-1 messages to be altered. COUNT defaults to one.
Delete some labels from a message.
These are arbitrary user-defined labels, not to be confused with
message attributes like new and deleted. Interactively you
will be prompted for the labels to be deleted. You can use
completion to expand the label names, with the completion list
being all the labels that have ever been used in this folder.
The names should be entered as a list separated by spaces or commas.
Label names are compared case-insensitively.
A numeric prefix argument COUNT causes the current message and the next COUNT-1 message to have the labels deleted. A negative COUNT arg causes the current message and the previous COUNT-1 messages to be altered. COUNT defaults to one.
Completely remove LABEL from the current folder. Removes LABEL from all messages and from the folder’s label list, so it will no longer appear in label completions.
This operation can be undone with vm-undo.
When called interactively, prompts for confirmation showing the number of messages that will be affected.
Remove from the current folder every label that no message carries.
Such labels accumulate as messages are relabelled or expunged –
deleting a label from the last message holding it does not remove it
from the folder – and they clutter label completion ever after.
Use vm-list-unused-labels to see them first.
No message is changed; only the folder’s label list.
This operation can be undone with vm-undo.
When called interactively, prompts for confirmation, listing the labels that will be removed.
List the labels of the current folder that no message carries.
These are exactly the labels vm-expunge-unused-labels would remove.
Nothing is changed.
Set message attributes.
Use this command to change attributes like deleted or
replied. Interactively you will be prompted for the attributes
to be changed, and only the attributes you enter will be altered.
You can use completion to expand the attribute names. The names
should be entered as a space separated list.
A numeric prefix argument COUNT causes the current message and the next COUNT-1 message to have their attributes altered. A negative COUNT arg causes the current message and the previous COUNT-1 messages to be altered. COUNT defaults to one.
Make the folder’s label list agree with the labels its messages carry. Adds labels that messages use but the folder does not list, and removes those the folder lists but no message uses. Afterwards label completion offers exactly the labels in use.
No message is changed; only the folder’s label list.
This operation can be undone with vm-undo.
When called interactively, prompts for confirmation, saying what will be
added and removed. See also vm-list-unused-labels.
Undo last change to message attributes in the current folder. Consecutive invocations of this command cause sequentially earlier changes to be undone. After an intervening command between undos, the undos themselves become undoable.
The default web browser to be used for following URLs (hyperlinks) in messages.
Clicking mouse-2 on a URL will send it to the default browser. Moving point to a character within the URL and pressing RETURN will also send the URL to the default browser.
If the value is a symbol, it should name a Lisp function, which is
called with the URL as its only argument. browse-url is the default
and the setting to want: which browser it opens is decided by
browse-url-browser-function, not by VM.
Two other handlers VM defines are not browsers:
vm-mouse-send-url-to-window-system passes the URL to the window
system’s "copy" mechanism so it can be pasted elsewhere, and
vm-mouse-send-url-to-clipboard sends it to the X clipboard.
If the value is a string, it names an external browser to run. The URL
is passed as its first argument, after the switches in
vm-url-browser-switches.
A nil value means VM should not enable URL passing to browsers.
Default value: browse-url
List of command line flags passed to the command named by
vm-url-browser. VM uses vm-url-browser to display URLs
in messages when you click on them.
Non-nil numeric value tells VM how hard to search for URLs.
The number specifies the maximum message size in characters that
VM will search for URLs. For message larger than this value, VM
will search from the beginning of the message to a point
vm-url-search-limit / 2 characters into the message. Then VM will
search from a point vm-url-search-limit / 2 characters from the
end of the message to the end of message.
Default value: 12000
Read mail under Emacs.
Optional first arg FOLDER specifies the folder to visit. It can
be the path name of a local folder or the maildrop specification
of a POP or IMAP folder. It defaults to the value of
vm-primary-inbox. The folder is visited in a VM buffer that is
put into VM mode, a major mode for reading mail. (See
vm-mode.)
Prefix arg or optional second arg READ-ONLY non-nil indicates that the folder should be considered read only. No attribute changes, message additions or deletions will be allowed in the visited folder.
Visiting a folder normally causes any contents of its spool files
to be moved and appended to the folder buffer. You can disable
this automatic fetching of mail by setting vm-auto-get-new-mail
to nil.
All the messages can be read by repeatedly pressing SPC. Use n for the
next message and p for the previous one to move about in the folder.
Messages are marked for
deletion with d, and saved to another folder with s. Quitting VM
with q saves the buffered folder to disk, but does not expunge
deleted messages. Use ### to expunge deleted messages.
Say what is missing from your VM configuration, and what to do about it.
Checks the settings a first-time reader has to get right before anything
works: which mail agent Emacs uses, the address mail goes out from, how it
is sent, where folders are kept, and where new mail comes from. Each
maildrop is checked for a type VM knows and the right number of fields,
neither of which the parsers mind, and vm-mail-header-from for a value
that is not an address, which is a From header nobody can reply to.
Says nothing about taste. Everything it reports is a setting whose default either does nothing or does something the reader did not choose.
Not documented.
Edit the vm-init-file.
Send a mail message from within VM, or from without. Optional argument TO is a string that should contain a comma separated recipient list.
Compose a new mail message using the current folder as its
parent folder and current message as its parent message. If the
variable vm-mail-use-sender-address is t, then the sender of the
current message is selected as the recipient of the new composition.
Like vm-mail, but run in a newly created frame. Optional argument TO is a string that should contain a comma separated recipient list.
Like vm-mail, but run in a different window. Optional argument TO is a string that should contain a comma separated recipient list.
Major mode for reading mail.
This is VM.
Use M-x vm-submit-bug-report to submit a bug report.
Commands:
Key Binding ------------------------------------------------------------------------------- 0 .. 9 digit-argument C-d vm-delete-message-backward TAB vm-goto-message-last-seen RET vm-goto-message C-t vm-toggle-threads-display C-_ vm-undo SPC vm-scroll-forward ! vm-toggle-flag-message - negative-argument . vm-mark-message-read < vm-promote-subthread > vm-demote-subthread ? vm-help @ vm-send-digest A vm-auto-archive-messages B vm-resend-message C vm-collapse-all-threads D vm-decode-mime-message E vm-expand-all-threads F vm-followup-include-text G vm-sort-messages K vm-kill-thread-subtree N vm-next-message-no-skip O vm-unload-message P vm-previous-message-no-skip R vm-reply-include-text S vm-save-folder T vm-toggle-thread U vm-mark-message-unread Z vm-forward-message-plain [ vm-move-to-previous-button ] vm-move-to-next-button ^ vm-goto-parent-message c vm-continue-composing-message d vm-delete-message f vm-followup g vm-get-new-mail h vm-summarize j vm-discard-cached-data k vm-kill-subject m vm-mail-from-folder n vm-next-message o vm-load-message p vm-previous-message q vm-quit r vm-reply s vm-save-message t vm-expose-hidden-headers u vm-undelete-message v vm-visit-folder x vm-quit-no-change z vm-forward-message DEL vm-scroll-backward C-/ vm-undo <backspace> vm-scroll-backward <delete> vm-scroll-backward C-c C-d vm-delete-all-attachments C-c C-e vm-edit-message C-c C-s vm-save-all-attachments C-x C-q vm-toggle-read-only C-x C-s vm-save-folder C-x C-w vm-write-file C-x u vm-undo C-M-n vm-move-message-forward C-M-p vm-move-message-backward M-C vm-show-copying-restrictions M-W vm-show-no-warranty M-n vm-next-unread-message M-p vm-previous-unread-message M-r vm-resend-bounced-message M-s vm-isearch-forward M ? vm-mark-help M A vm-mark-messages-same-author M C vm-mark-messages-by-selector M M vm-mark-message M N vm-next-command-uses-marks M R vm-mark-summary-region M S vm-mark-messages-same-subject M T vm-mark-thread-subtree M U vm-unmark-message M V vm-toggle-all-marks M X vm-mark-messages-by-virtual-folder M a vm-unmark-messages-same-author M c vm-unmark-messages-by-selector M m vm-mark-all-messages M n vm-next-command-uses-marks M r vm-unmark-summary-region M s vm-unmark-messages-same-subject M t vm-unmark-thread-subtree M u vm-clear-all-marks M x vm-unmark-messages-by-virtual-folder V ! vm-create-flagged-virtual-folder V ? vm-virtual-help V A vm-create-virtual-folder-same-author V C vm-create-virtual-folder V D vm-virtual-auto-delete-message V M vm-toggle-virtual-mirror V O vm-virtual-omit-message V R vm-create-virtual-folder-same-recipient V S vm-create-virtual-folder-same-subject V T vm-create-virtual-folder-of-threads V U vm-virtual-update-folders V V vm-visit-virtual-folder V X vm-apply-virtual-folder V a vm-create-author-virtual-folder V d vm-create-date-virtual-folder V l vm-create-label-virtual-folder V n vm-create-new-virtual-folder V r vm-create-author-or-recipient-virtual-folder V s vm-create-subject-virtual-folder V t vm-create-text-virtual-folder V u vm-create-unseen-virtual-folder W ? vm-window-help W D vm-delete-window-configuration W S vm-save-window-configuration W W vm-apply-window-configuration l a vm-add-message-labels l d vm-delete-message-labels l e vm-add-existing-message-labels | d vm-pipe-message-to-command-discard-output | n vm-pipe-messages-to-command-discard-output | s vm-pipe-messages-to-command | | vm-pipe-message-to-command # # # vm-expunge-folder
Customize VM by setting variables and store them in the vm-init-file.
Like vm, but run in a newly created frame.
Like vm, but run in a different window.
Submit a bug report, with pertinent information to the VM bug list.
Switch to another opened VM folder and rearrange windows as with a scroll.
Toggle the variable vm-enable-thread-operations.
If enabled, VM operations on root messages of collapsed threads will apply to all the messages in the threads. If disabled, VM operations only apply to individual messages.
"Operations" in this context include deleting, saving, setting attributes, adding/deleting labels etc.
Display and return the value of the variable vm-version.
Display and the value of the variable vm-version-commit.
Visit a mail file. VM will parse and present its messages to you in the usual way.
First arg FOLDER specifies the mail file to visit. When this command is called interactively the file name is read from the minibuffer.
Prefix arg or optional second arg READ-ONLY non-nil indicates that the folder should be considered read only. No attribute changes, messages additions or deletions will be allowed in the visited folder.
The optional third arg JUST-VISIT (not available interactively) says that the folder should be visited with as little initial processing as possible. No summary generation, no moving of the message-pointer, no retrieval of new mail.
Like vm-visit-folder, but run in a newly created frame.
Like vm-visit-folder, but run in a different window.
Visit a IMAP mailbox. VM will present its messages to you in the usual way. Messages found in the IMAP mailbox will be downloaded and stored in a local cache. If you expunge messages from the cache, the corresponding messages will be expunged from the IMAP mailbox when the folder is saved.
When this command is called interactively, the FOLDER name will
be read from the minibuffer in the format
"account-name:folder-name", where account-name is the short
name of an IMAP account listed in vm-imap-account-alist and
folder-name is a folder in this account.
Prefix arg or optional second arg READ-ONLY non-nil indicates that the folder should be considered read only. No attribute changes, messages additions or deletions will be allowed in the visited folder.
Like vm-visit-imap-folder, but run in a newly created frame.
Like vm-visit-imap-folder, but run in a different window.
Visit a POP mailbox. VM will present its messages to you in the usual way. Messages found in the POP mailbox will be downloaded and stored in a local cache. If you expunge messages from the cache, the corresponding messages will be expunged from the POP mailbox.
First arg FOLDER specifies the name of the POP mailbox to visit.
You can only visit mailboxes that are specified in vm-pop-folder-alist.
When this command is called interactively the mailbox name is read from the
minibuffer.
Prefix arg or optional second arg READ-ONLY non-nil indicates that the folder should be considered read only. No attribute changes, messages additions or deletions will be allowed in the visited folder.
Like vm-visit-pop-folder, but run in a newly created frame.
Like vm-visit-pop-folder, but run in a different window.
Visit a mail file maintained by Thunderbird. VM will parse and present its messages to you in the usual way.
First arg FOLDER specifies the mail file to visit. When this command is called interactively the file name is read from the minibuffer.
Prefix arg or optional second arg READ-ONLY non-nil indicates that the folder should be considered read only. No attribute changes, messages additions or deletions will be allowed in the visited folder.
This function differs from vm-visit-folder in that it remembers that
the folder is a foreign folder maintained by Thunderbird. Saving
of messages is carried out preferentially to other Thunderbird folders.
Visit the virtual folder FOLDER-NAME. With a prefix argument, visit it in read-only mode.
When called in Lisp code, additional optional arguments BOOKMARK and SUMMARY-FORMAT specify the message where the pointer should be and the summary format to use. DIRECTORY is the default directory for the virtual folder buffer.
Like vm-visit-virtual-folder, but run in a newly created frame.
Like vm-visit-virtual-folder, but run in a different window.
Create a vm-virtual-folder-alist according to the records in the bbdb.
For each record that has a vm-virtual attribute, add or modify the
corresponding BBDB-VM-VIRTUAL element of the vm-virtual-folder-alist.
(BBDB-VM-VIRTUAL ((vm-primary-inbox)
(author-or-recipient BBDB-RECORD-NET-REGEXP)))
The element gets added to the element-name sublist of the
vm-virtual-folder-alist.
Create a vm-virtual-folder-alist according to the records in the bbdb.
For each record check wheather its alias is in the variable
bbdb/vm-virtual-folder-alist-by-mail-alias-alist and then
add/modify the corresponding VM-VIRTUAL element of the
vm-virtual-folder-alist.
(BBDB-VM-VIRTUAL ((vm-primary-inbox)
(author-or-recipient BBDB-RECORD-NET-REGEXP)))
The element gets added to the element-name sublist of the
vm-virtual-folder-alist.
Add a new WORD to the list of spam words.
Check if there are selectors missing for either vm-mode or mail-mode.
Head each run of messages in the summary with the folder it would be filed to. Called interactively it sorts the folder by auto-folder first, so that the messages destined for one folder are together, and then writes that folder’s name above each run. The names are display only: they are removed and rewritten each time, and no message is changed.
Which folder a message would go to is vm-virtual-auto-select-folder’s
answer, from vm-virtual-auto-folder-alist.
A folder visited without a summary has nowhere to write them and is left
alone. Sorting by auto-folder calls this, and it used to reach
with-current-buffer with a nil summary buffer: G auto-folder answered
"Wrong type argument: stringp, nil" rather than sorting (emacs-vm/vm#851).
Discharge the internal cached data about spam words.
Apply a FUNCTION to the next COUNT messages matching SELECTOR.
With a prefix ARG ask user before saving.
Mark messages matching a virtual folder selector for deletion.
The virtual folder selector can be configured by the variable
vm-virtual-auto-delete-message-selector.
This function does not visit the virtual folder, but checks only the current message, therefore it is much faster and not so disturbing like the method described in the VM-FAQ.
In order to automatically mark spam for deletion use the function
vm-virtual-auto-delete-messages. See its documentation on how to hook it
into VM!
Mark all messages from the current up to the last for (spam-)deletion.
Add this to vm-arrived-messages-hook.
See the function vm-virtual-auto-delete-message for details.
(add-hook ’vm-arrived-messages-hook #’vm-virtual-auto-delete-messages)
Return t if SELECTOR matches the current message. Called with an prefix argument we display more diagnostics about the selector evaluation. Information is displayed in the order of evaluation and indented according to the level of recursion. The displayed information is has the format: FATHER-SELECTOR: RESULT CHILD-SELECTOR
Apply vm-virtual-filter-alist to the next COUNT messages.
Messages matched by a rule with :skip-inbox are expunged once every
rule has run. Returns the number of messages some rule matched.
Apply vm-virtual-filter-alist to the messages that have just arrived.
Add this to vm-arrived-messages-hook:
(add-hook ’vm-arrived-messages-hook #’vm-virtual-filter-new-messages)
Like vm-virtual-auto-delete-messages, this runs from the current
message to the last, which on arrival is exactly the new mail.
Return the selector of virtual folder VFOLDER for VALID-FOLDER-LIST.
Save all messages of current virtual folder in the real folder with the same name.
Omits a message from a virtual folder. IMHO allowing it for real folders makes no sense. One rather should create a virtual folder of all messages.
Save the current message to a mail folder.
Like vm-save-message but the default folder is guessed by
vm-virtual-auto-select-folder.
Add the current message to all virtual folders that are applicable.
With a prefix argument COUNT, the current message and the next COUNT - 1 messages are added. A negative argument means the current message and the previous |COUNT| - 1 messages are added.
When invoked on marked messages (via vm-next-command-uses-marks),
only marked messages are added, other messages are ignored. If
applied to collapsed threads in summary and thread operations are
enabled via vm-enable-thread-operations then all messages in the
thread are added.
A list of (ALIAS . FOLDER-NAME) pairs, which map an alias to a folder.
When true we expunge the affected right after marking and saving them.
When set to a folder name we save affected messages there.
Name of virtual folder selector used for automatically deleting a message. Actually they are only marked for deletion.
Default value: "spam"
Non-nil value should be an alist that VM will use to choose a default folder name when messages are saved. The alist should be of the form
((VIRTUAL-FOLDER-NAME FOLDER-NAME)
...)
where VIRTUAL-FOLDER-NAME is a string, and FOLDER-NAME is a string or an s-expression that evaluates to a string.
Each entry is a two-element list, as the example below shows. This said
"(VIRTUAL-FOLDER-NAME . FOLDER-NAME)" until 2026-08-12; the entry is read
with cadr, so a dotted pair whose tail is the folder name signals
"wrong-type-argument listp" instead of saving anything.
This allows you to extend vm-virtual-auto-select-folder to generate
a folder name. Your function may use folder to get the currently chosen
folder name and mp (a vm-message-pointer) to access the message.
Example: (setq vm-virtual-auto-folder-alist
'(("spam" (concat folder "-"
(format-time-string "%y%m" (current-time))))))
This will return "spam-0008" as a folder name for messages matching the virtual folder selector of the virtual folder "spam" during August in year 2000.
Whether virtual selectors match without regard to case.
Applies to the selectors run by the combinators vm-vs-and, vm-vs-or and
vm-vs-not, and by their mail-mode counterparts in vm-avirtual.el.
Default value: t
Non-nil means print what each virtual selector decided, and why.
The combinators print a line per selector as they evaluate it, indented by
depth; vm-virtual-check-selector-interactive turns this on for one call when
given a prefix argument.
Lives here rather than in vm-avirtual.el, which defines the rest of that feature, because the combinators that read it are in vm-virtual.el.
Rules deciding what happens to a message when it arrives. Non-nil value should be an alist of the form
((VIRTUAL-FOLDER-NAME . ACTIONS)
...)
where VIRTUAL-FOLDER-NAME names a virtual folder in
vm-virtual-folder-alist, whose selector says which messages the rule
applies to, and ACTIONS is a property list of what to do with them:
:label STRING attach the labels named in STRING, which is a
list separated by spaces or commas, as
‘vm-add-message-labels’ takes them
:attributes STRING set the attributes named in STRING, a space
separated list of ‘vm-supported-attribute-names’,
as ‘vm-set-message-attributes’ takes them
:save FOLDER save a copy in FOLDER. FOLDER is a string or an
expression evaluating to one
:skip-inbox t keep the message out of the folder: it is flagged
deleted and expunged once every rule has run
Every rule that matches is applied, in the order they appear here, so a message can be labelled by one rule and saved by another.
To have the rules run on incoming mail:
(add-hook ’vm-arrived-messages-hook #’vm-virtual-filter-new-messages)
The message is written into the folder before any of this happens, so
:skip-inbox removes it again rather than preventing its arrival.
An example, taking two rules from vm-virtual-folder-alist:
(setq vm-virtual-folder-alist
'(("from-arik" (("inbox") (author "arik")))
("spam" (("inbox") (spam-word)))))
(setq vm-virtual-filter-alist
'(("from-arik" :label "arik" :attributes "read")
("spam" :save "spam-folder" :skip-inbox t)))
Non-nil value causes the vm-avirtual.el package to make up
auto-folder names from virtual folder names, so that all messages
belonging to a virtual folder are saved to real folders with the
same name. Any auto-folder names suggested in
vm-virtual-auto-folder-alist will take priority over such made
up names.
Default value: t
Apply the selectors of a named virtual folder to the current folder and create a virtual folder containing the selected messages.
Prefix arg means the new virtual folder should be visited read only.
Create a virtual folder (search folder) of messages with the given string in the name/address of the author or recipients, from the current folder.
Prefix arg means the new virtual folder should be visited read only.
Create a virtual folder (search folder) of messages with the given string in the author’s name/address, from the current folder.
Prefix arg means the new virtual folder should be visited read only.
Create a virtual folder (search folder) of all messages with date in given range.
Prefix arg means the new virtual folder should be visited read only.
Create a virtual folder (search folder) with all the flagged messages in the current folder.
Prefix arg means the new virtual folder should be visited read only.
Create a virtual folder with given label from messages in the current folder.
Prefix arg means the new virtual folder should be visited read only.
Create a virtual folder (search folder) of all newly received messages in the current folder.
Prefix arg means the new virtual folder should be visited read only.
Create a new virtual folder from messages in the current folder.
The messages will be chosen by applying the selector you specify,
which is normally read from the minibuffer. See vm-vs-interactive
for the list of selectors.
Prefix arg means the new virtual folder should be visited read only.
Create a new virtual folder from messages in the current folder,
using another frame.
The messages will be chosen by applying the selector you specify,
which is normally read from the minibuffer. See vm-vs-interactive
for the list of selectors.
Prefix arg means the new virtual folder should be visited read only.
Create a new virtual folder from messages in the current folder
using another window.
The messages will be chosen by applying the selector you specify,
which is normally read from the minibuffer. See vm-vs-interactive
for the list of selectors.
Prefix arg means the new virtual folder should be visited read only.
Create a virtual folder (search folder) with given subject from messages in the current folder.
Prefix arg means the new virtual folder should be visited read only.
Create a virtual folder (search folder) of all messages with the given string in its text.
Prefix arg means the new virtual folder should be visited read only.
Create a virtual folder (search folder) of all unseen from messages in the current folder.
Prefix arg means the new virtual folder should be visited read only.
Create a new virtual folder from messages in the current folder.
The messages will be chosen by applying the selector you specify,
which is normally read from the minibuffer. See vm-vs-interactive
for the list of selectors.
Prefix arg means the new virtual folder should be visited read only.
Create a new virtual folder of threads in the current folder. The threads will be chosen by applying the selector you specify, which is normally read from the minibuffer. If any message in a thread matches the selector then the thread is chosen.
Prefix arg means the new virtual folder should be visited read only.
Create a new virtual folder from messages in the current folder,
using another frame.
The messages will be chosen by applying the selector you specify,
which is normally read from the minibuffer. See vm-vs-interactive
for the list of selectors.
Prefix arg means the new virtual folder should be visited read only.
Create a new virtual folder from messages in the current folder
using another window.
The messages will be chosen by applying the selector you specify,
which is normally read from the minibuffer. See vm-vs-interactive
for the list of selectors.
Prefix arg means the new virtual folder should be visited read only.
Create a virtual folder (search folder) for all messages from the same author as the current message.
Create a virtual folder (search folder) for all messages that have
as a recipient the To addressee as the current message. If there are
multiple addressees, only the first one is chosen.
Create a virtual folder (search folder) for all messages with the same subject as the current message.
Toggle whether this virtual folder mirrors the attributes of the real ones.
Mirrored, which is the default, a virtual message and the real message it stands for are the same message: deleting or labelling it here does so in the real folder, and in every other virtual folder showing it. Unmirrored, this folder keeps its own attributes, so it can be marked up without touching the real folders, and the undo history is kept separately too.
Toggling back restores the attributes each message had on the other side, so nothing is lost by looking. Only meaningful in a virtual folder; signals elsewhere.
Show the virtual folder commands and their keys in the echo area.
Default-directory to be used for virtual folders other than search
folders. Since virtual folders do not visit files, the
default-directory for the buffers of the virtual folder will be
whatever is the default-directory when the virtual folder is
visited. To override that, you can set this variable. The directory
where your VM folders are normally stored would be a good choice.
This only affects the virtual folders created using
vm-visit-virtual-folder. Search folders always inherit the
default-directory of their parent folders.
Non-nil value should be a list of virtual folder definitions.
A virtual folder is a mapping of messages from one or more real folders into what appears to be a single folder. A virtual folder definition specifies which real folders should be searched for prospective messages and what the inclusion criteria are.
Each virtual folder definition should have the following form:
(VIRTUAL-FOLDER-NAME
( (FOLDER ...)
(SELECTOR [ARG ...]) ... )
... )
VIRTUAL-FOLDER-NAME is the name of the virtual folder being defined. This is the name by which you and VM will refer to this folder.
FOLDER should be the specification of a real folder: a file path for a local folder or a maildrop specification for a POP/IMAP folder. There may be more than one FOLDER listed, the SELECTORs within that sublist will apply to them all. If FOLDER is a directory, VM will assume this to mean that all the folders in that directory should be searched.
The SELECTOR is a Lisp symbol that tells VM how to decide whether a message from one of the specified FOLDERs should be included in the virtual folder. Some SELECTORs require an argument ARG; unless otherwise noted ARG may be omitted.
See the VM manual section "Virtual Selectors" for the complete list of recognized SELECTORs.
Non-nil value causes the attributes of messages in virtual folders to mirror the changes in the attributes of the underlying real messages. Similarly, changes in the attributes of virtual messages will change the attributes of the underlying real messages. A nil value causes virtual messages to have their own distinct set of attributes, apart from the underlying real message.
This variable automatically becomes buffer-local when set in any
fashion. You should set this variable only in your .vm or .emacs
file. Use setq-default. Once VM has been started, you should not
set this variable directly, rather you should use the command
vm-toggle-virtual-mirror, normally bound to V M.
Default value: t
Toggle displaying of all images in the presentation buffer. If the prefix arg is given, all images are considered to be safe.
Non-nil means VM will allow retrieving images in the HTML contents
with the <img> tags. See also the documentation for the variable
vm-w3m-safe-url-regexp.
Default value: t
Regexp matching URLs which are considered to be safe. Some HTML mails might contain a nasty trick used by spammers, using the <img> tag which is far more evil than the [Click Here!] button. It is most likely intended to check whether the ominous spam mail has reached your eyes or not, in which case the spammer knows for sure that your email address is valid. It is done by embedding an identifier string into a URL that you might automatically retrieve when displaying the image. The default value is "\\‘cid:" which only matches parts embedded to the Multipart/Related type MIME contents and VM will never connect to the spammer’s site arbitrarily. You may set this variable to nil if you consider all urls to be safe.
Default value: "\\`cid:"
Change the current window configuration to be one associated with a particular action. The action will be read from the minibuffer.
Delete the configuration saved for a particular action. This action will no longer have an associated window configuration. The action will be read from the minibuffer.
Iconify the current frame. Run the hooks in vm-iconify-frame-hook before doing so.
Name and save the current window configuration. With this command you associate the current window setup with an action. Each time you perform this action VM will duplicate this window setup.
Nearly every VM command can have a window configuration
associated with it. VM also allows some category configurations,
startup, reading-message, composing-message, editing-message,
marking-message and searching-message for the commands that
do these things. There is also a default configuration that VM
will use if no other configuration is applicable. Command
specific configurations are searched for first, then the category
configurations and then the default configuration. The first
configuration found is the one that is applied.
The value of vm-mutable-window-configuration must be non-nil for VM to use window configurations.
Show the window configuration commands and their keys in the echo area.
Non-nil value is an alist of types and lists of frame parameters. This list tells VM what frame parameters to associate with each new frame it creates of a specific type.
The alist should be of this form
((SYMBOL PARAMLIST) (SYMBOL2 PARAMLIST2) ...)
SYMBOL must be one of ‘completion’, ‘composition’, ‘edit’,
‘folder’, ‘primary-folder’ or ‘summary’. It specifies the type
of frame that the following PARAMLIST applies to.
‘completion’ specifies parameters for frames that display lists of
choices generated by a mouse-initiated completing read. (See ‘vm-frame-per-completion’.)
‘composition’ specifies parameters for mail composition frames.
‘edit’ specifies parameters for message edit frames
(e.g. created by vm-edit-message-other-frame)
‘folder’ specifies parameters for frames created by vm and the
‘vm-visit-’ commands.
‘primary-folder’ specifies parameters for the frame created by running
vm without any arguments.
‘summary’ specifies parameters for frames that display a summary buffer
(e.g. created by vm-summarize-other-frame)
PARAMLIST is a list of pairs as described in the documentation for
the function make-frame.
Non-nil value causes VM to open a new frame on mouse initiated completing reads. A mouse initiated completing read occurs when you invoke a VM command using the mouse, either with a menu or a toolbar button. That command must then prompt you for information, and there must be a limited set of valid responses.
If these conditions are met and vm-frame-per-completion’s value
is non-nil, VM will create a new frame containing a list of
responses that you can select with the mouse.
A nil value means the current frame will be used to display the list of choices.
This variable has no meaning if you’re not running Emacs native under X Windows or some other window system that allows multiple real Emacs frames. Note that Emacs supports virtual frames under ttys but VM will not use these to display completion information.
Default value: t
Non-nil value causes the mail composition commands to open a new frame. Nil means the commands will use the current frame. This variable does not apply to the VM commands whose names end in -other-frame, which always create a new frame.
This variable has no meaning if you’re not running under an Emacs capable of displaying multiple real or virtual frames. Note that Emacs supports multiple virtual frames on dumb terminals, and VM will use them.
Default value: t
Non-nil value causes vm-edit-message to open a new frame.
Nil means the vm-edit-message will use the current frame. This
variable does not apply to vm-edit-message-other-frame, which
always create a new frame.
This variable has no meaning if you’re not running under an Emacs capable of displaying multiple real or virtual frames. Note that Emacs support multiple virtual frames on dumb terminals, and VM will use them.
Default value: t
Non-nil value causes the folder visiting commands to visit in a new frame. Nil means the commands will use the current frame. This variable does not apply to the VM commands whose names end in -other-frame, which always create a new frame.
This variable has no meaning if you’re not running under an Emacs capable of displaying multiple real or virtual frames. Note that Emacs supports multiple virtual frames on dumb terminals, and VM will use them.
Default value: t
Non-nil value causes VM to open a new frame to display help buffers. Nil means the VM will use the current frame.
This variable has no meaning if you’re not running under an Emacs capable of displaying multiple real or virtual frames. Note that Emacs supports multiple virtual frames on dumb terminals, and VM will use them.
Non-nil value causes VM to display the folder summary in its own frame.
Nil means the vm-summarize command will use the current frame.
This variable does not apply to vm-summarize-other-frame, which
always create a new frame.
This variable has no meaning if you’re not running under an Emacs capable of displaying multiple real or virtual frames. Note that Emacs supports multiple virtual frames on dumb terminals, and VM will use them.
Non-nil value means VM is allowed to create and destroy frames
to display and undisplay buffers. Whether VM actually does
so depends on the value of the variables with names prefixed by
‘vm-frame-per-’.
VM can create a frame to display a buffer, and delete frame to undisplay a buffer. A nil value means VM should not create or delete frames.
This variable does not apply to the VM commands whose names end in -other-frame, which always create a new frame.
Default value: t
This variable’s value controls VM’s window usage.
A non-nil value gives VM free run of the Emacs display; it will commandeer the entire screen for its purposes.
A value of nil restricts VM’s window usage to the window from which it was invoked. VM will not create, delete, or use any other windows, nor will it resize its own window.
Default value: t
Specifies whether VM should raise its frame at startup. A value of nil means never raise the frame. A value of t means always raise the frame. Other values are reserved for future use.
Default value: t
Non-nil means VM should search frames other than the selected frame when looking for a window that is already displaying a buffer that VM wants to display or undisplay.
Default value: t
Non-nil value causes VM to move the mouse cursor into newly created frames. This is useful to give the new frame the focus under some window managers that randomly place newly created frames.
Nil means don’t move the mouse cursor.
Non-nil value should be a string that tells VM where to load and save your window configuration settings. Your window configuration settings are loaded automatically the first time you run VM in an Emacs session, and tells VM how to set up windows depending on what you are doing inside VM.
The commands vm-save-window-configuration (normally bound to WS) and
vm-delete-window-configuration (bound to WD) let you update this
information; see their documentation for more information.
You cannot change your window configuration setup without giving
vm-window-configuration-file a non-nil value. A nil value causes
VM to use the default window setup specified by the value of
vm-default-window-configuration.
WARNING: Don’t point vm-window-configuration-file at your .vm or
.emacs file. Your window configuration file should start out as
an empty or nonexistent file. VM will repeatedly overwrite this
file as you update your window configuration settings, so
anything else you put into this file will go away.
Default value: "~/.vm.windows"
| Jump to: | .
>
8
A B C D E F G H I K L M N O P Q R S T U V W X |
|---|
| Jump to: | .
>
8
A B C D E F G H I K L M N O P Q R S T U V W X |
|---|
| Jump to: | !
.
[
]
@
#
<
>
|
$
A B C D E F G H K L M N O P Q R S T U V W X Z |
|---|
| Jump to: | !
.
[
]
@
#
<
>
|
$
A B C D E F G H K L M N O P Q R S T U V W X Z |
|---|
| Jump to: | B D I M R U V |
|---|
| Jump to: | B D I M R U V |
|---|
| Jump to: | B F M S V W |
|---|
| Jump to: | B F M S V W |
|---|
| Jump to: | A B C D E F H I L M N O P Q R S T U V W X Y |
|---|
| Jump to: | A B C D E F H I L M N O P Q R S T U V W X Y |
|---|
Copyright © 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software—to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation’s software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
Also, for each author’s protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors’ reputations.
Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone’s free use or not licensed at all.
The precise terms and conditions for copying, distribution and modification follow.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and “any later version”, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.
one line to give the program's name and an idea of what it does. Copyright (C) 19yy name of author This program 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 2 of the License, or (at your option) any later version. This program 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 this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
The hypothetical commands ‘show w’ and ‘show c’ should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than ‘show w’ and ‘show c’; they could even be mouse-clicks or menu items—whatever suits your program.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a “copyright disclaimer” for the program, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice
This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.