Top

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.


What is VM?

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


Installing VM

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.


Overview

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:

User Option: vm-confirm-quit

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.


1 Starting Up

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:

User Option: vm-startup-with-summary

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


1.1 Local Folders

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.


Spool Files

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.


POP Spool Files

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

IMAP Spool Files

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

Multiple access to IMAP spool files

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.


Index Files

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

Folder types

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 writes one on every message it puts in such a folder.
  • VM refuses to read a message that has none, and names it. A folder written by a mailer that omits the header is one VM will not open.
  • A length that is wrong rather than missing gives no sign of it. The folder opens, VM falling back on a search for the next separator, while anything that believes the header, which is what the format is for, reads the wrong bytes.

vm-change-folder-type is the repair for both. Converting a folder to the type it already claims recomputes every length.

  • A prefix argument asks for a file and converts it on disk without visiting it, which is the only way in when the folder cannot be read.
  • Two prefix arguments write the result to a file you name and leave the original alone, for comparing the two before parting with either.
  • Either way the folder as it was is kept in a backup file, named as Emacs names one when saving a buffer. Changing a visited folder’s type keeps a backup too.
  • The folder’s own type is among the types offered, so the repair can be run on a folder that is open in front of you.

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.

Why mboxcl2: it will not corrupt your mail

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:

  • A message is stored exactly as it came, byte for byte. A signature still verifies, an attachment still has its original bytes, and a message containing a From_ line cannot split a folder in two.
  • Finding the end of a message costs a count rather than a search, which for a folder of tens of thousands of messages is the difference between reading the lengths and scanning the file.

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.

How VM’s mbox differs from other mbox files

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 fewer ‘From ’ lines than other mailers.

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.

VM’s reader is narrower than its writer, on purpose.

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.

An mboxcl2 folder is quoted not at all.

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.

A babyl folder VM writes may not be one Rmail can open.

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.

VM keeps its own state in the messages.

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.

Read and unread are not where other mailers look.

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.

Where a VM folder is read differently elsewhere

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.

A From_ folder VM wrote, read by a program using the plain rule.

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.

An mboxcl2 folder, read by a program that ignores 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’.

How VM decides what a folder is

The name decides, and between From_ and mboxcl2 the name is the only thing that can:

  1. What the name says, through 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.
  2. What VM can work out from the contents, for an existing folder whose name says nothing. BABYL and MMDF are detected from what stands at the front of the file, which is reliable. Telling mboxcl2 from From_ is not: it rests on whether every message carries a length, and VM reads a folder as From_ unless enough of them do. See VM's mbox. A folder read as the wrong one of those two is misparsed rather than refused, which is why the name is worth putting on a folder that has no From_ line to lose.
  3. 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.

The folders VM writes for you

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.
  • IMAP and POP caches. Every cache VM creates is named imap-cache-md5.mboxcl2, or pop-cache-..., and written in that type: it holds arbitrary mail that VM alone writes, which is exactly the case the lengths are for. This does not depend on 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.

Converting the caches you already have

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.

Checking a folder

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.

Converting a folder

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.

Converting to and from plain mbox

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:

  1. M-x vm-change-folder-type RET From_ RET
  2. Answer the question about the file left behind. Converting sent.mboxcl2 writes sent, and sent.mboxcl2 is then offered for deletion; the folder as it was is kept in a backup file whichever you answer.
  3. M-x vm-check-folder to see that the result is what you meant.

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.

The four mbox variants

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.

mboxo

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.

mboxrd

As mboxo, but “>From ” becomes “>>From ” as well, so the change can be undone exactly. VM does not write this variant.

mboxcl

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.

mboxcl2

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.


1.2 POP and IMAP Folders

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.

Maildrop specification

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:

110for POP
995for POP over SSL
143for IMAP
993for 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.

Troubleshooting mail servers

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:

User Option: vm-pop-keep-trace-buffer

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

User Option: vm-imap-keep-trace-buffer

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


POP Folders

Command: vm-visit-pop-folder folder &optional read-only &rest rest

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.


IMAP Folders

Command: vm-visit-imap-folder folder &optional read-only &rest rest

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.

While VM is talking to the server

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:

  • Anything local happens at once, as it always did.
  • Anything that needs the server and can wait (a body to be shown, the flags you have changed, an expunge, a save) is done when the session running now has finished. A folder runs one session at a time: two writing into it would interleave two sets of messages, flags and expunges in one buffer and one cache file.
  • Anything that must have an answer before it can go on (saving or copying a message whose body is still on the server, and completing a folder name) waits for it. Those are the two places VM still waits on purpose, and C-g works throughout.

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.

IMAP Synchronization

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:

Command: vm-imap-synchronize &optional full

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, and why labels do not stick

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 label is a mailbox.

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.

IMAP keywords are not labels.

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.

What you can do about it

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 local IMAP server as a cache

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:

  • Every VM operation answers at local speed rather than at the remote’s.
  • Changes are queued for you. A local server accepts a flag change immediately and its sync tool pushes it when the remote is reachable, so VM neither waits nor fails when the network is down.

The structure of it

Three pieces:

  1. An IMAP server on the local machine. dovecot is the usual choice.
  2. A sync tool that mirrors the remote mailbox into it. mbsync (from isync) is the usual choice; offlineimap and imapsync are alternatives.
  3. Optionally something that runs the sync when mail arrives rather than on a timer. 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")))

Setting it up

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.

  1. A user and a directory for the store. Create a system user that owns the mail store, make its directory, and give it to that user with permissions 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.
  2. Virtual users, one per account. A local server needs an account for VM to log in to, and it need not correspond to a Unix user. Generate a hashed password with
    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.

  3. Passwords where the sync tool can reach them, rather than in its configuration file. 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.
  4. A sync channel per account, with its own state directory, so that one account’s state cannot be confused with another’s.
  5. Run it. A timer is the simple answer, through 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.

What to watch

  • A resync from scratch changes 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.
  • A cache file is not the cache server. VM keeps its own local copy of a server folder, named imap-cache-md5.mboxcl2 (see Folder types), and that is a separate thing from the local IMAP server’s own store. Running a cache server does not remove VM’s cache file, and the two hold the same mail for different reasons.
  • Metadata is where the arrangement leaks. 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.
  • Test the pieces separately. 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.

1.3 Thunderbird Folders

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.

Differences in folder summary

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.

How the inter-operation works

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:

User Option: vm-sync-thunderbird-status

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.


1.4 External Messages

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.


1.5 Getting New Mail

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.


1.6 Crash Recovery

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.

Recovering Folders

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:

  • VM retrieves no new mail for it.
  • No summary is generated.
  • MIME is not decoded.

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:

Yes, the auto-save file being larger

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.

No, it being significantly smaller

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.

Recovering Message Compositions

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.

Recovering Sessions

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:

  1. Run M-x vm-mode in the buffer holding the folder.
  2. Save it once you are satisfied that it is not damaged. Or kill the buffer, where the auto-saved version is not one you trust: VM asks whether you mean to kill it and then whether to delete the auto-save file, and answering “yes” to the second is what loses the auto-saved folder for ever.

Backing Up a Folder

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:

Command: vm-backup-folder

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.

Reverting a Folder

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:

Command: 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.

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.


2 Setting Up

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.


2.1 Making VM the mail reader Emacs uses

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.


2.2 Folders on this machine

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.


2.3 Reading mail on a server

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

2.4 What the summary shows

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.


2.5 Reading what arrives

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

2.6 Composing

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)

Short names for addresses

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.


2.7 Sending

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.

A server for each of your addresses

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.

Interrupting a send

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.


2.8 The address book

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.


2.9 Keys of your own

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.


4 Reading Messages

Once a message has been selected, VM will show it to you. By default, presentation is done in two stages: previewing and paging.


4.1 Previewing

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.


4.2 Paging

SPC during a message preview exposes the body, flagging the message “read” if it was new or unread. From there:

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.


4.3 Reading MIME Messages

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.


4.3.1 Viewing MIME messages

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:

User Option: vm-mime-auto-displayed-content-types

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

User Option: vm-mime-auto-displayed-content-type-exceptions

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.

Content-Disposition (inline or attachment)

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:

t

Always follow the header.

nil

Ignore it.

internal-only

Follow it for the types VM can display itself. (See Internal display of MIME attachments.)

Viewing MIME structure

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.


4.3.2 Operating on MIME attachments

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.

$ wvm-mime-reader-map-save-file
$ svm-mime-reader-map-save-message
$ pvm-mime-reader-map-pipe-to-printer
$ |vm-mime-reader-map-pipe-to-command
$ RETvm-mime-reader-map-display-using-default
$ evm-mime-reader-map-display-using-external-viewer
$ vvm-mime-reader-map-display-object-as-type
$ dvm-delete-mime-object
$ avm-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.

Command: vm-save-all-attachments &optional count directory

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.

Command: vm-delete-all-attachments &optional count

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.


4.3.3 Internal display of MIME attachments

User Option: vm-mime-internal-content-types

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.

User Option: vm-mime-internal-content-type-exceptions

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

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

w3m

The same program run outside Emacs, converting the part to plain text.

lynx

The lynx browser run the same way.

shr

Emacs’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.


4.3.4 HTML display

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

Whether images are shown at all.

vm-w3m-safe-url-regexp

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


4.3.5 External display of MIME attachments

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.


4.3.6 Displaying inline images in messages

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


4.3.7 MIME type conversion

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.


4.3.8 MIME character sets

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.


4.3.9 MIME multipart/alternative

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:

best

The 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-internal

The closest subpart VM can display itself. No external viewer is used.

all

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


4.3.10 MIME multipart/related

The content type multipart/related is used to add attachments that should be displayed embedded in the message, typically a ‘text/html’ message. If you use Emacs-W3M to view ‘text/html’ content, then VM will automatically ship the ‘multipart/related’ attachments to Emacs/W3M so that it can embed them in the message display.

However, if you do not use an internal viewer for the ‘text/html’ content, then the attachments will not get displayed. In this case, VM will display all the attachments individually, either as buttons or as images. In effect, VM falls down to the method of displaying ‘multipart/mixed’ content.

You can ask VM to always treat ‘multipart/related’ content in a way similar to ‘multipart/mixed’ by setting the variable vm-mime-multipart/related-show-method to 'mixed.


4.3.11 Inferring MIME types

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.

User Option: vm-infer-mime-types

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.

User Option: vm-infer-mime-types-for-text

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.

4.3.12 Calendar invitations

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.


4.3.13 Reading Secure MIME Messages

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.


5 Sending Messages

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.

C-c C-y (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-folder

This allows one to yank a message from a different folder than the parent of this composition.

C-c C-v <Any VM command key>

All VM commands may be accessed in a VM Mail mode buffer by prefixing them with C-c C-v.

C-c C-a (vm-attach-file) or drag-and-drop a file

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

C-c C-m (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.

C-c C-b (vm-attach-buffer)

Attaches an Emacs buffer to the composition.

C-c C-e (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.

C-c C-p (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.


5.1 Sending Options

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 Bcc header promises that the addresses in it are not shown to the other recipients, and whether that promise is kept may be outside Emacs. With send-mail-function set to sendmail-send-it, Emacs leaves the header in the message it hands sendmail-program and trusts that program to take it out: it has to, because that program is passed -t and 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, unless send-mail-function is one that removes the header itself. smtpmail-send-it is such a function: it works out the recipients first and then deletes the header. See Sending, for a worked smtpmail configuration, 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-removal to nil stops it asking at all, for someone who knows their transport removes it.

User Option: vm-mail-auto-save-directory

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.

User Option: vm-mail-use-sender-address

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.

Checks and conveniences

These were add-ons switched on through vm-enable-addons in earlier releases; each is an option of its own now.

User Option: vm-check-recipients

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.

User Option: vm-check-for-empty-subject

Non-nil means ask before sending a message with an empty Subject.

Default value: t

User Option: vm-clean-subject-prefixes

Non-nil means tidy the Subject prefixes of a new composition. vm-mail-subject-cleanup does the work, by vm-mail-subject-prefix-replacements.

User Option: vm-open-line-in-quoted-text

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.

User Option: vm-mail-mode-fake-date-p

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.


5.2 Sending MIME Messages

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.


MIME attachments

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:

Inline

The object is displayed within or alongside the message text, where that is possible.

Attachment

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.

Point-to-point attachment operations

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.


MIME characters

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.

User Option: vm-mime-8bit-text-transfer-encoding

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.

User Option: vm-mime-max-text-line-length

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

User Option: vm-send-using-flowed-text

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.


MIME headers

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?=.

User Option: vm-mime-encode-headers-regexp

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"
User Option: vm-mime-encode-headers-type

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

User Option: vm-mime-encode-headers-words-regexp

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]*\\)+\\)*\\)"

MIME preview

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:


5.3 Sending Secure MIME Messages

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

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.

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:

C-c # s

vm-epg-sign signs the composition.

C-c # e

vm-epg-encrypt encrypts it. With a prefix argument, it signs it too.

C-c # E

vm-epg-sign-and-encrypt signs and encrypts it.

C-c # k

vm-epg-attach-public-key attaches a public key.

C-c # a

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.


5.4 Replying

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:

r (vm-reply)

Replies to the author of the current message.

R (vm-reply-include-text)

Replies to the author of the current message and provides included text.

f (vm-followup)

Replies to the all recipients of the current message.

F (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.

User Option: vm-in-reply-to-format

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.

Included text

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

Filling included text

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

Alternative methods to include text

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.

Options

The attribution is a line of text saying who wrote what is being included, inserted before it. See Summaries, for the format.

User Option: vm-included-text-attribution-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.


5.5 Forwarding Messages

VM has four commands to forward messages: z (vm-forward-message), Z (vm-forward-message-plain), @ (vm-send-digest) and B (vm-resend-message).

Forwarding

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.

  • For encapsulated forwarding, the default is to forward all the headers, but you can limit the forwarded headers by setting 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.
  • For plain-text forwarding, done by the Z command, the variables 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”.
Command: vm-forward-message-all-headers

Like vm-forward-message but forwards all the headers.

User Option: vm-forwarding-subject-format

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.

Digests

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.

Resending

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-To header sees otherwise.


5.6 Saving copies of sent mail

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:

The parent folder is an IMAP folder

That folder’s account. The parent folder is the one you started composing from.

It is not one, or there is none

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.

Command: vm-do-fcc-before-mime-encode

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.


5.7 Postponing Messages

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.


6 Multiple Email Addresses (Personality Crisis)

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-actions and vm-pcrisis-default-rules outright, 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.

6.1 Automorph

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)

6.2 Examples

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

6.3 Checking Your Rules

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:

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.

6.4 Debugging Personality Crisis

To debug Personality Crisis configurations, examine these variables after composing a message:

You can also call vm-pcrisis-build-true-conditions-list interactively to test your conditions.


7 Selecting Messages

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.


7.1 Marking Messages

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:

M C (vm-mark-messages-by-selector)

Mark all messages matching a virtual selector. See Virtual Folders.

M c (vm-unmark-messages-by-selector)

Unmark all messages matching a virtual selector.

M X (vm-mark-messages-by-virtual-folder)

Mark all messages matching the selectors of a virtual folder. See Virtual Folders.

M x (vm-unmark-messages-by-virtual-folder)

Unmark all messages matching the selectors of a virtual folder.

M T (vm-mark-thread-subtree)

Mark all messages in the thread tree rooted at current message. See Threading.

M t (vm-unmark-thread-subtree)

Unmark all messages in the thread tree rooted at current message.

M S (vm-mark-messages-same-subject)

Mark messages with the same subject as the current message.

M s (vm-unmark-messages-same-subject)

Unmark messages with the same subject as the current message.

M A (vm-mark-messages-same-author)

Mark messages with the same author as the current message.

