Mercurial > hg > xemacs-beta
diff lisp/vm/vm-vars.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | ac2d302a0011 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/vm/vm-vars.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,2318 @@ +;;; VM user and internal variable initialization +;;; Copyright (C) 1989, 1990, 1991, 1993, 1994, 1995 Kyle E. Jones +;;; +;;; 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 1, 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +(provide 'vm-vars) + +(defvar vm-init-file "~/.vm" + "*Startup file for VM that is loaded the first time you run VM +in an Emacs session.") + +(defvar vm-options-file "~/.vm.options" + "*Secondary startup file for VM, loaded after vm-init-file. +This file is written and overwritten by VM and is not meant for +users to edit directly. Use the Options menu to change what +appears in this file.") + +(defvar vm-primary-inbox "~/INBOX" + "*Mail is moved from the system mailbox to this file for reading.") + +(defvar vm-crash-box "~/INBOX.CRASH" + "*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.") + +(defvar vm-keep-crash-boxes nil + "*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.") + +;; use this function to access vm-spool-files on the fly. this +;; allows us to use environmental variables without setting +;; vm-spool-files at load time and thereby making it hard to dump an +;; Emacs containing a preloaded VM. +(defun vm-spool-files () + (or vm-spool-files + (and (setq vm-spool-files (getenv "MAILPATH")) + (setq vm-spool-files + (vm-parse vm-spool-files + "\\([^:%?]+\\)\\([%?][^:]*\\)?\\(:\\|$\\)"))) + (and (setq vm-spool-files (getenv "MAIL")) + (setq vm-spool-files (list vm-spool-files))))) + +(defvar vm-spool-files nil + "*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 POP maildrop, +provided it can be matched by the value of vm-recognize-pop-maildrops. + + A POP maildrop specification has the following format: + + \"HOST:PORT:AUTH:USER:PASSWORD\" + + HOST is the host name of the POP server + PORT is the TCP port number to connect to (should normally be 110). + 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\", \"rpop\" and \"apop\". For \"pass\", the PASSWORD is sent to + the server with the POP PASS command. For \"rpop\", the PASSWORD + should be the string to be sent to the server via the RPOP + command. In this case the string is not really a secret; + authentication is done by other means. 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. + +CRASHBOX is the temporary file that VM uses to store mail in +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. + +NOTE: The values of vm-primary-inbox and vm-crash-box are ignored +when getting new mail if vm-spool-files is a list of lists. + +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.") + +(defvar vm-pop-md5-program "md5" + "*Program that reads a message on its standard input and writes an +MD5 digest on its output.") + +(defvar vm-recognize-pop-maildrops "^[^:]+:[^:]+:[^:]+:[^:]+:[^:]+" + "*Value if non-nil should be a regular expression that matches +spool names found in vm-spool-files that should be considered POP +maildrops. A nil value tells VM that all the spool names are to +be considered files.") + +(defvar vm-auto-get-new-mail t + "*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 and may occur while you are editing +other files. It should not disturb your editing, except perhaps +for a pause while the work is being done. The `itimer' package +must be installed for this to work. Otherwise a numeric value is +the same as a value of t.") + +(defvar vm-default-folder-type + (cond ((not (boundp 'system-configuration)) + 'From_) + ((or (string-match "-solaris" system-configuration) + (string-match "usg-unix-v" system-configuration) + (string-match "-ibm-aix" system-configuration)) + 'From_-with-Content-Length) + ((string-match "-sco" system-configuration) + 'mmdf) + (t 'From_)) + "*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. +Allowed types are: + + From_ + From_-with-Content-Length + mmdf + babyl + +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 From_-with-Content-Length you +must set vm-trust-From_-with-Content-Length non-nil.") + +(defvar vm-check-folder-types t + "*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. + +Depending on the value of vm-convert-folder-types VM will either +convert the messages to the appropriate type before saving or +incorporating them, or it will signal an error.") + +(defvar vm-convert-folder-types t + "*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.") + +(defvar vm-trust-From_-with-Content-Length + (eq vm-default-folder-type 'From_-with-Content-Length) + "*Non-nil value means that if the first message in a folder contains +a Content-Length header and begins with \"From \" VM can safely +assume that all messages in the folder have Content-Length headers +that specify the length of the text section of each message. VM +will then use these headers to determine message boundaries +instead of the usual way of searching for two newlines followed by a +line that begins with \"From \". + +If you set vm-default-folder-type to From_-with-Content-Length you +must set this variable non-nil.") + +(defvar vm-visible-headers + '("Resent-" + "From:" "Sender:" + "To:" "Apparently-To:" "Cc:" + "Subject:" + "Date:") + "*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 display last.") + +(defvar vm-invisible-header-regexp nil + "*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.") + +(defvar vm-highlighted-header-regexp nil + "*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. + +This does not work under version 18 Emacs. + +If you're using XEmacs, you might want to use the builtin +`highlight-headers' package instead. If so, then you should set +the variable vm-use-lucid-highlighting non-nil. You'll need to +set the various variables used by the highlight-headers package +to customize highlighting. vm-highlighted-header-regexp is +ignored in this case.") + +(defvar vm-use-lucid-highlighting + ;; (not (not ...)) to avoid the confusing value of 6. + (not (not (string-match "XEmacs" emacs-version))) + "*Non-nil means to use the `highlight-headers' package in XEmacs. +Nil means just use VM's builtin header highlighting code. + +FSF Emacs always uses VM's builtin highlighting code.") + +(defvar vm-highlighted-header-face 'bold + "*Face to be used to highlight headers. +This variable is ignored under Lucid Emacs. +See the documentation for the function `highlight-headers' +to find out how to customize header highlighting under Lucid Emacs.") + +(defvar vm-preview-lines 0 + "*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.") + +(defvar vm-preview-read-messages nil + "*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.") + +(defvar vm-auto-next-message t + "*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.") + +(defvar vm-honor-page-delimiters nil + "*Non-nil value causes VM to honor page delimiters (as specified by the +Emacs page-delimiter variable) when scrolling through a message.") + +(defvar vm-default-window-configuration + ;; startup = full screan summary + ;; quitting = full screen folder + ;; reading-message = folder on bottom, summary on top + ;; composing-message = full screen composition + ;; editing-message = full screen edit + ;; vm-summarize = folder on bottom, summary on top + '( + (startup + ((((top . 70) (left . 70))) + (((- (0 0 80 10) (0 10 80 40)) + ((nil summary) (nil message)) + ((nil nil nil t) (nil nil nil nil)))))) + (quitting + ((((top . 70) (left . 70))) + (((0 0 80 40) + ((nil message)) + ((nil nil nil t)))))) + (reading-message + ((((top . 70) (left . 70))) + (((- (0 0 80 10) (0 10 80 40)) + ((nil summary) (nil message)) + ((nil nil nil t) (nil nil nil nil)))))) + (composing-message + ((((top . 70) (left . 70))) + (((0 0 80 40) + ((nil composition)) + ((nil nil nil t)))))) + (editing-message + ((((top . 70) (left . 70))) + (((0 0 80 40) + ((nil edit)) + ((nil nil nil t)))))) + (vm-summarize + ((((top . 70) (left . 70))) + (((- (0 0 80 10) (0 10 80 40)) + ((nil summary) (nil message)) + ((nil nil nil t) (nil nil nil nil)))))) + ) + "Default window configuration for VM if the user does not specify one. +If you want to completely turn off VM's window configuration +feature, set this variable and vm-window-configuration-file to +nil in your .vm file. + +If you want to have a different window configuration setup than +this, you should not set this variable directly. Rather you +should set the variable vm-window-configuration-file to point at +a file, and use the command vm-save-window-configuration +(normally bound to `WS') to modify part of this configuration to +your liking. + +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.") + +(defvar vm-window-configuration-file "~/.vm.windows" + "*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.") + +(defvar vm-confirm-quit 0 + "*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.") + +(defvar vm-folder-directory nil + "*Directory where folders of mail are kept.") + +(defvar vm-confirm-new-folders nil + "*Non-nil value causes interactive calls to vm-save-message +to ask for confirmation before creating a new folder.") + +(defvar vm-delete-empty-folders t + "*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.") + +(defvar vm-flush-interval t + "*Non-nil value specifies how often VM flushes its cached internal +data. 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, isn't 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.") + +(defvar vm-visit-when-saving 0 + "*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 that is not nil and not t means VM will save to a folder's +buffer if that folder is being visited, otherwise VM saves to the folder +file itself.") + +(defvar vm-auto-folder-alist nil + "*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-NAME) ... + ...)) +where HEADER-NAME-REGEXP and REGEXP are strings, and FOLDER-NAME +is a string or an s-expression that evaluates to a string. + +If any part of the contents of the message header whose name is +matched by HEADER-NAME-REGEXP 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. 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. + +When FOLDER-NAME 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-NAME 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.") + +(defvar vm-auto-folder-case-fold-search nil + "*Non-nil value means VM will ignore case when matching header +contents while doing automatic folder selection via the variable +vm-auto-folder-alist.") + +(defvar vm-virtual-folder-alist nil + "*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-NAME ...) + (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-NAME should be the name of a real folder. There may be more than +one FOLDER-NAME listed, the SELECTORs within that sublist will apply to +them all. If FOLDER-NAME 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 folders specified by the FOLDER-NAMEs should be included +in the virtual folder. Some SELECTORs require an argument ARG; unless +otherwise noted ARG may be omitted. + +The recognized SELECTORs are: + + author - matches message if ARG matches the author; ARG should be a + regular expression. + 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. + any - matches any message. + deleted - matches message if it is flagged for deletion. + edited - matches message if it has been edited. + filed - matched message if it has been saved with its headers. + forwarded - matches message if it has been forwarded. + header - matches message if ARG matches any part of the header + portion of the message; ARG should be a + regular expression. + label - matches message if message has a label named ARG. + 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. + marked - matches message if it is marked, as with vm-mark-message. + new - matches message if it is new. + 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 word \"drum\" in their Subject header. + `or' takes any number of arguments. + read - matches message if it is neither new nor unread. + recipient - matches message if ARG matches any part of the recipient + list of the message. ARG should be a regular expression. + replied - matches message if it has been replied to. + 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. + subject - matches message if ARG matches any part of the message's + subject; 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. + unread - matches message if it is old but unread. + written - matches message if it has been saved without its headers. +") + +(defvar vm-virtual-mirror t + "*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'.") +(make-variable-buffer-local 'vm-virtual-mirror) + +(defvar vm-folder-read-only nil + "*Non-nil value causes a folder to be considered unmodifiable by VM. +Commands that modify message attributes or messages themselves are disallowed. +Commands that add or delete messages from the folder are disallowed. +Commands that scan or allow the reading of messages are allowed but the +`new' and `unread' message flags are not changed by them. + +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-read-only, normally bound to C-x C-q.") +(make-variable-buffer-local 'vm-folder-read-only) + +(defvar vm-included-text-prefix " > " + "*String used to prefix included text in replies.") + +(defvar vm-keep-sent-messages 1 + "*Non-nil value N causes VM to keep the last N messages sent from within VM. +`Keep' means that VM will not kill the VM mail 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.") + +(defvar vm-confirm-mail-send nil + "*Non-nil means ask before sending a mail message. +This affects vm-mail-send and vm-mail-send-and-exit in Mail mode.") + +(defvar vm-mail-header-from nil + "*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.") + +(defvar vm-reply-subject-prefix nil + "*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.") + +(defvar vm-reply-ignored-addresses nil + "*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.") + +(defvar vm-reply-ignored-reply-tos nil + "*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 a 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.") + +(defvar vm-in-reply-to-format "%i" + "*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.") + +(defvar vm-included-text-attribution-format "%F writes:\n" + "*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.") + +(defvar vm-included-text-headers nil + "*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 only +headers matched by that variable will be omitted; 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.") + +(defvar vm-included-text-discard-header-regexp nil + "*Non-nil value should be a regular expression header 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.") + +(defvar vm-forwarding-subject-format "forwarded message from %F" + "*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.") + +(defvar vm-forwarded-headers nil + "*List of headers that should be forwarded by vm-forward-message. +These 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 only headers +matched by that variable will be omitted; all 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.") + +(defvar vm-unforwarded-header-regexp "only-drop-this-header" + "*Non-nil value should be a regular expression header that tells +what headers should not be forwarded by vm-forward-message. 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 headers +matched by this variable will not be forwarded; all 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.") + +(defvar vm-forwarding-digest-type "rfc934" + "*Non-nil value should be a string that specifies the type of +message encapsulation format to use when forwarding a message. +Legal values of this variable are: + +\"rfc934\" +\"rfc1153\" +nil + +A nil value means don't use a digest, just mark the beginning and +end of the forwarded message.") + +(defvar vm-digest-preamble-format "\"%s\" (%F)" + "*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.") + +(defvar vm-digest-center-preamble t + "*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.") + +(defvar vm-digest-identifier-header-format "X-Digest: %s\n" + "*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.") + +(defvar vm-digest-burst-type "rfc934" + "*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\" + \"guess\" + +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.") + +(defvar vm-digest-send-type "rfc934" + "*String that specifies the type of digest vm-send-digest will use. +Legal values of this variable are: + +\"rfc934\" +\"rfc1153\" + +") + +(defvar vm-rfc934-digest-headers + '("Resent-" + "From:" "Sender:" + "To:" "Cc:" + "Subject:" + "Date:" + "Message-ID:" + "Keywords:") + "*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.") + +(defvar vm-rfc934-digest-discard-header-regexp nil + "*Non-nil value should be a regular expression header 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.") + +(defvar vm-rfc1153-digest-headers + '("Resent-" + "Date:" + "From:" "Sender:" + "To:" "Cc:" + "Subject:" + "Message-ID:" + "Keywords:") + "*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.") + +(defvar vm-rfc1153-digest-discard-header-regexp "\\(X400-\\)?Received:" + "*Non-nil value should be a regular expression header 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.") + +(defvar vm-resend-bounced-headers + '("Resent-" + "From:" "Sender:" "Reply-To:" + "To:" "Cc:" + "Subject:" + "Newsgroups:" + "In-Reply-To:" "References:" + "Keywords:" + "X-") + "*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.") + +(defvar vm-resend-bounced-discard-header-regexp nil + "*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.") + +(defvar vm-resend-headers nil + "*List of headers that should be 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.") + +(defvar vm-resend-discard-header-regexp "\\(\\(X400-\\)?Received:\\|Resent-\\)" + "*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-bounced-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.") + +(defvar vm-summary-format "%n %*%a %-17.17F %-3.3m %2d %4l/%-5c %I\"%s\"\n" + "*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 (always four characters wide) + The first char is `D', `N', `U' or ` ' for deleted, new, unread + and read messages respectively. + The second char is `F', `W' or ` ' for filed (saved) or written + messages. + The third char is `R', `Z' or ` ' for messages replied to, + and forwarded messages. + The fourth char is `E' if the message has been edited, ` ' otherwise. + A - longer version of attributes indicators (seven characters wide) + The first char is `D', `N', `U' or ` ' for deleted, new, unread + and read messages respectively. + The second is `r' or ` ', for message replied to. + The third is `z' or ` ', for messages forwarded. + The fourth is `b' or ` ', for messages redistributed. + The fifth is `f' or ` ', for messages filed. + The sixth is `w' or ` ', for messages written. + The seventh is `e' or ` ', for messages that have been edited. + 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 + s - message subject + t - addresses of the recipients of the message, in a comma-separated list + T - 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. + 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 + +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. + +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 +on the left instead of the right. + +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.") + +(defvar 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.") + +(defvar vm-summary-highlight-face 'bold + "*Face to use to highlight the summary entry for the current message. +Nil means don't highlight the current message's summary entry.") + +(defvar vm-summary-show-threads nil + "*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.") +(make-variable-buffer-local 'vm-summary-show-threads) + +(defvar vm-summary-thread-indent-level 2 + "*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.") + +(defvar vm-thread-using-subject t + "*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.") + +(defvar vm-summary-uninteresting-senders nil + "*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-uninteresting-senders-arrow (default \"To: +\") followed by what would be shown by the %T and %t specifiers +respectively.") + +(defvar vm-summary-uninteresting-senders-arrow "To: " + "*String to display before the string that is displayed instead of an +\"uninteresting\" sender. See vm-summary-uninteresting-senders.") + +(defvar vm-auto-center-summary nil + "*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.") + +(defvar vm-summary-subject-no-newlines t + "*Non-nil value means VM should replace newlines with spaces in the subject +displayed in the summary.") + +(defvar vm-subject-ignored-prefix "^\\(re: *\\)+" + "*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.") + +(defvar vm-subject-ignored-suffix "\\( (fwd)\\| \\)+$" + "*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.") + +(defvar vm-mutable-windows pop-up-windows + "*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.") + +(defvar vm-mutable-frames nil + "*Non-nil value means VM is allowed to create and destroy frames +to display and undisplay buffers. + +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 is _not_ an analogue of vm-mutable-windows. VM +still might create frames if this variable is nil. If you set +the vm-frame-per-* variables VM will still create frames. Using +the vm-frame-per-* variables you have more control over when it +happens. + +Users should consider setting vm-frame-per-folder and +vm-frame-per-composition and/or using the -other-frame commands +instead of setting this variable. If vm-mutable-frames is set to t, +then vm-mutable-windows should probably be set to nil so that you +avoid splitting frames. + +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 Emacs native +under X Windows or some other window system that allows multiple +Emacs frames.") + +(defvar vm-frame-per-folder t + "*Non-nil value causes the folder visiting commands to visit in a new frame. +Nil means the commands will use the current frame. This variable +does not apply to the VM commands whose names end in +-other-frame, which always create a new frame. + +This variable has no meaning if you're not running Emacs native +under X Windows or some other window system that allows multiple +Emacs frames.") + +(defvar vm-frame-per-summary nil + "*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 Emacs native +under X Windows or some other window system that allows multiple +Emacs frames.") + +(defvar vm-frame-per-composition t + "*Non-nil value causes the mail composition commands to open a new frame. +Nil means the commands will use the current frame. This variable +does not apply to the VM commands whose names end in +-other-frame, which always create a new frame. + +This variable has no meaning if you're not running Emacs native +under X Windows or some other window system that allows multiple +Emacs frames.") + +(defvar vm-frame-per-edit t + "*Non-nil value causes vm-edit-message to open a new frame. +Nil means the vm-edit-message will use the current frame. This +variable does not apply to vm-edit-message-other-frame, which +always create a new frame. + +This variable has no meaning if you're not running Emacs native +under X Windows or some other window system that allows multiple +Emacs frames.") + +;; #### Chuck, I know you don't like external package mods but +;; this one is an absolute travesty, and VM has a simply +;; abominable time between releases. If you don't at least give +;; the VM frames a special name, it makes it impossible for lots +;; of other things to work sensibly. +(defvar vm-frame-parameter-alist + (if (string-match "XEmacs" emacs-version) + '((folder ((name . "VM"))))) + "*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 `composition', `edit', `folder' or `summary'. +It specifies the type of frame that the following PARAMLIST applies to. + +`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 to 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'. + +This variable has no effect on frames created as a result of +having vm-mutable-frames set to non-nil.") + +(defvar vm-search-other-frames t + "*Non-nil means VM should search frames other than the selected frame +when looking for a window that is already displaying a buffer that +VM wants to display or undisplay.") + +(defvar vm-use-toolbar + '(next previous delete/undelete autofile file + reply compose print visit quit nil help) + "*Non-nil value causes VM to provide a toolbar interface. +Value should be a list of symbols that will determine which +toolbar buttons will appears and in what order. Valid symbol +value within the list are: + +autofile +compose +delete/undelete +file +help +next +previous +print +quit +reply +visit +nil + +If nil appears in the list, it should appear exactly once. All +buttons after nil in the list will be displayed flushright in +top/bottom toolbars and flush bottom in left/right toolbars. + +This variable only has meaning under XEmacs 19.12 and beyond. +See also vm-toolbar-orientation to control where the toolbar is placed.") + +(defvar vm-toolbar-orientation 'left + "*Value is a symbol that specifies where the VM toolbar is located. +Legal values are `left', `right' `top' and `bottom'. Any other +value will be interpreted as `top'. + +This variable only has meaning under XEmacs 19.12 and beyond.") + +(defvar vm-toolbar-pixmap-directory + (expand-file-name (concat data-directory "vm/")) + "*Value specifies the directory VM should find its toolbar pixmaps.") + +(defvar vm-use-menus '(folder motion send mark label sort + virtual undo dispose emacs nil help) + "*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 that they are listed +determine what menus will be in the menubar and how they are +ordered. Valid symbols 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.") + +(defvar vm-warp-mouse-to-new-frame nil + "*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.") + +;; if browse-url is around (always will be in XEmacs 19.14) use it; +;; otherwise do our own support. +(if (boundp 'browse-url-browser-function) + (defvaralias 'vm-url-browser 'browse-url-browser-function) + (defvar vm-url-browser + (cond ((fboundp 'w3-fetch-other-frame) + 'w3-fetch-other-frame) + ((fboundp 'w3-fetch) + 'w3-fetch) + (t 'vm-mouse-send-url-to-netscape)) + "*Non-nil value means VM should enable URL passing. +This means that VM will search for URLs (Universal Resource +Locators) in messages and make it possible for you to pass them +to a World Wide Web browser. + +Clicking mouse-2 on the URL will send it to the browser. + +Clicking mouse-3 on the URL will pop up a menu of browsers and +you can pick which one you want to use. + +Moving point to a character within the URL and pressing RETURN +will send the URL to the browser (Only in XEmacs). + +If the value of vm-url-browser is a string, it should specify +name of an external browser to run. The URL will be passed to +the program as its first argument. + +If the value of vm-url-browser is a symbol, if should specifiy a +Lisp function to call. The URL will be passed to the program as +its first and only argument. Use + + (setq vm-url-browser 'vm-mouse-send-url-to-netscape) + +for Netscape, and + + (setq vm-url-browser 'vm-mouse-send-url-to-mosaic) + +for Mosaic. The advantage of using them is that they will display +an URL using on existing Mosaic or Netscape process, if possible. + +A nil value means VM should not enable URL passing to browsers.")) + +(defvar vm-highlight-url-face 'bold-italic + "*Non-nil value should be a face to use display URLs found in messages. +Nil means don't highlight URLs.") + +(defvar vm-url-search-limit 12000 + "*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 mssage 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.") + +(defvar vm-display-xfaces nil + "*Non-nil means display images as specifies in X-Face headers. +This requires at least XEmacs 19.12 with native xface support compiled in.") + +(defvar vm-startup-with-summary t + "*Value tells VM whether to generate a summary when a folder is visited. +Nil means don't automatically generate a summary. + +A value of t means always generate a summary. + +A positive numeric value N means only generate a summary if there +are N or more messages. + +A negative numeric value -N means only generate a summary if +there are N or less messages.") + +(defvar vm-follow-summary-cursor t + "*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.") + +(defvar vm-jump-to-new-messages t + "*Non-nil value causes VM to jump to the first new message +whenever such messages arrive in a folder or the first time a +folder is visited. + +See also vm-jump-to-unread-messages.") + +(defvar vm-jump-to-unread-messages t + "*Non-nil value causes VM to jump to the first unread message +whenever such messages arrive in a folder or the first time a +folder is visited. New messages are considered unread in this +context so new messages will be jumped to as well. + +The value of vm-jump-to-new-messages takes precedence over the +setting of this variable. So if there are unread messages and +new messages VM will jump to the first new message, even if an +unread message appears before it in the folder, provided +vm-jump-to-new-messages is non-nil.") + +(defvar vm-skip-deleted-messages t + "*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.") + +(defvar vm-skip-read-messages nil + "*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.") + +(defvar vm-move-after-deleting nil + "*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.") + +(defvar vm-move-after-undeleting nil + "*Non-nil value causes VM's `u' command to automatically invoke +vm-next-message or vm-previous-message after undeleting, to move +past the undeleted messages. A value of t means motion should +honor the value of vm-circular-folders. A value that is not t +and not nil means that motion should be done as if +vm-circular-folders is set to nil.") + +(defvar vm-delete-after-saving nil + "*Non-nil value causes VM automatically to mark messages for deletion +after successfully saving them to a folder.") + +(defvar vm-delete-after-archiving nil + "*Non-nil value causes VM automatically to mark messages for deletion +after successfully auto-archiving them with the vm-auto-archive-messages +command.") + +(defvar vm-delete-after-bursting nil + "*Non-nil value causes VM automatically to mark a message for deletion +after it has been successfully burst by the vm-burst-digest command.") + +(defvar vm-circular-folders 0 + "*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.") + +(defvar vm-search-using-regexps nil + "*Non-nil value causes VM's search command to interpret user input as a +regular expression instead of as a literal string.") + +(defvar vm-move-messages-physically nil + "*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.") + +(defvar vm-edit-message-mode 'text-mode + "*Major mode to use when editing messages in VM.") + +(defvar vm-print-command lpr-command + "*Command VM uses to print messages.") + +(defvar vm-print-command-switches lpr-switches + "*Command line flags passed to the command named by vm-print-command. +VM uses vm-print-command to print messages.") + +(defvar vm-berkeley-mail-compatibility + (memq system-type '(berkeley-unix netbsd)) + "*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.") + +(defvar vm-strip-reply-headers nil + "*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 +to t, because as of Emacs v18.52 \"fakemail\" could not handle unstripped +headers.") + +(defvar vm-inhibit-startup-message nil + "*Non-nil causes VM not to display its copyright notice, disclaimers +etc. when started in the usual way.") + +(defvar vm-select-new-message-hook nil + "*List of hook functions called every time a message with the 'new' +attribute 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).") + +(defvar vm-select-unread-message-hook nil + "*List of hook functions called every time a message with the 'unread' +attribute 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).") + +(defvar vm-select-message-hook nil + "*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).") + +(defvar vm-arrived-message-hook nil + "*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).") + +(defvar vm-arrived-messages-hook nil + "*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. When the +hooks are run the current buffer will be the folder containing +the messages.") + +(defvar vm-reply-hook nil + "*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.") + +(defvar vm-forward-message-hook nil + "*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.") + +(defvar vm-resend-bounced-message-hook nil + "*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.") + +(defvar vm-resend-message-hook nil + "*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.") + +(defvar vm-send-digest-hook nil + "*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.") + +(defvar vm-mail-hook nil + "*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.") + +(defvar vm-summary-update-hook nil + "*List of hook functions called just after VM updates an existing +entry a folder summary.") + +(defvar vm-summary-redo-hook nil + "*List of hook functions called just after VM adds or deletes +entries from a folder summary.") + +(defvar vm-visit-folder-hook nil + "*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.") + +(defvar vm-retrieved-spooled-mail-hook nil + "*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.") + +(defvar vm-edit-message-hook nil + "*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.") + +(defvar vm-mail-mode-hook nil + "*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.") + +(defvar vm-mode-hook nil + "*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.") + +(defvar vm-mode-hooks nil + "*Old name for vm-mode-hook. +Supported for backward compatibility. +You should use the new name.") + +(defvar vm-summary-mode-hook nil + "*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.") + +(defvar vm-summary-mode-hooks nil + "*Old name for vm-summary-mode-hook. +Supported for backward compatibility. +You should use the new name.") + +(defvar vm-virtual-mode-hook nil + "*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.") + +(defvar vm-quit-hook nil + "*List of hook functions to run when you quit VM. +This applies to any VM quit command.") + +(defvar vm-summary-pointer-update-hook nil + "*List of hook functions to run when VM summary pointer is updated. +When the hooks are run, the current buffer will be the summary buffer.") + +(defvar vm-display-buffer-hook nil + "*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.") + +(defvar vm-undisplay-buffer-hook nil + "*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.") + +(defvar vm-iconify-frame-hook nil + "*List of hook functions that are run whenever VM iconifies a frame.") + +(defvar vm-menu-setup-hook nil + "*List of hook function that are run just after all menus are initialized.") + +(defvar mail-yank-hooks nil + "Hooks called after a message is yanked into a mail composition. + +(This hook is deprecated, you should use mail-citation-hook instead.) + +Value is a list of functions to be run. +Each hook function can find the newly yanked message between point and mark. +Each hook function should return with point and mark around the yanked message. + +See the documentation for vm-yank-message to see when VM will run +these hooks.") + +(defvar mail-citation-hook nil + "*Hook for modifying a citation just inserted in the mail buffer. +Each hook function can find the citation between (point) and (mark t). +And each hook function should leave point and mark around the citation +text as modified. + +If this hook is entirely empty (nil), a default action is taken +instead of no action.") + +(defvar mail-default-headers nil + "*A string containing header lines, to be inserted in outgoing messages. +It is inserted before you edit the message, +so you can edit or delete these lines.") + +(defvar mail-signature nil + "*Text inserted at end of mail buffer when a message is initialized. +If t, it means to insert the contents of the file `~/.signature'.") + +(defvar vm-rename-current-buffer-function nil + "*Non-nil value should be a function to call to rename a buffer. +Value should be something that can be passed to `funcall'. If +this variable is non-nil, VM will use this function instead of +its own buffer renaming code. The buffer to be renamed will be +the current buffer when the function is called.") + +(defvar mode-popup-menu nil + "The mode-specific popup menu. Automatically buffer local. +By default, when you press mouse-3 in VM, this menu is popped up.") +(make-variable-buffer-local 'mode-popup-menu) + +(defvar vm-movemail-program "movemail" + "*Name of program to use to move mail from the system spool +to another location. Normally this should be the movemail program +distributed with Emacs.") + +(defvar vm-netscape-program "netscape" + "*Name of program to use to run Netscape. +vm-mouse-send-url-to-netscape uses this.") + +(defvar vm-mosaic-program "Mosaic" + "*Name of program to use to run Mosaic. +vm-mouse-send-url-to-mosaic uses this.") + +(defvar vm-tale-is-an-idiot nil + "*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.") + +(defvar vm-maintainer-address "bug-vm@uunet.uu.net" + "Where to send VM bug reports.") + +(defvar vm-mode-map + (let ((map (make-sparse-keymap))) +;; unneeded now that VM buffers all have buffer-read-only == t. +;; (suppress-keymap map) + (define-key map "h" 'vm-summarize) + (define-key map "\M-n" 'vm-next-unread-message) + (define-key map "\M-p" 'vm-previous-unread-message) + (define-key map "n" 'vm-next-message) + (define-key map "p" 'vm-previous-message) + (define-key map "N" 'vm-next-message-no-skip) + (define-key map "P" 'vm-previous-message-no-skip) + (define-key map "\C-\M-n" 'vm-move-message-forward) + (define-key map "\C-\M-p" 'vm-move-message-backward) + (define-key map "\t" 'vm-goto-message-last-seen) + (define-key map "\r" 'vm-goto-message) + (define-key map "^" 'vm-goto-parent-message) + (define-key map "t" 'vm-expose-hidden-headers) + (define-key map " " 'vm-scroll-forward) + (define-key map "b" 'vm-scroll-backward) + (define-key map "\C-?" 'vm-scroll-backward) + (define-key map "d" 'vm-delete-message) + (define-key map "\C-d" 'vm-delete-message-backward) + (define-key map "u" 'vm-undelete-message) + (define-key map "U" 'vm-unread-message) + (define-key map "e" 'vm-edit-message) + (define-key map "a" 'vm-set-message-attributes) + (define-key map "j" 'vm-discard-cached-data) + (define-key map "k" 'vm-kill-subject) + (define-key map "f" 'vm-followup) + (define-key map "F" 'vm-followup-include-text) + (define-key map "r" 'vm-reply) + (define-key map "R" 'vm-reply-include-text) + (define-key map "\M-r" 'vm-resend-bounced-message) + (define-key map "B" 'vm-resend-message) + (define-key map "z" 'vm-forward-message) + (define-key map "c" 'vm-continue-composing-message) + (define-key map "@" 'vm-send-digest) + (define-key map "*" 'vm-burst-digest) + (define-key map "m" 'vm-mail) + (define-key map "g" 'vm-get-new-mail) + (define-key map "G" 'vm-sort-messages) + (define-key map "v" 'vm-visit-folder) + (define-key map "s" 'vm-save-message) + (define-key map "w" 'vm-save-message-sans-headers) + (define-key map "A" 'vm-auto-archive-messages) + (define-key map "S" 'vm-save-folder) + (define-key map "|" 'vm-pipe-message-to-command) + (define-key map "#" 'vm-expunge-folder) + (define-key map "q" 'vm-quit) + (define-key map "x" 'vm-quit-no-change) + (define-key map "i" 'vm-iconify-frame) + (define-key map "?" 'vm-help) + (define-key map "\C-_" 'vm-undo) + (define-key map "\C-xu" 'vm-undo) + (define-key map "!" 'shell-command) + (define-key map "<" 'vm-beginning-of-message) + (define-key map ">" 'vm-end-of-message) + (define-key map "\M-s" 'vm-isearch-forward) + (define-key map "=" 'vm-summarize) + (define-key map "L" 'vm-load-init-file) + (define-key map "l" (make-sparse-keymap)) + (define-key map "la" 'vm-add-message-labels) + (define-key map "ld" 'vm-delete-message-labels) + (define-key map "V" (make-sparse-keymap)) + (define-key map "VV" 'vm-visit-virtual-folder) + (define-key map "VC" 'vm-create-virtual-folder) + (define-key map "VA" 'vm-apply-virtual-folder) + (define-key map "VM" 'vm-toggle-virtual-mirror) + (define-key map "V?" 'vm-virtual-help) + (define-key map "M" (make-sparse-keymap)) + (define-key map "MN" 'vm-next-command-uses-marks) + (define-key map "Mn" 'vm-next-command-uses-marks) + (define-key map "MM" 'vm-mark-message) + (define-key map "MU" 'vm-unmark-message) + (define-key map "Mm" 'vm-mark-all-messages) + (define-key map "Mu" 'vm-clear-all-marks) + (define-key map "MC" 'vm-mark-matching-messages) + (define-key map "Mc" 'vm-unmark-matching-messages) + (define-key map "MT" 'vm-mark-thread-subtree) + (define-key map "Mt" 'vm-unmark-thread-subtree) + (define-key map "MS" 'vm-mark-messages-same-subject) + (define-key map "Ms" 'vm-unmark-messages-same-subject) + (define-key map "MA" 'vm-mark-messages-same-author) + (define-key map "Ma" 'vm-unmark-messages-same-author) + (define-key map "M?" 'vm-mark-help) + (define-key map "W" (make-sparse-keymap)) + (define-key map "WW" 'vm-apply-window-configuration) + (define-key map "WS" 'vm-save-window-configuration) + (define-key map "WD" 'vm-delete-window-configuration) + (define-key map "W?" 'vm-window-help) + (define-key map "\C-t" 'vm-toggle-threads-display) + (define-key map "\C-x\C-s" 'vm-save-buffer) + (define-key map "\C-x\C-w" 'vm-write-file) + (define-key map "\C-x\C-q" 'vm-toggle-read-only) + (define-key map "%" 'vm-change-folder-type) + (define-key map "\M-C" 'vm-show-copying-restrictions) + (define-key map "\M-W" 'vm-show-no-warranty) + ;; suppress-keymap provides these, but now that we don't use + ;; suppress-keymap anymore... + (define-key map "0" 'digit-argument) + (define-key map "1" 'digit-argument) + (define-key map "2" 'digit-argument) + (define-key map "3" 'digit-argument) + (define-key map "4" 'digit-argument) + (define-key map "5" 'digit-argument) + (define-key map "6" 'digit-argument) + (define-key map "7" 'digit-argument) + (define-key map "8" 'digit-argument) + (define-key map "9" 'digit-argument) + (define-key map "-" 'negative-argument) + map ) + "Keymap for VM mode.") + +(defvar vm-summary-mode-map vm-mode-map + "Keymap for VM Summary mode") + +(defvar vm-mail-mode-map + (let ((map (make-sparse-keymap))) + (define-key map "\C-c\C-v" vm-mode-map) + (define-key map "\C-c\C-y" 'vm-yank-message) + (define-key map "\C-c\C-s" 'vm-mail-send) + (define-key map "\C-c\C-c" 'vm-mail-send-and-exit) + (define-key map "\C-c\C-w" 'mail-signature) + (define-key map "\C-c\C-t" 'mail-text) + (define-key map "\C-c\C-q" 'mail-fill-yanked-message) + (define-key map "\C-c\C-f\C-t" 'mail-to) + (define-key map "\C-c\C-f\C-b" 'mail-bcc) + (define-key map "\C-c\C-f\C-s" 'mail-subject) + (define-key map "\C-c\C-f\C-c" 'mail-cc) + (define-key map "\C-c\C-f\C-f" 'mail-fcc) + map ) + "Keymap for VM Mail mode buffers.") + +(defvar vm-edit-message-map + (let ((map (make-sparse-keymap))) + (define-key map "\C-c\C-v" vm-mode-map) + (define-key map "\C-c\e" 'vm-edit-message-end) + (define-key map "\C-c\C-c" 'vm-edit-message-end) + (define-key map "\C-c\C-]" 'vm-edit-message-abort) + map ) + "Keymap for the buffers created by VM's vm-edit-message command.") + +(defvar vm-folder-history nil + "List of folders visited this Emacs session.") + +;; internal vars +(defvar vm-folder-type nil) +(make-variable-buffer-local 'vm-folder-type) +(defvar vm-message-list nil) +(make-variable-buffer-local 'vm-message-list) +(defvar vm-virtual-folder-definition nil) +(make-variable-buffer-local 'vm-virtual-folder-definition) +(defvar vm-virtual-buffers nil) +(make-variable-buffer-local 'vm-virtual-buffers) +(defvar vm-real-buffers nil) +(make-variable-buffer-local 'vm-real-buffers) +(defvar vm-message-pointer nil) +(make-variable-buffer-local 'vm-message-pointer) +(defvar vm-message-order-changed nil) +(make-variable-buffer-local 'vm-message-order-changed) +(defvar vm-message-order-header-present nil) +(make-variable-buffer-local 'vm-message-order-header-present) +(defvar vm-last-message-pointer nil) +(make-variable-buffer-local 'vm-last-message-pointer) +(defvar vm-mail-buffer nil) +(make-variable-buffer-local 'vm-mail-buffer) +(defvar vm-summary-buffer nil) +(make-variable-buffer-local 'vm-summary-buffer) +(defvar vm-summary-pointer nil) +(make-variable-buffer-local 'vm-summary-pointer) +(defvar vm-system-state nil) +(make-variable-buffer-local 'vm-system-state) +(defvar vm-undo-record-list nil) +(make-variable-buffer-local 'vm-undo-record-list) +(defvar vm-saved-undo-record-list nil) +(make-variable-buffer-local 'vm-saved-undo-record-list) +(defvar vm-undo-record-pointer nil) +(make-variable-buffer-local 'vm-undo-record-pointer) +(defvar vm-last-save-folder nil) +(make-variable-buffer-local 'vm-last-save-folder) +(defvar vm-last-written-file nil) +(make-variable-buffer-local 'vm-last-written-file) +(defvar vm-last-visit-folder nil) +(defvar vm-last-pipe-command nil) +(make-variable-buffer-local 'vm-last-pipe-command) +(defvar vm-messages-not-on-disk 0) +(make-variable-buffer-local 'vm-messages-not-on-disk) +(defvar vm-totals nil) +(make-variable-buffer-local 'vm-totals) +(defvar vm-modification-counter 0) +(make-variable-buffer-local 'vm-modification-counter) +(defvar vm-flushed-modification-counter nil) +(make-variable-buffer-local 'vm-flushed-modification-counter) +(defvar vm-messages-needing-summary-update nil) +(defvar vm-buffers-needing-display-update nil) +(defvar vm-numbering-redo-start-point nil) +(make-variable-buffer-local 'vm-numbering-redo-start-point) +(defvar vm-numbering-redo-end-point nil) +(make-variable-buffer-local 'vm-numbering-redo-end-point) +(defvar vm-summary-redo-start-point nil) +(make-variable-buffer-local 'vm-summary-redo-start-point) +(defvar vm-need-summary-pointer-update nil) +(make-variable-buffer-local 'vm-need-summary-pointer-update) +(defvar vm-thread-obarray nil) +(make-variable-buffer-local 'vm-thread-obarray) +(defvar vm-thread-subject-obarray nil) +(make-variable-buffer-local 'vm-thread-subject-obarray) +(defvar vm-label-obarray nil) +(make-variable-buffer-local 'vm-label-obarray) +(defvar vm-block-new-mail nil) +(make-variable-buffer-local 'vm-block-new-mail) +(defvar vm-saved-buffer-modified-p nil) +(make-variable-buffer-local 'vm-saved-buffer-modified-p) +(defvar vm-kept-mail-buffers nil) +(defvar vm-inhibit-write-file-hook nil) +(defvar vm-chop-full-name-function 'vm-choose-chop-full-name-function) +(defvar vm-session-beginning t) +(defvar vm-init-file-loaded nil) +(defvar vm-window-configurations nil) +(defvar vm-window-configuration nil) +(defvar vm-message-id-number 0) +(defconst vm-spool-directory + (or (and (boundp 'rmail-spool-directory) rmail-spool-directory) + "/usr/spool/mail/")) +(defconst vm-content-length-search-regexp "^Content-Length:.*\n\\|\\(\n\n\\)") +(defconst vm-content-length-header "Content-Length:") +(defconst vm-attributes-header-regexp + "^X-VM-\\(Attributes\\|v5-Data\\):\\(.*\n\\([ \t].*\n\\)*\\)") +(defconst vm-attributes-header "X-VM-v5-Data:") +(defconst vm-message-order-header-regexp "^X-VM-Message-Order:") +(defconst vm-message-order-header "X-VM-Message-Order:") +(defconst vm-bookmark-header-regexp "^X-VM-Bookmark:") +(defconst vm-bookmark-header "X-VM-Bookmark:") +(defconst vm-summary-header-regexp "^X-VM-Summary-Format:") +(defconst vm-summary-header "X-VM-Summary-Format:") +(defconst vm-vheader-header-regexp "^X-VM-VHeader:") +(defconst vm-vheader-header "X-VM-VHeader:") +(defconst vm-labels-header-regexp "^X-VM-Labels:") +(defconst vm-labels-header "X-VM-Labels:") +(defconst vm-berkeley-mail-status-header "Status: ") +(defconst vm-berkeley-mail-status-header-regexp "^Status: \\(..?\\)\n") +(defvar vm-matched-header-vector (make-vector 6 nil)) +(defconst vm-supported-folder-types + '("From_" "From_-with-Content-Length" "mmdf" "babyl")) +(defconst vm-supported-window-configurations + '(("default") + ("startup") + ("quitting") + ("composing-message") + ("editing-message") + ("marking-message") + ("reading-message") + ("searching-message") + ("vm-delete-message") + ("vm-delete-message-backward") + ("vm-undelete-message") + ("vm-kill-subject") + ("vm-expunge-folder") + ("vm-burst-digest") + ("vm-burst-rfc934-digest") + ("vm-burst-rfc1153-digest") + ("vm-edit-message") + ("vm-discard-cached-data") + ("vm-edit-message-end") + ("vm-edit-message-abort") + ("vm-unread-message") + ("vm-quit-no-change") + ("vm-quit") + ("vm-save-buffer") + ("vm-write-file") + ("vm-save-folder") + ("vm-save-and-expunge-folder") + ("vm-visit-folder") + ("vm-visit-folder-other-frame") + ("vm-visit-folder-other-window") + ("vm-help") + ("vm-get-new-mail") + ("vm-load-init-file") + ("vm") + ("vm-other-frame") + ("vm-other-window") + ("vm-toggle-read-only") + ("vm-mode") + ("vm-show-copying-restrictions") + ("vm-show-no-warranty") + ("vm-clear-all-marks") + ("vm-mark-all-messages") + ("vm-mark-message") + ("vm-unmark-message") + ("vm-mark-messages-same-subject") + ("vm-unmark-messages-same-subject") + ("vm-mark-messages-same-author") + ("vm-unmark-messages-same-author") + ("vm-mark-matching-messages") + ("vm-unmark-matching-messages") + ("vm-mark-thread-subtree") + ("vm-unmark-thread-subtree") + ("vm-next-command-uses-marks") + ("vm-mark-help") + ("vm-submit-bug-report") + ("vm-goto-message") + ("vm-goto-message-last-seen") + ("vm-next-message") + ("vm-previous-message") + ("vm-next-message-no-skip") + ("vm-previous-message-no-skip") + ("vm-next-unread-message") + ("vm-previous-unread-message") + ("vm-scroll-forward") + ("vm-scroll-backward") + ("vm-expose-hidden-headers") + ("vm-beginning-of-message") + ("vm-end-of-message") + ("vm-yank-message-other-folder") + ("vm-yank-message") + ("vm-mail-send-and-exit") + ("vm-mail-send") + ("vm-reply") + ("vm-reply-include-text") + ("vm-followup") + ("vm-followup-include-text") + ("vm-forward-message") + ("vm-forward-message-all-headers") + ("vm-mail") + ("vm-resend-bounced-message") + ("vm-resend-message") + ("vm-send-digest") + ("vm-send-rfc934-digest") + ("vm-send-rfc1153-digest") + ("vm-reply-other-frame") + ("vm-reply-include-text-other-frame") + ("vm-followup-other-frame") + ("vm-followup-include-text-other-frame") + ("vm-forward-message-other-frame") + ("vm-forward-message-all-headers-other-frame") + ("vm-mail-other-frame") + ("vm-mail-other-window") + ("vm-resend-bounced-message-other-frame") + ("vm-resend-message-other-frame") + ("vm-send-digest-other-frame") + ("vm-send-rfc934-digest-other-frame") + ("vm-send-rfc1153-digest-other-frame") + ("vm-continue-composing-message") + ("vm-auto-archive-messages") + ("vm-save-message") + ("vm-save-message-sans-headers") + ("vm-pipe-message-to-command") + ("vm-isearch-forward") + ("vm-move-message-forward") + ("vm-move-message-backward") + ("vm-move-message-forward-physically") + ("vm-move-message-backward-physically") + ("vm-sort-messages") + ("vm-toggle-threads-display") + ("vm-summarize") + ("vm-summarize-other-frame") + ("vm-undo") + ("vm-visit-virtual-folder") + ("vm-visit-virtual-folder-other-frame") + ("vm-visit-virtual-folder-other-window"))) +(defconst vm-supported-sort-keys + '("date" "reversed-date" + "author" "reversed-author" + "subject" "reversed-subject" + "recipients" "reversed-recipients" + "line-count" "reversed-line-count" + "byte-count" "reversed-byte-count" + "physical-order" "reversed-physical-order")) +(defconst vm-supported-interactive-virtual-selectors + '(("any") + ("header") + ("label") + ("text") + ("recipient") + ("author") + ("subject") + ("sent-before") + ("sent-after") + ("more-chars-than") + ("less-chars-than") + ("more-lines-than") + ("less-lines-than") + ("new") + ("unread") + ("read") + ("deleted") + ("replied") + ("forwarded") + ("filed") + ("written") + ("edited") + ("marked"))) +(defconst vm-supported-attribute-names + '("new" + "unread" + "read" + "deleted" + "replied" + "forwarded" + "redistributed" + "filed" + "written" + "edited" + "undeleted" + "unreplied" + "unforwarded" + "unredistributed" + "unfiled" + "unwritten" + "unedited" + ;; for babyl cogniscenti + "recent" + "unseen" + "answered" + "unanswered")) + +(defvar vm-key-functions nil) +(defconst vm-digest-type-alist '(("rfc934") ("rfc1153"))) +(defvar vm-completion-auto-correct t + "Non-nil means that minibuffer-complete-file should aggressively erase +the trailing part of a word that caused completion to fail, and retry +the completion with the resulting word.") +(defvar vm-minibuffer-completion-table nil + "Completion table used by vm-minibuffer-complete-word. +Should be just a list of strings, not an alist or an obarray.") +(defvar vm-completion-auto-space t + "Non-nil value means that vm-minibuffer-complete-word should automatically +append a space to words that complete unambiguously.") +(defconst vm-attributes-vector-length 9) +(defconst vm-cache-vector-length 20) +(defconst vm-softdata-vector-length 16) +(defconst vm-location-data-vector-length 6) +(defconst vm-mirror-data-vector-length 5) +(defconst vm-startup-message-lines + '("Please use \\[vm-submit-bug-report] to report bugs." + "You may give out copies of VM. Type \\[vm-show-copying-restrictions] to see the conditions" + "VM comes with ABSOLUTELY NO WARRANTY; type \\[vm-show-no-warranty] for full details" + "In Stereo (where available)")) +(defconst vm-startup-message-displayed nil) +;; for the mode line +(defvar vm-mode-line-format + '("" " %&%& " + ("VM: " + (vm-folder-read-only "read-only ") + (vm-virtual-folder-definition (vm-virtual-mirror "mirrored ")) + "%b" + (vm-mail-buffer (vm-ml-sort-keys ("" " by " vm-ml-sort-keys))) + (vm-message-list + (" " vm-ml-message-number + " (of " vm-ml-highest-message-number ")") + (vm-folder-type + " (unrecognized folder type)" + " (no messages)"))) + (vm-message-list + (" %[ " vm-ml-message-attributes-alist + (vm-ml-labels ("; " vm-ml-labels)) " %] ") + (" %[%] ")) + "%p" " " global-mode-string)) + +(defvar vm-ml-message-attributes-alist + '((vm-ml-message-new + "new" + (vm-ml-message-unread + "unread" + (vm-ml-message-read "read"))) + (vm-ml-message-edited " edited") + (vm-ml-message-filed " filed") + (vm-ml-message-written " written") + (vm-ml-message-replied " replied") + (vm-ml-message-forwarded " forwarded") + (vm-ml-message-redistributed " redistributed") + (vm-ml-message-deleted " deleted") + (vm-ml-message-marked " MARKED"))) +(defvar vm-ml-message-number nil) +(make-variable-buffer-local 'vm-ml-message-number) +(defvar vm-ml-highest-message-number nil) +(make-variable-buffer-local 'vm-ml-highest-message-number) +(defvar vm-ml-sort-keys nil) +(make-variable-buffer-local 'vm-ml-sort-keys) +(defvar vm-ml-labels nil) +(make-variable-buffer-local 'vm-ml-labels) +; unused now +;(defvar vm-ml-attributes-string nil) +;(make-variable-buffer-local 'vm-ml-attributes-string) +(defvar vm-ml-message-new nil) +(make-variable-buffer-local 'vm-ml-message-new) +(defvar vm-ml-message-unread nil) +(make-variable-buffer-local 'vm-ml-message-unread) +(defvar vm-ml-message-read nil) +(make-variable-buffer-local 'vm-ml-message-read) +(defvar vm-ml-message-edited nil) +(make-variable-buffer-local 'vm-ml-message-edited) +(defvar vm-ml-message-replied nil) +(make-variable-buffer-local 'vm-ml-message-replied) +(defvar vm-ml-message-forwarded nil) +(make-variable-buffer-local 'vm-ml-message-forwarded) +(defvar vm-ml-message-redistributed nil) +(make-variable-buffer-local 'vm-ml-message-redistributed) +(defvar vm-ml-message-deleted nil) +(make-variable-buffer-local 'vm-ml-message-deleted) +(defvar vm-ml-message-filed nil) +(make-variable-buffer-local 'vm-ml-message-filed) +(defvar vm-ml-message-written nil) +(make-variable-buffer-local 'vm-ml-message-written) +(defvar vm-ml-message-marked nil) +(make-variable-buffer-local 'vm-ml-message-marked) +;; to make the tanjed compiler shut up +(defvar vm-pop-read-point nil) +(defvar vm-reply-list nil) +(defvar vm-forward-list nil) +(defvar vm-redistribute-list nil) +(defvar current-itimer nil) +(defvar mode-popup-menu nil) +(defvar current-menubar nil) +(defvar scrollbar-height nil) +(defvar top-toolbar nil) +(defvar top-toolbar-height nil) +(defvar bottom-toolbar nil) +(defvar bottom-toolbar-height nil) +(defvar right-toolbar nil) +(defvar right-toolbar-width nil) +(defvar left-toolbar nil) +(defvar left-toolbar-width nil) +;; this defvar matches the XEmacs one so it doesn't matter if VM +;; is loaded before highlight-headers.el +(defvar highlight-headers-regexp "Subject[ \t]*:") +(defvar vm-url-regexp + "\\(file\\|ftp\\|gopher\\|http\\|https\\|news\\|wais\\|www\\)://[^ \t\n\f\r\"<>|()]*[^ \t\n\f\r\"<>|.!?(){}]" + "Regular expression that matches an absolute URL.") +(defconst vm-month-alist + '(("jan" "January" "1") + ("feb" "February" "2") + ("mar" "March" "3") + ("apr" "April" "4") + ("may" "May" "5") + ("jun" "June" "6") + ("jul" "July" "7") + ("aug" "August" "8") + ("sep" "September" "9") + ("oct" "October" "10") + ("nov" "November" "11") + ("dec" "December" "12"))) +(defvar vm-pop-passwords nil) +(defvar pop-up-frames nil) +(defvar vm-parse-date-workspace (make-vector 6 nil)) +;; cache so we don't call timezone-make-date-sortable so much. +;; messages have their own cache; this is for the virtual folder +;; alist selectors. +(defvar vm-sortable-date-alist nil) +(defvar vm-summary-=> nil) +(defvar vm-summary-no-=> nil) +(defvar vm-summary-overlay nil) +(make-variable-buffer-local 'vm-summary-overlay) +(defvar vm-thread-loop-obarray (make-vector 29 0)) +(defvar vm-delete-duplicates-obarray (make-vector 29 0)) +(defvar vm-mail-mode-map-parented nil) +(defvar vm-xface-cache (make-vector 29 0))