M a (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.

M R (vm-mark-summary-region)

Mark all messages in the current region in a Summary buffer

M r (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.


8 Saving Messages

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

The default. Append to the folder’s buffer when it is being visited, and to the file otherwise.

t

Always visit the folder first.

nil

Always 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).

Automatic save folders

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:

User Option: vm-save-using-auto-folders

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

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.

Other commands

M-x vm-save-message-sans-headers

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

A (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.

|d (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.

|s (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.

|n (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.

User Option: vm-berkeley-mail-compatibility

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.


9 Deleting Messages

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.

d (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.

u (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.

k (vm-kill-subject)

Flags all messages with the same subject as the current message (ignoring “Re:”) for deletion.

K (vm-kill-thread-subtree)

Flags all messages in the thread subtree of the current message for deletion.

vm-delete-duplicate-messages

Flags duplicate messages for deletion. The duplicate messages are detected by comparing message ID’s.

vm-delete-duplicate-messages-by-body

Flags 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:

Command: vm-save-folder-no-expunge &optional prefix

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.

Command: vm-quit-no-expunge

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.

Command: vm-delete-duplicate-messages

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


10 Editing Messages

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.


11 Message Attributes

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.

new

The message was retrieved from a spool file during this visit of the current folder.

unread

The message was retrieved from a spool file during some past visit of the folder but is still unread.

flagged

A message you marked to come back to, with ! (vm-toggle-flag-message). VM attaches no meaning of its own to it.

  • The summary shows ‘!’, in the 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).
  • V ! gathers a folder’s flagged messages into a virtual folder (see Virtual Folders).
  • On an IMAP server it is the \Flagged flag, which other mail programs show as a star or a flag.
  • Not the same as marking a message, which is a selection lasting only for the session (see Marking Messages).
filed

The message has been saved to some folder.

written

The body of the message has been saved to a file.

edited

The message has been altered (with vm-edit-message) since it arrived.

deleted

The message is deleted and will be removed from the folder at the next expunge.

forwarded

The message has been forwarded with either vm-forward-message, vm-send-digest or one of their variants.

redistributed

The message has been forwarded with the vm-resend-message command.

replied

The 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:

n

Every n seconds, n being a positive integer. vm-flush-interval defaults to 90.

t

At every change.

nil

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


12 Sorting Messages

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

Valid sort keys are:

datethe date the message was sent
activitythe date of the newest message in its thread
authorthe address in the From header
full-namethe name in the From header
subjectthe subject, normalized as below
recipientsthe To and Cc headers together
addresseesthe To header alone
line-countthe number of lines
byte-countthe number of bytes
physical-orderthe order the messages are stored in
spam-scorethe 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.


12.1 Threading

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.


13 Digests

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:

‘rfc934’
‘rfc1153’
‘mime’

The three formats VM understands.

‘guess’

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.


14 Summaries

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:

User Option: vm-follow-summary-cursor

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


14.1 Summary Format

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:

a

attribute 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.
A

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

I

thread indentation

n

message number

i

message ID

c

number of characters in message (ignoring headers)

S

human readable size of the message

l

number of lines in message (ignoring headers)

d

numeric day of month message sent

w

day of the week message sent

m

month message sent

M

numeric month message sent (January = 1)

y

year message sent

h

hour:min:sec message sent

H

hour:min message sent

z

timezone of date when the message was sent

f

author’s address

F

author’s full name (same as f if full name not found)

t

email addresses of the addressees of the message (listed in the “To” header), in a comma-separated list

T

full names of the addressees of the message (listed in the “To” header), in a comma-separated list

r

addresses of the recipients of the message (listed in the “To” or “Cc” headers), in a comma-separated list

R

full names of the recipients of the message, in a comma-separated list (or their email addresses if full names are not given)

s

message subject

L

labels (as a comma list)

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.

(

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:

width

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.

maximum

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.


14.2 Threaded Summaries

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.

Manual control of thread indentation

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.

Command: vm-promote-subthread n

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.

Command: vm-demote-subthread n

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.


14.3 Thread Folding

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.

User Option: vm-summary-thread-folding-on-motion

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

User Option: vm-summary-show-thread-count

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.


14.4 Thread Operations

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.


14.5 Summary Faces

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.

User Option: vm-mouse-track-summary

Non-nil value means highlight summary lines as the mouse passes over them.

Default value: t

Hiding summary lines

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

Predefined summary faces


15 Virtual Folders

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.


15.1 Search Folders

Command: vm-create-search-folder selector &optional arg read-only name bookmark

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.

Command: vm-create-virtual-folder-of-threads selector &optional arg read-only name bookmark

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.

Command: vm-apply-virtual-folder name &optional read-only

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:

Command: vm-create-virtual-folder-same-subject

Create a virtual folder (search folder) for all messages with the same subject as the current message.

Command: vm-create-virtual-folder-same-author

Create a virtual folder (search folder) for all messages from the same author as the current message.

Command: vm-create-virtual-folder-same-recipient

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:

V a (vm-create-author-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 d (vm-create-date-virtual-folder)
V l (vm-create-label-virtual-folder)
V ! (vm-create-flagged-virtual-folder)
V n (vm-create-new-virtual-folder)
V u (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’:

  1. Create a search folder of the messages with that subject.
  2. Browse them until you find the one you want.
  3. Quit the search folder. VM leaves you on the same message in the original folder.

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.


15.2 Defined Virtual Folders

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.


15.3 Virtual Selectors

Generic selectors

any

matches any message.

header

matches message if ARG matches any part of the header portion of the message; ARG should be a regular expression.

text

matches message if ARG matches any part of the text portion of the message; ARG should be a regular expression.

header-or-text

matches message if ARG matches any part of the headers or the text portion of the message; ARG should be a regular expression.

header-field

matches messages if the header field named ARG1 has text matching ARG2.

Selectors based on message headers

author

matches message if ARG matches the author; ARG should be a regular expression.

author-or-recipient

matches message if ARG matches the author of the message or any of its recipients; ARG should be a regular expression.

recipient

matches message if ARG matches any part of the recipient list of the message. ARG should be a regular expression.

principal

matches message if ARG matches any part of the ‘Reply-To’ header of the message. ARG should be a regular expression.

addressee

matches 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-senders

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

outgoing

matches message if your are the author of it, i.e. if the author matches vm-summary-uninteresting-senders.

in-bbdb

matches 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)
subject

matches message if ARG matches any part of the message’s subject; ARG should be a regular expression.

sortable-subject

matches 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-after

matches 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-before

matches 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-than

matches message if it is more than ARG days old (today = 0)

newer-than

matches message if it is at most ARG days old (today = 0)

message-id

matches message if its Message ID has a string matching ARG

uid

matches message if its IMAP UID is ARG (for IMAP folders)

uidl

matches message if its POP UIDL is ARG (for POP folders)

spam-score

matches message if its spam score is at least ARG. See vm-spam-score-headers for configuration.

Selectors based on message attributes

deleted

matches message if it is flagged for deletion.

undeleted

matches message if it has not been deleted.

edited

matches message if it has been edited.

unedited

matches message if it has not been edited.

filed

matches message if it has been saved with its headers.

unfiled

matches message if it has not been saved with its headers.

written

matches message if it has been saved without its headers.

new
recent

matches message if it is new. Two names for one selector.

read

matches message if it is neither new nor unread.

unread
unseen

matches message if it is not new and hasn’t been read. Two names for one selector.

flagged

matches message if it is flagged (see Message Attributes).

unflagged

matches message if it is not flagged.

replied
answered

matches message if it has been replied to. Two names for one selector.

unreplied
unanswered

matches message if it has not been replied to. Two names for one selector.

forwarded

matches message if it has been forwarded using a variant of vm-forward-message, vm-send-digest or one of their variants.

unforwarded

matches message if it has not been forwarded using vm-forward-message, vm-send-digest or one of their variants.

redistributed

matches message if it has been redistributed using vm-resend-message.

unredistributed

matches message if it has not been redistributed using vm-resend-message.

marked

matches message if it is marked, as with vm-mark-message.

unmarked

matches message if it is not marked.

selected

matches the message the folder is looking at, and no other.

unwritten

matches message if it has not been saved without its headers.

label

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

collapsed

matches message if it is the root of a thread that is currently collapsed in the summary (see Threading). Takes no ARG.

expanded

matches message if it is the root of a thread that is currently expanded in the summary. Takes no ARG.

Selectors based on analyzing the text

attachment

matches if a message contains an attachment, i.e., its text matches vm-vs-attachment-regexp.

spam-word

matches 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-than

matches message if message has less than ARG characters. ARG should be a number.

less-lines-than

matches message if message has less than ARG lines. ARG should be a number.

more-chars-than

matches message if message has more than ARG characters. ARG should be a number.

more-lines-than

matches message if message has more than ARG lines. ARG should be a number.

Complex selector operations

sexp

matches 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”.)

eval

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

and

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

not

matches message only if its selector argument does NOT match the message. Example:

(not (deleted))

matches messages that are not deleted.

or

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

thread

matches 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-all

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

Selectors based on context

folder-name

matches message if it is from a folder matching ARG

virtual-folder-member

matches message if the message is already a member of some virtual folder currently being visited.

vm-mode

matches the message if the current-buffer is in vm-mode and one of its argument selectors matches the message.

mail-mode

matches the message if the current-buffer is in mail-mode and one of its argument selectors matches the message.


15.4 Working with Virtual Folders

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.


15.5 vm-avirtual Package

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

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.

Command: vm-virtual-auto-delete-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.

Automatic saving

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 filtering

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 STRING

Attach the labels named in STRING, a space separated list, as vm-add-message-labels takes them.

:attributes STRING

Set the attributes named in STRING, a space separated list, as vm-set-message-attributes takes them.

:save FOLDER

Save a copy of the message in FOLDER, which 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 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.


16 IMAP Server Folders

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.

Command: vm-imap-synchronize &optional full

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.

UIDVALIDITY

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.

Operations for the IMAP server

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.


17 Frames and Windows

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.


17.1 Frame Configuration

VM has a set of variables that let you specify when VM creates frames and what attributes the new frames will have.

User Option: vm-frame-per-folder

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

User Option: vm-frame-per-summary

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.

User Option: vm-frame-per-composition

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

User Option: vm-frame-per-edit

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

User Option: vm-frame-per-help

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.

User Option: vm-frame-per-completion

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.

User Option: vm-frame-parameter-alist

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.

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.


17.2 Window Configuration

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:

  1. The configuration for that command.
  2. The configuration for the command’s class, where the command is in one. Not all are. Message composition commands are in the “composing-message” class, every vm-quit* command is in “quitting”, the commands that set and clear message marks are in “marking-message”, and so on.
  3. The “default” class configuration, where one is defined.

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.


18 Toolbar

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.

autofile

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

compose

The 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/undelete

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

file

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

getmail

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

help

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

mime

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

next

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

previous

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

print

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

quit

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

reply

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

visit

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


20 Faces

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.

User Option: vm-mime-button-face

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.


21 Using the Mouse

VM uses the following layout for the mouse buttons in the folder and summary buffers.

button-1 (left button usually)

Unchanged.

button-2 (middle button usually)

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.

button-3 (right button usually)

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.


22 Customizing VM

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.


22.1 Where settings go

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:

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.


22.2 Settings that apply to one folder

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.


23 Hooks

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

User Option: vm-select-new-message-hook

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.

User Option: vm-select-unread-message-hook

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.

User Option: vm-select-message-hook

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

User Option: vm-save-message-hook

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.

User Option: vm-arrived-message-hook

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

User Option: vm-spooled-mail-waiting-hook

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.

User Option: vm-arrived-messages-hook

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.

User Option: vm-reply-hook

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.

User Option: vm-forward-message-hook

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.

User Option: vm-resend-bounced-message-hook

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.

User Option: vm-resend-message-hook

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.

User Option: vm-send-digest-hook

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.

User Option: vm-mail-hook

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.

User Option: vm-summary-update-hook

List of hook functions called just after VM updates an existing entry a folder summary.

User Option: vm-summary-redo-hook

List of hook functions called just after VM adds or deletes entries from a folder summary.

User Option: vm-startup-hook

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.

User Option: vm-visit-folder-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.

User Option: vm-retrieved-spooled-mail-hook

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.

User Option: vm-edit-message-hook

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.

User Option: vm-mail-mode-hook

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.

User Option: vm-mode-hook

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.

User Option: vm-mode-hooks

Old name for vm-mode-hook. Supported for backward compatibility. You should use the new name.

User Option: vm-summary-mode-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.

User Option: vm-summary-mode-hooks

Old name for vm-summary-mode-hook. Supported for backward compatibility. You should use the new name.

User Option: vm-virtual-mode-hook

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.

User Option: vm-presentation-mode-hook

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.

User Option: vm-quit-hook

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.

User Option: vm-summary-pointer-update-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.

User Option: vm-display-buffer-hook

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.

User Option: vm-undisplay-buffer-hook

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.

User Option: vm-iconify-frame-hook

List of hook functions that are run whenever VM iconifies a frame.

User Option: vm-menu-setup-hook

List of hook functions that are run just after all menus are initialized.

User Option: vm-mime-display-function

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.

User Option: vm-mail-send-hook

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.


24 Configuration of VM

Hints on email environment configuration

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.

Configuration for email reception

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 (Post office protocol)
  • IMAP (Internet message access protocol)

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:

  • You can store your email in local folders and download new mail from the mail servers. See Local Folders, especially the subsections on “POP Spool Files” and “IMAP Spool Files.” Even though the local folders method is provided for both POP and IMAP servers, it is really appropriate only for POP servers.
  • You can store your email on the mail server and process it in VM via cache folders stored on your file system. See POP and IMAP Folders. Even though the method of server folders is provided for both POP and IMAP servers, it is really appropriate only for IMAP servers.

Configuration for secure email reception

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 email sending

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:

  • Port 25 is where one server takes mail from another. Internet providers commonly block it for everything else, so it is rarely the port you want.
  • Port 587 is submission: where a mail program hands over mail of its own, having said who it is. STARTTLS usually secures it.
  • Port 465 is submission as well, secured from the first byte rather than by STARTTLS.

smtpmail does SSL/TLS itself, so these two settings are the whole of it.

  • The SMTP server does not use a secure protocol.

    Set smtpmail-stream-type to nil and smtpmail-smtp-service to the port the server takes mail on, 587 or 25.

  • The SMTP server is secure from the first byte.

    Set smtpmail-stream-type to ssl and smtpmail-smtp-service to its port, usually 465.

  • The SMTP server upgrades the connection with STARTTLS.

    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.

25 Customizations

Useful ways to customize VM.

25.1 Reading messages

Shrunken headers

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:

User Option: vm-enable-shrunken-headers

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.

Return receipts

A sender can ask to be told when you read their message. VM does not answer such a request unless you say so:

User Option: vm-handle-return-receipts

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.

User Option: vm-handle-return-receipt-mode

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.

MIME alternatives

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:

Command: vm-toggle-best-mime

Toggle between best-internal and best mime decoding modes. (Alley Soughton)

(Thanks to Alley Stoughton for this contribution.)

25.2 Saving messages and attachments

Auto saving attachments

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:

Command: vm-mime-auto-save-all-attachments &optional count

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)

User Option: vm-mime-auto-save-all-attachments-subdir

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:

User Option: vm-auto-save-all-attachments

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.

25.3 How much VM says

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:

0

Only what VM cannot stay silent about.

1

Errors, and warnings worth interrupting for.

5

Normal level, and the default: 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.

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.

25.3.1 The log

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.

25.4 Being told about new mail

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.

25.5 What a composition buffer is called

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.


26 History and Administration

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 source, and what changed in each release

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.

Technical support

Two mailing lists, hosted at Savannah:

viewmail-info@nongnu.org

Questions and discussion.

viewmail-bugs@nongnu.org

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

Get Involved

VM is now supported and maintained by the user community. So, as an active user, your participation is key to keep the project going.

Contributors

Contributions to the code from the following members of the VM community are gratefully acknowledged:

  • Aidan Kehoe
  • Glenn <unknown last name>
  • Jens Gustedt
  • John J Foerch
  • Kevin Rogers
  • Rob Hodges
  • Robert Marshall
  • Robert P. Goldman
  • Katsumi Yamaoka
  • Julian Bradfield
  • Samuel Bronson
  • Brent Goodrick
  • Tim Cross
  • Arik Mitschang
  • Anthony Mallet
  • Noah Friedman
  • JJK “Blueman”
  • Eric Schulte

Please let us know if any contributors have been missed out.

Selected Releases of Kyle Jones

  • Version 4.10, released in 1989.
  • Version 5.00, released in 1990.
  • Version 6.00, released 6 January, 1997.
  • Version 7.00, released 2 December, 2001.
  • Version 7.10, released 5 March, 2003.
  • Version 7.15, released 3 May, 2003.
  • Version 7.16, released 26 May, 2003.
  • Version 7.17, released 6 July, 2003.
  • Version 7.18, released 2 November, 2003.
  • Version 7.19, released 29 September, 2004.

Releases of Robert Widhopf-Fenk

  • Version 8.0.0, released 31 May, 2007.
  • Version 8.0.1, released 29 June, 2007.
  • Version 8.0.2, released 25 July, 2007.
  • Version 8.0.3, released 15 August, 2007.
  • Version 8.0.4, released 2 November, 2007.
  • Version 8.0.5, released 3 November, 2007.
  • Version 8.0.6, released 2 January, 2008.
  • Version 8.0.7, released 5 January, 2008.
  • Version 8.0.8, released 11 February, 2008.
  • Version 8.0.9, released 20 February, 2008.
  • Version 8.0.10, released 22 June, 2008.
  • Version 8.0.11, released 11 August, 2008.
  • Version 8.0.12, released 5 November, 2008.
  • Version 8.0.13, released 29 November, 2009.
  • Version 8.0.14, released 16 December, 2009.

Releases of VM development team

  • Version 8.1.0, released 21 March, 2010.
  • Version 8.1.1, released 25 April, 2010.
  • Version 8.1.2, released 5 March, 2012.
  • Version 8.2.0b1, the last of the 8.2 betas. Version 8.2.0 itself was never released.
  • Version 8.3.0, released 22 December 2025
  • Version 8.3.1, released 27 December 2025
  • Version 8.3.2, released 29 December 2025
  • Version 9.0.0snapshot, from git

27 Highlights

Here are some of the VM features that its users find most valuable:


28 Future Plans

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.


29 Reporting Bugs

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:

  1. Run vm-pop-start-bug-report or vm-imap-start-bug-report.
  2. Provoke the problem.
  3. Run 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.


30 VM Internals

This section gives a sketchy overview of the VM internals for the developers/programmers.


30.1 Folder Internals

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

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

Folder 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:

    • forwarding. if a message is being forwarded.
    • replying. if a message is being replied to.
    • redistributing. if a message is being redistributed.
  • 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.

vm-folder-access-data

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.

30.2 Message Internals

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.

Location data

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

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.

Soft data

This vector contains other calculated data about the message that is specific to a VM session.

Attributes

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.

Cached Data

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.

Mirror Data

Extra data shared by virtual messages if vm-virtual-mirror is non-nil.

MIME layout

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.

Cross-buffer sharing of data

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

30.2.1 RFC compliance

The format of the mail messages is as described in RFC 822.

  • RFC 822. Standard for the format of ARPA Internet text messages. August 1982.
  • RFC 2822. Internet Message Format (proposed). April 2001.
  • RFC 5322. Internet Message Format (standard). October 2008.

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.

  • RFC 2045. Format of Internet Message Bodies. November 1996.
  • RFC 2046. Media Types. November 1996.
  • RFC 2047. Message Header Extensions for NON-ASCII Text. November 1996.
  • RFC 2048. Registration Procedures. November 1996.
  • RFC 2049. Conformance Criteria and Examples. November 1996.

The following updates that have been made to the original MIME standards have not been implemented in VM.

  • RFC 2231. MIME Parameter Value and Encoded Word Extensions. November 1997.
  • RFC 5335. Internationalized Email Headers (Experimental). September 2008.
  • RFC 6532. Internationalized Email Headers (Proposed). February 2012.

30.3 Summary Internals

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:

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:

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:


30.4 Threading Internals

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:

The vm-thread-subject-obarray interns each subject string found in the folder and maps it to a vector containing the following elements:

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.

Error handling

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.


30.5 Sorting Internals

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.


30.6 IMAP Server Interaction

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.


30.7 User Interaction

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

30.8 Coding Systems

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.


30.9 Message Display

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.


30.10 MIME Display

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:

  1. If the MIME part is a multipart type, then the subparts are displayed as needed. If it is a single part, it proceeds as follows.
  2. If the MIME part should not be displayed automatically, it is displayed as a button. (An automatically displayed MIME type is one listed in vm-mime-auto-displayed-content-types but not listed in the corresponding exceptions.)
  3. If the MIME part should be displayed internally and VM is able to do so, then it is displayed internally. (An internally displayed MIME type is one listed in vm-mime-internal-content-types but not listed in the corresponding exceptions.)
  4. Otherwise, the MIME part is displayed externally. An external viewer is found from 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:


30.11 MIME Composition

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:

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.

Yanking or Forwarding MIME Messages

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.


30.12 Virtual Folder Internals

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:

Evidently, the last two registrations are only needed for interactive selectors that can be used with the V C command.


30.13 Extents and Overlays

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:

  1. Summary buffers use an overlay for each summary line. All the markers are set to nil before a summary is regenerated and put back afterwards; not doing that seriously degrades the speed of summary generation.
  2. Presentation buffers use an overlay for each MIME button.

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.


30.14 Timers and Concurrency

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

Moves 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-function

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


Appendix A Command and Variable Reference

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.


A.1 Deleting and expunging

A.1.1 Commands

Command: vm-compact-folder &rest rest

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

Command: vm-delete-duplicate-messages

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.

Command: vm-delete-duplicate-messages-by-body

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.

Command: vm-delete-message count &optional mlist

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.

Command: vm-delete-message-backward count

Like vm-delete-message, except the deletion direction is reversed.

Command: vm-expunge-folder &rest rest

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

Command: vm-kill-subject &optional arg

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.

Command: vm-kill-thread-subtree &optional arg

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.

Command: vm-toggle-flag-message count &optional mlist

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.

Command: vm-undelete-message count

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.


A.2 Digests

A.2.1 Commands

Command: vm-burst-digest &optional digest-type

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.

Command: vm-burst-digest-to-temp-folder &optional digest-type

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.

Command: vm-burst-mime-digest

Burst a MIME digest

Command: vm-burst-rfc1153-digest

Burst an RFC 1153 style digest

Command: vm-burst-rfc934-digest

Burst an RFC 934 style digest

A.2.2 User options

User Option: vm-burst-digest-messages-inherit-labels

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

User Option: vm-digest-burst-type

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"

User Option: vm-digest-center-preamble

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

User Option: vm-digest-identifier-header-format

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"

User Option: vm-digest-preamble-format

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

User Option: vm-digest-send-type

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"

User Option: vm-mime-digest-discard-header-regexp

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.

User Option: vm-mime-digest-headers

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-")
User Option: vm-rfc1153-digest-discard-header-regexp

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:"

User Option: vm-rfc1153-digest-headers

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:")
User Option: vm-rfc934-digest-discard-header-regexp

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.

User Option: vm-rfc934-digest-headers

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

A.3 Dired

A.3.1 Commands

Command: vm-dired-attach-file composition

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.

Command: vm-dired-do-attach-files composition

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.


A.4 Dispose

A.4.1 User options

User Option: vm-auto-folder-alist

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.

User Option: vm-auto-folder-case-fold-search

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

User Option: vm-confirm-for-auto-archive

Non-nil value causes VM to ask for confirmation when vm-auto-archive-messages is invoked.

Default value: t

User Option: vm-delete-after-archiving

Non-nil value causes VM to automatically mark messages for deletion after successfully auto-archiving them with the vm-auto-archive-messages command.

User Option: vm-delete-after-bursting

Non-nil value causes VM automatically to mark a message for deletion after it has been successfully burst by the vm-burst-digest command.

User Option: vm-delete-after-saving

Non-nil value causes VM automatically to mark messages for deletion after successfully saving them to a folder.

User Option: vm-edit-message-mode

Major mode to use when editing messages in VM.

Default value: text-mode

User Option: vm-expunge-before-save

Non-nil value causes VM to expunge deleted messages before saving a folder.

User Option: vm-save-using-auto-folders

Non-nil value means that VM will suggest folders for saving messages automatically using the setting of vm-auto-folder-alist.

Default value: t

User Option: vm-visit-when-saving

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


A.5 Editing messages

A.5.1 Commands

Command: vm-discard-cached-data &optional count

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.

Command: vm-edit-message &optional prefix-argument

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.

Command: vm-edit-message-abort

Abort the edit of a message, forgetting changes to the message.

Command: vm-edit-message-end

End the edit of a message and copy the result to its folder.

Command: vm-edit-message-other-frame &optional prefix

Like vm-edit-message, but run in a newly created frame.


A.6 Encryption with EasyPG

A.6.1 Commands

Command: vm-epg-ask-hook

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)

Command: vm-epg-attach-public-key

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.

Command: vm-epg-cleartext-decrypt

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.

Command: vm-epg-cleartext-encrypt sign

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.

Command: vm-epg-cleartext-sign

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.

Command: vm-epg-cleartext-verify

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.

Command: vm-epg-compose-mode &optional arg

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
Command: vm-epg-encrypt &optional 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.

Command: vm-epg-insert-public-key

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.

Command: vm-epg-sign

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.

Command: vm-epg-sign-and-encrypt

Sign and encrypt the composition as PGP/MIME. Equivalent to vm-epg-encrypt with a prefix argument.

Command: vm-epg-snarf-keys

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.

A.6.2 User options

User Option: vm-epg-ask-function

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

User Option: vm-epg-auto-decrypt

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

User Option: vm-epg-auto-snarf

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

User Option: vm-epg-cleartext-search-limit

Number of bytes to search into the message for a PGP clear text armor.

Default value: 4096

User Option: vm-epg-fetch-missing-keys

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

User Option: vm-epg-get-author-headers

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

User Option: vm-epg-get-recipients-headers

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

User Option: vm-epg-sign-text-transfer-encoding

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

A.6.3 Called by VM

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.

Command: vm-epg-compose-mode-menu arg1

PGP/MIME compose mode menu.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-epg-prompt-for-action

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.


A.7 External

A.7.1 User options

User Option: vm-enable-external-messages

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.

User Option: vm-external-fetch-message-for-presentation

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

User Option: vm-external-fetched-message-limit

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


A.8 Faces

A.8.1 User options

User Option: vm-attachment-button-face

Face used for text in buttons that trigger the display of MIME objects.

Default value: vm-attachment-button

User Option: vm-attachment-button-mouse-face

Face used for text in MIME buttons when mouse is hovering.

Default value: vm-attachment-button-mouse

User Option: vm-citation-faces

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)
User Option: vm-enable-body-faces

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

User Option: vm-highlight-url-face

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

User Option: vm-highlighted-header-face

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

User Option: vm-mime-button-face

Face used for text in buttons that trigger the display of MIME objects.

Default value: vm-mime-button

User Option: vm-mime-button-mouse-face

Face used for text in MIME buttons when mouse is hovering.

Default value: vm-mime-button-mouse

User Option: vm-signature-face

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

User Option: vm-summary-enable-faces

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.

User Option: vm-summary-highlight-face

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


A.9 Folders

A.9.1 Commands

Command: vm-backup-folder

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.

Command: vm-change-folder-type type &optional file output

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.

Command: vm-check-folder &optional file

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.

Command: vm-convert-caches-to-mboxcl2 &optional each

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.

Command: vm-emit-totals-blurb

Show the line vm-totals-blurb answers, and answer with it.

Command: vm-folder-cache-file &optional buffer

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.

Command: vm-folder-name

Return the current folder’s name (local file name, or POP/IMAP maildrop string).

Command: vm-get-new-mail &optional arg

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.

Command: vm-help

Display help for various VM activities.

Command: vm-load-message &optional count

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.

Command: vm-mark-message-read &optional count

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.

Command: vm-mark-message-unread &optional count

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.

Command: vm-quit &optional no-expunge no-change

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.

Command: vm-quit-just-bury

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.

Command: vm-quit-just-iconify

Iconify the frame and bury the current VM folder and summary buffers. The folder is not altered and Emacs is still visiting it.

Command: vm-quit-no-change

Quit visiting the current folder and discard any changes made to the folder.

Command: vm-quit-no-expunge

Quit visiting the current folder without expunging deleted messages.

The setting of vm-expunge-before-quit is ignored.

Command: vm-recover-file

Recover the autosave file for the current folder. Same as M-x vm-recover-folder.

Command: vm-recover-folder

Recover the autosave file for the current folder. Same as M-x vm-recover-folder.

Command: vm-refresh-message

Reload the message body from its permanent location. Currently this facility is only available for IMAP folders.

Command: vm-reorder-message-headers message &rest rest
Command: vm-revert-buffer

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.

Command: 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.

Command: vm-save-and-expunge-folder &optional prefix

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.

Command: vm-save-buffer prefix

Not documented.

Command: vm-save-folder &optional prefix

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.

Command: vm-save-folder-no-expunge &optional prefix

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.

Command: vm-toggle-read-only

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.

Command: vm-unload-message &optional count physical

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.

Command: vm-unread-message &optional count

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.

Command: vm-write-file

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.

A.9.2 User options

User Option: vm-auto-get-new-mail

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

User Option: vm-berkeley-mail-compatibility

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.

User Option: vm-check-folder-types

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

User Option: vm-confirm-new-folders

Non-nil value causes interactive calls to vm-save-message to ask for confirmation before creating a new folder.

User Option: vm-convert-folder-types

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

User Option: vm-crash-box

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.

User Option: 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"

User Option: vm-default-From_-folder-type

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_

User Option: vm-default-folder-permission-bits

Default UNIX permission bits for newly created folders.

Default value: 384

User Option: vm-default-folder-type

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_

User Option: vm-default-new-folder-line-ending-type

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

User Option: vm-delete-empty-folders

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

User Option: vm-flush-interval

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

User Option: vm-folder-directory

Directory where folders of mail are kept.

User Option: vm-folder-file-precious-flag

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

User Option: vm-folder-type-by-extension-alist

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

User Option: vm-imap-auto-expunge-alist

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.

User Option: vm-imap-expunge-after-retrieving

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

User Option: vm-index-file-suffix

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.

User Option: vm-keep-crash-boxes

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.

User Option: vm-mail-check-always

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.

User Option: vm-mail-check-interval

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

User Option: vm-make-crash-box-name

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.

User Option: vm-make-spool-file-name

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.

User Option: vm-mboxcl2-strict

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

User Option: vm-move-messages-physically

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.

User Option: vm-pop-auto-expunge-alist

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.

User Option: vm-pop-expunge-after-retrieving

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

User Option: vm-primary-inbox

Mail is moved from the system mailbox to this file for reading.

Default value: "~/INBOX"

User Option: vm-spam-score-headers

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))
User Option: vm-spam-words-file

A file storing a list of words contained in spam messages.

Default value: worked out when VM is loaded, from this system.

User Option: vm-spool-file-suffixes

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.

User Option: vm-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.

User Option: vm-sync-thunderbird-status

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

User Option: vm-thunderbird-folder-directory

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.

User Option: vm-trust-content-length

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.


A.10 Forward

A.10.1 User options

User Option: vm-forwarded-headers

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.

User Option: vm-forwarded-headers-plain

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:")
User Option: vm-forwarding-digest-type

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"

User Option: vm-forwarding-subject-format

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"

User Option: vm-resend-bounced-discard-header-regexp

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.

User Option: vm-resend-bounced-headers

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-")
User Option: vm-resend-discard-header-regexp

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

User Option: vm-resend-headers

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.

User Option: vm-unforwarded-header-regexp

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"

User Option: vm-unforwarded-header-regexp-plain

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.


A.11 Helpers

A.11.1 User options

User Option: vm-grep-program

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"

User Option: vm-icontopbm-program

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.

User Option: vm-imagemagick-program

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.

User Option: vm-lynx-program

Name of program to use to run lynx. This is used to retrieve URLs.

Default value: "lynx"

User Option: vm-movemail-program

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.

User Option: vm-movemail-program-switches

List of command line flags to pass to the movemail program named by vm-movemail-program.

User Option: vm-session-trace-max-size

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

User Option: vm-ssh-program

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"

User Option: vm-ssh-program-switches

List of command line switches to pass to SSH.

User Option: vm-ssh-remote-command

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"

User Option: vm-stunnel-program

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.

User Option: 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.

User Option: vm-stunnel-program-switches

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.

User Option: vm-stunnel-random-data-method

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

User Option: vm-stunnel-wants-configuration-file

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

User Option: vm-uncompface-program

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.

User Option: vm-w3m-program

Name of program to use to run w3m. This is used to retrieve URLs.

Default value: "w3m"


A.12 Hooks

A.12.1 User options

User Option: vm-arrived-message-hook

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

User Option: vm-arrived-messages-hook

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.

User Option: vm-display-buffer-hook

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.

User Option: vm-edit-message-hook

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.

User Option: vm-forward-message-hook

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.

User Option: vm-iconify-frame-hook

List of hook functions that are run whenever VM iconifies a frame.

User Option: vm-imap-session-preauth-hook

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

User Option: vm-mail-hook

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.

User Option: vm-mail-mode-hook

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.

User Option: vm-mail-send-hook

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.

User Option: vm-menu-setup-hook

List of hook functions that are run just after all menus are initialized.

User Option: vm-mode-hook

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.

User Option: vm-mode-hooks

Old name for vm-mode-hook. Supported for backward compatibility. You should use the new name.

User Option: vm-presentation-mode-hook

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.

User Option: vm-quit-hook

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

User Option: vm-reply-hook

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.

User Option: vm-resend-bounced-message-hook

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.

User Option: vm-resend-message-hook

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.

User Option: vm-retrieved-spooled-mail-hook

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.

User Option: vm-save-message-hook

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.

User Option: vm-select-message-hook

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

User Option: vm-select-new-message-hook

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.

User Option: vm-select-unread-message-hook

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.

User Option: vm-send-digest-hook

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.

User Option: vm-showing-message-hook

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

User Option: vm-spooled-mail-waiting-hook

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.

User Option: vm-startup-hook

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.

User Option: vm-summary-mode-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.

User Option: vm-summary-mode-hooks

Old name for vm-summary-mode-hook. Supported for backward compatibility. You should use the new name.

User Option: vm-summary-pointer-update-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.

User Option: vm-summary-redo-hook

List of hook functions called just after VM adds or deletes entries from a folder summary.

User Option: vm-summary-update-hook

List of hook functions called just after VM updates an existing entry a folder summary.

User Option: vm-undisplay-buffer-hook

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.

User Option: vm-virtual-mode-hook

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.

User Option: vm-visit-folder-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.


A.13 IMAP

A.13.1 Commands

Command: vm-create-imap-folder folder

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.

Command: vm-delete-imap-folder folder

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.

Command: vm-expunge-imap-messages

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.

Command: vm-imap-create-folder folder

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.

Command: vm-imap-delete-folder folder

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.

Command: vm-imap-list-folders account &optional filter-new

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.

Command: vm-imap-rename-folder source dest

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.

Command: vm-imap-start-bug-report

Begin to compose a bug report for IMAP support functionality.

Command: vm-imap-submit-bug-report

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.

Command: vm-imap-synchronize &optional full

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

Command: vm-list-imap-folders account &optional filter-new

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.

Command: vm-prune-imap-retrieved-list source

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.

Command: vm-rename-imap-folder source dest

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.

A.13.2 User options

User Option: vm-imap-account-alist

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")))
User Option: vm-imap-default-account

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.

User Option: vm-imap-folder-cache-directory

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.

User Option: vm-imap-keep-trace-buffer

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

User Option: vm-imap-max-message-size

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.

User Option: vm-imap-message-bunch-size

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

User Option: vm-imap-refer-to-inbox-by-account-name

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.

User Option: vm-imap-save-to-server

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.

User Option: vm-imap-server-timeout

Number of seconds to wait for output from the IMAP server before timing out. It can be set to nil to never time out.

User Option: vm-imap-tolerant-of-bad-imap

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.


A.14 Icalendar

A.14.1 Commands

Command: vm-icalendar-import &optional file

Add the calendar part of the current message to the diary. Hands the part to Emacs’s own icalendar-import-buffer, which writes into FILE, diary-file by default. Issue #85.


A.15 License

A.15.1 Commands

Command: vm-show-copying-restrictions &optional warranty

Show VM’s license, i.e. the GPL.

Command: vm-show-no-warranty

Display "NO WARRANTY" section of the GNU General Public License.


A.16 MIME and attachments

A.16.1 Commands

Command: vm-attach-buffer buffer type &optional charset description

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.

Command: vm-attach-file file type &optional charset description _no-suggested-filename

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.

Command: vm-attach-files-in-directory directory &optional regexp

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.

Command: vm-attach-message message &optional description

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.

Command: vm-attach-message-to-composition composition &optional description

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.

Command: vm-attach-mime-file file type

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.

Command: vm-decode-mime-message &optional state

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.

Command: vm-delete-all-attachments &optional count

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.

Command: vm-delete-mime-object &optional saved-file

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.

Command: vm-list-mime-part-structure &optional verbose

List mime part structure of the current message.

Command: vm-mime-attach-buffer buffer type &optional charset description

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.

Command: vm-mime-attach-file file type &optional charset description _no-suggested-filename

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.

Command: vm-mime-attach-message message &optional description

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.

Command: vm-mime-attach-message-to-composition composition &optional description

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.

Command: vm-mime-attach-mime-file file type

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.

Command: vm-mime-auto-save-all-attachments &optional count

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)

Command: vm-mime-change-content-disposition

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.

Command: vm-mime-convert-to-attachment-buttons

Replace all mime buttons in the current buffer by attachment buttons.

Command: vm-mime-encode-composition &optional attachments-only

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.

Command: vm-mime-list-part-structure &optional verbose

List mime part structure of the current message.

Command: vm-mime-preview-composition

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.

Command: vm-mime-reader-map-attach-to-composition

Attach the MIME object at point to a message being composed. The buffer for message composition is queried from the minibuffer.

Command: vm-mime-reader-map-convert-then-display

Convert the MIME object at point to text and display it.

Command: vm-mime-reader-map-display-object-as-type

Display the MIME object at point as some other type.

Command: vm-mime-reader-map-display-using-default

Display the MIME object at point using the default face.

Command: vm-mime-reader-map-display-using-external-viewer

Display the MIME object at point with an external viewer.

Command: vm-mime-reader-map-pipe-to-command

Pipe the MIME object at point to a shell command.

Command: vm-mime-reader-map-pipe-to-command-discard-output

Pipe the MIME object at point to a shell command.

Command: vm-mime-reader-map-pipe-to-printer

Print the MIME object at point.

Command: vm-mime-reader-map-save-file

Write the MIME object at point to a file.

Command: vm-mime-reader-map-save-message

Save the MIME object at point to a folder.

Command: vm-mime-rename-attachment

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.

Command: vm-mime-run-display-function-at-point &optional function

Run the vm-mime-function for the MIME button at point. If optional argument FUNCTION is given, run it instead. USR, 2011-03-07

Command: vm-nuke-alternative-text/html &optional count mlist

Removes the text/html part of all multipart/alternative message parts.

This is a destructive operation and cannot be undone!

Command: vm-save-all-attachments &optional count directory

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.

Command: vm-save-attachments &optional count

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.

Command: vm-toggle-best-mime

Toggle between best-internal and best mime decoding modes. (Alley Soughton)

A.16.2 User options

User Option: vm-attach-files-in-directory-default-charset

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

User Option: vm-attach-files-in-directory-default-type

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.

User Option: vm-auto-decode-mime-messages

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

User Option: vm-auto-save-all-attachments

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.

User Option: vm-display-using-mime

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

User Option: vm-emit-messages-for-mime-decoding

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

User Option: vm-icalendar-description-lines

How many lines of a calendar part’s DESCRIPTION to show, or nil for all.

Default value: 10

User Option: vm-icalendar-show-description

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

User Option: vm-infer-mime-types

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.

User Option: vm-infer-mime-types-for-text

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.
User Option: vm-mime-8bit-header-charsets

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)

User Option: vm-mime-8bit-text-transfer-encoding

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

User Option: vm-mime-all-attachments-directory

Directory to where the attachments should go or come from.

User Option: vm-mime-alternative-show-method

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

User Option: vm-mime-alternative-yank-method

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.

User Option: vm-mime-attachment-auto-suffix-alist

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"))
User Option: vm-mime-attachment-auto-type-alist

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"))
User Option: vm-mime-attachment-save-directory

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.

User Option: vm-mime-attachment-source-directory

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.

User Option: vm-mime-auto-displayed-content-type-exceptions

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.

User Option: vm-mime-auto-displayed-content-types

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

User Option: vm-mime-auto-save-all-attachments-subdir

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.

User Option: vm-mime-avoid-folding-content-type

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

User Option: vm-mime-button-format-alist

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]%)"))
User Option: vm-mime-charset-completion-alist

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"))
User Option: vm-mime-charset-converter-alist

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.

User Option: vm-mime-complete-html-for-external-viewer

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

User Option: vm-mime-composition-armor-from-lines

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.

User Option: vm-mime-confirm-delete

Non-nil value causes VM to request confirmation from the user before deleting a MIME object with vm-delete-mime-object.

Default value: t

User Option: vm-mime-decode-for-preview

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

User Option: vm-mime-deletable-type-exceptions

List of MIME types which should not be deleted.

Default value: ("text")

User Option: vm-mime-deletable-types

List of MIME types which should be deleted.

Default value: ("application" "x-unknown" "application/x-gzip")

User Option: vm-mime-delete-after-saving

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.

User Option: vm-mime-delete-viewer-processes

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

User Option: vm-mime-deleted-object-label

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"

User Option: vm-mime-display-function

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.

User Option: vm-mime-display-image-strips-incrementally

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

User Option: vm-mime-encode-headers-regexp

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"
User Option: vm-mime-encode-headers-type

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

User Option: vm-mime-encode-headers-words-regexp

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]*\\)+\\)*\\)"
User Option: vm-mime-external-content-type-exceptions

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.

User Option: vm-mime-external-content-types-alist

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.

User Option: vm-mime-externalize-cid-references

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

User Option: vm-mime-forward-saved-attachments

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

User Option: vm-mime-honor-content-disposition

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.

User Option: vm-mime-ignore-composite-type-opaque-transfer-encoding

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

User Option: vm-mime-ignore-mime-version

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

User Option: vm-mime-ignore-missing-multipart-boundary

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

User Option: vm-mime-internal-content-type-exceptions

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.

User Option: vm-mime-internal-content-types

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

User Option: vm-mime-max-message-size

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.

User Option: vm-mime-max-text-line-length

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

User Option: vm-mime-multipart/related-show-method

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

User Option: vm-mime-parts-display-separator

Separator string to insert between mime parts when displayed one after another.

Default value:

"
----------------------------------------------------------------------
"
User Option: vm-mime-require-mime-version-header

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.

User Option: vm-mime-saveable-type-exceptions

List of MIME types which should not be saved.

Default value: ("text")

User Option: vm-mime-saveable-types

List of MIME types which should be saved.

Default value: ("application" "x-unknown" "application/x-gzip")

User Option: vm-mime-shr-inhibit-images

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

User Option: vm-mime-text/html-handler

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

User Option: vm-mime-thumbnail-max-geometry

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"

User Option: vm-mime-type-converter-alist

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.

User Option: vm-mime-ucs-list

List of coding systems that can encode all characters known to emacs.

Default value: (utf-8 iso-2022-jp ctext escape-quoted)

User Option: vm-mime-unflow-flowed-text

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

User Option: vm-mime-use-image-strips

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

User Option: vm-mime-verify-signatures

Non-nil value means that VM should attempt to verify signatures attached in "multipart/signed" parts.

User Option: vm-send-using-flowed-text

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.

User Option: vm-send-using-mime

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

User Option: vm-smime-get-recipient-certificate-method

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

User Option: vm-url-retrieval-methods

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

User Option: vm-url-retrieval-timeout

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

A.16.3 Called by VM

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.

Command: vm-fetch-mode &optional read-only

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.

Command: vm-mime-Q-decode-region start end

Not documented.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-mime-encode-headers

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.

Command: vm-presentation-mode &optional read-only

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.


A.17 Marks

A.17.1 Commands

Command: vm-clear-all-marks

Removes all message marks in the current folder.

Command: vm-mark-all-messages

Mark all messages in the current folder.

Command: vm-mark-help

Show the mark commands and their keys in the echo area.

Command: vm-mark-matching-messages selector &optional arg

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.

Command: vm-mark-matching-messages-with-virtual-folder name

Mark messages that are matched by the selectors of virtual folder NAME.

Command: vm-mark-message count

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.

Command: vm-mark-messages-by-selector selector &optional arg

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.

Command: vm-mark-messages-by-virtual-folder name

Mark messages that are matched by the selectors of virtual folder NAME.

Command: vm-mark-messages-same-author

Mark all messages with the same author as the current message.

Command: vm-mark-messages-same-subject

Mark all messages with the same subject as the current message.

Command: vm-mark-summary-region

Mark all messages with summary lines contained in the region.

Command: vm-mark-thread-subtree

Mark all messages in the thread tree rooted at the current message.

Command: vm-next-command-uses-marks

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.

Command: vm-toggle-all-marks

Toggles all message marks in the current folder. Messages that are unmarked will become marked and messages that are marked will become unmarked.

Command: vm-unmark-matching-messages selector &optional arg

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.

Command: vm-unmark-matching-messages-with-virtual-folder name

Unmark messages that are matched by the selectors of virtual folder NAME.

Command: vm-unmark-message count

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.

Command: vm-unmark-messages-by-selector selector &optional arg

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.

Command: vm-unmark-messages-by-virtual-folder name

Unmark messages that are matched by the selectors of virtual folder NAME.

Command: vm-unmark-messages-same-author

Unmark all messages with the same author as the current message.

Command: vm-unmark-messages-same-subject

Unmark all messages with the same subject as the current message.

Command: vm-unmark-summary-region

Remove marks from messages with summary lines contained in the region.

Command: vm-unmark-thread-subtree

Unmark all messages in the thread tree rooted at the current message.


A.18.1 Commands

Command: vm-customize

Customize VM options.

Command: vm-view-manual

View the VM manual.

Command: vm-view-news

View the newest of VM’s NEWS files.

A.18.2 Called by VM

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.

Command: vm-menu-create-author-virtual-folder

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.

Command: vm-menu-create-subject-virtual-folder

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.

Command: vm-menu-hm-create-dir parent-dir

Create a subdir in PARENT-DIR.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-menu-hm-delete-folder folder

Query deletes a folder.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-menu-hm-make-folder-menu

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.

Command: vm-menu-hm-rename-folder folder

Rename a folder.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-menu-mail-to

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.

Command: vm-menu-popup-attachment-menu event

Not documented.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-menu-popup-context-menu event

Not documented.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-menu-popup-fsfemacs-menu event &optional menu

Not documented.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-menu-popup-image-menu event

Not documented.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-menu-popup-mailto-url-browser-menu event

Not documented.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-menu-popup-mime-dispose-menu event

Not documented.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-menu-popup-mode-menu event

Not documented.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-menu-popup-url-browser-menu event

Not documented.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-menu-toggle-menubar &optional buffer

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.

Command: vm-menu-yank-original

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.


A.19 Message History

A.19.1 Commands

Command: vm-message-history-backward &optional arg

Select the previous message in the current folder’s history. With prefix ARG, select the ARG’th previous message.

Command: vm-message-history-browse

Select a message from a popup menu of the current folder’s history.

Command: vm-message-history-forward &optional arg

Select the next message in the current folder’s history. With prefix ARG, select the ARG’th next message.

Command: vm-message-history-mode &optional arg

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.

A.19.2 User options

User Option: vm-message-history-max

The number of read or previewed messages in each folder’s history.

Default value: 32

User Option: vm-message-history-mode-hook

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

A.19.3 Called by VM

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.

Command: vm-message-history-browse-select

Select the message below the cursor.

Not autoloaded: VM has to be loaded before M-x offers this one.


A.20 Minibuf

A.20.1 Called by VM

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.

Command: vm-minibuffer-complete-word &optional exiting

Not documented.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-minibuffer-complete-word-and-exit

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.

Command: vm-minibuffer-completion-help

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.


A.21 Mouse

A.21.1 Called by VM

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.

Command: vm-mouse-button-2 event

The immediate action event in VM buffers, depending on where the mouse is clicked. See Info node (VM) Using the Mouse.

Command: vm-mouse-button-3 event

Brings up the context-sensitive menu in VM buffers, depending on where the mouse is clicked. See Info node ‘(VM) Using the Mouse’.

Command: vm-mouse-popup-or-select event

Not documented.

Command: vm-mouse-read-file-name-quit-handler &optional normal-exit

Not documented.

Command: vm-mouse-read-string-quit-handler &optional normal-exit

Not documented.

Command: vm-mouse-send-url-at-event event

Not documented.


A.22 Moving about

A.22.1 Commands

Command: vm-goto-last-message-seen

Go to the message last previewed.

Command: vm-goto-message n

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.

Command: vm-goto-message-last-seen

Go to the message last previewed.

Command: vm-goto-parent-message

Go to the parent of the current message.

Command: vm-next-message &optional count retry signal-errors

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.

Command: vm-next-message-no-skip &optional count

Like vm-next-message but will not skip deleted or read messages.

Command: vm-next-message-same-subject

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.

Command: vm-next-unread-message

Move forward to the nearest new or unread message, if there is one.

Command: vm-previous-message &optional count retry signal-errors

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.

Command: vm-previous-message-no-skip &optional count

Like vm-previous-message but will not skip deleted or read messages.

Command: vm-previous-message-same-subject

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.

Command: vm-previous-unread-message

Move backward to the nearest new or unread message, if there is one.


A.23 New mail notification

A.23.1 Commands

Command: vm-biff-delete-popup &optional wf

Not documented.

Command: vm-biff-fvwm-focus-vm-folder-frame

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

Command: vm-biff-mode &optional arg

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.

Command: vm-biff-popup &optional force

Scan the current VM folder for new messages and popup a summary frame.

Command: vm-biff-select-message

Put focus on the folder frame and select the appropriate message.

A.23.2 User options

User Option: vm-biff-FvwmCommand-path

Full qualified path to FvwmCommand.

Default value: "/usr/bin/FvwmCommand"

User Option: vm-biff-auto-remove

Number of seconds after the popup window is automatically removed.

User Option: vm-biff-body-peek

Maximum number of characters to peek into the body of a message.

Default value: 50

User Option: vm-biff-focus-popup

Non-nil means the pop-up window takes the focus when it appears.

User Option: vm-biff-folder-list

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.

User Option: vm-biff-max-height

Maximum hight of the popup window.

Default value: 10

User Option: vm-biff-mode-hook

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

User Option: vm-biff-place-frame-function

Function that sets the popup frame position and size.

Default value: vm-biff-place-frame

User Option: vm-biff-position

Position of the popup-frame.

Default value: center

User Option: vm-biff-select-frame-hook

List of hook functions to be run when selection a message. You may want to add vm-biff-fvwm-focus-vm-folder-frame.

User Option: vm-biff-select-hook

List of hook functions to be run when selection a message.

User Option: vm-biff-selector

Virtual folder selector matching the messages the pop-up shows.

Default value: (and (new) (not (deleted)) (not (outgoing)))

User Option: vm-biff-summary-format

Like vm-summary-format but for popup buffers.

User Option: vm-biff-width

Width of the popup-frame.

Default value: 120

A.23.3 Called by VM

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.

Command: vm-biff-select-message-mouse event

Not documented.


A.24 Other settings

A.24.1 Commands

Command: vm-current-key-bindings

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.

Command: vm-load-init-file &optional init-only

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.

Command: vm-mail-mode-elide-reply-region b e

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.

Command: vm-show-log

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.

Command: vm-smime-encrypt-message

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

Command: vm-smime-sign-message

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

Command: vm-v8-key-bindings

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.

Command: vm-view-file-other-frame 91 65 114 103 32 108 105 115 116 32 110 111 116 32 97 118 97 105 108 97 98 108 101 32 117 110 116 105 108 32 102 117 110 99 116 105 111 110 32 100 101 102 105 110 105 116 105 111 110 32 105 115 32 108 111 97 100 101 100 46 93

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.

A.24.2 User options

User Option: vm-confirm-quit

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

User Option: vm-expunge-before-quit

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.

User Option: vm-handle-return-receipt-mode

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

User Option: vm-handle-return-receipt-peek

Number of characters from the original message body to be returned.

Default value: 500

User Option: vm-handle-return-receipts

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.

User Option: vm-image-directory

The directory where VM finds the pixmaps for mime objects.

User Option: vm-init-file

Startup file for VM that is loaded the first time you run VM in an Emacs session.

Default value: "~/.vm"

User Option: vm-log-level

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.

User Option: vm-log-max-lines

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

User Option: vm-preferences-file

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"

User Option: vm-preserve-read-only-folders-on-disk

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

User Option: vm-report-subprocess-errors

Boolean flag that controls whether VM should report errors from running commands in subprocesses.

Default value: t

User Option: vm-search-using-regexps

Non-nil value causes VM’s search command to interpret user input as a regular expression instead of as a literal string.

User Option: vm-suggest-checking-configuration

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

User Option: vm-temp-file-directory

Name of a directory where VM can put temporary files.

Default value: worked out when VM is loaded, from this system.

User Option: vm-verbal-time

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

User Option: vm-verbosity

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

A.24.3 Called by VM

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.

Command: vm-do-fcc-before-mime-encode

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.


A.25 POP

A.25.1 Commands

Command: vm-expunge-pop-messages

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.

Command: vm-pop-start-bug-report

Begin to compose a bug report for POP support functionality.

Command: vm-pop-submit-bug-report

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.

A.25.2 User options

User Option: vm-pop-folder-alist

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.

User Option: vm-pop-folder-cache-directory

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.

User Option: vm-pop-keep-trace-buffer

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

User Option: vm-pop-max-message-size

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.

User Option: vm-pop-server-timeout

Number of seconds to wait for output from the POP server before timing out. It can be set to nil to never time out.


A.26 Personality Crisis

A.26.1 Commands

Command: vm-pcrisis-automorph

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.

Command: vm-pcrisis-build-actions-to-run-list

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.

Command: vm-pcrisis-build-true-conditions-list

Build list of true conditions and store it in the variable vm-pcrisis-true-conditions.

Command: vm-pcrisis-check-configuration

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.

Command: vm-pcrisis-fix-auto-profiles-file

Change vm-pcrisis-auto-profiles-file to the format used by v0.82+.

Command: vm-pcrisis-load-auto-profiles

Initialise vm-pcrisis-auto-profiles from vm-pcrisis-auto-profiles-file.

Command: vm-pcrisis-migrate-profiles-to-BBDB

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.

Command: vm-pcrisis-mode &optional arg

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.

Command: vm-pcrisis-prompt-for-profile &optional remember prompt

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.

Command: vm-pcrisis-run-action &optional action-regexp

Run all actions with names matching the ACTION-REGEXP. If called interactively it prompts for the regexp. You may also use completion.

Command: vm-pcrisis-run-actions &optional actions verbose

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.

Command: vm-pcrisis-toggle-no-automorph

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.

Command: vm-pcrisis-true-conditions

Return a list of all true conditions. Run this function in order to test/check your conditions.

A.26.2 User options

User Option: vm-pcrisis-actions

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

User Option: vm-pcrisis-auto-profiles-expunge-days

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

User Option: vm-pcrisis-auto-profiles-file

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"

User Option: vm-pcrisis-automorph-rules

Alist associating conditions with actions from vm-pcrisis-actions when automorphing.

User Option: vm-pcrisis-conditions

List of conditions which will be checked by pcrisis.

User Option: vm-pcrisis-default-profile

The default profile to select if no profile was found.

Default value: "default"

User Option: vm-pcrisis-default-rules

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.

User Option: vm-pcrisis-expect-default-signature

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

User Option: vm-pcrisis-forward-rules

A list of condition-action rules used when forwarding.

User Option: vm-pcrisis-mail-rules

An alist associating conditions with actions from vm-pcrisis-actions when composing a message starting from a folder.

User Option: vm-pcrisis-mode-hook

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

User Option: vm-pcrisis-newmail-rules

An alist associating conditions with actions from vm-pcrisis-actions when composing.

User Option: vm-pcrisis-prompt-for-profile-headers

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")))
User Option: vm-pcrisis-reply-rules

A list of condition-action rules used during reply.

User Option: vm-pcrisis-resend-rules

An alist associating conditions with actions from vm-pcrisis-actions when resending.

A.26.3 Called by VM

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.

Command: vm-pcrisis-backward-tab-header-or-tab-stop

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.

Command: vm-pcrisis-read-actions prompt &optional default

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.

Command: vm-pcrisis-tab-header-or-tab-stop &optional backward

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.


A.27 Postponed compositions

A.27.1 Commands

Command: vm-continue-postponed-message &optional silent draft

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.

Command: vm-continue-what-message &optional where

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.

Command: vm-continue-what-message-other-frame

Ask for continuing of postponed messages if there are some.

Command: vm-continue-what-message-other-window

Ask for continuing of postponed messages if there are some.

Command: vm-delete-postponed-message

Delete the source message belonging to the continued composition.

Command: vm-mail-auto-fcc

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.

Command: vm-mail-fcc &optional arg

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.

Command: vm-mail-notice-requested-upon-delivery-to

Notice-Requested-Upon-Delivery-To:

Command: vm-mail-priority

Insert priority headers into a VM composition buffer. See the variable vm-mail-priority.

Command: vm-mail-return-receipt-to

Insert the "Return-Receipt-To" header into a VM composition buffer. See the variable vm-mail-return-receipt-to.

Command: vm-mail-select-folder folder-alist

Return a folder according to FOLDER-ALIST for the current message. This function is a slightly changed version of vm-auto-select-folder.

Command: vm-mail-to-fcc &optional arg return-only

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.

Command: vm-postpone-message &optional folder dont-kill no-postpone-header

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.

Command: vm-postpone-mode &optional arg

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.

Command: vm-reply-by-continue-postponed-message

Like vm-reply but preserves attachments.

Command: vm-summary-function-f m

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

A.27.2 User options

User Option: vm-after-postpone-message-hook

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.

User Option: vm-auto-expunge-postponed-folder

If non-nil, the postponed-folder is auto-expunged whenever postponed messages are continued and sent out.

User Option: vm-continue-postponed-message-hook

List of hook functions to be run after continuing a postponed message.

User Option: vm-mail-fcc-default

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)
User Option: vm-mail-folder-alist

Like vm-auto-folder-alist but for outgoing messages. It should be fed to vm-mail-select-folder.

User Option: vm-mail-to-headers

A list of headers for finding the email address to use as FCC-folder.

Default value: ("To:" "CC:" "BCC:")

User Option: vm-mail-to-regexp

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 ]+\\)@"

User Option: vm-postpone-message-hook

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.

User Option: vm-postpone-mode-hook

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

User Option: vm-postponed-folder

The name of the folder where postponed messages are saved.

Default value: "postponed"

User Option: vm-postponed-header

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: "

User Option: vm-postponed-message-discard-header-regexp

Similar to vm-unforwarded-header-regexp. A regular expression matching all headers that should be discard when when continuing a postponed message.

User Option: vm-postponed-message-headers

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:")
User Option: vm-save-killed-message

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

User Option: vm-save-killed-messages-folder

The name of the folder where killed messages are saved.

Default value: "postponed"

User Option: vm-zero-drafts-start-compose

When t and there are no drafts, vm-continue-what-message call vm-mail.


A.28 Printing

A.28.1 User options

User Option: vm-print-command

Command VM uses to print messages.

Default value: "lpr"

User Option: vm-print-command-switches

List of command line flags passed to the command named by vm-print-command. VM uses vm-print-command to print messages.

User Option: vm-ps-print-each-message-header-lines

See ps-header-lines.

Default value: 2

User Option: vm-ps-print-each-message-left-header

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))))
User Option: vm-ps-print-each-message-right-header

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)

User Option: vm-ps-print-each-message-summary-format

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"

User Option: vm-ps-print-message-font-size

The font size for the PS-output of the message text.

Default value: 10

User Option: vm-ps-print-message-function

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

User Option: vm-ps-print-message-header-lines

See ps-header-lines.

Default value: 2

User Option: vm-ps-print-message-left-header

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")))
User Option: vm-ps-print-message-right-header

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)

User Option: vm-ps-print-message-separator

The separator between messages when printing multiple messages.

Default value: "\n"

User Option: vm-ps-print-message-summary-format

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\"
******************************************************************************
"

A.29 Printing with ps-print

A.29.1 Commands

Command: vm-ps-print-each-message &optional count filename

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.

Command: vm-ps-print-marked &optional filename separate nup color

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)

Command: vm-ps-print-message &optional count filename each

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.

Command: vm-ps-print-message-infect-vm &optional each

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.

Command: vm-ps-print-message-presentation &optional filename

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.


A.30 Reading a message

A.30.1 Commands

Command: vm-beginning-of-message

Moves to the beginning of the current message.

Command: vm-end-of-message

Moves to the end of the current message, exposing and flagging it read as necessary.

Command: vm-energize-urls &optional clean-only

Not documented.

Command: vm-energize-urls-in-message-region &optional start end

Not documented.

Command: vm-expose-hidden-headers

Toggle exposing and hiding message headers that are normally not visible.

Command: vm-isearch-presentation

Switches to the Presentation buffer and starts isearch.

Command: vm-move-to-next-button count

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.

Command: vm-move-to-previous-button count

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.

Command: vm-next-button count

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.

Command: vm-previous-button count

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.

Command: vm-scroll-backward &optional arg

Scroll backward a screenful of text. Prefix N scrolls backward N lines.

Command: vm-scroll-backward-one-line &optional count

Scroll backward one line. Prefix arg N means scroll backward N lines. Negative arg means scroll forward.

Command: vm-scroll-forward &optional arg

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.

Command: vm-scroll-forward-one-line &optional count

Scroll forward one line. Prefix arg N means scroll forward N lines. Negative arg means scroll backward.

Command: vm-shrunken-headers &optional toggle

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.

Command: vm-shrunken-headers-toggle

Toggle display of shrunken headers.

Command: vm-shrunken-headers-toggle-this

Toggle display of shrunken headers.

A.30.2 User options

User Option: vm-assimilate-new-messages-sorted

When enabled new messages will be inserted in current sort order. Otherwise they are appended to the folder, which is VM default.

User Option: vm-display-xfaces

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.

User Option: vm-enable-shrunken-headers

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.

User Option: vm-fill-paragraphs-containing-long-lines

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.

User Option: vm-highlighted-header-regexp

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.

User Option: vm-honor-page-delimiters

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.

User Option: vm-invisible-header-regexp

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.

User Option: vm-page-continuation-glyph

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

User Option: vm-paragraph-fill-column

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

User Option: vm-presentation-minor-modes

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

User Option: vm-preview-lines

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

User Option: vm-preview-read-messages

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.

User Option: vm-use-presentation-minor-modes

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.

User Option: vm-visible-headers

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:")
User Option: vm-word-wrap-paragraphs

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.

A.30.3 Called by VM

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.

Command: vm-emit-eom-blurb

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.

Command: vm-emit-mime-decoding-message format &rest args

Not documented.

Not autoloaded: VM has to be loaded before M-x offers this one.

Command: vm-shrunken-headers-toggle-this-mouse &optional event

Toggle display of shrunken headers.


A.31 Replying and composing

A.31.1 Commands

Command: vm-continue-composing-message &optional not-picky

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.

Command: vm-fill-long-lines-in-reply

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.

Command: vm-followup count

Reply to all recipients of the current message. See the documentation for the function vm-reply for details.

Command: vm-followup-include-text count

Reply to all recipients of the current message and include text from the message. See the documentation for the function vm-reply for details.

Command: vm-followup-include-text-other-frame count

Like vm-followup-include-text, but run in a newly created frame.

Command: vm-followup-other-frame count

Like vm-followup, but run in a newly created frame.

Command: vm-forward-message &optional plain mlist

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.

Command: vm-forward-message-all-headers

Like vm-forward-message but forwards all the headers.

Command: vm-forward-message-all-headers-other-frame

Like vm-forward-message-all-headers, but run in a newly created frame.

Command: vm-forward-message-other-frame

Like vm-forward-message, but run in a newly created frame.

Command: vm-forward-message-plain

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.

Command: vm-forward-message-plain-other-frame

Like vm-forward-message-plain, but run in a newly created frame.

Command: vm-mail-mode-citation-clean-up

Remove doubly-cited text and extra lines in a mail message.

Command: vm-mail-mode-hide-headers

Hides and protects headers listed in vm-mail-mode-hidden-headers. With a prefix arg, call vm-mail-mode-show-headers instead.

Command: vm-mail-mode-show-headers

Display any hidden headers in a composition buffer.

Command: vm-mail-send

Just like mail-send except that VM flags the appropriate message(s) as replied to, forwarded, etc, if appropriate.

Command: vm-mail-send-and-exit &rest _ignored

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.

Command: vm-mail-to-mailto-url url

Creates a message composition buffer to send mail to the URL. This command can be invoked from external agents via an emacsclient.

Command: vm-preview-composition

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.

Command: vm-reply count

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.

Command: vm-reply-include-text count

Reply to the sender (only) of the current message and include text from the message. See the documentation for function vm-reply for details.

Command: vm-reply-include-text-other-frame count

Like vm-reply-include-text, but run in a newly created frame.

Command: vm-reply-other-frame count

Like vm-reply, but run in a newly created frame.

Command: vm-resend-bounced-message

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.

Command: vm-resend-bounced-message-other-frame

Like vm-resend-bounced-message, but run in a newly created frame.

Command: vm-resend-message

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.

Command: vm-resend-message-other-frame

Like vm-resend-message, but run in a newly created frame.

Command: vm-retry-bounced-message

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.

Command: vm-send-digest &optional prefix mlist

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.

Command: vm-send-digest-other-frame &optional prefix

Like vm-send-digest, but run in a newly created frame.

Command: vm-send-mime-digest &optional preamble

Like vm-send-digest but always sends an MIME (multipart/digest) digest.

Command: vm-send-mime-digest-other-frame &optional prefix

Like vm-send-mime-digest, but run in a newly created frame.

Command: vm-send-rfc1153-digest &optional preamble

Like vm-send-digest but always sends an RFC 1153 digest.

Command: vm-send-rfc1153-digest-other-frame &optional prefix

Like vm-send-rfc1153-digest, but run in a newly created frame.

Command: vm-send-rfc934-digest &optional preamble

Like vm-send-digest but always sends an RFC 934 digest.

Command: vm-send-rfc934-digest-other-frame &optional prefix

Like vm-send-rfc934-digest, but run in a newly created frame.

Command: vm-yank-message message

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.

Command: vm-yank-message-other-folder folder

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.

A.31.2 User options

User Option: vm-check-bcc-removal

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

User Option: vm-check-for-empty-subject

Non-nil means ask before sending a message with an empty Subject.

Default value: t

User Option: vm-check-recipients

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.

User Option: vm-clean-subject-prefixes

Non-nil means tidy the Subject prefixes of a new composition. vm-mail-subject-cleanup does the work, by vm-mail-subject-prefix-replacements.

User Option: vm-coding-system-priorities

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.

User Option: vm-confirm-killing-a-composition

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

User Option: vm-confirm-mail-send

Non-nil means ask before sending a mail message. This affects vm-mail-send and vm-mail-send-and-exit in Mail mode.

User Option: vm-disable-modes-before-encoding

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)
User Option: vm-dnd-protocol-alist

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))
User Option: vm-drop-buffer-name-chars

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:]/]"

User Option: vm-fill-long-lines-in-reply-column

Fill lines spanning that many columns or more in replies.

Default value: 70

User Option: vm-fill-paragraphs-containing-long-lines-in-reply

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.

User Option: vm-html-in-reply-column

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

User Option: vm-in-reply-to-format

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"

User Option: vm-include-mime-attachments

Non-nil value enables attachments to be included in quoted text in a reply message. Otherwise only the button label will be included.

User Option: vm-include-text-basic

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.

User Option: vm-included-mime-types-list

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.

User Option: vm-included-text-attribution-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"

User Option: vm-included-text-discard-header-regexp

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.

User Option: vm-included-text-headers

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.

User Option: vm-included-text-prefix

String used to prefix included text in replies.

Default value: " > "

User Option: vm-keep-sent-messages

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

User Option: vm-mail-auto-save-directory

Directory where messages being composed are auto-saved. If it is nil, vm-folder-directory is used for this purpose.

User Option: vm-mail-check-recipient-format

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

User Option: vm-mail-header-from

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.

User Option: vm-mail-header-insert-date

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

User Option: vm-mail-header-insert-message-id

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

User Option: vm-mail-header-order

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:")
User Option: vm-mail-mode-citation-kill-regexp-alist

Regexp replacement pairs for cleaning of replies.

Default value:

(("^\\( > [|{}>:;][^
]*
\\)+"
  . "[...]
")
 ("^\\([^|{}>:;]+.*\\)
 > [|{}>:;]*$"
  . "\\1")
 ("^ > [|{}>:;]*
\\([^|{}>:;]\\)"
  . "\\1")
 ("^ > [|{}>:;]*\\s-*
\\( > [|{}>:;]*\\s-*
\\)+"
  . " > 
")
 ("


+"
  . "

")
 ("^ > --[^
]*
\\( > [^
]*
\\)+"
  . "
")
 ("^ > ________[^
]*
\\( > [^
]*
\\)+"
  . "
"))
User Option: vm-mail-mode-fake-date-p

Non-nil means vm-mail-mode-insert-date-maybe keeps an existing date header. Otherwise, overwrite existing date headers

Default value: t

User Option: vm-mail-mode-hidden-headers

A list of headers to hide in a VM composition buffer.

Default value: ("References" "X-Mailer")

User Option: vm-mail-prompt-if-subject-empty

Prompt for a subject when empty.

Default value: t

User Option: vm-mail-reorder-message-headers

Reorder message headers before sending.

User Option: vm-mail-subject-number-reply

Non-nil means, add a number [N] after the reply prefix. The number reflects the number of references.

User Option: vm-mail-subject-prefix-replacements

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: "))
User Option: vm-mail-use-sender-address

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.

User Option: vm-open-line-in-quoted-text

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.

User Option: vm-reply-ignored-addresses

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.

User Option: vm-reply-ignored-reply-tos

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.

User Option: vm-reply-subject-prefix

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.

User Option: vm-strip-reply-headers

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.

User Option: vm-word-wrap-paragraphs-in-reply

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.

A.31.3 Called by VM

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.

Command: vm-handle-return-receipt

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.

Command: vm-mail-check-bcc-removal

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.

Command: vm-mail-check-for-empty-subject

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.

Command: vm-mail-check-recipients

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.

Command: vm-mail-subject-cleanup

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.


A.32 S/MIME

A.32.1 Commands

Command: vm-smime-sign-encrypt-message

See documentation for vm-smime-sign-message and vm-smime-encrypt-message. This function simply toggles the two of those and can be used to instruct VM to S/MIME sign and encrypt an outgoing message upon sending.


A.33 Saving and forwarding

A.33.1 Commands

Command: vm-auto-archive-messages &optional prompt

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.

Command: vm-pipe-message-to-command command &optional prefixarg discard-output

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.

Command: vm-pipe-message-to-command-discard-output command &optional prefixarg

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.

Command: vm-pipe-messages-to-command command &optional prefixarg discard-output no-wait

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.

Command: vm-pipe-messages-to-command-discard-output command &optional prefixarg

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.

Command: vm-pipe-messages-to-command-to-string command &optional prefixarg

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.

Command: vm-print-message &optional count

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.

Command: vm-save-message folder &optional count mlist quiet

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.

Command: vm-save-message-sans-headers file &optional count quiet

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

Command: vm-save-message-to-imap-folder folder &optional count mlist _quiet

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.

Command: vm-save-message-to-local-folder folder &optional count mlist quiet

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.


A.34 Searching

A.34.1 Commands

Command: vm-isearch-backward &optional arg

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.

Command: vm-isearch-forward &optional arg

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.35 Searching with grepmail

A.35.1 Commands

Command: vm-grepmail arguments folders

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.

A.35.2 User options

User Option: vm-grepmail-arguments

Arguments for grepmail program.

Default value: worked out when VM is loaded, from this system.

User Option: vm-grepmail-command

Path to the program.

Default value: "grepmail"


A.36 Serial mail

A.36.1 Commands

Command: vm-serial-expand-tokens &optional rstart rend

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.

Command: vm-serial-get-token &optional token

Return value of vm-serial TOKEN.

Command: vm-serial-insert-token token

Reads a valid token, inserts it at point and expands it.

Command: vm-serial-mode &optional arg

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.

Command: vm-serial-send-mail &optional non-interactive done

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!

Command: vm-serial-send-mail-and-exit &optional non-interactive

Like vm-serial-send-mail but kills the buffer after sending all.

Command: vm-serial-set-token &optional token newvalue doc

Set vm-serial TOKEN to NEWVALUE with DOC. You may remove a token by specifying just the TOKEN as argument.

Command: vm-serial-yank-mail &optional mail no-expand

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.

A.36.2 User options

User Option: vm-serial-cookie

The string which begins a token or Lisp expression. See vm-serial-expand-tokens for information about valid tokens.

Default value: "$"

User Option: vm-serial-fcc

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.

User Option: vm-serial-mail-signature

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!

User Option: vm-serial-mails-alist

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"))
User Option: vm-serial-mode-hook

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

User Option: vm-serial-token-alist

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"))
User Option: vm-serial-unknown-to

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"


A.37 Sorting

A.37.1 Commands

Command: vm-move-message-backward count

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.

Command: vm-move-message-backward-physically count

Like vm-move-message-backward but always move the message physically.

Command: vm-move-message-forward count

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.

Command: vm-move-message-forward-physically count

Like vm-move-message-forward but always move the message physically.

Command: vm-sort-messages keys &optional lets-get-physical

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.


A.38 Summary faces

A.38.1 Commands

Command: vm-summary-faces-hide &optional prop

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.

Command: vm-summary-faces-mode &optional arg

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.

A.38.2 User options

User Option: vm-mail-mode-open-line-regexp

Regexp matching prefix of quoted text at line start.

Default value: "[ \11]*>"

User Option: vm-summary-faces-alist

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

A.39 The summary

A.39.1 Commands

Command: vm-collapse-all-threads

Collapse (fold) all threads in the folder so that only the roots of the threads are shown in the Summary window.

Command: vm-collapse-thread &optional nomove root

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.

Command: vm-expand-all-threads

Expand all threads in the folder, which might have been collapsed (folded) earlier.

Command: vm-expand-thread &optional root

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.

Command: vm-fix-my-summary &optional kill-local-summary

Rebuild the summary. Call this function if you made changes to vm-summary-format.

Command: vm-headers-summary &optional display raise

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.

Command: vm-headers-summary-other-frame &optional display

Like vm-summarize, but run in a newly created frame.

Command: vm-summarize &optional display raise

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.

Command: vm-summarize-other-frame &optional display

Like vm-summarize, but run in a newly created frame.

Command: vm-summary-trace-message

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.

Command: vm-toggle-thread

Toggle collapse/expand thread associated with message at point. see vm-expand-thread and vm-collapse-thread for a description of action.

A.39.2 User options

User Option: vm-auto-center-summary

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.

User Option: vm-auto-next-message

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

User Option: vm-circular-folders

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.

User Option: vm-enable-thread-operations

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.

User Option: vm-follow-summary-cursor

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

User Option: vm-jump-to-new-messages

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

User Option: vm-jump-to-unread-messages

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

User Option: vm-mouse-track-summary

Non-nil value means highlight summary lines as the mouse passes over them.

Default value: t

User Option: vm-move-after-deleting

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.

User Option: vm-move-after-killing

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.

User Option: vm-move-after-reading

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.

User Option: vm-move-after-undeleting

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.

User Option: vm-restore-saved-summary-formats

If t, the summary format is stored in each folder and restored after visiting it again.

User Option: vm-skip-deleted-messages

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

User Option: vm-skip-read-messages

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.

User Option: vm-sort-messages-by-delivery-date

If set to t, VM will use the "Delivery-Date" header instead of the "Date" header for sorting messages.

User Option: vm-sort-subthreads

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

User Option: vm-startup-with-summary

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

User Option: vm-subject-ignored-prefix

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: *\\)+"

User Option: vm-subject-ignored-suffix

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)\\| \\)+$"

User Option: vm-subject-significant-chars

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.

User Option: vm-subject-tag-prefix

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.

User Option: vm-subject-tag-prefix-exceptions

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.

User Option: vm-summary-arrow

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: "->"

User Option: vm-summary-attachment-indicator

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: "$"

User Option: vm-summary-attachment-mime-type-exceptions

List of MIME types which should not be listed as attachment.

User Option: vm-summary-attachment-mime-types

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.

User Option: vm-summary-enable-thread-folding

If non-nil, enables folding of threads in VM summary windows.

User Option: vm-summary-format

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"

User Option: vm-summary-maximum-thread-indentation

The maximum number of thread nesting levels that should be displayed by indentation in the folder summary.

Default value: 20

User Option: vm-summary-postponed-indicator

Indicator shown for postponed messages.

Default value: "P"

User Option: vm-summary-principal-marker

String to display before the principal when displayed instead of an "uninteresting" sender. See vm-summary-uninteresting-senders.

Default value: "For: "

User Option: vm-summary-recipient-marker

String to display before the recipients when displayed instead of an "uninteresting" sender. See vm-summary-uninteresting-senders.

Default value: "To: "

User Option: vm-summary-show-thread-count

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

User Option: vm-summary-show-threads

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.

User Option: vm-summary-strip-subject-tags

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.

User Option: vm-summary-thread-folding-on-motion

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.

User Option: vm-summary-thread-indent-level

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

User Option: vm-summary-thread-indentation-by-references

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

User Option: vm-summary-uninteresting-senders

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.

User Option: vm-summary-visible

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

User Option: vm-thread-using-subject

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


A.40 The toolbar

A.40.1 User options

User Option: vm-popup-menu-on-mouse-3

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

User Option: vm-toolbar-pixmap-directory

The directory VM should find its toolbar pixmaps.

User Option: vm-use-menubar-buttons

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

User Option: vm-use-menus

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)
User Option: vm-use-toolbar

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)

A.40.2 Called by VM

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.

Command: vm-toolbar-autofile-message

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.

Command: vm-toolbar-can-autofile-p

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.

Command: vm-toolbar-compose-command &optional to subject

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.

Command: vm-toolbar-decode-mime-command &optional state

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.

Command: vm-toolbar-delete/undelete-message &optional prefixarg

Not documented.

Command: vm-toolbar-file-command folder &optional count mlist quiet

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.

Command: vm-toolbar-followup-command count

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.

Command: vm-toolbar-forward-command &optional plain mlist

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.

Command: vm-toolbar-getmail-command &optional arg

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.

Command: vm-toolbar-helper-command

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.

Command: vm-toolbar-next-command &optional count retry signal-errors

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.

Command: vm-toolbar-previous-command &optional count retry signal-errors

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.

Command: vm-toolbar-print-command &optional count

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.

Command: vm-toolbar-quit-command &optional no-expunge no-change

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.

Command: vm-toolbar-reply-command count

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.

Command: vm-toolbar-visit-command folder &optional read-only &rest rest

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.


A.41 Threading

A.41.1 Commands

Command: vm-attach-to-thread

Attach the current message as a child of the message last visited.

Command: vm-check-thread-integrity &optional ml

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.

Command: vm-demote-subthread n

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.

Command: vm-promote-subthread n

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.

Command: vm-toggle-threads-display

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.

Command: vm-trace-message-id

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.

Command: vm-trace-message-subject

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.


A.42 Undo

A.42.1 Commands

Command: vm-add-existing-message-labels string count

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.

Command: vm-add-message-labels string count

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.

Command: vm-delete-message-labels string count

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.

Command: vm-expunge-label label

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.

Command: vm-expunge-unused-labels

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.

Command: vm-list-unused-labels

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.

Command: vm-set-message-attributes string count

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.

Command: vm-sync-labels

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.

Command: vm-undo

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.


A.43 Url

A.43.1 User options

User Option: vm-url-browser

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

User Option: vm-url-browser-switches

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.

User Option: vm-url-search-limit

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


A.44 VM itself

A.44.1 Commands

Command: vm &optional folder &rest rest

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.

Command: vm-check-configuration

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.

Command: vm-compose-mail &optional to subject other-headers continue switch-function yank-action send-actions return-action &rest _ignored

Not documented.

Command: vm-edit-init-file

Edit the vm-init-file.

Command: vm-mail &optional to subject

Send a mail message from within VM, or from without. Optional argument TO is a string that should contain a comma separated recipient list.

Command: vm-mail-from-folder &optional subject

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.

Command: vm-mail-other-frame &optional to subject

Like vm-mail, but run in a newly created frame. Optional argument TO is a string that should contain a comma separated recipient list.

Command: vm-mail-other-window &optional to subject

Like vm-mail, but run in a different window. Optional argument TO is a string that should contain a comma separated recipient list.

Command: vm-mode &optional read-only

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.

Command: vm-other-frame &optional folder read-only &rest rest

Like vm, but run in a newly created frame.

Command: vm-other-window &optional folder read-only &rest rest

Like vm, but run in a different window.

Command: vm-submit-bug-report &optional pre-hooks post-hooks

Submit a bug report, with pertinent information to the VM bug list.

Command: vm-switch-to-folder folder-name

Switch to another opened VM folder and rearrange windows as with a scroll.

Command: vm-toggle-thread-operations

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.

Command: vm-version

Display and return the value of the variable vm-version.

Command: vm-version-commit

Display and the value of the variable vm-version-commit.

Command: vm-visit-folder folder &optional read-only &rest rest

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.

Command: vm-visit-folder-other-frame folder &optional read-only &rest rest

Like vm-visit-folder, but run in a newly created frame.

Command: vm-visit-folder-other-window folder &optional read-only &rest rest

Like vm-visit-folder, but run in a different window.

Command: vm-visit-imap-folder folder &optional read-only &rest rest

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.

Command: vm-visit-imap-folder-other-frame folder &optional read-only &rest rest

Like vm-visit-imap-folder, but run in a newly created frame.

Command: vm-visit-imap-folder-other-window folder &optional read-only &rest rest

Like vm-visit-imap-folder, but run in a different window.

Command: vm-visit-pop-folder folder &optional read-only &rest rest

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.

Command: vm-visit-pop-folder-other-frame folder &optional read-only &rest rest

Like vm-visit-pop-folder, but run in a newly created frame.

Command: vm-visit-pop-folder-other-window folder &optional read-only &rest rest

Like vm-visit-pop-folder, but run in a different window.

Command: vm-visit-thunderbird-folder folder &optional read-only &rest rest

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.

Command: vm-visit-virtual-folder folder-name &optional read-only bookmark summary-format directory

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.

Command: vm-visit-virtual-folder-other-frame folder-name &optional read-only bookmark summary-format directory

Like vm-visit-virtual-folder, but run in a newly created frame.

Command: vm-visit-virtual-folder-other-window folder-name &optional read-only bookmark summary-format directory

Like vm-visit-virtual-folder, but run in a different window.


A.45 Virtual folder actions

A.45.1 Commands

Command: bbdb/vm-set-virtual-folder-alist

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.

Command: bbdb/vm-set-virtual-folder-alist-by-mail-alias

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.

Command: vm-add-spam-word word

Add a new WORD to the list of spam words.

Command: vm-avirtual-check-for-missing-selectors &optional arg

Check if there are selectors missing for either vm-mode or mail-mode.

Command: vm-sort-insert-auto-folder-names

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

Command: vm-spam-words-rebuild

Discharge the internal cached data about spam words.

Command: vm-virtual-apply-function count &optional selector function

Apply a FUNCTION to the next COUNT messages matching SELECTOR.

Command: vm-virtual-auto-archive-messages &optional prompt

With a prefix ARG ask user before saving.

Command: vm-virtual-auto-delete-message &optional count selector

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!

Command: vm-virtual-auto-delete-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)

Command: vm-virtual-check-selector-interactive selector &optional diagnostics

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

Command: vm-virtual-filter-messages &optional count

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.

Command: vm-virtual-filter-new-messages

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.

Command: vm-virtual-get-selector vfolder &optional valid-folder-list

Return the selector of virtual folder VFOLDER for VALID-FOLDER-LIST.

Command: vm-virtual-make-folder-persistent

Save all messages of current virtual folder in the real folder with the same name.

Command: vm-virtual-omit-message &optional count message-list

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.

Command: vm-virtual-save-message &optional folder count

Save the current message to a mail folder. Like vm-save-message but the default folder is guessed by vm-virtual-auto-select-folder.

Command: vm-virtual-update-folders &optional count message-list

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.45.2 User options

User Option: bbdb/vm-virtual-folder-alist-by-mail-alias-alist

A list of (ALIAS . FOLDER-NAME) pairs, which map an alias to a folder.

User Option: vm-virtual-auto-delete-message-expunge

When true we expunge the affected right after marking and saving them.

User Option: vm-virtual-auto-delete-message-folder

When set to a folder name we save affected messages there.

User Option: vm-virtual-auto-delete-message-selector

Name of virtual folder selector used for automatically deleting a message. Actually they are only marked for deletion.

Default value: "spam"

User Option: vm-virtual-auto-folder-alist

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.

User Option: vm-virtual-check-case-fold-search

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

User Option: vm-virtual-check-diagnostics

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.

User Option: vm-virtual-filter-alist

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)))
User Option: vm-virtual-make-up-auto-folder-names

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


A.46 Virtual folders

A.46.1 Commands

Command: vm-apply-virtual-folder name &optional read-only

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.

Command: vm-create-author-or-recipient-virtual-folder &optional string read-only name

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.

Command: vm-create-author-virtual-folder &optional string read-only name

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.

Command: vm-create-date-virtual-folder &optional arg read-only subject

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.

Command: vm-create-flagged-virtual-folder &optional read-only name

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.

Command: vm-create-label-virtual-folder &optional arg read-only name

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.

Command: vm-create-new-virtual-folder &optional read-only name

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.

Command: vm-create-search-folder selector &optional arg read-only name bookmark

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.

Command: vm-create-search-folder-other-frame selector &optional arg read-only name bookmark

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.

Command: vm-create-search-folder-other-window selector &optional arg read-only name bookmark

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.

Command: vm-create-subject-virtual-folder &optional string read-only subject

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.

Command: vm-create-text-virtual-folder &optional string read-only subject

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.

Command: vm-create-unseen-virtual-folder &optional read-only name

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.

Command: vm-create-virtual-folder selector &optional arg read-only name bookmark

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.

Command: vm-create-virtual-folder-of-threads selector &optional arg read-only name bookmark

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.

Command: vm-create-virtual-folder-other-frame selector &optional arg read-only name bookmark

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.

Command: vm-create-virtual-folder-other-window selector &optional arg read-only name bookmark

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.

Command: vm-create-virtual-folder-same-author

Create a virtual folder (search folder) for all messages from the same author as the current message.

Command: vm-create-virtual-folder-same-recipient

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.

Command: vm-create-virtual-folder-same-subject

Create a virtual folder (search folder) for all messages with the same subject as the current message.

Command: vm-toggle-virtual-mirror

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.

Command: vm-virtual-help

Show the virtual folder commands and their keys in the echo area.

A.46.2 User options

User Option: vm-virtual-default-directory

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.

User Option: vm-virtual-folder-alist

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.

User Option: vm-virtual-mirror

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


A.47 W3m

A.47.1 Commands

Command: vm-w3m-safe-toggle-inline-images &optional arg

Toggle displaying of all images in the presentation buffer. If the prefix arg is given, all images are considered to be safe.

A.47.2 User options

User Option: vm-w3m-display-inline-images

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

User Option: vm-w3m-safe-url-regexp

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:"


A.48 Windows and frames

A.48.1 Commands

Command: vm-apply-window-configuration tag

Change the current window configuration to be one associated with a particular action. The action will be read from the minibuffer.

Command: vm-delete-window-configuration tag

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.

Command: vm-iconify-frame

Iconify the current frame. Run the hooks in vm-iconify-frame-hook before doing so.

Command: vm-save-window-configuration tag

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.

Command: vm-window-help

Show the window configuration commands and their keys in the echo area.

A.48.2 User options

User Option: vm-frame-parameter-alist

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.

User Option: vm-frame-per-completion

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

User Option: vm-frame-per-composition

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

User Option: vm-frame-per-edit

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

User Option: vm-frame-per-folder

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

User Option: vm-frame-per-help

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.

User Option: vm-frame-per-summary

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.

User Option: vm-mutable-frame-configuration

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

User Option: vm-mutable-window-configuration

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

User Option: vm-raise-frame-at-startup

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

User Option: vm-search-other-frames

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

User Option: vm-warp-mouse-to-new-frame

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.

User Option: vm-window-configuration-file

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"


Concept Index

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  
Index EntrySection

.
.vmStarting Up
.vm.preferencesStarting Up
.vm.windowsWindow Configuration

>
>From lines, ambiguityFolder types

8
8-bit headersCharacter sets

A
accounts, sending from the right oneMultiple Email Addresses
address bookPreface
addresses, several of your ownMultiple Email Addresses
AIXFolder types
aliases, mailComposing setup
archivingPreface
archiving mailFolder types
asynchronous operationIMAP Folders
attachment buttonReplying
attachment file nameMIME attachments
attachmentsViewing MIME
attachmentsAttachments
auth-source libraryPOP and IMAP Folders
authinfoPOP and IMAP Folders
auto-saveCrash Recovery
auto-saveMessage Attributes

B
BabylLocal Folders
BabylFolder types
Babyl formatFolder Internals
babyl, quotingFolder types
backups, of a folderCrash Recovery
BBDBPreface
BBDBVirtual Selectors
BBDBVirtual Selectors
BBDBHighlights
Bcc, kept privateSending Options
BellFrom_Folder types
BellFrom_ folder typeFolder Internals
biffCustomizations
blind carbon copySending Options
browse-urlUsing the Mouse
bug reportsHistory and Administration
bug reportsBugs

C
cache file, convertingFolder types
cache file, folder typeFolder types
cache file, two servers on one hostIMAP Folders
cache foldersPOP and IMAP Folders
cache serverIMAP Folders
cached dataMessage Internals
calendarCalendar invitations
character setsCharacter sets
chattinessCustomizations
checking a configurationSetting Up
checking for mail, cost ofGetting New Mail
checking recipientsSending Options
cidExternal display
citations, colouringPreviewing
cleartext PGPSending Secure MIME
compactingIntroduction
compactingIntroduction
compacting, IMAP serversIMAP Spool Files
compacting, POP serversPOP Spool Files
composition buffer namesCustomizations
configuration settingsStarting Up
configuration, worked exampleSetting Up
Content-DispositionViewing MIME
Content-DispositionMIME attachments
Content-LengthFolder types
converting foldersFolder types
converting to mboxFolder types
corruption, mboxFolder types
CRAM-MD5POP and IMAP Folders
crash boxLocal Folders
crash recoveryCrash Recovery
customizationCustomizing VM
customizeCustomizing VM
CustomizeWhere Settings Go

D
default headersSaving copies
defined virtual foldersVirtual Folders
Deleting and expungingReference for Deleting and expunging
delivery dateSorting Messages
DigestsReference for Digests
DiredReference for Dired
DisposeReference for Dispose
distributions, packaged VMInstallation
dovecotIMAP Folders
drag and dropSending Messages
drag and dropMIME attachments

E
EasyPGPOP and IMAP Folders
Editing messagesReference for Editing messages
ELPAInstallation
EmacsPreface
Emacs-w3mInternal display
Emacs-w3mHTML display
Emacs-w3mmultipart/related
Emacs-w3mUsing the Mouse
email addresses, several of your ownMultiple Email Addresses
empty subjectSending Options
encrypt-toSending Secure MIME
encrypting to yourselfSending Secure MIME
encryptionPreface
Encryption with EasyPGReference for Encryption with EasyPG
epa-file libraryPOP and IMAP Folders
example.vmStarting Up
example.vmSetting Up
expungingIntroduction
expungingIntroduction
expunging, IMAP messagesIMAP Spool Files
expunging, POP serversPOP Spool Files
ExternalReference for External
external messagesExternal Messages

F
facesSummary Faces
FacesReference for Faces
FCCSaving copies
FCC header after sendingSaving copies
FCC, folder typeFolder types
file CCSaving copies
file lockingLocal Folders
file lockingSaving Messages
filling paragraphsPaging
flagged messagesMessage Attributes
flagging messagesMessage Attributes
flags, on a message saved to a serverSaving Messages
folder type of a sent copySaving copies
folder type, how it is decidedFolder types
folder type, name refusedFolder types
folder typesFolder types
folder-local variablesFolder Settings
folder, backing upCrash Recovery
FoldersReference for Folders
format=flowedInternal display
format=flowedMIME characters
ForwardReference for Forward
From header, choosing which addressMultiple Email Addresses
From_Folder types
From_ folder typeFolder Internals
From_ folders, differencesFolder types
From_ line in message bodyFolder Internals
From_ quotingFolder types
From_ quoting, keptFolder types
From_-with-Content-LengthFolder types
From_with-Content-Length folder typeFolder Internals
From-stuffingFolder Internals

G
gitInstallation
GitLabHistory and Administration
global-set-key, in the init fileWhere Settings Go
GmailIMAP Folders
GNU EmacsPreface
GnusPreface
GPGPreface
graphics toolkitMenus

H
hard linksIntroduction
header: In-Reply-ToThreading
header: ReferencesThreading
header: SubjectThreading
headers onlyExternal Messages
headers-only modeExternal Messages
headers, shrunkenCustomizations
HelpersReference for Helpers
hiding summary linesSummary Faces
HooksReference for Hooks
HTMLInternal display
HTMLUsing the Mouse
HTMLHighlights
hung sendSending setup

I
iCalendarCalendar invitations
IcalendarReference for Icalendar
iconvCharacter sets
identitiesMultiple Email Addresses
identities, and which server sends themSending setup
ImageMagickDisplaying images
imagesDisplaying images
images, in HTML mailExternal display
images, remote ones in a messageHTML display
IMAPPreface
IMAPIMAP Folders
IMAPSaving Messages
IMAPHighlights
IMAPReference for IMAP
IMAP spool filesIMAP Spool Files
IMAP-FCCSaving copies
importing mailFolder types
index fileIndex Files
init file, an exampleStarting Up
inline PGPSending Secure MIME
installing VMInstallation
interactive virtual foldersVirtual Folders
interoperability, babylFolder types
interoperability, mboxFolder types
interoperability, splittingFolder types
invitationCalendar invitations
isyncIMAP Folders

K
key bindings, where to put themWhere Settings Go
killing a folder bufferVirtual Folders
Kyle JonesHistory and Administration

L
labels, lost on the serverIMAP Folders
labels, on a message saved to a serverSaving Messages
LicenseReference for License
line lengthMIME characters
links, from Org to a messageConfiguration
local variables listFolder Settings
logCustomizations
long linesMIME characters
longlines.elPaging
lynxInternal display

M
mail serversPreface
maildirPreface
maildrop specificationPOP Spool Files
maildrop specificationIMAP Spool Files
maildrop specificationPOP and IMAP Folders
mailing listsHistory and Administration
mailrcComposing setup
markingMarking Messages
MarksReference for Marks
mboxPreface
mboxLocal Folders
mboxFolder Internals
mbox variantsFolder types
mbox, converting toFolder types
mbox, incompatibilityFolder types
mbox, VM’s variantFolder types
mboxclFolder types
mboxcl2Folder types
mboxcl2Folder types
mboxcl2, no quotingFolder types
mboxcl2, quoting picked up elsewhereFolder types
mboxcl2, whyFolder types
mboxoFolder types
mboxoFolder types
mboxrdFolder types
mboxrdFolder types
mbsyncIMAP Folders
MDNCustomizations
menu barMenus
MenusReference for Menus
menus, pop-upMenus
message attributesPOP Folders
message attributesIMAP Folders
message attributesCrash Recovery
message attributesMessage Attributes
Message HistoryReference for Message History
message labelsIMAP Folders
message labelsCrash Recovery
message labelsMessage Attributes
message labelsVirtual Selectors
MHFolder types
MIMEPreface
MIMEMIME Messages
MIMEHighlights
MIME alternative, as a buttonmultipart/alternative
MIME alternative, bestmultipart/alternative
MIME alternative, bestCustomizations
MIME alternative, best-internalmultipart/alternative
MIME alternative, best-internalCustomizations
MIME alternative, favoritemultipart/alternative
MIME alternative, favorite-internalmultipart/alternative
MIME alternativesmultipart/alternative
MIME alternativesReplying
MIME alternativesCustomizations
MIME and attachmentsReference for MIME and attachments
MIME buttonViewing MIME
MIME structureAttachments
MinibufReference for Minibuf
MMDFFolder types
MMDF formatFolder Internals
mode line, server activityIMAP Folders
MouseReference for Mouse
Moving aboutReference for Moving about
multipart typesInternal display
multipart/alternativemultipart/alternative
multipart/mixedmultipart/related
multipart/relatedHTML display
multipart/relatedmultipart/related

N
new mail notificationCustomizations
New mail notificationReference for New mail notification
newsgroupsPreface
no handler for HTMLInternal display

O
offlineimapIMAP Folders
OpenPGPSending Secure MIME
Org modePreface
Org modeConfiguration
Other settingsReference for Other settings

P
package-installInstallation
passwords, storingPOP and IMAP Folders
Personality CrisisMultiple Email Addresses
Personality CrisisReference for Personality Crisis
PGPSending Secure MIME
PGP/MIMESending Secure MIME
point-to-point attachment operationsMIME attachments
POPPreface
POPPOP Folders
POPReference for POP
POP spool filesPOP Spool Files
port, TCPPOP and IMAP Folders
Postponed compositionsReference for Postponed compositions
postponed messages, folder typeFolder types
postponing message compositionPostponing Messages
predefined summary facesSummary Faces
preferences settingsStarting Up
prefix argumentNavigating
prefix argumentSelecting Messages
primary inboxIntroduction
primary inboxStarting Up
primary inboxPOP and IMAP Folders
PrintingReference for Printing
Printing with ps-printReference for Printing with ps-print
progress messagesCustomizations

Q
quoted text, colouringPreviewing
quoting From_ linesFolder types

R
read receiptCustomizations
read-only foldersStarting Up
reading a folderFolder types
Reading a messageReference for Reading a message
referenceReference
renaming an attachmentMIME attachments
Replying and composingReference for Replying and composing
resending messagesForwarding Messages
Resent-To headerForwarding Messages
return receiptCustomizations
RFC 3676Internal display
RFC 6532Character sets
RmailPreface
RmailLocal Folders
RmailFolder types
Rmail, reading a VM babyl folderFolder types
Robert Widhopf-FenkHistory and Administration
RSS feedsPreface

S
S/MIMEReference for S/MIME
SavannahHistory and Administration
save foldersSaving Messages
Saving and forwardingReference for Saving and forwarding
search foldersVirtual Folders
searchingNavigating
searchingMarking Messages
searchingVirtual Folders
searchingSearch Folders
searchingDefined Folders
SearchingReference for Searching
Searching with grepmailReference for Searching with grepmail
searching within a messagePaging
send, interrupting one that has stoppedSending setup
Serial mailReference for Serial mail
shrInternal display
signature, colouringPreviewing
SMTP, one server per identitySending setup
SolarisFolder types
sortingSorting Messages
SortingReference for Sorting
source, building fromInstallation
spamSorting Messages
spamSorting Messages
spool fileIntroduction
spool fileLocal Folders
SSHPOP and IMAP Folders
SSLPOP and IMAP Folders
stunnelPOP and IMAP Folders
stunnelPOP and IMAP Folders
subject tagsSorting Messages
summary facesSummary Faces
Summary facesReference for Summary faces
symbolic linksIntroduction
System VFolder types
System VFolder Internals

T
text/calendarCalendar invitations
The summaryReference for The summary
The toolbarReference for The toolbar
threadingThreading
ThreadingReference for Threading
ThunderbirdPreface
ThunderbirdThunderbird Folders
timingCustomizations
TLSPOP and IMAP Folders
toolbar, where it is placedToolbar
tracking imageHTML display
tutorialSetting Up

U
Uday S ReddyHistory and Administration
UIDVALIDITYIMAP Folders
UIDVALIDITYIMAP Server Folders
Ulrich MüllerHistory and Administration
undoMessage Attributes
UndoReference for Undo
UnixFolder types
unused labelsMessage Attributes
URLFaces
URLUsing the Mouse
UrlReference for Url

V
verbosityCustomizations
Virtual folder actionsReference for Virtual folder actions
virtual foldersPreface
virtual foldersMarking Messages
virtual foldersVirtual Folders
virtual foldersHighlights
Virtual foldersReference for Virtual folders
visual line modePaging
VM itselfReference for VM itself
vm-avirtualvm-avirtual
vm-create-imap-folderIMAP Server Folders
vm-delete-imap-folderIMAP Server Folders
vm-epgSending Secure MIME
vm-list-imap-foldersIMAP Server Folders
vm-pcrisisMultiple Email Addresses
vm-postponePostponing Messages
vm-rename-imap-folderIMAP Server Folders
vm-summary-faces-hideSummary Faces
vmpcMultiple Email Addresses

W
w3mInternal display
W3mReference for W3m
web browserUsing the Mouse
Windows and framesReference for Windows and frames
WonderworksHistory and Administration
word wrappingPaging

X
X-GM-LABELSIMAP Folders
X-VM-IMAP-Retrieved headerIMAP Spool Files
X-VM-v5-DataFolder types


Key Index

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  
Index EntrySection

!
!Paging
!Paging

.
.Paging

[
[Attachments

]
]Attachments

@
@Forwarding Messages

#
###Introduction
###Deleting Messages

<
<Threaded Summaries

>
>Threaded Summaries

|
||Saving Messages
|dSaving Messages
|nSaving Messages
|sSaving Messages

$
$ |Attachments
$ aMIME attachments
$ dAttachments
$ dAttachments
$ eAttachments
$ pAttachments
$ RETAttachments
$ sAttachments
$ wAttachments

A
ASaving Messages

B
BForwarding Messages

C
CThread Folding
C-_Message Attributes
C-c C-]Editing Messages
C-c C-aSending Messages
C-c C-aMIME attachments
C-c C-bSending Messages
C-c C-bMIME attachments
C-c C-cSending Messages
C-c C-cMIME preview
C-c C-dPostponing Messages
C-c C-eSending Messages
C-c C-eMIME preview
C-c C-eEditing Messages
C-c C-mSending Messages
C-c C-mMIME attachments
C-c C-pSending Messages
C-c C-pMIME preview
C-c C-vSending Messages
C-c C-ySending Messages
C-c ESCEditing Messages
C-gSending setup
C-x uMessage Attributes

D
dIntroduction
DViewing MIME
dDeleting Messages
DELIntroduction
DELPaging

E
EThread Folding

F
fReplying
FReplying

G
gIntroduction
gGetting New Mail
GSorting Messages

H
hIntroduction
hSummaries

K
kDeleting Messages
KDeleting Messages

L
l aMessage Attributes
l dMessage Attributes

M
mSending Messages
M AMarking Messages
M aMarking Messages
M CMarking Messages
M cMarking Messages
M MMarking Messages
M mMarking Messages
M RMarking Messages
M rMarking Messages
M SMarking Messages
M sMarking Messages
M TMarking Messages
M tMarking Messages
M UMarking Messages
M uMarking Messages
M XMarking Messages
M xMarking Messages
M-nNavigating
M-pNavigating
M-sNavigating

N
nIntroduction
nNavigating
NNavigating

O
oExternal Messages
OExternal Messages

P
pNavigating
PNavigating

Q
qIntroduction

R
rReplying
RReplying
RETNavigating

S
sIntroduction
SIntroduction
sSaving Messages
SPCIntroduction
SPCPaging

T
tPreviewing
TThread Folding
TABNavigating

U
uIntroduction
UPaging
uDeleting Messages

V
vStarting Up
V !Search Folders
V ASearch Folders
V aSearch Folders
V CSearch Folders
V dSearch Folders
V lSearch Folders
V lVirtual Selectors
V MWorking with Virtual Folders
V nSearch Folders
V Ovm-avirtual
V rSearch Folders
V SSearch Folders
V sSearch Folders
V TSearch Folders
V tSearch Folders
V uSearch Folders
V Uvm-avirtual
V VVirtual Folders
V VDefined Folders
V XSearch Folders

W
W DWindow Configuration
W SWindow Configuration
W WWindow Configuration

X
xIntroduction

Z
zForwarding Messages
ZForwarding Messages


Command Index

Jump to:   B   D   I   M   R   U   V  
Index EntrySection

B
bbdb/vm-set-virtual-folder-alistReference for Virtual folder actions
bbdb/vm-set-virtual-folder-alistReference for Virtual folder actions
bbdb/vm-set-virtual-folder-alist-by-mail-aliasReference for Virtual folder actions
bbdb/vm-set-virtual-folder-alist-by-mail-aliasReference for Virtual folder actions
browse-urlUsing the Mouse

D
display-images-pDisplaying images

I
image-type-available-pDisplaying images

M
mail-abbrevs-setupComposing setup

R
recover-fileCrash Recovery
revert-bufferCrash Recovery

U
unrmailFolder types

V
vmStarting Up
vmStarting Up
vmReference for VM itself
vmReference for VM itself
vm-add-existing-message-labelsReference for Undo
vm-add-existing-message-labelsReference for Undo
vm-add-message-labelsMessage Attributes
vm-add-message-labelsVirtual Selectors
vm-add-message-labelsReference for Undo
vm-add-message-labelsReference for Undo
vm-add-spam-wordReference for Virtual folder actions
vm-add-spam-wordReference for Virtual folder actions
vm-apply-virtual-folderSearch Folders
vm-apply-virtual-folderSearch Folders
vm-apply-virtual-folderReference for Virtual folders
vm-apply-virtual-folderReference for Virtual folders
vm-apply-window-configurationWindow Configuration
vm-apply-window-configurationReference for Windows and frames
vm-apply-window-configurationReference for Windows and frames
vm-attach-bufferMIME attachments
vm-attach-bufferReference for MIME and attachments
vm-attach-bufferReference for MIME and attachments
vm-attach-fileMIME attachments
vm-attach-fileReference for MIME and attachments
vm-attach-fileReference for MIME and attachments
vm-attach-files-in-directoryMIME attachments
vm-attach-files-in-directoryReference for MIME and attachments
vm-attach-files-in-directoryReference for MIME and attachments
vm-attach-messageMIME attachments
vm-attach-messageReference for MIME and attachments
vm-attach-messageReference for MIME and attachments
vm-attach-message-to-compositionMIME attachments
vm-attach-message-to-compositionReference for MIME and attachments
vm-attach-message-to-compositionReference for MIME and attachments
vm-attach-mime-fileReference for MIME and attachments
vm-attach-mime-fileReference for MIME and attachments
vm-attach-to-threadReference for Threading
vm-attach-to-threadReference for Threading
vm-auto-archive-messagesSaving Messages
vm-auto-archive-messagesReference for Saving and forwarding
vm-auto-archive-messagesReference for Saving and forwarding
vm-avirtual-check-for-missing-selectorsReference for Virtual folder actions
vm-avirtual-check-for-missing-selectorsReference for Virtual folder actions
vm-backup-folderCrash Recovery
vm-backup-folderCrash Recovery
vm-backup-folderCrash Recovery
vm-backup-folderReference for Folders
vm-backup-folderReference for Folders
vm-beginning-of-messageReference for Reading a message
vm-beginning-of-messageReference for Reading a message
vm-biff-delete-popupReference for New mail notification
vm-biff-delete-popupReference for New mail notification
vm-biff-fvwm-focus-vm-folder-frameReference for New mail notification
vm-biff-fvwm-focus-vm-folder-frameReference for New mail notification
vm-biff-modeWhere Settings Go
vm-biff-modeCustomizations
vm-biff-modeReference for New mail notification
vm-biff-modeReference for New mail notification
vm-biff-popupReference for New mail notification
vm-biff-popupReference for New mail notification
vm-biff-select-messageReference for New mail notification
vm-biff-select-messageReference for New mail notification
vm-biff-select-message-mouseReference for New mail notification
vm-biff-select-message-mouseReference for New mail notification
vm-burst-digestDigests
vm-burst-digestReference for Digests
vm-burst-digestReference for Digests
vm-burst-digest-to-temp-folderReference for Digests
vm-burst-digest-to-temp-folderReference for Digests
vm-burst-mime-digestReference for Digests
vm-burst-mime-digestReference for Digests
vm-burst-rfc1153-digestReference for Digests
vm-burst-rfc1153-digestReference for Digests
vm-burst-rfc934-digestReference for Digests
vm-burst-rfc934-digestReference for Digests
vm-change-folder-typeFolder types
vm-change-folder-typeReference for Folders
vm-change-folder-typeReference for Folders
vm-check-configurationStarting Up
vm-check-configurationSetting Up
vm-check-configurationConfiguration
vm-check-configurationReference for VM itself
vm-check-configurationReference for VM itself
vm-check-folderFolder types
vm-check-folderReference for Folders
vm-check-folderReference for Folders
vm-check-thread-integrityReference for Threading
vm-check-thread-integrityReference for Threading
vm-clear-all-marksReference for Marks
vm-clear-all-marksReference for Marks
vm-collapse-all-threadsThread Folding
vm-collapse-all-threadsThread Folding
vm-collapse-all-threadsReference for The summary
vm-collapse-all-threadsReference for The summary
vm-collapse-threadThread Folding
vm-collapse-threadReference for The summary
vm-collapse-threadReference for The summary
vm-compact-folderIntroduction
vm-compact-folderDeleting Messages
vm-compact-folderReference for Deleting and expunging
vm-compact-folderReference for Deleting and expunging
vm-compose-mailReference for VM itself
vm-compose-mailReference for VM itself
vm-continue-composing-messageReference for Replying and composing
vm-continue-composing-messageReference for Replying and composing
vm-continue-postponed-messagePostponing Messages
vm-continue-postponed-messageReference for Postponed compositions
vm-continue-postponed-messageReference for Postponed compositions
vm-continue-what-messageReference for Postponed compositions
vm-continue-what-messageReference for Postponed compositions
vm-continue-what-message-other-frameReference for Postponed compositions
vm-continue-what-message-other-frameReference for Postponed compositions
vm-continue-what-message-other-windowReference for Postponed compositions
vm-continue-what-message-other-windowReference for Postponed compositions
vm-convert-caches-to-mboxcl2Folder types
vm-convert-caches-to-mboxcl2Reference for Folders
vm-convert-caches-to-mboxcl2Reference for Folders
vm-create-author-or-recipient-virtual-folderSearch Folders
vm-create-author-or-recipient-virtual-folderReference for Virtual folders
vm-create-author-or-recipient-virtual-folderReference for Virtual folders
vm-create-author-virtual-folderSearch Folders
vm-create-author-virtual-folderReference for Virtual folders
vm-create-author-virtual-folderReference for Virtual folders
vm-create-date-virtual-folderSearch Folders
vm-create-date-virtual-folderReference for Virtual folders
vm-create-date-virtual-folderReference for Virtual folders
vm-create-flagged-virtual-folderSearch Folders
vm-create-flagged-virtual-folderReference for Virtual folders
vm-create-flagged-virtual-folderReference for Virtual folders
vm-create-imap-folderReference for IMAP
vm-create-imap-folderReference for IMAP
vm-create-label-virtual-folderSearch Folders
vm-create-label-virtual-folderReference for Virtual folders
vm-create-label-virtual-folderReference for Virtual folders
vm-create-new-virtual-folderSearch Folders
vm-create-new-virtual-folderReference for Virtual folders
vm-create-new-virtual-folderReference for Virtual folders
vm-create-search-folderSearch Folders
vm-create-search-folderSearch Folders
vm-create-search-folderReference for Virtual folders
vm-create-search-folderReference for Virtual folders
vm-create-search-folder-other-frameSearch Folders
vm-create-search-folder-other-frameReference for Virtual folders
vm-create-search-folder-other-frameReference for Virtual folders
vm-create-search-folder-other-windowSearch Folders
vm-create-search-folder-other-windowReference for Virtual folders
vm-create-search-folder-other-windowReference for Virtual folders
vm-create-subject-virtual-folderSearch Folders
vm-create-subject-virtual-folderReference for Virtual folders
vm-create-subject-virtual-folderReference for Virtual folders
vm-create-text-virtual-folderSearch Folders
vm-create-text-virtual-folderReference for Virtual folders
vm-create-text-virtual-folderReference for Virtual folders
vm-create-unseen-virtual-folderSearch Folders
vm-create-unseen-virtual-folderReference for Virtual folders
vm-create-unseen-virtual-folderReference for Virtual folders
vm-create-virtual-folderSearch Folders
vm-create-virtual-folderReference for Virtual folders
vm-create-virtual-folderReference for Virtual folders
vm-create-virtual-folder-of-threadsSearch Folders
vm-create-virtual-folder-of-threadsSearch Folders
vm-create-virtual-folder-of-threadsReference for Virtual folders
vm-create-virtual-folder-of-threadsReference for Virtual folders
vm-create-virtual-folder-other-frameReference for Virtual folders
vm-create-virtual-folder-other-frameReference for Virtual folders
vm-create-virtual-folder-other-windowReference for Virtual folders
vm-create-virtual-folder-other-windowReference for Virtual folders
vm-create-virtual-folder-same-authorSearch Folders
vm-create-virtual-folder-same-authorSearch Folders
vm-create-virtual-folder-same-authorReference for Virtual folders
vm-create-virtual-folder-same-authorReference for Virtual folders
vm-create-virtual-folder-same-recipientSearch Folders
vm-create-virtual-folder-same-recipientSearch Folders
vm-create-virtual-folder-same-recipientReference for Virtual folders
vm-create-virtual-folder-same-recipientReference for Virtual folders
vm-create-virtual-folder-same-subjectSearch Folders
vm-create-virtual-folder-same-subjectSearch Folders
vm-create-virtual-folder-same-subjectReference for Virtual folders
vm-create-virtual-folder-same-subjectReference for Virtual folders
vm-current-key-bindingsReference for Other settings
vm-current-key-bindingsReference for Other settings
vm-customizeWhere Settings Go
vm-customizeReference for Menus
vm-customizeReference for Menus
vm-decode-mime-messageReference for MIME and attachments
vm-decode-mime-messageReference for MIME and attachments
vm-delete-all-attachmentsAttachments
vm-delete-all-attachmentsAttachments
vm-delete-all-attachmentsReference for MIME and attachments
vm-delete-all-attachmentsReference for MIME and attachments
vm-delete-duplicate-messagesDeleting Messages
vm-delete-duplicate-messagesDeleting Messages
vm-delete-duplicate-messagesDeleting Messages
vm-delete-duplicate-messagesReference for Deleting and expunging
vm-delete-duplicate-messagesReference for Deleting and expunging
vm-delete-duplicate-messages-by-bodyDeleting Messages
vm-delete-duplicate-messages-by-bodyReference for Deleting and expunging
vm-delete-duplicate-messages-by-bodyReference for Deleting and expunging
vm-delete-imap-folderReference for IMAP
vm-delete-imap-folderReference for IMAP
vm-delete-messageIntroduction
vm-delete-messageDeleting Messages
vm-delete-messageReference for Deleting and expunging
vm-delete-messageReference for Deleting and expunging
vm-delete-message-backwardReference for Deleting and expunging
vm-delete-message-backwardReference for Deleting and expunging
vm-delete-message-labelsMessage Attributes
vm-delete-message-labelsReference for Undo
vm-delete-message-labelsReference for Undo
vm-delete-mime-objectAttachments
vm-delete-mime-objectAttachments
vm-delete-mime-objectReference for MIME and attachments
vm-delete-mime-objectReference for MIME and attachments
vm-delete-postponed-messagePostponing Messages
vm-delete-postponed-messageReference for Postponed compositions
vm-delete-postponed-messageReference for Postponed compositions
vm-delete-window-configurationWindow Configuration
vm-delete-window-configurationReference for Windows and frames
vm-delete-window-configurationReference for Windows and frames
vm-demote-subthreadThreaded Summaries
vm-demote-subthreadThreaded Summaries
vm-demote-subthreadReference for Threading
vm-demote-subthreadReference for Threading
vm-determine-proper-charsetMIME characters
vm-dired-attach-fileMIME attachments
vm-dired-attach-fileReference for Dired
vm-dired-attach-fileReference for Dired
vm-dired-do-attach-filesMIME attachments
vm-dired-do-attach-filesReference for Dired
vm-dired-do-attach-filesReference for Dired
vm-discard-cached-dataReference for Editing messages
vm-discard-cached-dataReference for Editing messages
vm-dnd-attach-fileMIME attachments
vm-do-fcc-before-mime-encodeSaving copies
vm-do-fcc-before-mime-encodeSaving copies
vm-do-fcc-before-mime-encodeReference for Other settings
vm-do-fcc-before-mime-encodeReference for Other settings
vm-edit-init-fileWhere Settings Go
vm-edit-init-fileReference for VM itself
vm-edit-init-fileReference for VM itself
vm-edit-messageEditing Messages
vm-edit-messageReference for Editing messages
vm-edit-messageReference for Editing messages
vm-edit-message-abortEditing Messages
vm-edit-message-abortReference for Editing messages
vm-edit-message-abortReference for Editing messages
vm-edit-message-endEditing Messages
vm-edit-message-endReference for Editing messages
vm-edit-message-endReference for Editing messages
vm-edit-message-other-frameReference for Editing messages
vm-edit-message-other-frameReference for Editing messages
vm-emit-eom-blurbReference for Reading a message
vm-emit-eom-blurbReference for Reading a message
vm-emit-mime-decoding-messageReference for Reading a message
vm-emit-mime-decoding-messageReference for Reading a message
vm-emit-totals-blurbReference for Folders
vm-emit-totals-blurbReference for Folders
vm-end-of-messageReference for Reading a message
vm-end-of-messageReference for Reading a message
vm-energize-urlsReference for Reading a message
vm-energize-urlsReference for Reading a message
vm-energize-urls-in-message-regionReference for Reading a message
vm-energize-urls-in-message-regionReference for Reading a message
vm-epg-ask-hookReference for Encryption with EasyPG
vm-epg-ask-hookReference for Encryption with EasyPG
vm-epg-attach-public-keyReference for Encryption with EasyPG
vm-epg-attach-public-keyReference for Encryption with EasyPG
vm-epg-cleartext-decryptReference for Encryption with EasyPG
vm-epg-cleartext-decryptReference for Encryption with EasyPG
vm-epg-cleartext-encryptSending Secure MIME
vm-epg-cleartext-encryptReference for Encryption with EasyPG
vm-epg-cleartext-encryptReference for Encryption with EasyPG
vm-epg-cleartext-signSending Secure MIME
vm-epg-cleartext-signReference for Encryption with EasyPG
vm-epg-cleartext-signReference for Encryption with EasyPG
vm-epg-cleartext-verifyReference for Encryption with EasyPG
vm-epg-cleartext-verifyReference for Encryption with EasyPG
vm-epg-compose-modeReference for Encryption with EasyPG
vm-epg-compose-modeReference for Encryption with EasyPG
vm-epg-compose-mode-menuReference for Encryption with EasyPG
vm-epg-compose-mode-menuReference for Encryption with EasyPG
vm-epg-encryptSending Secure MIME
vm-epg-encryptReference for Encryption with EasyPG
vm-epg-encryptReference for Encryption with EasyPG
vm-epg-insert-public-keyReference for Encryption with EasyPG
vm-epg-insert-public-keyReference for Encryption with EasyPG
vm-epg-prompt-for-actionReference for Encryption with EasyPG
vm-epg-prompt-for-actionReference for Encryption with EasyPG
vm-epg-signSending Secure MIME
vm-epg-signReference for Encryption with EasyPG
vm-epg-signReference for Encryption with EasyPG
vm-epg-sign-and-encryptSending Secure MIME
vm-epg-sign-and-encryptReference for Encryption with EasyPG
vm-epg-sign-and-encryptReference for Encryption with EasyPG
vm-epg-snarf-keysReference for Encryption with EasyPG
vm-epg-snarf-keysReference for Encryption with EasyPG
vm-expand-all-threadsThread Folding
vm-expand-all-threadsThread Folding
vm-expand-all-threadsReference for The summary
vm-expand-all-threadsReference for The summary
vm-expand-threadThread Folding
vm-expand-threadReference for The summary
vm-expand-threadReference for The summary
vm-expose-hidden-headersPreviewing
vm-expose-hidden-headersReference for Reading a message
vm-expose-hidden-headersReference for Reading a message
vm-expunge-folderIntroduction
vm-expunge-folderDeleting Messages
vm-expunge-folderReference for Deleting and expunging
vm-expunge-folderReference for Deleting and expunging
vm-expunge-imap-messagesIMAP Spool Files
vm-expunge-imap-messagesReference for IMAP
vm-expunge-imap-messagesReference for IMAP
vm-expunge-labelMessage Attributes
vm-expunge-labelReference for Undo
vm-expunge-labelReference for Undo
vm-expunge-pop-messagesPOP Spool Files
vm-expunge-pop-messagesReference for POP
vm-expunge-pop-messagesReference for POP
vm-expunge-unused-labelsMessage Attributes
vm-expunge-unused-labelsReference for Undo
vm-expunge-unused-labelsReference for Undo
vm-fetch-modeReference for MIME and attachments
vm-fetch-modeReference for MIME and attachments
vm-fill-long-lines-in-replyReplying
vm-fill-long-lines-in-replyReference for Replying and composing
vm-fill-long-lines-in-replyReference for Replying and composing
vm-fix-my-summarySummary Format
vm-fix-my-summaryReference for The summary
vm-fix-my-summaryReference for The summary
vm-folder-cache-fileIMAP Folders
vm-folder-cache-fileReference for Folders
vm-folder-cache-fileReference for Folders
vm-folder-nameReference for Folders
vm-folder-nameReference for Folders
vm-followupReplying
vm-followupReference for Replying and composing
vm-followupReference for Replying and composing
vm-followup-include-textReplying
vm-followup-include-textReference for Replying and composing
vm-followup-include-textReference for Replying and composing
vm-followup-include-text-other-frameReference for Replying and composing
vm-followup-include-text-other-frameReference for Replying and composing
vm-followup-other-frameReference for Replying and composing
vm-followup-other-frameReference for Replying and composing
vm-forward-messageForwarding Messages
vm-forward-messageReference for Replying and composing
vm-forward-messageReference for Replying and composing
vm-forward-message-all-headersForwarding Messages
vm-forward-message-all-headersForwarding Messages
vm-forward-message-all-headersReference for Replying and composing
vm-forward-message-all-headersReference for Replying and composing
vm-forward-message-all-headers-other-frameReference for Replying and composing
vm-forward-message-all-headers-other-frameReference for Replying and composing
vm-forward-message-other-frameReference for Replying and composing
vm-forward-message-other-frameReference for Replying and composing
vm-forward-message-plainForwarding Messages
vm-forward-message-plainReference for Replying and composing
vm-forward-message-plainReference for Replying and composing
vm-forward-message-plain-other-frameReference for Replying and composing
vm-forward-message-plain-other-frameReference for Replying and composing
vm-get-new-mailIntroduction
vm-get-new-mailPOP Spool Files
vm-get-new-mailIMAP Spool Files
vm-get-new-mailGetting New Mail
vm-get-new-mailWorking with Virtual Folders
vm-get-new-mailReference for Folders
vm-get-new-mailReference for Folders
vm-goto-last-message-seenReference for Moving about
vm-goto-last-message-seenReference for Moving about
vm-goto-messageNavigating
vm-goto-messageReference for Moving about
vm-goto-messageReference for Moving about
vm-goto-message-last-seenNavigating
vm-goto-message-last-seenReference for Moving about
vm-goto-message-last-seenReference for Moving about
vm-goto-parent-messageReference for Moving about
vm-goto-parent-messageReference for Moving about
vm-grepmailReference for Searching with grepmail
vm-grepmailReference for Searching with grepmail
vm-handle-return-receiptReference for Replying and composing
vm-handle-return-receiptReference for Replying and composing
vm-headers-summaryIntroduction
vm-headers-summarySummaries
vm-headers-summaryReference for The summary
vm-headers-summaryReference for The summary
vm-headers-summary-other-frameReference for The summary
vm-headers-summary-other-frameReference for The summary
vm-helpReference for Folders
vm-helpReference for Folders
vm-icalendar-importCalendar invitations
vm-icalendar-importReference for Icalendar
vm-icalendar-importReference for Icalendar
vm-iconify-frameReference for Windows and frames
vm-iconify-frameReference for Windows and frames
vm-imap-create-folderReference for IMAP
vm-imap-create-folderReference for IMAP
vm-imap-delete-folderReference for IMAP
vm-imap-delete-folderReference for IMAP
vm-imap-list-foldersReference for IMAP
vm-imap-list-foldersReference for IMAP
vm-imap-rename-folderReference for IMAP
vm-imap-rename-folderReference for IMAP
vm-imap-save-compositionSaving copies
vm-imap-start-bug-reportBugs
vm-imap-start-bug-reportReference for IMAP
vm-imap-start-bug-reportReference for IMAP
vm-imap-submit-bug-reportBugs
vm-imap-submit-bug-reportReference for IMAP
vm-imap-submit-bug-reportReference for IMAP
vm-imap-synchronizeIMAP Folders
vm-imap-synchronizeIMAP Folders
vm-imap-synchronizeIMAP Server Folders
vm-imap-synchronizeIMAP Server Folders
vm-imap-synchronizeIMAP Server Folders
vm-imap-synchronizeReference for IMAP
vm-imap-synchronizeReference for IMAP
vm-isearch-backwardNavigating
vm-isearch-backwardDefined Folders
vm-isearch-backwardReference for Searching
vm-isearch-backwardReference for Searching
vm-isearch-forwardNavigating
vm-isearch-forwardDefined Folders
vm-isearch-forwardReference for Searching
vm-isearch-forwardReference for Searching
vm-isearch-presentationPaging
vm-isearch-presentationReference for Reading a message
vm-isearch-presentationReference for Reading a message
vm-kill-subjectDeleting Messages
vm-kill-subjectReference for Deleting and expunging
vm-kill-subjectReference for Deleting and expunging
vm-kill-thread-subtreeDeleting Messages
vm-kill-thread-subtreeReference for Deleting and expunging
vm-kill-thread-subtreeReference for Deleting and expunging
vm-list-imap-foldersReference for IMAP
vm-list-imap-foldersReference for IMAP
vm-list-mime-part-structureAttachments
vm-list-mime-part-structureReference for MIME and attachments
vm-list-mime-part-structureReference for MIME and attachments
vm-list-unused-labelsMessage Attributes
vm-list-unused-labelsReference for Undo
vm-list-unused-labelsReference for Undo
vm-load-init-fileStarting Up
vm-load-init-fileWhere Settings Go
vm-load-init-fileReference for Other settings
vm-load-init-fileReference for Other settings
vm-load-messageExternal Messages
vm-load-messageReference for Folders
vm-load-messageReference for Folders
vm-mailSending Messages
vm-mailReference for VM itself
vm-mailReference for VM itself
vm-mail-auto-fccReference for Postponed compositions
vm-mail-auto-fccReference for Postponed compositions
vm-mail-check-bcc-removalReference for Replying and composing
vm-mail-check-bcc-removalReference for Replying and composing
vm-mail-check-for-empty-subjectReference for Replying and composing
vm-mail-check-for-empty-subjectReference for Replying and composing
vm-mail-check-recipientsReference for Replying and composing
vm-mail-check-recipientsReference for Replying and composing
vm-mail-fccReference for Postponed compositions
vm-mail-fccReference for Postponed compositions
vm-mail-from-folderSending Messages
vm-mail-from-folderSending Options
vm-mail-from-folderReference for VM itself
vm-mail-from-folderReference for VM itself
vm-mail-mode-citation-clean-upSending Options
vm-mail-mode-citation-clean-upReference for Replying and composing
vm-mail-mode-citation-clean-upReference for Replying and composing
vm-mail-mode-elide-reply-regionSending Options
vm-mail-mode-elide-reply-regionReference for Other settings
vm-mail-mode-elide-reply-regionReference for Other settings
vm-mail-mode-hide-headersReference for Replying and composing
vm-mail-mode-hide-headersReference for Replying and composing
vm-mail-mode-show-headersReference for Replying and composing
vm-mail-mode-show-headersReference for Replying and composing
vm-mail-notice-requested-upon-delivery-toReference for Postponed compositions
vm-mail-notice-requested-upon-delivery-toReference for Postponed compositions
vm-mail-other-frameReference for VM itself
vm-mail-other-frameReference for VM itself
vm-mail-other-windowReference for VM itself
vm-mail-other-windowReference for VM itself
vm-mail-priorityReference for Postponed compositions
vm-mail-priorityReference for Postponed compositions
vm-mail-return-receipt-toReference for Postponed compositions
vm-mail-return-receipt-toReference for Postponed compositions
vm-mail-select-folderReference for Postponed compositions
vm-mail-select-folderReference for Postponed compositions
vm-mail-sendReference for Replying and composing
vm-mail-sendReference for Replying and composing
vm-mail-send-and-exitReference for Replying and composing
vm-mail-send-and-exitReference for Replying and composing
vm-mail-subject-cleanupReference for Replying and composing
vm-mail-subject-cleanupReference for Replying and composing
vm-mail-to-fccReference for Postponed compositions
vm-mail-to-fccReference for Postponed compositions
vm-mail-to-mailto-urlReference for Replying and composing
vm-mail-to-mailto-urlReference for Replying and composing
vm-mark-all-messagesReference for Marks
vm-mark-all-messagesReference for Marks
vm-mark-helpReference for Marks
vm-mark-helpReference for Marks
vm-mark-matching-messagesReference for Marks
vm-mark-matching-messagesReference for Marks
vm-mark-matching-messages-with-virtual-folderReference for Marks
vm-mark-matching-messages-with-virtual-folderReference for Marks
vm-mark-messageReference for Marks
vm-mark-messageReference for Marks
vm-mark-message-readPaging
vm-mark-message-readReference for Folders
vm-mark-message-readReference for Folders
vm-mark-message-unreadPaging
vm-mark-message-unreadReference for Folders
vm-mark-message-unreadReference for Folders
vm-mark-messages-by-selectorMarking Messages
vm-mark-messages-by-selectorReference for Marks
vm-mark-messages-by-selectorReference for Marks
vm-mark-messages-by-virtual-folderMarking Messages
vm-mark-messages-by-virtual-folderReference for Marks
vm-mark-messages-by-virtual-folderReference for Marks
vm-mark-messages-same-authorMarking Messages
vm-mark-messages-same-authorReference for Marks
vm-mark-messages-same-authorReference for Marks
vm-mark-messages-same-subjectMarking Messages
vm-mark-messages-same-subjectReference for Marks
vm-mark-messages-same-subjectReference for Marks
vm-mark-summary-regionMarking Messages
vm-mark-summary-regionReference for Marks
vm-mark-summary-regionReference for Marks
vm-mark-thread-subtreeMarking Messages
vm-mark-thread-subtreeReference for Marks
vm-mark-thread-subtreeReference for Marks
vm-menu-create-author-virtual-folderReference for Menus
vm-menu-create-author-virtual-folderReference for Menus
vm-menu-create-subject-virtual-folderReference for Menus
vm-menu-create-subject-virtual-folderReference for Menus
vm-menu-hm-create-dirReference for Menus
vm-menu-hm-create-dirReference for Menus
vm-menu-hm-delete-folderReference for Menus
vm-menu-hm-delete-folderReference for Menus
vm-menu-hm-make-folder-menuReference for Menus
vm-menu-hm-make-folder-menuReference for Menus
vm-menu-hm-rename-folderReference for Menus
vm-menu-hm-rename-folderReference for Menus
vm-menu-mail-toReference for Menus
vm-menu-mail-toReference for Menus
vm-menu-popup-attachment-menuReference for Menus
vm-menu-popup-attachment-menuReference for Menus
vm-menu-popup-context-menuReference for Menus
vm-menu-popup-context-menuReference for Menus
vm-menu-popup-fsfemacs-menuReference for Menus
vm-menu-popup-fsfemacs-menuReference for Menus
vm-menu-popup-image-menuReference for Menus
vm-menu-popup-image-menuReference for Menus
vm-menu-popup-mailto-url-browser-menuReference for Menus
vm-menu-popup-mailto-url-browser-menuReference for Menus
vm-menu-popup-mime-dispose-menuReference for Menus
vm-menu-popup-mime-dispose-menuReference for Menus
vm-menu-popup-mode-menuReference for Menus
vm-menu-popup-mode-menuReference for Menus
vm-menu-popup-url-browser-menuReference for Menus
vm-menu-popup-url-browser-menuReference for Menus
vm-menu-toggle-menubarReference for Menus
vm-menu-toggle-menubarReference for Menus
vm-menu-yank-originalReference for Menus
vm-menu-yank-originalReference for Menus
vm-message-history-backwardReference for Message History
vm-message-history-backwardReference for Message History
vm-message-history-browseReference for Message History
vm-message-history-browseReference for Message History
vm-message-history-browse-selectReference for Message History
vm-message-history-browse-selectReference for Message History
vm-message-history-forwardReference for Message History
vm-message-history-forwardReference for Message History
vm-message-history-modeReference for Message History
vm-message-history-modeReference for Message History
vm-mime-attach-bufferReference for MIME and attachments
vm-mime-attach-bufferReference for MIME and attachments
vm-mime-attach-fileReference for MIME and attachments
vm-mime-attach-fileReference for MIME and attachments
vm-mime-attach-messageReference for MIME and attachments
vm-mime-attach-messageReference for MIME and attachments
vm-mime-attach-message-to-compositionReference for MIME and attachments
vm-mime-attach-message-to-compositionReference for MIME and attachments
vm-mime-attach-mime-fileReference for MIME and attachments
vm-mime-attach-mime-fileReference for MIME and attachments
vm-mime-auto-save-all-attachmentsCustomizations
vm-mime-auto-save-all-attachmentsCustomizations
vm-mime-auto-save-all-attachmentsReference for MIME and attachments
vm-mime-auto-save-all-attachmentsReference for MIME and attachments
vm-mime-change-content-dispositionReference for MIME and attachments
vm-mime-change-content-dispositionReference for MIME and attachments
vm-mime-convert-to-attachment-buttonsReference for MIME and attachments
vm-mime-convert-to-attachment-buttonsReference for MIME and attachments
vm-mime-encode-compositionSending Messages
vm-mime-encode-compositionReference for MIME and attachments
vm-mime-encode-compositionReference for MIME and attachments
vm-mime-encode-headersReference for MIME and attachments
vm-mime-encode-headersReference for MIME and attachments
vm-mime-list-part-structureViewing MIME
vm-mime-list-part-structureReference for MIME and attachments
vm-mime-list-part-structureReference for MIME and attachments
vm-mime-preview-compositionReference for MIME and attachments
vm-mime-preview-compositionReference for MIME and attachments
vm-mime-Q-decode-regionReference for MIME and attachments
vm-mime-Q-decode-regionReference for MIME and attachments
vm-mime-reader-map-attach-to-compositionAttachments
vm-mime-reader-map-attach-to-compositionMIME attachments
vm-mime-reader-map-attach-to-compositionReference for MIME and attachments
vm-mime-reader-map-attach-to-compositionReference for MIME and attachments
vm-mime-reader-map-convert-then-displayReference for MIME and attachments
vm-mime-reader-map-convert-then-displayReference for MIME and attachments
vm-mime-reader-map-display-object-as-typeAttachments
vm-mime-reader-map-display-object-as-typeReference for MIME and attachments
vm-mime-reader-map-display-object-as-typeReference for MIME and attachments
vm-mime-reader-map-display-using-defaultAttachments
vm-mime-reader-map-display-using-defaultReference for MIME and attachments
vm-mime-reader-map-display-using-defaultReference for MIME and attachments
vm-mime-reader-map-display-using-external-viewerAttachments
vm-mime-reader-map-display-using-external-viewerReference for MIME and attachments
vm-mime-reader-map-display-using-external-viewerReference for MIME and attachments
vm-mime-reader-map-pipe-to-commandAttachments
vm-mime-reader-map-pipe-to-commandReference for MIME and attachments
vm-mime-reader-map-pipe-to-commandReference for MIME and attachments
vm-mime-reader-map-pipe-to-command-discard-outputReference for MIME and attachments
vm-mime-reader-map-pipe-to-command-discard-outputReference for MIME and attachments
vm-mime-reader-map-pipe-to-printerAttachments
vm-mime-reader-map-pipe-to-printerReference for MIME and attachments
vm-mime-reader-map-pipe-to-printerReference for MIME and attachments
vm-mime-reader-map-save-fileAttachments
vm-mime-reader-map-save-fileReference for MIME and attachments
vm-mime-reader-map-save-fileReference for MIME and attachments
vm-mime-reader-map-save-messageAttachments
vm-mime-reader-map-save-messageReference for MIME and attachments
vm-mime-reader-map-save-messageReference for MIME and attachments
vm-mime-rename-attachmentMIME attachments
vm-mime-rename-attachmentReference for MIME and attachments
vm-mime-rename-attachmentReference for MIME and attachments
vm-mime-run-display-function-at-pointReference for MIME and attachments
vm-mime-run-display-function-at-pointReference for MIME and attachments
vm-minibuffer-complete-wordReference for Minibuf
vm-minibuffer-complete-wordReference for Minibuf
vm-minibuffer-complete-word-and-exitReference for Minibuf
vm-minibuffer-complete-word-and-exitReference for Minibuf
vm-minibuffer-completion-helpReference for Minibuf
vm-minibuffer-completion-helpReference for Minibuf
vm-modeStarting Up
vm-modeReference for VM itself
vm-modeReference for VM itself
vm-mouse-button-2Reference for Mouse
vm-mouse-button-2Reference for Mouse
vm-mouse-button-3Reference for Mouse
vm-mouse-button-3Reference for Mouse
vm-mouse-popup-or-selectReference for Mouse
vm-mouse-popup-or-selectReference for Mouse
vm-mouse-read-file-name-quit-handlerReference for Mouse
vm-mouse-read-file-name-quit-handlerReference for Mouse
vm-mouse-read-string-quit-handlerReference for Mouse
vm-mouse-read-string-quit-handlerReference for Mouse
vm-mouse-send-url-at-eventReference for Mouse
vm-mouse-send-url-at-eventReference for Mouse
vm-mouse-send-url-to-clipboardUsing the Mouse
vm-mouse-send-url-to-window-systemUsing the Mouse
vm-move-message-backwardReference for Sorting
vm-move-message-backwardReference for Sorting
vm-move-message-backward-physicallyReference for Sorting
vm-move-message-backward-physicallyReference for Sorting
vm-move-message-forwardReference for Sorting
vm-move-message-forwardReference for Sorting
vm-move-message-forward-physicallyReference for Sorting
vm-move-message-forward-physicallyReference for Sorting
vm-move-to-next-buttonReference for Reading a message
vm-move-to-next-buttonReference for Reading a message
vm-move-to-previous-buttonReference for Reading a message
vm-move-to-previous-buttonReference for Reading a message
vm-next-buttonAttachments
vm-next-buttonReference for Reading a message
vm-next-buttonReference for Reading a message
vm-next-command-uses-marksReference for Marks
vm-next-command-uses-marksReference for Marks
vm-next-messageIntroduction
vm-next-messageNavigating
vm-next-messageReference for Moving about
vm-next-messageReference for Moving about
vm-next-message-no-skipNavigating
vm-next-message-no-skipReference for Moving about
vm-next-message-no-skipReference for Moving about
vm-next-message-same-subjectReference for Moving about
vm-next-message-same-subjectReference for Moving about
vm-next-unread-messageNavigating
vm-next-unread-messageReference for Moving about
vm-next-unread-messageReference for Moving about
vm-nuke-alternative-text/htmlmultipart/alternative
vm-nuke-alternative-text/htmlReference for MIME and attachments
vm-nuke-alternative-text/htmlReference for MIME and attachments
vm-org-openConfiguration
vm-org-store-linkConfiguration
vm-other-frameReference for VM itself
vm-other-frameReference for VM itself
vm-other-windowReference for VM itself
vm-other-windowReference for VM itself
vm-pcrisis-add-headerMultiple Email Addresses
vm-pcrisis-automorphMultiple Email Addresses
vm-pcrisis-automorphReference for Personality Crisis
vm-pcrisis-automorphReference for Personality Crisis
vm-pcrisis-backward-tab-header-or-tab-stopReference for Personality Crisis
vm-pcrisis-backward-tab-header-or-tab-stopReference for Personality Crisis
vm-pcrisis-body-matchMultiple Email Addresses
vm-pcrisis-build-actions-to-run-listReference for Personality Crisis
vm-pcrisis-build-actions-to-run-listReference for Personality Crisis
vm-pcrisis-build-true-conditions-listReference for Personality Crisis
vm-pcrisis-build-true-conditions-listReference for Personality Crisis
vm-pcrisis-check-configurationMultiple Email Addresses
vm-pcrisis-check-configurationReference for Personality Crisis
vm-pcrisis-check-configurationReference for Personality Crisis
vm-pcrisis-composition-bufferMultiple Email Addresses
vm-pcrisis-delete-headerMultiple Email Addresses
vm-pcrisis-fix-auto-profiles-fileReference for Personality Crisis
vm-pcrisis-fix-auto-profiles-fileReference for Personality Crisis
vm-pcrisis-folder-account-matchMultiple Email Addresses
vm-pcrisis-folder-matchMultiple Email Addresses
vm-pcrisis-header-matchMultiple Email Addresses
vm-pcrisis-insert-headerMultiple Email Addresses
vm-pcrisis-load-auto-profilesReference for Personality Crisis
vm-pcrisis-load-auto-profilesReference for Personality Crisis
vm-pcrisis-migrate-profiles-to-BBDBReference for Personality Crisis
vm-pcrisis-migrate-profiles-to-BBDBReference for Personality Crisis
vm-pcrisis-modeComposing setup
vm-pcrisis-modeMultiple Email Addresses
vm-pcrisis-modeReference for Personality Crisis
vm-pcrisis-modeReference for Personality Crisis
vm-pcrisis-my-identitiesMultiple Email Addresses
vm-pcrisis-none-true-yetMultiple Email Addresses
vm-pcrisis-only-from-matchMultiple Email Addresses
vm-pcrisis-other-condMultiple Email Addresses
vm-pcrisis-pre-functionMultiple Email Addresses
vm-pcrisis-pre-signatureMultiple Email Addresses
vm-pcrisis-prompt-for-profileMultiple Email Addresses
vm-pcrisis-prompt-for-profileReference for Personality Crisis
vm-pcrisis-prompt-for-profileReference for Personality Crisis
vm-pcrisis-read-actionsReference for Personality Crisis
vm-pcrisis-read-actionsReference for Personality Crisis
vm-pcrisis-run-actionReference for Personality Crisis
vm-pcrisis-run-actionReference for Personality Crisis
vm-pcrisis-run-actionsReference for Personality Crisis
vm-pcrisis-run-actionsReference for Personality Crisis
vm-pcrisis-signatureMultiple Email Addresses
vm-pcrisis-substitute-headerMultiple Email Addresses
vm-pcrisis-substitute-replied-headerMultiple Email Addresses
vm-pcrisis-tab-header-or-tab-stopReference for Personality Crisis
vm-pcrisis-tab-header-or-tab-stopReference for Personality Crisis
vm-pcrisis-toggle-no-automorphReference for Personality Crisis
vm-pcrisis-toggle-no-automorphReference for Personality Crisis
vm-pcrisis-true-conditionsReference for Personality Crisis
vm-pcrisis-true-conditionsReference for Personality Crisis
vm-pcrisis-virtual-check-selectorMultiple Email Addresses
vm-pcrisis-warn-if-misconfiguredMultiple Email Addresses
vm-pipe-message-to-commandSaving Messages
vm-pipe-message-to-commandReference for Saving and forwarding
vm-pipe-message-to-commandReference for Saving and forwarding
vm-pipe-message-to-command-discard-outputSaving Messages
vm-pipe-message-to-command-discard-outputReference for Saving and forwarding
vm-pipe-message-to-command-discard-outputReference for Saving and forwarding
vm-pipe-messages-to-commandSaving Messages
vm-pipe-messages-to-commandReference for Saving and forwarding
vm-pipe-messages-to-commandReference for Saving and forwarding
vm-pipe-messages-to-command-discard-outputSaving Messages
vm-pipe-messages-to-command-discard-outputReference for Saving and forwarding
vm-pipe-messages-to-command-discard-outputReference for Saving and forwarding
vm-pipe-messages-to-command-to-stringReference for Saving and forwarding
vm-pipe-messages-to-command-to-stringReference for Saving and forwarding
vm-pop-start-bug-reportBugs
vm-pop-start-bug-reportReference for POP
vm-pop-start-bug-reportReference for POP
vm-pop-submit-bug-reportBugs
vm-pop-submit-bug-reportReference for POP
vm-pop-submit-bug-reportReference for POP
vm-postpone-messageCrash Recovery
vm-postpone-messagePostponing Messages
vm-postpone-messageReference for Postponed compositions
vm-postpone-messageReference for Postponed compositions
vm-postpone-modePostponing Messages
vm-postpone-modeReference for Postponed compositions
vm-postpone-modeReference for Postponed compositions
vm-presentation-modeReference for MIME and attachments
vm-presentation-modeReference for MIME and attachments
vm-preview-compositionSending Messages
vm-preview-compositionReference for Replying and composing
vm-preview-compositionReference for Replying and composing
vm-previous-buttonAttachments
vm-previous-buttonReference for Reading a message
vm-previous-buttonReference for Reading a message
vm-previous-messageNavigating
vm-previous-messageReference for Moving about
vm-previous-messageReference for Moving about
vm-previous-message-no-skipNavigating
vm-previous-message-no-skipReference for Moving about
vm-previous-message-no-skipReference for Moving about
vm-previous-message-same-subjectReference for Moving about
vm-previous-message-same-subjectReference for Moving about
vm-previous-unread-messageNavigating
vm-previous-unread-messageReference for Moving about
vm-previous-unread-messageReference for Moving about
vm-print-messageReference for Saving and forwarding
vm-print-messageReference for Saving and forwarding
vm-promote-subthreadThreaded Summaries
vm-promote-subthreadThreaded Summaries
vm-promote-subthreadReference for Threading
vm-promote-subthreadReference for Threading
vm-prune-imap-retrieved-listIMAP Spool Files
vm-prune-imap-retrieved-listReference for IMAP
vm-prune-imap-retrieved-listReference for IMAP
vm-ps-print-each-messageReference for Printing with ps-print
vm-ps-print-each-messageReference for Printing with ps-print
vm-ps-print-markedReference for Printing with ps-print
vm-ps-print-markedReference for Printing with ps-print
vm-ps-print-messageReference for Printing with ps-print
vm-ps-print-messageReference for Printing with ps-print
vm-ps-print-message-infect-vmReference for Printing with ps-print
vm-ps-print-message-infect-vmReference for Printing with ps-print
vm-ps-print-message-presentationReference for Printing with ps-print
vm-ps-print-message-presentationReference for Printing with ps-print
vm-quitIntroduction
vm-quitReference for Folders
vm-quitReference for Folders
vm-quit-just-buryIntroduction
vm-quit-just-buryIntroduction
vm-quit-just-buryReference for Folders
vm-quit-just-buryReference for Folders
vm-quit-just-iconifyIntroduction
vm-quit-just-iconifyReference for Folders
vm-quit-just-iconifyReference for Folders
vm-quit-no-changeIntroduction
vm-quit-no-changeReference for Folders
vm-quit-no-changeReference for Folders
vm-quit-no-expungeDeleting Messages
vm-quit-no-expungeDeleting Messages
vm-quit-no-expungeReference for Folders
vm-quit-no-expungeReference for Folders
vm-recover-fileReference for Folders
vm-recover-fileReference for Folders
vm-recover-folderCrash Recovery
vm-recover-folderReference for Folders
vm-recover-folderReference for Folders
vm-refresh-messageExternal Messages
vm-refresh-messageReference for Folders
vm-refresh-messageReference for Folders
vm-rename-imap-folderReference for IMAP
vm-rename-imap-folderReference for IMAP
vm-reorder-message-headersReference for Folders
vm-reorder-message-headersReference for Folders
vm-replyReplying
vm-replyReference for Replying and composing
vm-replyReference for Replying and composing
vm-reply-by-continue-postponed-messageReference for Postponed compositions
vm-reply-by-continue-postponed-messageReference for Postponed compositions
vm-reply-include-textReplying
vm-reply-include-textReference for Replying and composing
vm-reply-include-textReference for Replying and composing
vm-reply-include-text-other-frameReference for Replying and composing
vm-reply-include-text-other-frameReference for Replying and composing
vm-reply-other-frameReference for Replying and composing
vm-reply-other-frameReference for Replying and composing
vm-resend-bounced-messageReference for Replying and composing
vm-resend-bounced-messageReference for Replying and composing
vm-resend-bounced-message-other-frameReference for Replying and composing
vm-resend-bounced-message-other-frameReference for Replying and composing
vm-resend-messageForwarding Messages
vm-resend-messageReference for Replying and composing
vm-resend-messageReference for Replying and composing
vm-resend-message-other-frameReference for Replying and composing
vm-resend-message-other-frameReference for Replying and composing
vm-retry-bounced-messageReference for Replying and composing
vm-retry-bounced-messageReference for Replying and composing
vm-revert-bufferReference for Folders
vm-revert-bufferReference for Folders
vm-revert-folderCrash Recovery
vm-revert-folderCrash Recovery
vm-revert-folderReference for Folders
vm-revert-folderReference for Folders
vm-save-all-attachmentsAttachments
vm-save-all-attachmentsAttachments
vm-save-all-attachmentsReference for MIME and attachments
vm-save-all-attachmentsReference for MIME and attachments
vm-save-and-expunge-folderReference for Folders
vm-save-and-expunge-folderReference for Folders
vm-save-attachmentsReference for MIME and attachments
vm-save-attachmentsReference for MIME and attachments
vm-save-bufferReference for Folders
vm-save-bufferReference for Folders
vm-save-folderIntroduction
vm-save-folderPOP Folders
vm-save-folderIMAP Folders
vm-save-folderIMAP Folders
vm-save-folderWorking with Virtual Folders
vm-save-folderReference for Folders
vm-save-folderReference for Folders
vm-save-folder-no-expungeDeleting Messages
vm-save-folder-no-expungeDeleting Messages
vm-save-folder-no-expungeReference for Folders
vm-save-folder-no-expungeReference for Folders
vm-save-messageIntroduction
vm-save-messageSaving Messages
vm-save-messageReference for Saving and forwarding
vm-save-messageReference for Saving and forwarding
vm-save-message-sans-headersSaving Messages
vm-save-message-sans-headersReference for Saving and forwarding
vm-save-message-sans-headersReference for Saving and forwarding
vm-save-message-to-imap-folderSaving Messages
vm-save-message-to-imap-folderReference for Saving and forwarding
vm-save-message-to-imap-folderReference for Saving and forwarding
vm-save-message-to-local-folderSaving Messages
vm-save-message-to-local-folderReference for Saving and forwarding
vm-save-message-to-local-folderReference for Saving and forwarding
vm-save-window-configurationWindow Configuration
vm-save-window-configurationReference for Windows and frames
vm-save-window-configurationReference for Windows and frames
vm-scroll-backwardIntroduction
vm-scroll-backwardReference for Reading a message
vm-scroll-backwardReference for Reading a message
vm-scroll-backward-one-lineReference for Reading a message
vm-scroll-backward-one-lineReference for Reading a message
vm-scroll-forwardIntroduction
vm-scroll-forwardReference for Reading a message
vm-scroll-forwardReference for Reading a message
vm-scroll-forward-one-lineReference for Reading a message
vm-scroll-forward-one-lineReference for Reading a message
vm-send-digestForwarding Messages
vm-send-digestReference for Replying and composing
vm-send-digestReference for Replying and composing
vm-send-digest-other-frameReference for Replying and composing
vm-send-digest-other-frameReference for Replying and composing
vm-send-mime-digestReference for Replying and composing
vm-send-mime-digestReference for Replying and composing
vm-send-mime-digest-other-frameReference for Replying and composing
vm-send-mime-digest-other-frameReference for Replying and composing
vm-send-rfc1153-digestReference for Replying and composing
vm-send-rfc1153-digestReference for Replying and composing
vm-send-rfc1153-digest-other-frameReference for Replying and composing
vm-send-rfc1153-digest-other-frameReference for Replying and composing
vm-send-rfc934-digestReference for Replying and composing
vm-send-rfc934-digestReference for Replying and composing
vm-send-rfc934-digest-other-frameReference for Replying and composing
vm-send-rfc934-digest-other-frameReference for Replying and composing
vm-serial-expand-tokensReference for Serial mail
vm-serial-expand-tokensReference for Serial mail
vm-serial-get-tokenReference for Serial mail
vm-serial-get-tokenReference for Serial mail
vm-serial-insert-tokenReference for Serial mail
vm-serial-insert-tokenReference for Serial mail
vm-serial-modeReference for Serial mail
vm-serial-modeReference for Serial mail
vm-serial-send-mailReference for Serial mail
vm-serial-send-mailReference for Serial mail
vm-serial-send-mail-and-exitReference for Serial mail
vm-serial-send-mail-and-exitReference for Serial mail
vm-serial-set-tokenReference for Serial mail
vm-serial-set-tokenReference for Serial mail
vm-serial-yank-mailReference for Serial mail
vm-serial-yank-mailReference for Serial mail
vm-set-message-attributesMessage Attributes
vm-set-message-attributesReference for Undo
vm-set-message-attributesReference for Undo
vm-show-copying-restrictionsReference for License
vm-show-copying-restrictionsReference for License
vm-show-logCustomizations
vm-show-logReference for Other settings
vm-show-logReference for Other settings
vm-show-no-warrantyReference for License
vm-show-no-warrantyReference for License
vm-shrunken-headersReference for Reading a message
vm-shrunken-headersReference for Reading a message
vm-shrunken-headers-toggleCustomizations
vm-shrunken-headers-toggleReference for Reading a message
vm-shrunken-headers-toggleReference for Reading a message
vm-shrunken-headers-toggle-thisReference for Reading a message
vm-shrunken-headers-toggle-thisReference for Reading a message
vm-shrunken-headers-toggle-this-mouseReference for Reading a message
vm-shrunken-headers-toggle-this-mouseReference for Reading a message
vm-smime-encrypt-messageReference for Other settings
vm-smime-encrypt-messageReference for Other settings
vm-smime-sign-encrypt-messageReference for S/MIME
vm-smime-sign-encrypt-messageReference for S/MIME
vm-smime-sign-messageReference for Other settings
vm-smime-sign-messageReference for Other settings
vm-sort-insert-auto-folder-namesReference for Virtual folder actions
vm-sort-insert-auto-folder-namesReference for Virtual folder actions
vm-sort-messagesSorting Messages
vm-sort-messagesReference for Sorting
vm-sort-messagesReference for Sorting
vm-spam-words-rebuildReference for Virtual folder actions
vm-spam-words-rebuildReference for Virtual folder actions
vm-submit-bug-reportBugs
vm-submit-bug-reportReference for VM itself
vm-submit-bug-reportReference for VM itself
vm-summarizeIntroduction
vm-summarizeSummaries
vm-summarizeReference for The summary
vm-summarizeReference for The summary
vm-summarize-other-frameReference for The summary
vm-summarize-other-frameReference for The summary
vm-summary-faces-hideReference for Summary faces
vm-summary-faces-hideReference for Summary faces
vm-summary-faces-modeSummary Faces
vm-summary-faces-modeReference for Summary faces
vm-summary-faces-modeReference for Summary faces
vm-summary-function-fReference for Postponed compositions
vm-summary-function-fReference for Postponed compositions
vm-summary-trace-messageReference for The summary
vm-summary-trace-messageReference for The summary
vm-switch-to-folderIntroduction
vm-switch-to-folderReference for VM itself
vm-switch-to-folderReference for VM itself
vm-sync-labelsMessage Attributes
vm-sync-labelsReference for Undo
vm-sync-labelsReference for Undo
vm-toggle-all-marksReference for Marks
vm-toggle-all-marksReference for Marks
vm-toggle-best-mimeCustomizations
vm-toggle-best-mimeCustomizations
vm-toggle-best-mimeReference for MIME and attachments
vm-toggle-best-mimeReference for MIME and attachments
vm-toggle-flag-messagePaging
vm-toggle-flag-messageReference for Deleting and expunging
vm-toggle-flag-messageReference for Deleting and expunging
vm-toggle-read-onlyReference for Folders
vm-toggle-read-onlyReference for Folders
vm-toggle-threadThread Folding
vm-toggle-threadReference for The summary
vm-toggle-threadReference for The summary
vm-toggle-thread-operationsThread Operations
vm-toggle-thread-operationsReference for VM itself
vm-toggle-thread-operationsReference for VM itself
vm-toggle-threads-displayThreading
vm-toggle-threads-displayThreaded Summaries
vm-toggle-threads-displayReference for Threading
vm-toggle-threads-displayReference for Threading
vm-toggle-virtual-mirrorWorking with Virtual Folders
vm-toggle-virtual-mirrorReference for Virtual folders
vm-toggle-virtual-mirrorReference for Virtual folders
vm-toolbar-autofile-messageReference for The toolbar
vm-toolbar-autofile-messageReference for The toolbar
vm-toolbar-can-autofile-pReference for The toolbar
vm-toolbar-can-autofile-pReference for The toolbar
vm-toolbar-compose-commandReference for The toolbar
vm-toolbar-compose-commandReference for The toolbar
vm-toolbar-decode-mime-commandReference for The toolbar
vm-toolbar-decode-mime-commandReference for The toolbar
vm-toolbar-delete/undelete-messageReference for The toolbar
vm-toolbar-delete/undelete-messageReference for The toolbar
vm-toolbar-file-commandReference for The toolbar
vm-toolbar-file-commandReference for The toolbar
vm-toolbar-followup-commandReference for The toolbar
vm-toolbar-followup-commandReference for The toolbar
vm-toolbar-forward-commandReference for The toolbar
vm-toolbar-forward-commandReference for The toolbar
vm-toolbar-getmail-commandReference for The toolbar
vm-toolbar-getmail-commandReference for The toolbar
vm-toolbar-helper-commandReference for The toolbar
vm-toolbar-helper-commandReference for The toolbar
vm-toolbar-next-commandReference for The toolbar
vm-toolbar-next-commandReference for The toolbar
vm-toolbar-previous-commandReference for The toolbar
vm-toolbar-previous-commandReference for The toolbar
vm-toolbar-print-commandReference for The toolbar
vm-toolbar-print-commandReference for The toolbar
vm-toolbar-quit-commandReference for The toolbar
vm-toolbar-quit-commandReference for The toolbar
vm-toolbar-reply-commandReference for The toolbar
vm-toolbar-reply-commandReference for The toolbar
vm-toolbar-visit-commandReference for The toolbar
vm-toolbar-visit-commandReference for The toolbar
vm-trace-message-idReference for Threading
vm-trace-message-idReference for Threading
vm-trace-message-subjectReference for Threading
vm-trace-message-subjectReference for Threading
vm-undelete-messageIntroduction
vm-undelete-messageDeleting Messages
vm-undelete-messageReference for Deleting and expunging
vm-undelete-messageReference for Deleting and expunging
vm-undoMessage Attributes
vm-undoReference for Undo
vm-undoReference for Undo
vm-unload-messageExternal Messages
vm-unload-messageReference for Folders
vm-unload-messageReference for Folders
vm-unmark-matching-messagesReference for Marks
vm-unmark-matching-messagesReference for Marks
vm-unmark-matching-messages-with-virtual-folderReference for Marks
vm-unmark-matching-messages-with-virtual-folderReference for Marks
vm-unmark-messageReference for Marks
vm-unmark-messageReference for Marks
vm-unmark-messages-by-selectorMarking Messages
vm-unmark-messages-by-selectorReference for Marks
vm-unmark-messages-by-selectorReference for Marks
vm-unmark-messages-by-virtual-folderMarking Messages
vm-unmark-messages-by-virtual-folderReference for Marks
vm-unmark-messages-by-virtual-folderReference for Marks
vm-unmark-messages-same-authorMarking Messages
vm-unmark-messages-same-authorReference for Marks
vm-unmark-messages-same-authorReference for Marks
vm-unmark-messages-same-subjectMarking Messages
vm-unmark-messages-same-subjectReference for Marks
vm-unmark-messages-same-subjectReference for Marks
vm-unmark-summary-regionMarking Messages
vm-unmark-summary-regionReference for Marks
vm-unmark-summary-regionReference for Marks
vm-unmark-thread-subtreeMarking Messages
vm-unmark-thread-subtreeReference for Marks
vm-unmark-thread-subtreeReference for Marks
vm-unread-messagePaging
vm-unread-messageReference for Folders
vm-unread-messageReference for Folders
vm-v8-key-bindingsReference for Other settings
vm-v8-key-bindingsReference for Other settings
vm-versionReference for VM itself
vm-versionReference for VM itself
vm-version-commitReference for VM itself
vm-version-commitReference for VM itself
vm-view-file-other-frameReference for Other settings
vm-view-file-other-frameReference for Other settings
vm-view-manualIntroduction
vm-view-manualReference for Menus
vm-view-manualReference for Menus
vm-view-newsIntroduction
vm-view-newsReference for Menus
vm-view-newsReference for Menus
vm-virtual-apply-functionReference for Virtual folder actions
vm-virtual-apply-functionReference for Virtual folder actions
vm-virtual-auto-archive-messagesvm-avirtual
vm-virtual-auto-archive-messagesReference for Virtual folder actions
vm-virtual-auto-archive-messagesReference for Virtual folder actions
vm-virtual-auto-delete-messagevm-avirtual
vm-virtual-auto-delete-messageReference for Virtual folder actions
vm-virtual-auto-delete-messageReference for Virtual folder actions
vm-virtual-auto-delete-messagesvm-avirtual
vm-virtual-auto-delete-messagesvm-avirtual
vm-virtual-auto-delete-messagesReference for Virtual folder actions
vm-virtual-auto-delete-messagesReference for Virtual folder actions
vm-virtual-check-selector-interactivevm-avirtual
vm-virtual-check-selector-interactiveReference for Virtual folder actions
vm-virtual-check-selector-interactiveReference for Virtual folder actions
vm-virtual-filter-messagesvm-avirtual
vm-virtual-filter-messagesReference for Virtual folder actions
vm-virtual-filter-messagesReference for Virtual folder actions
vm-virtual-filter-new-messagesvm-avirtual
vm-virtual-filter-new-messagesReference for Virtual folder actions
vm-virtual-filter-new-messagesReference for Virtual folder actions
vm-virtual-get-selectorReference for Virtual folder actions
vm-virtual-get-selectorReference for Virtual folder actions
vm-virtual-helpReference for Virtual folders
vm-virtual-helpReference for Virtual folders
vm-virtual-make-folder-persistentReference for Virtual folder actions
vm-virtual-make-folder-persistentReference for Virtual folder actions
vm-virtual-omit-messagevm-avirtual
vm-virtual-omit-messageReference for Virtual folder actions
vm-virtual-omit-messageReference for Virtual folder actions
vm-virtual-save-messagevm-avirtual
vm-virtual-save-messageReference for Virtual folder actions
vm-virtual-save-messageReference for Virtual folder actions
vm-virtual-update-foldersvm-avirtual
vm-virtual-update-foldersReference for Virtual folder actions
vm-virtual-update-foldersReference for Virtual folder actions
vm-visit-folderStarting Up
vm-visit-folderReference for VM itself
vm-visit-folderReference for VM itself
vm-visit-folder-other-frameReference for VM itself
vm-visit-folder-other-frameReference for VM itself
vm-visit-folder-other-windowReference for VM itself
vm-visit-folder-other-windowReference for VM itself
vm-visit-imap-folderStarting Up
vm-visit-imap-folderIMAP Folders
vm-visit-imap-folderIMAP Folders
vm-visit-imap-folderReference for VM itself
vm-visit-imap-folderReference for VM itself
vm-visit-imap-folder-other-frameReference for VM itself
vm-visit-imap-folder-other-frameReference for VM itself
vm-visit-imap-folder-other-windowReference for VM itself
vm-visit-imap-folder-other-windowReference for VM itself
vm-visit-pop-folderStarting Up
vm-visit-pop-folderPOP Folders
vm-visit-pop-folderPOP Folders
vm-visit-pop-folderPOP Folders
vm-visit-pop-folderReference for VM itself
vm-visit-pop-folderReference for VM itself
vm-visit-pop-folder-other-frameReference for VM itself
vm-visit-pop-folder-other-frameReference for VM itself
vm-visit-pop-folder-other-windowReference for VM itself
vm-visit-pop-folder-other-windowReference for VM itself
vm-visit-thunderbird-folderThunderbird Folders
vm-visit-thunderbird-folderReference for VM itself
vm-visit-thunderbird-folderReference for VM itself
vm-visit-virtual-folderVirtual Folders
vm-visit-virtual-folderDefined Folders
vm-visit-virtual-folderReference for VM itself
vm-visit-virtual-folderReference for VM itself
vm-visit-virtual-folder-other-frameReference for VM itself
vm-visit-virtual-folder-other-frameReference for VM itself
vm-visit-virtual-folder-other-windowReference for VM itself
vm-visit-virtual-folder-other-windowReference for VM itself
vm-w3m-safe-toggle-inline-imagesHTML display
vm-w3m-safe-toggle-inline-imagesReference for W3m
vm-w3m-safe-toggle-inline-imagesReference for W3m
vm-window-helpReference for Windows and frames
vm-window-helpReference for Windows and frames
vm-write-fileReference for Folders
vm-write-fileReference for Folders
vm-yank-messageSending Messages
vm-yank-messageReference for Replying and composing
vm-yank-messageReference for Replying and composing
vm-yank-message-other-folderSending Messages
vm-yank-message-other-folderReference for Replying and composing
vm-yank-message-other-folderReference for Replying and composing


Variable Index

Jump to:   B   F   M   S   V   W  
Index EntrySection

B
bbdb/vm-virtual-folder-alist-by-mail-alias-alistReference for Virtual folder actions
bbdb/vm-virtual-folder-alist-by-mail-alias-alistReference for Virtual folder actions
browse-url-browser-functionUsing the Mouse

F
file-preserve-symlinks-on-saveIntroduction
fill-columnMIME characters

M
mail-citation-hookSending Messages
mail-default-headersSetting Up
mail-default-headersSaving copies
mail-personal-alias-fileComposing setup
mail-send-hookSending setup
mail-setup-with-fromSending Options
mail-signatureMultiple Email Addresses
mail-user-agentMail agent

S
send-mail-functionSending setup
smime-keysReading Secure MIME
smtpmail-smtp-serviceConfiguration
smtpmail-stream-typeConfiguration

V
vm-after-postpone-message-hookReference for Postponed compositions
vm-after-postpone-message-hookReference for Postponed compositions
vm-arrived-message-hookHooks
vm-arrived-message-hookHooks
vm-arrived-message-hookReference for Hooks
vm-arrived-message-hookReference for Hooks
vm-arrived-messages-hookvm-avirtual
vm-arrived-messages-hookvm-avirtual
vm-arrived-messages-hookHooks
vm-arrived-messages-hookHooks
vm-arrived-messages-hookCustomizations
vm-arrived-messages-hookReference for Hooks
vm-arrived-messages-hookReference for Hooks
vm-assimilate-new-messages-sortedReference for Reading a message
vm-assimilate-new-messages-sortedReference for Reading a message
vm-attach-files-in-directory-default-charsetReference for MIME and attachments
vm-attach-files-in-directory-default-charsetReference for MIME and attachments
vm-attach-files-in-directory-default-typeReference for MIME and attachments
vm-attach-files-in-directory-default-typeReference for MIME and attachments
vm-attachment-button-faceReference for Faces
vm-attachment-button-faceReference for Faces
vm-attachment-button-mouse-faceReference for Faces
vm-attachment-button-mouse-faceReference for Faces
vm-auto-center-summarySummaries
vm-auto-center-summaryReference for The summary
vm-auto-center-summaryReference for The summary
vm-auto-decode-mime-messagesViewing MIME
vm-auto-decode-mime-messagesReference for MIME and attachments
vm-auto-decode-mime-messagesReference for MIME and attachments
vm-auto-expunge-postponed-folderPostponing Messages
vm-auto-expunge-postponed-folderReference for Postponed compositions
vm-auto-expunge-postponed-folderReference for Postponed compositions
vm-auto-folder-alistSaving Messages
vm-auto-folder-alistSaving Messages
vm-auto-folder-alistReference for Dispose
vm-auto-folder-alistReference for Dispose
vm-auto-folder-case-fold-searchSaving Messages
vm-auto-folder-case-fold-searchReference for Dispose
vm-auto-folder-case-fold-searchReference for Dispose
vm-auto-get-new-mailStarting Up
vm-auto-get-new-mailGetting New Mail
vm-auto-get-new-mailCustomizations
vm-auto-get-new-mailReference for Folders
vm-auto-get-new-mailReference for Folders
vm-auto-next-messagePaging
vm-auto-next-messageReference for The summary
vm-auto-next-messageReference for The summary
vm-auto-save-all-attachmentsCustomizations
vm-auto-save-all-attachmentsCustomizations
vm-auto-save-all-attachmentsReference for MIME and attachments
vm-auto-save-all-attachmentsReference for MIME and attachments
vm-berkeley-mail-compatibilityFolder types
vm-berkeley-mail-compatibilitySaving Messages
vm-berkeley-mail-compatibilitySaving Messages
vm-berkeley-mail-compatibilityReference for Folders
vm-berkeley-mail-compatibilityReference for Folders
vm-biff-auto-removeReference for New mail notification
vm-biff-auto-removeReference for New mail notification
vm-biff-body-peekReference for New mail notification
vm-biff-body-peekReference for New mail notification
vm-biff-focus-popupReference for New mail notification
vm-biff-focus-popupReference for New mail notification
vm-biff-folder-listReference for New mail notification
vm-biff-folder-listReference for New mail notification
vm-biff-FvwmCommand-pathReference for New mail notification
vm-biff-FvwmCommand-pathReference for New mail notification
vm-biff-max-heightReference for New mail notification
vm-biff-max-heightReference for New mail notification
vm-biff-mode-hookReference for New mail notification
vm-biff-mode-hookReference for New mail notification
vm-biff-place-frame-functionReference for New mail notification
vm-biff-place-frame-functionReference for New mail notification
vm-biff-positionReference for New mail notification
vm-biff-positionReference for New mail notification
vm-biff-select-frame-hookReference for New mail notification
vm-biff-select-frame-hookReference for New mail notification
vm-biff-select-hookReference for New mail notification
vm-biff-select-hookReference for New mail notification
vm-biff-selectorReference for New mail notification
vm-biff-selectorReference for New mail notification
vm-biff-summary-formatReference for New mail notification
vm-biff-summary-formatReference for New mail notification
vm-biff-widthReference for New mail notification
vm-biff-widthReference for New mail notification
vm-burst-digest-messages-inherit-labelsReference for Digests
vm-burst-digest-messages-inherit-labelsReference for Digests
vm-check-bcc-removalSending Options
vm-check-bcc-removalReference for Replying and composing
vm-check-bcc-removalReference for Replying and composing
vm-check-folder-typesReference for Folders
vm-check-folder-typesReference for Folders
vm-check-for-empty-subjectSending Options
vm-check-for-empty-subjectSending Options
vm-check-for-empty-subjectReference for Replying and composing
vm-check-for-empty-subjectReference for Replying and composing
vm-check-recipientsSending Options
vm-check-recipientsSending Options
vm-check-recipientsReference for Replying and composing
vm-check-recipientsReference for Replying and composing
vm-circular-foldersNavigating
vm-circular-foldersNavigating
vm-circular-foldersReference for The summary
vm-circular-foldersReference for The summary
vm-citation-facesPreviewing
vm-citation-facesReference for Faces
vm-citation-facesReference for Faces
vm-clean-subject-prefixesSending Options
vm-clean-subject-prefixesSending Options
vm-clean-subject-prefixesReference for Replying and composing
vm-clean-subject-prefixesReference for Replying and composing
vm-coding-system-prioritiesMIME characters
vm-coding-system-prioritiesReference for Replying and composing
vm-coding-system-prioritiesReference for Replying and composing
vm-confirm-for-auto-archiveSaving Messages
vm-confirm-for-auto-archiveReference for Dispose
vm-confirm-for-auto-archiveReference for Dispose
vm-confirm-killing-a-compositionPostponing Messages
vm-confirm-killing-a-compositionReference for Replying and composing
vm-confirm-killing-a-compositionReference for Replying and composing
vm-confirm-mail-sendReference for Replying and composing
vm-confirm-mail-sendReference for Replying and composing
vm-confirm-new-foldersSaving Messages
vm-confirm-new-foldersReference for Folders
vm-confirm-new-foldersReference for Folders
vm-confirm-quitIntroduction
vm-confirm-quitIntroduction
vm-confirm-quitReference for Other settings
vm-confirm-quitReference for Other settings
vm-continue-postponed-message-hookReference for Postponed compositions
vm-continue-postponed-message-hookReference for Postponed compositions
vm-convert-folder-typesReference for Folders
vm-convert-folder-typesReference for Folders
vm-crash-boxLocal Folders
vm-crash-boxLocal mail
vm-crash-boxReference for Folders
vm-crash-boxReference for Folders
vm-crash-box-suffixSpool Files
vm-crash-box-suffixReference for Folders
vm-crash-box-suffixReference for Folders
vm-default-folder-permission-bitsReference for Folders
vm-default-folder-permission-bitsReference for Folders
vm-default-folder-typeLocal Folders
vm-default-folder-typeFolder types
vm-default-folder-typeFolder types
vm-default-folder-typeFolder types
vm-default-folder-typeFolder types
vm-default-folder-typeReference for Folders
vm-default-folder-typeReference for Folders
vm-default-From_-folder-typeReference for Folders
vm-default-From_-folder-typeReference for Folders
vm-default-new-folder-line-ending-typeReference for Folders
vm-default-new-folder-line-ending-typeReference for Folders
vm-delete-after-archivingSaving Messages
vm-delete-after-archivingReference for Dispose
vm-delete-after-archivingReference for Dispose
vm-delete-after-burstingReference for Dispose
vm-delete-after-burstingReference for Dispose
vm-delete-after-savingSaving Messages
vm-delete-after-savingReference for Dispose
vm-delete-after-savingReference for Dispose
vm-delete-empty-foldersIntroduction
vm-delete-empty-foldersReference for Folders
vm-delete-empty-foldersReference for Folders
vm-digest-burst-typeDigests
vm-digest-burst-typeReference for Digests
vm-digest-burst-typeReference for Digests
vm-digest-center-preambleForwarding Messages
vm-digest-center-preambleReference for Digests
vm-digest-center-preambleReference for Digests
vm-digest-identifier-header-formatReference for Digests
vm-digest-identifier-header-formatReference for Digests
vm-digest-preamble-formatForwarding Messages
vm-digest-preamble-formatReference for Digests
vm-digest-preamble-formatReference for Digests
vm-digest-send-typeForwarding Messages
vm-digest-send-typeReference for Digests
vm-digest-send-typeReference for Digests
vm-disable-modes-before-encodingReference for Replying and composing
vm-disable-modes-before-encodingReference for Replying and composing
vm-display-buffer-hookHooks
vm-display-buffer-hookHooks
vm-display-buffer-hookReference for Hooks
vm-display-buffer-hookReference for Hooks
vm-display-using-mimeMIME Messages
vm-display-using-mimeReference for MIME and attachments
vm-display-using-mimeReference for MIME and attachments
vm-display-xfacesReference for Reading a message
vm-display-xfacesReference for Reading a message
vm-dnd-protocol-alistReference for Replying and composing
vm-dnd-protocol-alistReference for Replying and composing
vm-drop-buffer-name-charsCustomizations
vm-drop-buffer-name-charsReference for Replying and composing
vm-drop-buffer-name-charsReference for Replying and composing
vm-edit-message-hookHooks
vm-edit-message-hookHooks
vm-edit-message-hookReference for Hooks
vm-edit-message-hookReference for Hooks
vm-edit-message-modeReference for Dispose
vm-edit-message-modeReference for Dispose
vm-emit-messages-for-mime-decodingReference for MIME and attachments
vm-emit-messages-for-mime-decodingReference for MIME and attachments
vm-enable-body-facesPreviewing
vm-enable-body-facesReference for Faces
vm-enable-body-facesReference for Faces
vm-enable-external-messagesExternal Messages
vm-enable-external-messagesReference for External
vm-enable-external-messagesReference for External
vm-enable-shrunken-headersCustomizations
vm-enable-shrunken-headersCustomizations
vm-enable-shrunken-headersReference for Reading a message
vm-enable-shrunken-headersReference for Reading a message
vm-enable-thread-operationsThread Operations
vm-enable-thread-operationsReference for The summary
vm-enable-thread-operationsReference for The summary
vm-epg-ask-functionSending Secure MIME
vm-epg-ask-functionReference for Encryption with EasyPG
vm-epg-ask-functionReference for Encryption with EasyPG
vm-epg-auto-decryptSending Secure MIME
vm-epg-auto-decryptReference for Encryption with EasyPG
vm-epg-auto-decryptReference for Encryption with EasyPG
vm-epg-auto-snarfSending Secure MIME
vm-epg-auto-snarfReference for Encryption with EasyPG
vm-epg-auto-snarfReference for Encryption with EasyPG
vm-epg-cleartext-search-limitReference for Encryption with EasyPG
vm-epg-cleartext-search-limitReference for Encryption with EasyPG
vm-epg-fetch-missing-keysSending Secure MIME
vm-epg-fetch-missing-keysReference for Encryption with EasyPG
vm-epg-fetch-missing-keysReference for Encryption with EasyPG
vm-epg-get-author-headersReference for Encryption with EasyPG
vm-epg-get-author-headersReference for Encryption with EasyPG
vm-epg-get-recipients-headersSending Secure MIME
vm-epg-get-recipients-headersReference for Encryption with EasyPG
vm-epg-get-recipients-headersReference for Encryption with EasyPG
vm-epg-sign-text-transfer-encodingReference for Encryption with EasyPG
vm-epg-sign-text-transfer-encodingReference for Encryption with EasyPG
vm-expunge-before-quitDeleting Messages
vm-expunge-before-quitReference for Other settings
vm-expunge-before-quitReference for Other settings
vm-expunge-before-saveDeleting Messages
vm-expunge-before-saveReference for Dispose
vm-expunge-before-saveReference for Dispose
vm-external-fetch-message-for-presentationExternal Messages
vm-external-fetch-message-for-presentationReference for External
vm-external-fetch-message-for-presentationReference for External
vm-external-fetched-message-limitExternal Messages
vm-external-fetched-message-limitReference for External
vm-external-fetched-message-limitReference for External
vm-fill-long-lines-in-reply-columnReplying
vm-fill-long-lines-in-reply-columnReference for Replying and composing
vm-fill-long-lines-in-reply-columnReference for Replying and composing
vm-fill-paragraphs-containing-long-linesPaging
vm-fill-paragraphs-containing-long-linesInternal display
vm-fill-paragraphs-containing-long-linesReference for Reading a message
vm-fill-paragraphs-containing-long-linesReference for Reading a message
vm-fill-paragraphs-containing-long-lines-in-replyReplying
vm-fill-paragraphs-containing-long-lines-in-replyReference for Replying and composing
vm-fill-paragraphs-containing-long-lines-in-replyReference for Replying and composing
vm-flush-intervalMessage Attributes
vm-flush-intervalReference for Folders
vm-flush-intervalReference for Folders
vm-folder-directoryLocal Folders
vm-folder-directoryPOP Folders
vm-folder-directoryIMAP Folders
vm-folder-directoryLocal mail
vm-folder-directorySaving Messages
vm-folder-directoryReference for Folders
vm-folder-directoryReference for Folders
vm-folder-file-precious-flagIntroduction
vm-folder-file-precious-flagReference for Folders
vm-folder-file-precious-flagReference for Folders
vm-folder-typeFolder Internals
vm-folder-type-by-extension-alistFolder types
vm-folder-type-by-extension-alistReference for Folders
vm-folder-type-by-extension-alistReference for Folders
vm-follow-summary-cursorNavigating
vm-follow-summary-cursorSummaries
vm-follow-summary-cursorSummaries
vm-follow-summary-cursorReference for The summary
vm-follow-summary-cursorReference for The summary
vm-forward-message-hookHooks
vm-forward-message-hookHooks
vm-forward-message-hookReference for Hooks
vm-forward-message-hookReference for Hooks
vm-forwarded-headersForwarding Messages
vm-forwarded-headersReference for Forward
vm-forwarded-headersReference for Forward
vm-forwarded-headers-plainForwarding Messages
vm-forwarded-headers-plainReference for Forward
vm-forwarded-headers-plainReference for Forward
vm-forwarding-digest-typeForwarding Messages
vm-forwarding-digest-typeReference for Forward
vm-forwarding-digest-typeReference for Forward
vm-forwarding-subject-formatForwarding Messages
vm-forwarding-subject-formatForwarding Messages
vm-forwarding-subject-formatReference for Forward
vm-forwarding-subject-formatReference for Forward
vm-frame-parameter-alistFrame Configuration
vm-frame-parameter-alistFrame Configuration
vm-frame-parameter-alistReference for Windows and frames
vm-frame-parameter-alistReference for Windows and frames
vm-frame-per-completionFrame Configuration
vm-frame-per-completionFrame Configuration
vm-frame-per-completionReference for Windows and frames
vm-frame-per-completionReference for Windows and frames
vm-frame-per-compositionFrame Configuration
vm-frame-per-compositionFrame Configuration
vm-frame-per-compositionReference for Windows and frames
vm-frame-per-compositionReference for Windows and frames
vm-frame-per-editFrame Configuration
vm-frame-per-editFrame Configuration
vm-frame-per-editReference for Windows and frames
vm-frame-per-editReference for Windows and frames
vm-frame-per-folderFrame Configuration
vm-frame-per-folderFrame Configuration
vm-frame-per-folderReference for Windows and frames
vm-frame-per-folderReference for Windows and frames
vm-frame-per-helpFrame Configuration
vm-frame-per-helpFrame Configuration
vm-frame-per-helpReference for Windows and frames
vm-frame-per-helpReference for Windows and frames
vm-frame-per-summaryFrame Configuration
vm-frame-per-summaryFrame Configuration
vm-frame-per-summaryReference for Windows and frames
vm-frame-per-summaryReference for Windows and frames
vm-get-new-mailIMAP Folders
vm-grep-programReference for Helpers
vm-grep-programReference for Helpers
vm-grepmail-argumentsReference for Searching with grepmail
vm-grepmail-argumentsReference for Searching with grepmail
vm-grepmail-commandReference for Searching with grepmail
vm-grepmail-commandReference for Searching with grepmail
vm-handle-return-receipt-modeCustomizations
vm-handle-return-receipt-modeCustomizations
vm-handle-return-receipt-modeReference for Other settings
vm-handle-return-receipt-modeReference for Other settings
vm-handle-return-receipt-peekReference for Other settings
vm-handle-return-receipt-peekReference for Other settings
vm-handle-return-receiptsCustomizations
vm-handle-return-receiptsCustomizations
vm-handle-return-receiptsReference for Other settings
vm-handle-return-receiptsReference for Other settings
vm-highlight-url-faceFaces
vm-highlight-url-faceReference for Faces
vm-highlight-url-faceReference for Faces
vm-highlighted-header-facePreviewing
vm-highlighted-header-faceFaces
vm-highlighted-header-faceReference for Faces
vm-highlighted-header-faceReference for Faces
vm-highlighted-header-regexpPreviewing
vm-highlighted-header-regexpFaces
vm-highlighted-header-regexpReference for Reading a message
vm-highlighted-header-regexpReference for Reading a message
vm-honor-page-delimitersReference for Reading a message
vm-honor-page-delimitersReference for Reading a message
vm-html-in-reply-columnReference for Replying and composing
vm-html-in-reply-columnReference for Replying and composing
vm-icalendar-description-linesCalendar invitations
vm-icalendar-description-linesReference for MIME and attachments
vm-icalendar-description-linesReference for MIME and attachments
vm-icalendar-show-descriptionCalendar invitations
vm-icalendar-show-descriptionReference for MIME and attachments
vm-icalendar-show-descriptionReference for MIME and attachments
vm-iconify-frame-hookHooks
vm-iconify-frame-hookHooks
vm-iconify-frame-hookReference for Hooks
vm-iconify-frame-hookReference for Hooks
vm-icontopbm-programReference for Helpers
vm-icontopbm-programReference for Helpers
vm-image-directoryReference for Other settings
vm-image-directoryReference for Other settings
vm-imagemagick-programDisplaying images
vm-imagemagick-programReference for Helpers
vm-imagemagick-programReference for Helpers
vm-imap-account-alistIMAP Folders
vm-imap-account-alistServer mail
vm-imap-account-alistReference for IMAP
vm-imap-account-alistReference for IMAP
vm-imap-auto-expunge-alistIMAP Spool Files
vm-imap-auto-expunge-alistReference for Folders
vm-imap-auto-expunge-alistReference for Folders
vm-imap-default-accountSaving copies
vm-imap-default-accountReference for IMAP
vm-imap-default-accountReference for IMAP
vm-imap-expunge-after-retrievingIMAP Spool Files
vm-imap-expunge-after-retrievingReference for Folders
vm-imap-expunge-after-retrievingReference for Folders
vm-imap-folder-cache-directoryIMAP Folders
vm-imap-folder-cache-directoryIMAP Folders
vm-imap-folder-cache-directoryServer mail
vm-imap-folder-cache-directoryReference for IMAP
vm-imap-folder-cache-directoryReference for IMAP
vm-imap-keep-trace-bufferPOP and IMAP Folders
vm-imap-keep-trace-bufferPOP and IMAP Folders
vm-imap-keep-trace-bufferReference for IMAP
vm-imap-keep-trace-bufferReference for IMAP
vm-imap-max-message-sizeIMAP Spool Files
vm-imap-max-message-sizeExternal Messages
vm-imap-max-message-sizeReference for IMAP
vm-imap-max-message-sizeReference for IMAP
vm-imap-message-bunch-sizeReference for IMAP
vm-imap-message-bunch-sizeReference for IMAP
vm-imap-refer-to-inbox-by-account-nameIMAP Folders
vm-imap-refer-to-inbox-by-account-nameReference for IMAP
vm-imap-refer-to-inbox-by-account-nameReference for IMAP
vm-imap-save-to-serverSaving Messages
vm-imap-save-to-serverReference for IMAP
vm-imap-save-to-serverReference for IMAP
vm-imap-server-timeoutReference for IMAP
vm-imap-server-timeoutReference for IMAP
vm-imap-session-preauth-hookPOP and IMAP Folders
vm-imap-session-preauth-hookReference for Hooks
vm-imap-session-preauth-hookReference for Hooks
vm-imap-tolerant-of-bad-imapReference for IMAP
vm-imap-tolerant-of-bad-imapReference for IMAP
vm-in-reply-to-formatReplying
vm-in-reply-to-formatReplying
vm-in-reply-to-formatReference for Replying and composing
vm-in-reply-to-formatReference for Replying and composing
vm-include-mime-attachmentsReference for Replying and composing
vm-include-mime-attachmentsReference for Replying and composing
vm-include-text-basicReplying
vm-include-text-basicReference for Replying and composing
vm-include-text-basicReference for Replying and composing
vm-include-text-from-presentationReplying
vm-included-mime-types-listReplying
vm-included-mime-types-listReference for Replying and composing
vm-included-mime-types-listReference for Replying and composing
vm-included-text-attribution-formatReplying
vm-included-text-attribution-formatReplying
vm-included-text-attribution-formatReference for Replying and composing
vm-included-text-attribution-formatReference for Replying and composing
vm-included-text-discard-header-regexpReplying
vm-included-text-discard-header-regexpReference for Replying and composing
vm-included-text-discard-header-regexpReference for Replying and composing
vm-included-text-headersReplying
vm-included-text-headersReference for Replying and composing
vm-included-text-headersReference for Replying and composing
vm-included-text-prefixSending Messages
vm-included-text-prefixReplying
vm-included-text-prefixReference for Replying and composing
vm-included-text-prefixReference for Replying and composing
vm-index-file-suffixIndex Files
vm-index-file-suffixReference for Folders
vm-index-file-suffixReference for Folders
vm-infer-mime-typesInferring MIME types
vm-infer-mime-typesInferring MIME types
vm-infer-mime-typesReference for MIME and attachments
vm-infer-mime-typesReference for MIME and attachments
vm-infer-mime-types-for-textInferring MIME types
vm-infer-mime-types-for-textInferring MIME types
vm-infer-mime-types-for-textReference for MIME and attachments
vm-infer-mime-types-for-textReference for MIME and attachments
vm-init-fileStarting Up
vm-init-fileWhere Settings Go
vm-init-fileWhere Settings Go
vm-init-fileReference for Other settings
vm-init-fileReference for Other settings
vm-invisible-header-regexpPreviewing
vm-invisible-header-regexpReference for Reading a message
vm-invisible-header-regexpReference for Reading a message
vm-jump-to-new-messagesNavigating
vm-jump-to-new-messagesReference for The summary
vm-jump-to-new-messagesReference for The summary
vm-jump-to-unread-messagesNavigating
vm-jump-to-unread-messagesReference for The summary
vm-jump-to-unread-messagesReference for The summary
vm-keep-crash-boxesReference for Folders
vm-keep-crash-boxesReference for Folders
vm-keep-sent-messagesReference for Replying and composing
vm-keep-sent-messagesReference for Replying and composing
vm-log-levelCustomizations
vm-log-levelReference for Other settings
vm-log-levelReference for Other settings
vm-log-max-linesCustomizations
vm-log-max-linesReference for Other settings
vm-log-max-linesReference for Other settings
vm-lynx-programReference for Helpers
vm-lynx-programReference for Helpers
vm-mail-auto-save-directoryCrash Recovery
vm-mail-auto-save-directorySending Options
vm-mail-auto-save-directorySending Options
vm-mail-auto-save-directoryReference for Replying and composing
vm-mail-auto-save-directoryReference for Replying and composing
vm-mail-check-alwaysGetting New Mail
vm-mail-check-alwaysReference for Folders
vm-mail-check-alwaysReference for Folders
vm-mail-check-intervalGetting New Mail
vm-mail-check-intervalReference for Folders
vm-mail-check-intervalReference for Folders
vm-mail-check-recipient-formatReference for Replying and composing
vm-mail-check-recipient-formatReference for Replying and composing
vm-mail-fcc-defaultReference for Postponed compositions
vm-mail-fcc-defaultReference for Postponed compositions
vm-mail-folder-alistReference for Postponed compositions
vm-mail-folder-alistReference for Postponed compositions
vm-mail-header-fromSetting Up
vm-mail-header-fromSending Options
vm-mail-header-fromReference for Replying and composing
vm-mail-header-fromReference for Replying and composing
vm-mail-header-insert-dateSending Options
vm-mail-header-insert-dateReference for Replying and composing
vm-mail-header-insert-dateReference for Replying and composing
vm-mail-header-insert-message-idSending Options
vm-mail-header-insert-message-idReference for Replying and composing
vm-mail-header-insert-message-idReference for Replying and composing
vm-mail-header-orderSending Options
vm-mail-header-orderReference for Replying and composing
vm-mail-header-orderReference for Replying and composing
vm-mail-hookHooks
vm-mail-hookHooks
vm-mail-hookReference for Hooks
vm-mail-hookReference for Hooks
vm-mail-mode-citation-kill-regexp-alistReference for Replying and composing
vm-mail-mode-citation-kill-regexp-alistReference for Replying and composing
vm-mail-mode-fake-date-pSending Options
vm-mail-mode-fake-date-pSending Options
vm-mail-mode-fake-date-pReference for Replying and composing
vm-mail-mode-fake-date-pReference for Replying and composing
vm-mail-mode-hidden-headersSending Options
vm-mail-mode-hidden-headersReference for Replying and composing
vm-mail-mode-hidden-headersReference for Replying and composing
vm-mail-mode-hookComposing setup
vm-mail-mode-hookHooks
vm-mail-mode-hookHooks
vm-mail-mode-hookReference for Hooks
vm-mail-mode-hookReference for Hooks
vm-mail-mode-open-line-regexpReference for Summary faces
vm-mail-mode-open-line-regexpReference for Summary faces
vm-mail-prompt-if-subject-emptyReference for Replying and composing
vm-mail-prompt-if-subject-emptyReference for Replying and composing
vm-mail-reorder-message-headersSending Options
vm-mail-reorder-message-headersReference for Replying and composing
vm-mail-reorder-message-headersReference for Replying and composing
vm-mail-send-hookHooks
vm-mail-send-hookHooks
vm-mail-send-hookReference for Hooks
vm-mail-send-hookReference for Hooks
vm-mail-subject-number-replyReference for Replying and composing
vm-mail-subject-number-replyReference for Replying and composing
vm-mail-subject-prefix-replacementsReference for Replying and composing
vm-mail-subject-prefix-replacementsReference for Replying and composing
vm-mail-to-headersReference for Postponed compositions
vm-mail-to-headersReference for Postponed compositions
vm-mail-to-regexpReference for Postponed compositions
vm-mail-to-regexpReference for Postponed compositions
vm-mail-use-sender-addressSending Options
vm-mail-use-sender-addressSending Options
vm-mail-use-sender-addressReference for Replying and composing
vm-mail-use-sender-addressReference for Replying and composing
vm-make-crash-box-nameSpool Files
vm-make-crash-box-nameReference for Folders
vm-make-crash-box-nameReference for Folders
vm-make-spool-file-nameSpool Files
vm-make-spool-file-nameReference for Folders
vm-make-spool-file-nameReference for Folders
vm-mboxcl2-strictFolder types
vm-mboxcl2-strictReference for Folders
vm-mboxcl2-strictReference for Folders
vm-menu-setup-hookHooks
vm-menu-setup-hookHooks
vm-menu-setup-hookReference for Hooks
vm-menu-setup-hookReference for Hooks
vm-message-history-maxReference for Message History
vm-message-history-maxReference for Message History
vm-message-history-mode-hookReference for Message History
vm-message-history-mode-hookReference for Message History
vm-mime-8bit-header-charsetsCharacter sets
vm-mime-8bit-header-charsetsReference for MIME and attachments
vm-mime-8bit-header-charsetsReference for MIME and attachments
vm-mime-8bit-text-transfer-encodingMIME characters
vm-mime-8bit-text-transfer-encodingMIME characters
vm-mime-8bit-text-transfer-encodingReference for MIME and attachments
vm-mime-8bit-text-transfer-encodingReference for MIME and attachments
vm-mime-all-attachments-directoryReference for MIME and attachments
vm-mime-all-attachments-directoryReference for MIME and attachments
vm-mime-alternative-show-methodmultipart/alternative
vm-mime-alternative-show-methodReference for MIME and attachments
vm-mime-alternative-show-methodReference for MIME and attachments
vm-mime-alternative-yank-methodReplying
vm-mime-alternative-yank-methodReference for MIME and attachments
vm-mime-alternative-yank-methodReference for MIME and attachments
vm-mime-attachment-auto-suffix-alistExternal display
vm-mime-attachment-auto-suffix-alistReference for MIME and attachments
vm-mime-attachment-auto-suffix-alistReference for MIME and attachments
vm-mime-attachment-auto-type-alistReference for MIME and attachments
vm-mime-attachment-auto-type-alistReference for MIME and attachments
vm-mime-attachment-save-directoryAttachments
vm-mime-attachment-save-directoryReference for MIME and attachments
vm-mime-attachment-save-directoryReference for MIME and attachments
vm-mime-attachment-source-directoryReference for MIME and attachments
vm-mime-attachment-source-directoryReference for MIME and attachments
vm-mime-auto-displayed-content-type-exceptionsViewing MIME
vm-mime-auto-displayed-content-type-exceptionsViewing MIME
vm-mime-auto-displayed-content-type-exceptionsmultipart/alternative
vm-mime-auto-displayed-content-type-exceptionsReference for MIME and attachments
vm-mime-auto-displayed-content-type-exceptionsReference for MIME and attachments
vm-mime-auto-displayed-content-typesViewing MIME
vm-mime-auto-displayed-content-typesViewing MIME
vm-mime-auto-displayed-content-typesDisplaying images
vm-mime-auto-displayed-content-typesReference for MIME and attachments
vm-mime-auto-displayed-content-typesReference for MIME and attachments
vm-mime-auto-save-all-attachments-subdirCustomizations
vm-mime-auto-save-all-attachments-subdirCustomizations
vm-mime-auto-save-all-attachments-subdirReference for MIME and attachments
vm-mime-auto-save-all-attachments-subdirReference for MIME and attachments
vm-mime-avoid-folding-content-typeReference for MIME and attachments
vm-mime-avoid-folding-content-typeReference for MIME and attachments
vm-mime-button-faceFaces
vm-mime-button-faceFaces
vm-mime-button-faceReference for Faces
vm-mime-button-faceReference for Faces
vm-mime-button-format-alistViewing MIME
vm-mime-button-format-alistReference for MIME and attachments
vm-mime-button-format-alistReference for MIME and attachments
vm-mime-button-mouse-faceReference for Faces
vm-mime-button-mouse-faceReference for Faces
vm-mime-charset-completion-alistReference for MIME and attachments
vm-mime-charset-completion-alistReference for MIME and attachments
vm-mime-charset-converter-alistCharacter sets
vm-mime-charset-converter-alistReference for MIME and attachments
vm-mime-charset-converter-alistReference for MIME and attachments
vm-mime-complete-html-for-external-viewerReference for MIME and attachments
vm-mime-complete-html-for-external-viewerReference for MIME and attachments
vm-mime-composition-armor-from-linesReference for MIME and attachments
vm-mime-composition-armor-from-linesReference for MIME and attachments
vm-mime-confirm-deleteAttachments
vm-mime-confirm-deleteReference for MIME and attachments
vm-mime-confirm-deleteReference for MIME and attachments
vm-mime-decode-for-previewViewing MIME
vm-mime-decode-for-previewReference for MIME and attachments
vm-mime-decode-for-previewReference for MIME and attachments
vm-mime-deletable-type-exceptionsAttachments
vm-mime-deletable-type-exceptionsReference for MIME and attachments
vm-mime-deletable-type-exceptionsReference for MIME and attachments
vm-mime-deletable-typesAttachments
vm-mime-deletable-typesReference for MIME and attachments
vm-mime-deletable-typesReference for MIME and attachments
vm-mime-delete-after-savingAttachments
vm-mime-delete-after-savingReference for MIME and attachments
vm-mime-delete-after-savingReference for MIME and attachments
vm-mime-delete-viewer-processesReference for MIME and attachments
vm-mime-delete-viewer-processesReference for MIME and attachments
vm-mime-deleted-object-labelReference for MIME and attachments
vm-mime-deleted-object-labelReference for MIME and attachments
vm-mime-digest-discard-header-regexpReference for Digests
vm-mime-digest-discard-header-regexpReference for Digests
vm-mime-digest-headersReference for Digests
vm-mime-digest-headersReference for Digests
vm-mime-display-functionHooks
vm-mime-display-functionHooks
vm-mime-display-functionReference for MIME and attachments
vm-mime-display-functionReference for MIME and attachments
vm-mime-display-image-strips-incrementallyReference for MIME and attachments
vm-mime-display-image-strips-incrementallyReference for MIME and attachments
vm-mime-encode-headers-regexpMIME headers
vm-mime-encode-headers-regexpMIME headers
vm-mime-encode-headers-regexpReference for MIME and attachments
vm-mime-encode-headers-regexpReference for MIME and attachments
vm-mime-encode-headers-typeMIME headers
vm-mime-encode-headers-typeMIME headers
vm-mime-encode-headers-typeReference for MIME and attachments
vm-mime-encode-headers-typeReference for MIME and attachments
vm-mime-encode-headers-words-regexpMIME headers
vm-mime-encode-headers-words-regexpMIME headers
vm-mime-encode-headers-words-regexpReference for MIME and attachments
vm-mime-encode-headers-words-regexpReference for MIME and attachments
vm-mime-external-content-type-exceptionsExternal display
vm-mime-external-content-type-exceptionsReference for MIME and attachments
vm-mime-external-content-type-exceptionsReference for MIME and attachments
vm-mime-external-content-types-alistExternal display
vm-mime-external-content-types-alistReference for MIME and attachments
vm-mime-external-content-types-alistReference for MIME and attachments
vm-mime-externalize-cid-referencesExternal display
vm-mime-externalize-cid-referencesReference for MIME and attachments
vm-mime-externalize-cid-referencesReference for MIME and attachments
vm-mime-forward-saved-attachmentsReference for MIME and attachments
vm-mime-forward-saved-attachmentsReference for MIME and attachments
vm-mime-honor-content-dispositionViewing MIME
vm-mime-honor-content-dispositionReference for MIME and attachments
vm-mime-honor-content-dispositionReference for MIME and attachments
vm-mime-ignore-composite-type-opaque-transfer-encodingReference for MIME and attachments
vm-mime-ignore-composite-type-opaque-transfer-encodingReference for MIME and attachments
vm-mime-ignore-mime-versionReference for MIME and attachments
vm-mime-ignore-mime-versionReference for MIME and attachments
vm-mime-ignore-missing-multipart-boundaryReference for MIME and attachments
vm-mime-ignore-missing-multipart-boundaryReference for MIME and attachments
vm-mime-internal-content-type-exceptionsInternal display
vm-mime-internal-content-type-exceptionsInternal display
vm-mime-internal-content-type-exceptionsReference for MIME and attachments
vm-mime-internal-content-type-exceptionsReference for MIME and attachments
vm-mime-internal-content-typesInternal display
vm-mime-internal-content-typesInternal display
vm-mime-internal-content-typesDisplaying images
vm-mime-internal-content-typesReference for MIME and attachments
vm-mime-internal-content-typesReference for MIME and attachments
vm-mime-max-message-sizeReference for MIME and attachments
vm-mime-max-message-sizeReference for MIME and attachments
vm-mime-max-text-line-lengthMIME characters
vm-mime-max-text-line-lengthMIME characters
vm-mime-max-text-line-lengthReference for MIME and attachments
vm-mime-max-text-line-lengthReference for MIME and attachments
vm-mime-multipart/related-show-methodmultipart/related
vm-mime-multipart/related-show-methodReference for MIME and attachments
vm-mime-multipart/related-show-methodReference for MIME and attachments
vm-mime-parts-display-separatorReference for MIME and attachments
vm-mime-parts-display-separatorReference for MIME and attachments
vm-mime-require-mime-version-headerReference for MIME and attachments
vm-mime-require-mime-version-headerReference for MIME and attachments
vm-mime-saveable-type-exceptionsAttachments
vm-mime-saveable-type-exceptionsReference for MIME and attachments
vm-mime-saveable-type-exceptionsReference for MIME and attachments
vm-mime-saveable-typesAttachments
vm-mime-saveable-typesReference for MIME and attachments
vm-mime-saveable-typesReference for MIME and attachments
vm-mime-shr-inhibit-imagesInternal display
vm-mime-shr-inhibit-imagesReference for MIME and attachments
vm-mime-shr-inhibit-imagesReference for MIME and attachments
vm-mime-text/html-handlerViewing setup
vm-mime-text/html-handlerInternal display
vm-mime-text/html-handlerReference for MIME and attachments
vm-mime-text/html-handlerReference for MIME and attachments
vm-mime-thumbnail-max-geometryReference for MIME and attachments
vm-mime-thumbnail-max-geometryReference for MIME and attachments
vm-mime-type-converter-alistViewing setup
vm-mime-type-converter-alistMIME type conversion
vm-mime-type-converter-alistReference for MIME and attachments
vm-mime-type-converter-alistReference for MIME and attachments
vm-mime-ucs-listReference for MIME and attachments
vm-mime-ucs-listReference for MIME and attachments
vm-mime-unflow-flowed-textInternal display
vm-mime-unflow-flowed-textReference for MIME and attachments
vm-mime-unflow-flowed-textReference for MIME and attachments
vm-mime-use-image-stripsDisplaying images
vm-mime-use-image-stripsReference for MIME and attachments
vm-mime-use-image-stripsReference for MIME and attachments
vm-mime-verify-signaturesReading Secure MIME
vm-mime-verify-signaturesReference for MIME and attachments
vm-mime-verify-signaturesReference for MIME and attachments
vm-mode-hookFolder Settings
vm-mode-hookHooks
vm-mode-hookHooks
vm-mode-hookReference for Hooks
vm-mode-hookReference for Hooks
vm-mode-hooksHooks
vm-mode-hooksHooks
vm-mode-hooksReference for Hooks
vm-mode-hooksReference for Hooks
vm-mode-mapKeys of your own
vm-mouse-track-summarySummary Faces
vm-mouse-track-summarySummary Faces
vm-mouse-track-summaryReference for The summary
vm-mouse-track-summaryReference for The summary
vm-move-after-deletingDeleting Messages
vm-move-after-deletingReference for The summary
vm-move-after-deletingReference for The summary
vm-move-after-killingDeleting Messages
vm-move-after-killingReference for The summary
vm-move-after-killingReference for The summary
vm-move-after-readingPaging
vm-move-after-readingReference for The summary
vm-move-after-readingReference for The summary
vm-move-after-undeletingDeleting Messages
vm-move-after-undeletingReference for The summary
vm-move-after-undeletingReference for The summary
vm-move-messages-physicallySorting Messages
vm-move-messages-physicallyReference for Folders
vm-move-messages-physicallyReference for Folders
vm-movemail-programLocal Folders
vm-movemail-programReference for Helpers
vm-movemail-programReference for Helpers
vm-movemail-program-switchesLocal Folders
vm-movemail-program-switchesReference for Helpers
vm-movemail-program-switchesReference for Helpers
vm-mutable-frame-configurationFrames and Windows
vm-mutable-frame-configurationReference for Windows and frames
vm-mutable-frame-configurationReference for Windows and frames
vm-mutable-window-configurationFrames and Windows
vm-mutable-window-configurationReference for Windows and frames
vm-mutable-window-configurationReference for Windows and frames
vm-open-line-in-quoted-textSending Options
vm-open-line-in-quoted-textSending Options
vm-open-line-in-quoted-textReference for Replying and composing
vm-open-line-in-quoted-textReference for Replying and composing
vm-page-continuation-glyphReference for Reading a message
vm-page-continuation-glyphReference for Reading a message
vm-paragraph-fill-columnPaging
vm-paragraph-fill-columnReference for Reading a message
vm-paragraph-fill-columnReference for Reading a message
vm-pcrisis-actionsMultiple Email Addresses
vm-pcrisis-actionsReference for Personality Crisis
vm-pcrisis-actionsReference for Personality Crisis
vm-pcrisis-auto-profiles-expunge-daysReference for Personality Crisis
vm-pcrisis-auto-profiles-expunge-daysReference for Personality Crisis
vm-pcrisis-auto-profiles-fileMultiple Email Addresses
vm-pcrisis-auto-profiles-fileReference for Personality Crisis
vm-pcrisis-auto-profiles-fileReference for Personality Crisis
vm-pcrisis-automorph-rulesMultiple Email Addresses
vm-pcrisis-automorph-rulesReference for Personality Crisis
vm-pcrisis-automorph-rulesReference for Personality Crisis
vm-pcrisis-conditionsMultiple Email Addresses
vm-pcrisis-conditionsReference for Personality Crisis
vm-pcrisis-conditionsReference for Personality Crisis
vm-pcrisis-current-bufferMultiple Email Addresses
vm-pcrisis-current-stateMultiple Email Addresses
vm-pcrisis-default-profileReference for Personality Crisis
vm-pcrisis-default-profileReference for Personality Crisis
vm-pcrisis-default-rulesMultiple Email Addresses
vm-pcrisis-default-rulesReference for Personality Crisis
vm-pcrisis-default-rulesReference for Personality Crisis
vm-pcrisis-expect-default-signatureMultiple Email Addresses
vm-pcrisis-expect-default-signatureReference for Personality Crisis
vm-pcrisis-expect-default-signatureReference for Personality Crisis
vm-pcrisis-forward-rulesMultiple Email Addresses
vm-pcrisis-forward-rulesReference for Personality Crisis
vm-pcrisis-forward-rulesReference for Personality Crisis
vm-pcrisis-mail-rulesMultiple Email Addresses
vm-pcrisis-mail-rulesReference for Personality Crisis
vm-pcrisis-mail-rulesReference for Personality Crisis
vm-pcrisis-mode-hookReference for Personality Crisis
vm-pcrisis-mode-hookReference for Personality Crisis
vm-pcrisis-newmail-rulesMultiple Email Addresses
vm-pcrisis-newmail-rulesReference for Personality Crisis
vm-pcrisis-newmail-rulesReference for Personality Crisis
vm-pcrisis-prompt-for-profile-headersReference for Personality Crisis
vm-pcrisis-prompt-for-profile-headersReference for Personality Crisis
vm-pcrisis-reply-rulesMultiple Email Addresses
vm-pcrisis-reply-rulesReference for Personality Crisis
vm-pcrisis-reply-rulesReference for Personality Crisis
vm-pcrisis-resend-rulesMultiple Email Addresses
vm-pcrisis-resend-rulesReference for Personality Crisis
vm-pcrisis-resend-rulesReference for Personality Crisis
vm-pipe-messages-to-command-endSaving Messages
vm-pipe-messages-to-command-startSaving Messages
vm-pop-auto-expunge-alistPOP Spool Files
vm-pop-auto-expunge-alistReference for Folders
vm-pop-auto-expunge-alistReference for Folders
vm-pop-expunge-after-retrievingPOP Spool Files
vm-pop-expunge-after-retrievingReference for Folders
vm-pop-expunge-after-retrievingReference for Folders
vm-pop-folder-alistPOP Folders
vm-pop-folder-alistServer mail
vm-pop-folder-alistReference for POP
vm-pop-folder-alistReference for POP
vm-pop-folder-cache-directoryPOP Folders
vm-pop-folder-cache-directoryPOP Folders
vm-pop-folder-cache-directoryServer mail
vm-pop-folder-cache-directoryReference for POP
vm-pop-folder-cache-directoryReference for POP
vm-pop-keep-trace-bufferPOP and IMAP Folders
vm-pop-keep-trace-bufferPOP and IMAP Folders
vm-pop-keep-trace-bufferReference for POP
vm-pop-keep-trace-bufferReference for POP
vm-pop-max-message-sizePOP Spool Files
vm-pop-max-message-sizeReference for POP
vm-pop-max-message-sizeReference for POP
vm-pop-md5-programPOP and IMAP Folders
vm-pop-server-timeoutReference for POP
vm-pop-server-timeoutReference for POP
vm-popup-menu-on-mouse-3Menus
vm-popup-menu-on-mouse-3Reference for The toolbar
vm-popup-menu-on-mouse-3Reference for The toolbar
vm-postpone-message-hookReference for Postponed compositions
vm-postpone-message-hookReference for Postponed compositions
vm-postpone-mode-hookReference for Postponed compositions
vm-postpone-mode-hookReference for Postponed compositions
vm-postponed-folderCrash Recovery
vm-postponed-folderPostponing Messages
vm-postponed-folderReference for Postponed compositions
vm-postponed-folderReference for Postponed compositions
vm-postponed-headerReference for Postponed compositions
vm-postponed-headerReference for Postponed compositions
vm-postponed-message-discard-header-regexpReference for Postponed compositions
vm-postponed-message-discard-header-regexpReference for Postponed compositions
vm-postponed-message-headersReference for Postponed compositions
vm-postponed-message-headersReference for Postponed compositions
vm-preferences-fileStarting Up
vm-preferences-fileWhere Settings Go
vm-preferences-fileReference for Other settings
vm-preferences-fileReference for Other settings
vm-presentation-minor-modesHTML display
vm-presentation-minor-modesReference for Reading a message
vm-presentation-minor-modesReference for Reading a message
vm-presentation-mode-hookHooks
vm-presentation-mode-hookHooks
vm-presentation-mode-hookReference for Hooks
vm-presentation-mode-hookReference for Hooks
vm-preserve-read-only-folders-on-diskStarting Up
vm-preserve-read-only-folders-on-diskReference for Other settings
vm-preserve-read-only-folders-on-diskReference for Other settings
vm-preview-linesPreviewing
vm-preview-linesReference for Reading a message
vm-preview-linesReference for Reading a message
vm-preview-read-messagesPreviewing
vm-preview-read-messagesReference for Reading a message
vm-preview-read-messagesReference for Reading a message
vm-primary-inboxStarting Up
vm-primary-inboxPOP and IMAP Folders
vm-primary-inboxLocal mail
vm-primary-inboxServer mail
vm-primary-inboxReference for Folders
vm-primary-inboxReference for Folders
vm-print-commandReference for Printing
vm-print-commandReference for Printing
vm-print-command-switchesReference for Printing
vm-print-command-switchesReference for Printing
vm-ps-print-each-message-header-linesReference for Printing
vm-ps-print-each-message-header-linesReference for Printing
vm-ps-print-each-message-left-headerReference for Printing
vm-ps-print-each-message-left-headerReference for Printing
vm-ps-print-each-message-right-headerReference for Printing
vm-ps-print-each-message-right-headerReference for Printing
vm-ps-print-each-message-summary-formatReference for Printing
vm-ps-print-each-message-summary-formatReference for Printing
vm-ps-print-message-font-sizeReference for Printing
vm-ps-print-message-font-sizeReference for Printing
vm-ps-print-message-functionReference for Printing
vm-ps-print-message-functionReference for Printing
vm-ps-print-message-header-linesReference for Printing
vm-ps-print-message-header-linesReference for Printing
vm-ps-print-message-left-headerReference for Printing
vm-ps-print-message-left-headerReference for Printing
vm-ps-print-message-right-headerReference for Printing
vm-ps-print-message-right-headerReference for Printing
vm-ps-print-message-separatorReference for Printing
vm-ps-print-message-separatorReference for Printing
vm-ps-print-message-summary-formatReference for Printing
vm-ps-print-message-summary-formatReference for Printing
vm-quit-hookHooks
vm-quit-hookHooks
vm-quit-hookReference for Hooks
vm-quit-hookReference for Hooks
vm-raise-frame-at-startupReference for Windows and frames
vm-raise-frame-at-startupReference for Windows and frames
vm-reply-hookHooks
vm-reply-hookHooks
vm-reply-hookReference for Hooks
vm-reply-hookReference for Hooks
vm-reply-ignored-addressesReplying
vm-reply-ignored-addressesReference for Replying and composing
vm-reply-ignored-addressesReference for Replying and composing
vm-reply-ignored-reply-tosReference for Replying and composing
vm-reply-ignored-reply-tosReference for Replying and composing
vm-reply-subject-prefixReplying
vm-reply-subject-prefixReference for Replying and composing
vm-reply-subject-prefixReference for Replying and composing
vm-report-subprocess-errorsReference for Other settings
vm-report-subprocess-errorsReference for Other settings
vm-resend-bounced-discard-header-regexpReference for Forward
vm-resend-bounced-discard-header-regexpReference for Forward
vm-resend-bounced-headersReference for Forward
vm-resend-bounced-headersReference for Forward
vm-resend-bounced-message-hookHooks
vm-resend-bounced-message-hookHooks
vm-resend-bounced-message-hookReference for Hooks
vm-resend-bounced-message-hookReference for Hooks
vm-resend-discard-header-regexpReference for Forward
vm-resend-discard-header-regexpReference for Forward
vm-resend-headersReference for Forward
vm-resend-headersReference for Forward
vm-resend-message-hookHooks
vm-resend-message-hookHooks
vm-resend-message-hookReference for Hooks
vm-resend-message-hookReference for Hooks
vm-restore-saved-summary-formatsSummary Format
vm-restore-saved-summary-formatsReference for The summary
vm-restore-saved-summary-formatsReference for The summary
vm-retrieved-spooled-mail-hookHooks
vm-retrieved-spooled-mail-hookHooks
vm-retrieved-spooled-mail-hookReference for Hooks
vm-retrieved-spooled-mail-hookReference for Hooks
vm-rfc1153-digest-discard-header-regexpReference for Digests
vm-rfc1153-digest-discard-header-regexpReference for Digests
vm-rfc1153-digest-headersReference for Digests
vm-rfc1153-digest-headersReference for Digests
vm-rfc934-digest-discard-header-regexpReference for Digests
vm-rfc934-digest-discard-header-regexpReference for Digests
vm-rfc934-digest-headersReference for Digests
vm-rfc934-digest-headersReference for Digests
vm-save-killed-messagePostponing Messages
vm-save-killed-messageReference for Postponed compositions
vm-save-killed-messageReference for Postponed compositions
vm-save-killed-messages-folderPostponing Messages
vm-save-killed-messages-folderReference for Postponed compositions
vm-save-killed-messages-folderReference for Postponed compositions
vm-save-message-hookHooks
vm-save-message-hookHooks
vm-save-message-hookReference for Hooks
vm-save-message-hookReference for Hooks
vm-save-using-auto-foldersSaving Messages
vm-save-using-auto-foldersSaving Messages
vm-save-using-auto-foldersReference for Dispose
vm-save-using-auto-foldersReference for Dispose
vm-search-other-framesFrame Configuration
vm-search-other-framesReference for Windows and frames
vm-search-other-framesReference for Windows and frames
vm-search-using-regexpsNavigating
vm-search-using-regexpsReference for Other settings
vm-search-using-regexpsReference for Other settings
vm-select-message-hookHooks
vm-select-message-hookHooks
vm-select-message-hookReference for Hooks
vm-select-message-hookReference for Hooks
vm-select-new-message-hookHooks
vm-select-new-message-hookHooks
vm-select-new-message-hookReference for Hooks
vm-select-new-message-hookReference for Hooks
vm-select-unread-message-hookHooks
vm-select-unread-message-hookHooks
vm-select-unread-message-hookReference for Hooks
vm-select-unread-message-hookReference for Hooks
vm-send-digest-hookHooks
vm-send-digest-hookHooks
vm-send-digest-hookReference for Hooks
vm-send-digest-hookReference for Hooks
vm-send-using-flowed-textMIME characters
vm-send-using-flowed-textMIME characters
vm-send-using-flowed-textReference for MIME and attachments
vm-send-using-flowed-textReference for MIME and attachments
vm-send-using-mimeSending Messages
vm-send-using-mimeSending MIME Messages
vm-send-using-mimeReference for MIME and attachments
vm-send-using-mimeReference for MIME and attachments
vm-serial-cookieReference for Serial mail
vm-serial-cookieReference for Serial mail
vm-serial-fccReference for Serial mail
vm-serial-fccReference for Serial mail
vm-serial-mail-signatureReference for Serial mail
vm-serial-mail-signatureReference for Serial mail
vm-serial-mails-alistReference for Serial mail
vm-serial-mails-alistReference for Serial mail
vm-serial-mode-hookReference for Serial mail
vm-serial-mode-hookReference for Serial mail
vm-serial-token-alistReference for Serial mail
vm-serial-token-alistReference for Serial mail
vm-serial-unknown-toReference for Serial mail
vm-serial-unknown-toReference for Serial mail
vm-session-trace-max-sizeBugs
vm-session-trace-max-sizeReference for Helpers
vm-session-trace-max-sizeReference for Helpers
vm-showing-message-hookReference for Hooks
vm-showing-message-hookReference for Hooks
vm-signature-facePreviewing
vm-signature-faceReference for Faces
vm-signature-faceReference for Faces
vm-skip-deleted-messagesNavigating
vm-skip-deleted-messagesReference for The summary
vm-skip-deleted-messagesReference for The summary
vm-skip-read-messagesNavigating
vm-skip-read-messagesReference for The summary
vm-skip-read-messagesReference for The summary
vm-smime-get-recipient-certificate-methodSending Secure MIME
vm-smime-get-recipient-certificate-methodSending Secure MIME
vm-smime-get-recipient-certificate-methodReference for MIME and attachments
vm-smime-get-recipient-certificate-methodReference for MIME and attachments
vm-sort-messages-by-delivery-dateSorting Messages
vm-sort-messages-by-delivery-dateReference for The summary
vm-sort-messages-by-delivery-dateReference for The summary
vm-sort-subthreadsThreading
vm-sort-subthreadsReference for The summary
vm-sort-subthreadsReference for The summary
vm-spam-score-headersSorting Messages
vm-spam-score-headersReference for Folders
vm-spam-score-headersReference for Folders
vm-spam-words-fileVirtual Selectors
vm-spam-words-fileReference for Folders
vm-spam-words-fileReference for Folders
vm-spool-file-suffixesSpool Files
vm-spool-file-suffixesReference for Folders
vm-spool-file-suffixesReference for Folders
vm-spool-filesSpool Files
vm-spool-filesLocal mail
vm-spool-filesReference for Folders
vm-spool-filesReference for Folders
vm-spooled-mail-waiting-hookHooks
vm-spooled-mail-waiting-hookHooks
vm-spooled-mail-waiting-hookReference for Hooks
vm-spooled-mail-waiting-hookReference for Hooks
vm-ssh-programPOP and IMAP Folders
vm-ssh-programReference for Helpers
vm-ssh-programReference for Helpers
vm-ssh-program-switchesReference for Helpers
vm-ssh-program-switchesReference for Helpers
vm-ssh-remote-commandPOP and IMAP Folders
vm-ssh-remote-commandReference for Helpers
vm-ssh-remote-commandReference for Helpers
vm-startup-hookHooks
vm-startup-hookHooks
vm-startup-hookReference for Hooks
vm-startup-hookReference for Hooks
vm-startup-with-summaryStarting Up
vm-startup-with-summaryStarting Up
vm-startup-with-summaryReference for The summary
vm-startup-with-summaryReference for The summary
vm-strip-reply-headersReplying
vm-strip-reply-headersReference for Replying and composing
vm-strip-reply-headersReference for Replying and composing
vm-stunnel-programPOP and IMAP Folders
vm-stunnel-programConfiguration
vm-stunnel-programReference for Helpers
vm-stunnel-programReference for Helpers
vm-stunnel-program-additional-configuration-filePOP and IMAP Folders
vm-stunnel-program-additional-configuration-fileReference for Helpers
vm-stunnel-program-additional-configuration-fileReference for Helpers
vm-stunnel-program-switchesReference for Helpers
vm-stunnel-program-switchesReference for Helpers
vm-stunnel-random-data-methodReference for Helpers
vm-stunnel-random-data-methodReference for Helpers
vm-stunnel-wants-configuration-fileReference for Helpers
vm-stunnel-wants-configuration-fileReference for Helpers
vm-subject-ignored-prefixSorting Messages
vm-subject-ignored-prefixVirtual Selectors
vm-subject-ignored-prefixReference for The summary
vm-subject-ignored-prefixReference for The summary
vm-subject-ignored-suffixSorting Messages
vm-subject-ignored-suffixVirtual Selectors
vm-subject-ignored-suffixReference for The summary
vm-subject-ignored-suffixReference for The summary
vm-subject-significant-charsSorting Messages
vm-subject-significant-charsReference for The summary
vm-subject-significant-charsReference for The summary
vm-subject-tag-prefixSorting Messages
vm-subject-tag-prefixReference for The summary
vm-subject-tag-prefixReference for The summary
vm-subject-tag-prefix-exceptionsSorting Messages
vm-subject-tag-prefix-exceptionsReference for The summary
vm-subject-tag-prefix-exceptionsReference for The summary
vm-suggest-checking-configurationSetting Up
vm-suggest-checking-configurationReference for Other settings
vm-suggest-checking-configurationReference for Other settings
vm-summary-arrowSummaries
vm-summary-arrowReference for The summary
vm-summary-arrowReference for The summary
vm-summary-attachment-indicatorSummary Format
vm-summary-attachment-indicatorReference for The summary
vm-summary-attachment-indicatorReference for The summary
vm-summary-attachment-mime-type-exceptionsReference for The summary
vm-summary-attachment-mime-type-exceptionsReference for The summary
vm-summary-attachment-mime-typesReference for The summary
vm-summary-attachment-mime-typesReference for The summary
vm-summary-enable-facesSummary Faces
vm-summary-enable-facesReference for Faces
vm-summary-enable-facesReference for Faces
vm-summary-enable-thread-foldingThread Folding
vm-summary-enable-thread-foldingReference for The summary
vm-summary-enable-thread-foldingReference for The summary
vm-summary-faces-alistSummary Faces
vm-summary-faces-alistReference for Summary faces
vm-summary-faces-alistReference for Summary faces
vm-summary-formatSummary setup
vm-summary-formatSummary Format
vm-summary-formatReference for The summary
vm-summary-formatReference for The summary
vm-summary-highlight-faceReference for Faces
vm-summary-highlight-faceReference for Faces
vm-summary-maximum-thread-indentationThreading
vm-summary-maximum-thread-indentationThreaded Summaries
vm-summary-maximum-thread-indentationReference for The summary
vm-summary-maximum-thread-indentationReference for The summary
vm-summary-mode-hookHooks
vm-summary-mode-hookHooks
vm-summary-mode-hookReference for Hooks
vm-summary-mode-hookReference for Hooks
vm-summary-mode-hooksHooks
vm-summary-mode-hooksHooks
vm-summary-mode-hooksReference for Hooks
vm-summary-mode-hooksReference for Hooks
vm-summary-pointer-update-hookHooks
vm-summary-pointer-update-hookHooks
vm-summary-pointer-update-hookReference for Hooks
vm-summary-pointer-update-hookReference for Hooks
vm-summary-postponed-indicatorSummary Format
vm-summary-postponed-indicatorReference for The summary
vm-summary-postponed-indicatorReference for The summary
vm-summary-principal-markerReference for The summary
vm-summary-principal-markerReference for The summary
vm-summary-recipient-markerSummary Format
vm-summary-recipient-markerReference for The summary
vm-summary-recipient-markerReference for The summary
vm-summary-redo-hookHooks
vm-summary-redo-hookHooks
vm-summary-redo-hookReference for Hooks
vm-summary-redo-hookReference for Hooks
vm-summary-show-thread-countThread Folding
vm-summary-show-thread-countThread Folding
vm-summary-show-thread-countReference for The summary
vm-summary-show-thread-countReference for The summary
vm-summary-show-threadsThreaded Summaries
vm-summary-show-threadsReference for The summary
vm-summary-show-threadsReference for The summary
vm-summary-strip-subject-tagsSorting Messages
vm-summary-strip-subject-tagsReference for The summary
vm-summary-strip-subject-tagsReference for The summary
vm-summary-thread-folding-on-motionThread Folding
vm-summary-thread-folding-on-motionThread Folding
vm-summary-thread-folding-on-motionReference for The summary
vm-summary-thread-folding-on-motionReference for The summary
vm-summary-thread-indent-levelThreading
vm-summary-thread-indent-levelThreaded Summaries
vm-summary-thread-indent-levelReference for The summary
vm-summary-thread-indent-levelReference for The summary
vm-summary-thread-indentation-by-referencesReference for The summary
vm-summary-thread-indentation-by-referencesReference for The summary
vm-summary-uninteresting-sendersSummary setup
vm-summary-uninteresting-sendersSummary Format
vm-summary-uninteresting-sendersVirtual Selectors
vm-summary-uninteresting-sendersVirtual Selectors
vm-summary-uninteresting-sendersReference for The summary
vm-summary-uninteresting-sendersReference for The summary
vm-summary-update-hookHooks
vm-summary-update-hookHooks
vm-summary-update-hookReference for Hooks
vm-summary-update-hookReference for Hooks
vm-summary-visibleThread Folding
vm-summary-visibleReference for The summary
vm-summary-visibleReference for The summary
vm-sync-thunderbird-statusFolder types
vm-sync-thunderbird-statusThunderbird Folders
vm-sync-thunderbird-statusThunderbird Folders
vm-sync-thunderbird-statusReference for Folders
vm-sync-thunderbird-statusReference for Folders
vm-temp-file-directoryReference for Other settings
vm-temp-file-directoryReference for Other settings
vm-thread-using-subjectThreading
vm-thread-using-subjectReference for The summary
vm-thread-using-subjectReference for The summary
vm-thunderbird-folder-directoryThunderbird Folders
vm-thunderbird-folder-directorySaving Messages
vm-thunderbird-folder-directoryReference for Folders
vm-thunderbird-folder-directoryReference for Folders
vm-toolbar-pixmap-directoryToolbar
vm-toolbar-pixmap-directoryReference for The toolbar
vm-toolbar-pixmap-directoryReference for The toolbar
vm-trust-content-lengthFolder types
vm-trust-content-lengthFolder types
vm-trust-content-lengthReference for Folders
vm-trust-content-lengthReference for Folders
vm-uncompface-programReference for Helpers
vm-uncompface-programReference for Helpers
vm-undisplay-buffer-hookHooks
vm-undisplay-buffer-hookHooks
vm-undisplay-buffer-hookReference for Hooks
vm-undisplay-buffer-hookReference for Hooks
vm-unforwarded-header-regexpForwarding Messages
vm-unforwarded-header-regexpReference for Forward
vm-unforwarded-header-regexpReference for Forward
vm-unforwarded-header-regexp-plainForwarding Messages
vm-unforwarded-header-regexp-plainReference for Forward
vm-unforwarded-header-regexp-plainReference for Forward
vm-url-browserUsing the Mouse
vm-url-browserReference for Url
vm-url-browserReference for Url
vm-url-browser-switchesReference for Url
vm-url-browser-switchesReference for Url
vm-url-retrieval-methodsReference for MIME and attachments
vm-url-retrieval-methodsReference for MIME and attachments
vm-url-retrieval-timeoutReference for MIME and attachments
vm-url-retrieval-timeoutReference for MIME and attachments
vm-url-search-limitFaces
vm-url-search-limitReference for Url
vm-url-search-limitReference for Url
vm-use-menubar-buttonsReference for The toolbar
vm-use-menubar-buttonsReference for The toolbar
vm-use-menusMenus
vm-use-menusReference for The toolbar
vm-use-menusReference for The toolbar
vm-use-presentation-minor-modesHTML display
vm-use-presentation-minor-modesHTML display
vm-use-presentation-minor-modesReference for Reading a message
vm-use-presentation-minor-modesReference for Reading a message
vm-use-toolbarToolbar
vm-use-toolbarReference for The toolbar
vm-use-toolbarReference for The toolbar
vm-verbal-timeCustomizations
vm-verbal-timeReference for Other settings
vm-verbal-timeReference for Other settings
vm-verbosityCustomizations
vm-verbosityCustomizations
vm-verbosityReference for Other settings
vm-verbosityReference for Other settings
vm-virtual-auto-delete-message-expungeReference for Virtual folder actions
vm-virtual-auto-delete-message-expungeReference for Virtual folder actions
vm-virtual-auto-delete-message-folderReference for Virtual folder actions
vm-virtual-auto-delete-message-folderReference for Virtual folder actions
vm-virtual-auto-delete-message-selectorvm-avirtual
vm-virtual-auto-delete-message-selectorReference for Virtual folder actions
vm-virtual-auto-delete-message-selectorReference for Virtual folder actions
vm-virtual-auto-folder-alistvm-avirtual
vm-virtual-auto-folder-alistReference for Virtual folder actions
vm-virtual-auto-folder-alistReference for Virtual folder actions
vm-virtual-check-case-fold-searchReference for Virtual folder actions
vm-virtual-check-case-fold-searchReference for Virtual folder actions
vm-virtual-check-diagnosticsReference for Virtual folder actions
vm-virtual-check-diagnosticsReference for Virtual folder actions
vm-virtual-default-directoryReference for Virtual folders
vm-virtual-default-directoryReference for Virtual folders
vm-virtual-filter-alistvm-avirtual
vm-virtual-filter-alistReference for Virtual folder actions
vm-virtual-filter-alistReference for Virtual folder actions
vm-virtual-folder-alistVirtual Folders
vm-virtual-folder-alistDefined Folders
vm-virtual-folder-alistReference for Virtual folders
vm-virtual-folder-alistReference for Virtual folders
vm-virtual-make-up-auto-folder-namesReference for Virtual folder actions
vm-virtual-make-up-auto-folder-namesReference for Virtual folder actions
vm-virtual-mirrorReference for Virtual folders
vm-virtual-mirrorReference for Virtual folders
vm-virtual-mode-hookHooks
vm-virtual-mode-hookHooks
vm-virtual-mode-hookReference for Hooks
vm-virtual-mode-hookReference for Hooks
vm-visible-headersPreviewing
vm-visible-headersReference for Reading a message
vm-visible-headersReference for Reading a message
vm-visit-folder-hookFolder Settings
vm-visit-folder-hookHooks
vm-visit-folder-hookHooks
vm-visit-folder-hookReference for Hooks
vm-visit-folder-hookReference for Hooks
vm-visit-when-savingSaving Messages
vm-visit-when-savingReference for Dispose
vm-visit-when-savingReference for Dispose
vm-vs-attachment-regexpVirtual Selectors
vm-w3m-display-inline-imagesHTML display
vm-w3m-display-inline-imagesReference for W3m
vm-w3m-display-inline-imagesReference for W3m
vm-w3m-programReference for Helpers
vm-w3m-programReference for Helpers
vm-w3m-safe-url-regexpHTML display
vm-w3m-safe-url-regexpReference for W3m
vm-w3m-safe-url-regexpReference for W3m
vm-warp-mouse-to-new-frameReference for Windows and frames
vm-warp-mouse-to-new-frameReference for Windows and frames
vm-window-configuration-fileWindow Configuration
vm-window-configuration-fileReference for Windows and frames
vm-window-configuration-fileReference for Windows and frames
vm-word-wrap-paragraphsPaging
vm-word-wrap-paragraphsReference for Reading a message
vm-word-wrap-paragraphsReference for Reading a message
vm-word-wrap-paragraphs-in-replyReference for Replying and composing
vm-word-wrap-paragraphs-in-replyReference for Replying and composing
vm-zero-drafts-start-composeReference for Postponed compositions
vm-zero-drafts-start-composeReference for Postponed compositions

W
w3m-force-redisplayHTML display
w3m-goto-article-functionHTML display
w3m-goto-article-functionUsing the Mouse
w3m-pop-up-framesHTML display


Internals Index

Jump to:   A   B   C   D   E   F   H   I   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y  
Index EntrySection

A
attachment buttonMIME Composition
attribute-modflagMessage Internals

B
Babyl formatFolder Internals
babyl-frob-flagMessage Internals
base 64Coding Systems
BellFrom_ folder typeFolder Internals
body-to-be-discardedMessage Internals
body-to-be-retrievedMessage Internals
bufferMessage Internals
byte-countMessage Internals

C
cacheMessage Internals
charsetCoding Systems
coding systemCoding Systems
coding-system-getCoding Systems
concurrencyTimers and Concurrency
Content-DescriptionMessage Internals
Content-DispositionMessage Internals
Content-IDMessage Internals
Content-Transfer-EncodingMessage Internals
Content-TypeMessage Internals
Content-TypeCoding Systems

D
declared-duplicatesMessage Internals
declared-parentMessage Internals
decode-coding-regionCoding Systems
decode-coding-stringCoding Systems
decoded-fromMessage Internals
decoded-full-nameMessage Internals
decoded-reply-toMessage Internals
decoded-reply-to-nameMessage Internals
decoded-sortable-subjectMessage Internals
decoded-subjectMessage Internals
decoded-summary-subjectMessage Internals
decoded-toMessage Internals
decoded-to-ccMessage Internals
decoded-to-cc-nameMessage Internals
deleted-flagMessage Internals
descriptionMessage Internals
display-errorMessage Internals
dispositionMessage Internals

E
edit-bufferMessage Internals
edited-flagMessage Internals
editingFolder Internals
encode-coding-regionCoding Systems
encode-coding-stringCoding Systems
encodingMessage Internals
endMessage Internals
extentsExtents and Overlays

F
filed-flagMessage Internals
forwarded-flagMessage Internals
forwardingFolder Internals
From_ folder typeFolder Internals
From_with-Content-Length folder typeFolder Internals
From-stuffingFolder Internals

H
header-startMessage Internals
headersMessage Internals
headers-to-be-discardedMessage Internals
headers-to-be-retrievedMessage Internals

I
idMessage Internals
imap-uidMessage Internals
imap-uid-validityMessage Internals
In-Reply-To headerThreading Internals
includeMIME Composition

L
label-stringMessage Internals
labelsMessage Internals
layout-is-convertedMessage Internals
line-countMessage Internals

M
markMessage Internals
mboxFolder Internals
message-access-methodMessage Internals
message-idMessage Internals
message-id-numberMessage Internals
message-symbolMessage Internals
message-typeMessage Internals
message/external-bodyMIME Display
MIMEFolder Internals
MIME buttonMIME Display
mime-charsetCoding Systems
mime-encoded-header-flagMessage Internals
mime-layoutMessage Internals
mirrored-message-symMessage Internals
MMDF formatFolder Internals
month-numberMessage Internals

N
new-flagMessage Internals
numberMessage Internals

O
overlaysExtents and Overlays

P
parentMessage Internals
partsMessage Internals
PGP/MIMESending Secure MIME
pop-uidlMessage Internals
previewingFolder Internals

Q
qdispositionMessage Internals
qtypeMessage Internals
quoted printableCoding Systems

R
readingFolder Internals
real-message-symMessage Internals
redistributed-flagMessage Internals
redistributingFolder Internals
referencesMessage Internals
References headerThreading Internals
replied-flagMessage Internals
replyingFolder Internals

S
saved-virtual-attributesMessage Internals
saved-virtual-mirror-dataMessage Internals
showingFolder Internals
sortable-datestringMessage Internals
spam-scoreMessage Internals
startMessage Internals
stuff-flagMessage Internals
su-endMessage Internals
su-startMessage Internals
su-summary-mouse-track-overlayMessage Internals
summaryMessage Internals
summary line, tokenizedSummary Internals
System VFolder Internals

T
textMessage Internals
text-endMessage Internals
thread-indentationMessage Internals
thread-indentationThreading Internals
thread-indentation-offsetMessage Internals
thread-listMessage Internals
thread-listThreading Internals
thread-subtreeMessage Internals
thread-subtreeThreading Internals
threads, buildingThreading Internals
timersTimers and Concurrency
to-namesMessage Internals
tokenized summary lineSummary Internals
typeMessage Internals

U
unconverted-layoutMessage Internals
unread-flagMessage Internals
unthreadThreading Internals
unusedMessage Internals

V
vheadersMessage Internals
vheaders-regexpMessage Internals
virtual-folder-definitionVirtual Folder Internals
virtual-messages-symMessage Internals
virtual-summaryMessage Internals
vm-check-mail-itimer-functionTimers and Concurrency
vm-component-buffersFolder Internals
vm-decode-mime-layoutMIME Display
vm-fetched-message-countFolder Internals
vm-fetched-messagesFolder Internals
vm-fetched-messagesFolder Internals
vm-flush-itimer-functionTimers and Concurrency
vm-folder-access-dataFolder Internals
vm-folder-access-methodFolder Internals
vm-folder-garbage-alistFolder Internals
vm-folder-read-onlyFolder Internals
vm-folder-typeFolder Internals
vm-folder-typeFolder Internals
vm-get-mail-itimer-functionTimers and Concurrency
vm-global-block-new-mailTimers and Concurrency
vm-image-modifiedMessage Internals
vm-include-mime-attachmentsMIME Composition
vm-key-functionsSorting Internals
vm-label-obarrayFolder Internals
vm-last-message-pointerFolder Internals
vm-mail-bufferUser Interaction
vm-mail-bufferUser Interaction
vm-menu-toggle-menubarUser Interaction
vm-messageSummary Internals
vm-message-garbageMessage Internals
vm-message-garbage-alistFolder Internals
vm-message-listFolder Internals
vm-message-listMessage Internals
vm-message-listSummary Internals
vm-message-listSummary Internals
vm-message-listTimers and Concurrency
vm-message-pointerFolder Internals
vm-message-pointerMessage Internals
vm-messages-needing-summary-updateSummary Internals
vm-mime-button-faceMIME Display
vm-mime-decodedFolder Internals
vm-mime-display-external-genericMessage Internals
vm-mime-display-internal-audio/basicMessage Internals
vm-mime-display-internal-image-xxxxMessage Internals
vm-mime-fake-attachment-overlaysMIME Composition
vm-mime-mule-charset-to-coding-alistCoding Systems
vm-mime-mule-coding-to-charset-alistCoding Systems
vm-mode-menu-mapUser Interaction
vm-numbering-redo-end-pointSummary Internals
vm-numbering-redo-start-pointSummary Internals
vm-presentation-bufferFolder Internals
vm-presentation-bufferUser Interaction
vm-presentation-buffer-handleFolder Internals
vm-real-buffersFolder Internals
vm-select-folder-buffer-and-validateUser Interaction
vm-select-folder-buffer-and-validateUser Interaction
vm-sort-compare-threadSorting Internals
vm-sort-compare-xxxxxxSorting Internals
vm-spooled-mail-waitingFolder Internals
vm-summary-bufferFolder Internals
vm-summary-bufferUser Interaction
vm-summary-formatSummary Internals
vm-summary-pointerFolder Internals
vm-summary-pointerSummary Internals
vm-summary-redo-start-pointSummary Internals
vm-system-stateFolder Internals
vm-thread-obarrayThreading Internals
vm-thread-subject-obarrayThreading Internals
vm-thread-using-subjectThreading Internals
vm-undo-record-listFolder Internals
vm-undo-record-pointerFolder Internals
vm-use-menusUser Interaction
vm-user-interaction-bufferUser Interaction
vm-user-interaction-bufferUser Interaction
vm-virtual-buffersFolder Internals
vm-virtual-folder-alistVirtual Folder Internals
vm-virtual-folder-definitionFolder Internals
vm-virtual-selector-arg-typeVirtual Folder Internals
vm-virtual-selector-clauseVirtual Folder Internals
vm-vs-alistVirtual Folder Internals
vm-vs-interactiveVirtual Folder Internals

W
written-flagMessage Internals

X
X-VM-BookmarkFolder Internals
X-VM-IMAP-RetrievedFolder Internals
X-VM-LabelsFolder Internals
X-VM-Last-ModifiedFolder Internals
X-VM-Message-orderFolder Internals
X-VM-POP-RetrievedFolder Internals
X-VM-Summary-FormatFolder Internals
X-VM-v5-DataMessage Internals
X-VM-v5-Data headerFolder Internals
X-VM-v5-Data headerMessage Internals
X-VM-VHeaderFolder Internals

Y
yankMIME Composition


GNU GENERAL PUBLIC LICENSE

Version 2, June 1991
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.

Preamble

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.

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  1. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The “Program”, below, refers to any such program or work, and a “work based on the Program” means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term “modification”.) Each licensee is addressed as “you”.

    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.

  2. You may copy and distribute verbatim copies of the Program’s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

    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.

  3. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
    1. You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
    2. You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
    3. If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

    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.

  4. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
    1. Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
    2. Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
    3. Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

    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.

  5. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
  6. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
  7. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients’ exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
  8. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

    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.

  9. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
  10. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

    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.

  11. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
    NO WARRANTY
  12. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  13. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

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.