/[emacs]/emacs/lisp/mh-e/mh-customize.el
ViewVC logotype

Diff of /emacs/lisp/mh-e/mh-customize.el

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.6 by wohler, Tue Jul 13 03:06:23 2004 UTC revision 1.6.2.1 by miles, Sat Sep 4 12:01:04 2004 UTC
# Line 34  Line 34 
34  ;;  ;;
35  ;; 1. MH-E Customization Groups  ;; 1. MH-E Customization Groups
36  ;;  ;;
37  ;;    These are the customization group definitions. These are organized in a  ;;    These are the customization group definitions. Every group has a
38  ;;    logical order. High-level, windows and toolbar, folder, message,  ;;    associated manual node. The ordering is alphabetical, except for the
39  ;;    composing and hooks.  ;;    groups mh-faces and mh-hooks which are last .
40  ;;  ;;
41  ;; 2. MH-E Customization  ;; 2. MH-E Customization
42  ;;  ;;
43  ;;    Here are the actual customization variables. There is a sub-section for  ;;    These are the actual customization variables. There is a sub-section for
44  ;;    each group in the MH-E Customization Groups section. Within each  ;;    each group in the MH-E Customization Groups section, in the same order,
45  ;;    section, variables are sorted alphabetically. The manual section  ;;    separated by page breaks. Within each section, variables are sorted
46  ;;    dictates which group a variable should be placed. New variables should  ;;    alphabetically.
 ;;    be placed in the section where they would most likely be defined.  
47  ;;  ;;
48  ;;    All hooks should be placed in the 'mh-hook group; in addition, add the  ;; 3. Hooks
49  ;;    group in which the hook is defined in the manual (or, if it is new,  ;;
50  ;;    where it would be defined). These two actions insures that the hooks  ;;    All hooks must be placed in the mh-hook group; in addition, add the
51  ;;    appear last in each group.  ;;    group associated with the manual node in which the hook is described.
52    ;;    Since the mh-hook group appears near the end of this file, the hooks
53    ;;    will appear at the end of these other groups.
54    ;;
55    ;; 4. Faces
56    ;;
57    ;;    Create a new face group if necessary; in this case, add the group
58    ;;    associated with the manual node in which the faces are described to the
59    ;;    faces' group definition. Since the face groups appear last, the face
60    ;;    groups will appear at the end of these other groups.
61  ;;  ;;
 ;; 3. Faces  
   
62  ;;; Change Log:  ;;; Change Log:
63    
64  ;;; Code:  ;;; Code:
65    
66  (provide 'mh-customize)  (provide 'mh-customize)
67  (require 'mh-utils)  
68    (eval-when-compile (require 'mh-acros))
69    (mh-require-cl)
70    (require 'mh-loaddefs)
71    
72    (autoload 'Info-goto-node "info")
73    
74    (eval-and-compile
75      (defvar mh-xemacs-flag (featurep 'xemacs)
76        "Non-nil means the current Emacs is XEmacs."))
77    
78  (when mh-xemacs-flag  (when mh-xemacs-flag
79    (require 'mh-xemacs))    (require 'mh-xemacs))
80    
81  ;;;###mh-autoload  ;; XXX: Functions autoloaded from the following files are used to initialize
82    ;;  customizable variables. They are require'd here, since otherwise the
83    ;;  corresponding .elc would be loaded at compile time.
84    (eval-when-compile
85      (require 'mh-init)
86      (require 'mh-identity))
87    
88  (defun mh-customize (&optional delete-other-windows-flag)  (defun mh-customize (&optional delete-other-windows-flag)
89    "Customize MH-E variables.    "Customize MH-E variables.
90  With optional argument DELETE-OTHER-WINDOWS-FLAG, other windows in the frame  If optional argument DELETE-OTHER-WINDOWS-FLAG is non-nil, other windows in
91  are removed."  the frame are removed."
92    (interactive "P")    (interactive "P")
93    (customize-group 'mh)    (customize-group 'mh)
94    (when delete-other-windows-flag    (when delete-other-windows-flag
95      (delete-other-windows)))      (delete-other-windows)))
96    
97    
98    
99    ;;; For compiler warnings...
100    (defvar mh-show-buffer)
101    (defvar mh-show-folder-buffer)
102    
103  ;;; MH-E Customization Groups  ;;; MH-E Customization Groups
104    
105  (defgroup mh nil  (defgroup mh nil
106    "GNU Emacs interface to the MH mail system."    "Emacs interface to the MH mail system.
107    MH is the Rand Mail Handler. Other implementations include nmh and GNU
108    mailutils."
109    :link '(custom-manual "(mh-e)Top")    :link '(custom-manual "(mh-e)Top")
110    :group 'mail)    :group 'mail)
111    
112  (defgroup mh-toolbar nil  (defgroup mh-e '((mh custom-group))     ; Sort of an alias for 'mh group
113    "Toolbar configuration."    "Emacs interface to the MH mail system.
114    :prefix "mh-"  MH is the Rand Mail Handler. Other implementations include nmh and GNU
115    mailutils."
116      :link '(custom-manual "(mh-e)Top"))
117    
118    (defgroup mh-alias nil
119      "Aliases."
120      :link '(custom-manual "(mh-e)Aliases")
121      :prefix "mh-alias-"
122    :group 'mh)    :group 'mh)
123    
124  (defgroup mh-speed nil  (defgroup mh-folder nil
125    "Speedbar and folder configuration."    "Organizing your mail with folders."
126    :prefix "mh-"    :prefix "mh-"
127    :link '(custom-manual "(mh-e)Customizing Moving Mail")    :link '(custom-manual "(mh-e)Organizing")
128    :group 'mh)    :group 'mh)
129    
130  (defgroup mh-folder nil  (defgroup mh-folder-selection nil
131    "Options for controlling scan listing."    "Folder selection."
132    :prefix "mh-"    :prefix "mh-"
133    :link '(custom-manual "(mh-e)Customizing Moving Mail")    :link '(custom-manual "(mh-e)Folder Selection")
134      :group 'mh)
135    
136    (defgroup mh-identity nil
137      "Identities."
138      :link '(custom-manual "(mh-e)Identities")
139      :prefix "mh-identity-"
140      :group 'mh)
141    
142    (defgroup mh-inc nil
143      "Incorporating your mail."
144      :prefix "mh-inc-"
145      :link '(custom-manual "(mh-e)Incorporating Mail")
146    :group 'mh)    :group 'mh)
147    
148  (defgroup mh-index nil  (defgroup mh-index nil
149    "Indexed searching."    "Searching."
150    :link '(custom-manual "(mh-e)Customizing mh-e")    :link '(custom-manual "(mh-e)Searching")
151    :prefix "mh-"    :prefix "mh-index-"
152    :group 'mh)    :group 'mh)
153    
154  (defgroup mh-junk nil  (defgroup mh-junk nil
155    "Spam handling."    "Dealing with junk mail."
156    :link '(custom-manual "(mh-e)Customizing mh-e")    :link '(custom-manual "(mh-e)Junk")
157    :prefix "mh-junk-"    :prefix "mh-junk-"
158    :group 'mh)    :group 'mh)
159    
160  (defgroup mh-show nil  (defgroup mh-letter nil
161    "Message display."    "Editing a draft."
162    :prefix "mh-"    :prefix "mh-"
163    :link '(custom-manual "(mh-e)Customizing Reading")    :link '(custom-manual "(mh-e)Editing Drafts")
164    :group 'mh)    :group 'mh)
165    
166  (defgroup mh-faces nil  (defgroup mh-ranges nil
167    "Faces used in MH-E."    "Ranges."
   :link '(custom-manual "(mh-e)Customizing mh-e")  
168    :prefix "mh-"    :prefix "mh-"
169    :group 'faces    :link '(custom-manual "(mh-e)Ranges")
170    :group 'mh)    :group 'mh)
171    
172  (defgroup mh-letter nil  (defgroup mh-scan-line-formats nil
173    "Composing messages."    "Scan line formats."
174      :link '(custom-manual "(mh-e)Scan Line Formats")
175    :prefix "mh-"    :prefix "mh-"
   :link '(custom-manual "(mh-e)Customizing Sending")  
176    :group 'mh)    :group 'mh)
177    
178  (defgroup mh-alias nil  (defgroup mh-sending-mail nil
179    "Alias handling."    "Sending mail."
180    :link '(custom-manual "(mh-e)Customizing mh-e")    :prefix "mh-"
181    :prefix "mh-alias-"    :link '(custom-manual "(mh-e)Sending Mail")
182    :group 'mh)    :group 'mh)
183    
184  (defgroup mh-identity nil  (defgroup mh-sequences nil
185    "Multiple personalities."    "Sequences."
186    :link '(custom-manual "(mh-e)Customizing mh-e")    :prefix "mh-"
187      :link '(custom-manual "(mh-e)Sequences")
188      :group 'mh)
189    
190    (defgroup mh-show nil
191      "Reading your mail."
192    :prefix "mh-"    :prefix "mh-"
193      :link '(custom-manual "(mh-e)Reading Mail")
194      :group 'mh)
195    
196    (defgroup mh-speed nil
197      "The speedbar."
198      :prefix "mh-speed-"
199      :link '(custom-manual "(mh-e)Speedbar")
200      :group 'mh)
201    
202    (defgroup mh-toolbar nil
203      "The toolbar"
204      :link '(custom-manual "(mh-e)Toolbar")
205      :prefix "mh-"
206      :group 'mh)
207    
208    (defgroup mh-faces nil
209      "Faces used in MH-E."
210      :link '(custom-manual "(mh-e)Top")
211      :prefix "mh-"
212      :group 'faces
213    :group 'mh)    :group 'mh)
214    
215  (defgroup mh-hooks nil  (defgroup mh-hooks nil
216    "MH-E hooks."    "MH-E hooks."
217    :link '(custom-manual "(mh-e)Customizing mh-e")    :link '(custom-manual "(mh-e)Top")
218    :prefix "mh-"    :prefix "mh-"
219    :group 'mh)    :group 'mh)
220    
221  ;;; Faces  ;;; Faces
222    
 (defgroup mh-speed-faces nil  
   "Faces used in speedbar."  
   :link '(custom-manual "(mh-e)Customizing mh-e")  
   :prefix "mh-"  
   :group 'mh-faces  
   :group 'mh-speed)  
   
223  (defgroup mh-folder-faces nil  (defgroup mh-folder-faces nil
224    "Faces used in scan listing."    "Faces used in scan listing."
225    :link '(custom-manual "(mh-e)Customizing mh-e")    :link '(custom-manual "(mh-e)Organizing")
226    :prefix "mh-"    :prefix "mh-"
227    :group 'mh-faces    :group 'mh-faces
228    :group 'mh-folder)    :group 'mh-show)
229    
230  (defgroup mh-index-faces nil  (defgroup mh-index-faces nil
231    "Faces used in indexed searches."    "Faces used in searching."
232    :link '(custom-manual "(mh-e)Customizing mh-e")    :link '(custom-manual "(mh-e)Searching")
233    :prefix "mh-"    :prefix "mh-"
234    :group 'mh-faces    :group 'mh-faces
235    :group 'mh-index)    :group 'mh-index)
236    
237    (defgroup mh-letter-faces nil
238      "Faces used in message drafts."
239      :link '(custom-manual "(mh-e)Sending Mail")
240      :prefix "mh-"
241      :group 'mh-faces
242      :group 'mh-letter)
243    
244  (defgroup mh-show-faces nil  (defgroup mh-show-faces nil
245    "Faces used in message display."    "Faces used in message display."
246    :link '(custom-manual "(mh-e)Customizing mh-e")    :link '(custom-manual "(mh-e)Reading Mail")
247    :prefix "mh-"    :prefix "mh-"
248    :group 'mh-faces    :group 'mh-faces
249    :group 'mh-show)    :group 'mh-show)
250    
251  (defgroup mh-letter-faces nil  (defgroup mh-speed-faces nil
252    "Faces used when composing messages."    "Faces used in speedbar."
253    :link '(custom-manual "(mh-e)Customizing mh-e")    :link '(custom-manual "(mh-e)Speedbar")
254    :prefix "mh-"    :prefix "mh-"
255    :group 'mh-faces    :group 'mh-faces
256    :group 'mh-letter)    :group 'mh-speed)
257    
258    
259    
260  ;;; MH-E Customization (:group mh)  ;;; Emacs interface to the MH mail system (:group mh)
261    (eval-when (compile)
262  ;;; Toolbar configuration (:group 'mh-toolbar)    (setq mh-variant 'none))
263    
264  (defcustom mh-tool-bar-search-function 'mh-search-folder  (defcustom mh-variant 'autodetect
265    "*Function called by the tool-bar search button.    "*Specifies the variant used by MH-E.
266  See `mh-search-folder' and `mh-index-search' for details."  
267    :type '(choice (const mh-search-folder)  The default setting of this option is `Auto-detect' which means that MH-E will
268                   (const mh-index-search)  automatically choose the first of nmh, MH, or GNU mailutils that it finds in
269                   (function :tag "Other function"))  the directories listed in `mh-path', `mh-sys-path', and `exec-path'. If, for
270    :group 'mh-toolbar)  example, you have both nmh and mailutils installed and `mh-variant-in-use' was
271    initialized to nmh but you want to use mailutils, then you can set this option
272  ;; Functions called from the tool bar  to `mailutils'.
273  (defun mh-tool-bar-search (&optional arg)  
274    "Interactively call `mh-tool-bar-search-function'.  When this variable is changed, MH-E resets `mh-progs', `mh-lib',
275  Optional argument ARG is not used."  `mh-lib-progs', `mh-flists-present-flag', and `mh-variant-in-use'
276    (interactive "P")  accordingly."
277    (call-interactively mh-tool-bar-search-function))    :type `(radio
278              (const :tag "Auto-detect" autodetect)
279  (defun mh-tool-bar-customize ()            ,@(mapcar (lambda (x) `(const ,(car x))) (mh-variants)))
280    "Call `mh-customize' from the toolbar."    :set (lambda (symbol value)
281    (interactive)           (set-default symbol value)     ;Done in mh-variant-set-variant!
282    (mh-customize t))           (mh-variant-set value))
283      :group 'mh)
 (defun mh-tool-bar-folder-help ()  
   "Visit \"(mh-e)Top\"."  
   (interactive)  
   (Info-goto-node "(mh-e)Top")  
   (delete-other-windows))  
   
 (defun mh-tool-bar-letter-help ()  
   "Visit \"(mh-e)Draft Editing\"."  
   (interactive)  
   (Info-goto-node "(mh-e)Draft Editing")  
   (delete-other-windows))  
   
 (defmacro mh-tool-bar-reply-generator (function recipient folder-buffer-flag)  
   "Generate FUNCTION that replies to RECIPIENT.  
 If FOLDER-BUFFER-FLAG is nil then the function generated  
 When INCLUDE-FLAG is non-nil, include message body being replied to."  
   `(defun ,function (&optional arg)  
      ,(format "Reply to \"%s\".\nWhen ARG is non-nil include message in reply."  
               recipient)  
      (interactive "P")  
      ,(if folder-buffer-flag nil '(set-buffer mh-show-folder-buffer))  
      (mh-reply (mh-get-msg-num nil) ,recipient arg)))  
   
 (mh-tool-bar-reply-generator mh-tool-bar-reply-from "from" t)  
 (mh-tool-bar-reply-generator mh-show-tool-bar-reply-from "from" nil)  
 (mh-tool-bar-reply-generator mh-tool-bar-reply-to "to" t)  
 (mh-tool-bar-reply-generator mh-show-tool-bar-reply-to "to" nil)  
 (mh-tool-bar-reply-generator mh-tool-bar-reply-all "all" t)  
 (mh-tool-bar-reply-generator mh-show-tool-bar-reply-all "all" nil)  
284    
285  ;; XEmacs has a couple of extra customizations...  
 (mh-do-in-xemacs  
   (defcustom mh-xemacs-use-toolbar-flag (if (and (featurep 'toolbar)  
                                                  (featurep 'xpm)  
                                                  (device-on-window-system-p))  
                                             t  
                                           nil)  
     "*If non-nil, use toolbar.  
286    
287  This will default to t if you are in an environment that supports  ;;; Aliases (:group 'mh-alias)
 toolbars and xpm."  
     :type 'boolean  
     :group 'mh-toolbar)  
288    
289    (defcustom mh-xemacs-toolbar-position (if mh-xemacs-use-toolbar-flag  (defcustom mh-alias-completion-ignore-case-flag t
290                                              'default    "*Non-nil means don't consider case significant in MH alias completion.
291                                            nil)  As MH ignores case in the aliases, so too does MH-E. However, you may turn
292      "*Where to put the toolbar.  this option off to make case significant which can be used to segregate
293    completion of your aliases. You might use lowercase for mailing lists and
294    uppercase for people."
295      :type 'boolean
296      :group 'mh-alias)
297    
298  Valid non-nil values are \"default\", \"top\", \"bottom\", \"left\",  (defcustom mh-alias-expand-aliases-flag nil
299  \"right\".  These match the four edges of the frame, with \"default\"    "*Non-nil means to expand aliases entered in the minibuffer.
300  meaning \"use the same position as the default-toolbar\".  In other words, aliases entered in the minibuffer will be expanded to the full
301    address in the message draft. By default, this expansion is not performed."
302      :type 'boolean
303      :group 'mh-alias)
304    
305  A nil value means do not use a toolbar.  (defcustom mh-alias-flash-on-comma t
306      "*Specify whether to flash address or warn on translation.
307    This option controls the behavior when a [comma] is pressed while entering
308    aliases or addresses. The default setting flashes the address associated with
309    an address in the minibuffer briefly, but does not display a warning if the
310    alias is not found."
311      :type '(choice (const :tag "Flash but Don't Warn If No Alias" t)
312                     (const :tag "Flash and Warn If No Alias" 1)
313                     (const :tag "Don't Flash Nor Warn If No Alias" nil))
314      :group 'mh-alias)
315    
316  If this variable is set to anything other than \"default\" and the  (defcustom mh-alias-insert-file nil
317  default-toolbar has a different positional setting from the value of    "*Filename used to store a new MH-E alias.
318  this variable, then two toolbars will be displayed.  The MH-E toolbar  The default setting of this option is `Use Aliasfile Profile Component'. This
319  and the default-toolbar."  option can also hold the name of a file or a list a file names. If this option
320      :type '(radio (const :tag "Same position as the \"default-toolbar\""  is set to a list of file names, or the `Aliasfile:' profile component contains
321                           :value default)  more than one file name, MH-E will prompt for one of them when MH-E adds an
322                    (const :tag "Along the top edge of the frame"  alias."
323                           :value top)    :type '(choice (const :tag "Use Aliasfile Profile Component" nil)
324                    (const :tag "Along the bottom edge of the frame"                   (file :tag "Alias File")
325                           :value bottom)                   (repeat :tag "List of Alias Files" file))
326                    (const :tag "Along the left edge of the frame"    :group 'mh-alias)
                          :value left)  
                   (const :tag "Along the right edge of the frame"  
                          :value right)  
                   (const :tag "Don't use a toolbar" nil))  
     :group 'mh-toolbar))  
327    
328  (defmacro mh-tool-bar-define (defaults &rest buttons)  (defcustom mh-alias-insertion-location 'sorted
329    "Define a tool bar for MH-E.    "Specifies where new aliases are entered in alias files.
330  DEFAULTS is the list of buttons that are present by default. It is a list of  This option is set to `Alphabetical' by default. If you organize your alias
331  lists where the sublists are of the following form:  file in other ways, then adding aliases to the `Top' or `Bottom' of your alias
332    file might be more appropriate."
333      :type '(choice (const :tag "Alphabetical" sorted)
334                     (const :tag "Top" top)
335                     (const :tag "Bottom" bottom))
336      :group 'mh-alias)
337    
338    (:KEYWORD FUNC1 FUNC2 FUNC3 ...)  (defcustom mh-alias-local-users t
339      "*If on, local users are added to alias completion.
340    
341  Here :KEYWORD is one of :folder or :letter. If it is :folder then the default  Aliases are created from `/etc/passwd' entries with a user ID larger than
342  buttons in the folder and show mode buffers are being specified. If it is  a magical number, typically 200. This can be a handy tool on a machine where
343  :letter then the default buttons in the letter mode are listed. FUNC1, FUNC2,  you and co-workers exchange messages. These aliases have the form
344  FUNC3, ... are the names of the functions that the buttons would execute.  `local.first.last' if a real name is present in the password file.
345    Otherwise, the alias will have the form `local.login'.
346    
347  Each element of BUTTONS is a list consisting of four mandatory items and one  If you're on a system with thousands of users you don't know, and the loading
348  optional item as follows:  of local aliases slows MH-E down noticeably, then turn this option off.
349    
350    (FUNCTION MODES ICON DOC &optional ENABLE-EXPR)  This option also takes a string which is executed to generate the password
351    file. For example, use \"ypcat passwd\" to obtain the NIS password file."
352      :type '(choice (boolean) (string))
353      :group 'mh-alias)
354    
355  where,  (defcustom mh-alias-local-users-prefix "local."
356      "*String prepended to the real names of users from the password file.
357    This option can also be set to `Use Login'.
358    
359    FUNCTION is the name of the function that will be executed when the button  For example, consider the following password file entry:
   is clicked.  
360    
361    MODES is a list of symbols. List elements must be from `folder', `letter' and      psg:x:1000:1000:Peter S Galbraith,,,:/home/psg:/bin/tcsh
   `sequence'. If `folder' is present then the button is available in the  
   folder and show buffer. If the name of FUNCTION is of the form \"mh-foo\",  
   where foo is some arbitrary string, then we check if the function  
   `mh-show-foo' exists. If it exists then that function is used in the show  
   buffer. Otherwise the original function `mh-foo' is used in the show buffer  
   as well. Presence of `sequence' is handled similar to the above. The only  
   difference is that the button is shown only when the folder is narrowed to a  
   sequence. If `letter' is present in MODES, then the button is available  
   during draft editing and runs FUNCTION when clicked.  
362    
363    ICON is the icon that is drawn in the button.  The following settings of this option will produce the associated aliases:
364    
365    DOC is the documentation for the button. It is used in tool-tips and in      \"local.\"                  local.peter.galbraith
366    providing other help to the user. GNU Emacs uses only the first line of the      \"\"                        peter.galbraith
367    string. So the DOC should be formatted such that the first line is useful and      Use Login                   psg
   complete without the rest of the string.  
368    
369    Optional item ENABLE-EXPR is an arbitrary lisp expression. If it evaluates  This option has no effect if variable `mh-alias-local-users' is turned off."
370    to nil, then the button is deactivated, otherwise it is active. If is in't    :type '(choice (const :tag "Use Login" nil)
371    present then the button is always active."                   (string))
372    ;; The following variable names have been carefully chosen to make code    :group 'mh-alias)
   ;; generation easier. Modifying the names should be done carefully.  
   (let (folder-buttons folder-docs folder-button-setter sequence-button-setter  
         show-buttons show-button-setter show-seq-button-setter  
         letter-buttons letter-docs letter-button-setter  
         folder-defaults letter-defaults  
         folder-vectors show-vectors letter-vectors)  
     (dolist (x defaults)  
       (cond ((eq (car x) :folder) (setq folder-defaults (cdr x)))  
             ((eq (car x) :letter) (setq letter-defaults (cdr x)))))  
     (dolist (button buttons)  
       (unless (and (listp button)  
                    (or (equal (length button) 4) (equal (length button) 5)))  
         (error "Incorrect MH-E tool-bar button specification: %s" button))  
       (let* ((name (nth 0 button))  
              (name-str (symbol-name name))  
              (icon (nth 2 button))  
              (xemacs-icon (mh-do-in-xemacs  
                            (cdr (assoc (intern icon) mh-xemacs-icon-map))))  
              (full-doc (nth 3 button))  
              (doc (if (string-match "\\(.*\\)\n" full-doc)  
                       (match-string 1 full-doc)  
                     full-doc))  
              (enable-expr (or (nth 4 button) t))  
              (modes (nth 1 button))  
              functions show-sym)  
         (when (memq 'letter modes) (setq functions `(:letter ,name)))  
         (when (or (memq 'folder modes) (memq 'sequence modes))  
           (setq functions  
                 (append `(,(if (memq 'folder modes) :folder :sequence) ,name)  
                         functions))  
           (setq show-sym  
                 (if (string-match "^mh-\\(.*\\)$" name-str)  
                     (intern (concat "mh-show-" (match-string 1 name-str)))  
                   name))  
           (setq functions  
                 (append `(,(if (memq 'folder modes) :show :show-seq)  
                           ,(if (fboundp show-sym) show-sym name))  
                         functions)))  
         (do ((functions functions (cddr functions)))  
             ((null functions))  
           (let* ((type (car functions))  
                  (function (cadr functions))  
                  (type1 (substring (symbol-name type) 1))  
                  (vector-list (cond ((eq type :show) 'show-vectors)  
                                     ((eq type :show-seq) 'show-vectors)  
                                     ((eq type :letter) 'letter-vectors)  
                                     (t 'folder-vectors)))  
                  (list (cond ((eq type :letter) 'mh-tool-bar-letter-buttons)  
                              (t 'mh-tool-bar-folder-buttons)))  
                  (key (intern (concat "mh-" type1 "toolbar-" name-str)))  
                  (setter (intern (concat type1 "-button-setter")))  
                  (mbuttons (cond ((eq type :letter) 'letter-buttons)  
                                  ((eq type :show) 'show-buttons)  
                                  ((eq type :show-seq) 'show-buttons)  
                                  (t 'folder-buttons)))  
                  (docs (cond ((eq mbuttons 'letter-buttons) 'letter-docs)  
                              ((eq mbuttons 'folder-buttons) 'folder-docs))))  
             (add-to-list vector-list `[,xemacs-icon ,function t ,full-doc])  
             (add-to-list  
              setter `(when (member ',name ,list)  
                        (mh-funcall-if-exists  
                         tool-bar-add-item ,icon ',function ',key  
                                           :help ,doc :enable ',enable-expr)))  
             (add-to-list mbuttons name)  
             (if docs (add-to-list docs doc))))))  
     (setq folder-buttons (nreverse folder-buttons)  
           letter-buttons (nreverse letter-buttons)  
           show-buttons (nreverse show-buttons)  
           letter-docs (nreverse letter-docs)  
           folder-docs (nreverse folder-docs)  
           folder-vectors (nreverse folder-vectors)  
           show-vectors (nreverse show-vectors)  
           letter-vectors (nreverse letter-vectors))  
     (dolist (x folder-defaults)  
       (unless (memq x folder-buttons)  
         (error "Folder defaults contains unknown button '%s'" x)))  
     (dolist (x letter-defaults)  
       (unless (memq x letter-buttons)  
         (error "Letter defaults contains unknown button '%s'" x)))  
     `(eval-when (compile load eval)  
        (defvar mh-folder-tool-bar-map nil)  
        (defvar mh-folder-seq-tool-bar-map nil)  
        (defvar mh-show-tool-bar-map nil)  
        (defvar mh-show-seq-tool-bar-map nil)  
        (defvar mh-letter-tool-bar-map nil)  
        ;; GNU Emacs tool bar specific code  
        (mh-do-in-gnu-emacs  
          ;; Custom setter functions  
          (defun mh-tool-bar-folder-buttons-set (symbol value)  
            "Construct toolbar for `mh-folder-mode' and `mh-show-mode'."  
            (set-default symbol value)  
            (setq mh-folder-tool-bar-map  
                  (let ((tool-bar-map (make-sparse-keymap)))  
                    ,@(nreverse folder-button-setter)  
                    tool-bar-map))  
            (setq mh-show-tool-bar-map  
                  (let ((tool-bar-map (make-sparse-keymap)))  
                    ,@(nreverse show-button-setter)  
                    tool-bar-map))  
            (setq mh-show-seq-tool-bar-map  
                  (let ((tool-bar-map (copy-keymap mh-show-tool-bar-map)))  
                    ,@(nreverse show-seq-button-setter)  
                    tool-bar-map))  
            (setq mh-folder-seq-tool-bar-map  
                  (let ((tool-bar-map (copy-keymap mh-folder-tool-bar-map)))  
                    ,@(nreverse sequence-button-setter)  
                    tool-bar-map)))  
          (defun mh-tool-bar-letter-buttons-set (symbol value)  
            "Construct toolbar for `mh-letter-mode'."  
            (set-default symbol value)  
            (setq mh-letter-tool-bar-map  
                  (let ((tool-bar-map (make-sparse-keymap)))  
                    ,@(nreverse letter-button-setter)  
                    tool-bar-map))))  
        ;; XEmacs specific code  
        (mh-do-in-xemacs  
          (defvar mh-toolbar-folder-vector-map  
            ',(loop for button in folder-buttons  
                    for vector in folder-vectors  
                    collect (cons button vector)))  
          (defvar mh-toolbar-show-vector-map  
            ',(loop for button in show-buttons  
                    for vector in show-vectors  
                    collect (cons button vector)))  
          (defvar mh-toolbar-letter-vector-map  
            ',(loop for button in letter-buttons  
                    for vector in letter-vectors  
                    collect (cons button vector)))  
          (defvar mh-toolbar-folder-buttons nil)  
          (defvar mh-toolbar-show-buttons nil)  
          (defvar mh-toolbar-letter-buttons nil)  
          ;; Custom setter functions  
          (defun mh-tool-bar-letter-buttons-set (symbol value)  
            (set-default symbol value)  
            (setq mh-toolbar-letter-buttons  
                  (loop for b in value  
                        collect (cdr (assoc b mh-toolbar-letter-vector-map)))))  
          (defun mh-tool-bar-folder-buttons-set (symbol value)  
            (set-default symbol value)  
            (setq mh-toolbar-folder-buttons  
                  (loop for b in value  
                        collect (cdr (assoc b mh-toolbar-folder-vector-map))))  
            (setq mh-toolbar-show-buttons  
                  (loop for b in value  
                        collect (cdr (assoc b mh-toolbar-show-vector-map)))))  
          ;; Initialize toolbar  
          (defun mh-toolbar-init (mode)  
            "Install toolbar in MODE."  
            (let ((toolbar (cond ((eq mode :folder) mh-toolbar-folder-buttons)  
                                 ((eq mode :letter) mh-toolbar-letter-buttons)  
                                 ((eq mode :show) mh-toolbar-show-buttons)))  
                  (height 37)  
                  (width 40)  
                  (buffer (current-buffer)))  
              (when (and mh-xemacs-toolbar-position mh-xemacs-use-toolbar-flag)  
                (cond  
                 ((eq mh-xemacs-toolbar-position 'top)  
                  (set-specifier top-toolbar toolbar buffer)  
                  (set-specifier top-toolbar-visible-p t)  
                  (set-specifier top-toolbar-height height))  
                 ((eq mh-xemacs-toolbar-position 'bottom)  
                  (set-specifier bottom-toolbar toolbar buffer)  
                  (set-specifier bottom-toolbar-visible-p t)  
                  (set-specifier bottom-toolbar-height height))  
                 ((eq mh-xemacs-toolbar-position 'left)  
                  (set-specifier left-toolbar toolbar buffer)  
                  (set-specifier left-toolbar-visible-p t)  
                  (set-specifier left-toolbar-width width))  
                 ((eq mh-xemacs-toolbar-position 'right)  
                  (set-specifier right-toolbar toolbar buffer)  
                  (set-specifier right-toolbar-visible-p t)  
                  (set-specifier right-toolbar-width width))  
                 (t (set-specifier default-toolbar toolbar buffer)))))))  
        ;; Declare customizable toolbars  
        (custom-declare-variable  
         'mh-tool-bar-folder-buttons  
         '(list ,@(mapcar (lambda (x) `(quote ,x)) folder-defaults))  
         "Choose buttons to include in MH-E folder/show toolbar."  
         :group 'mh-toolbar :set 'mh-tool-bar-folder-buttons-set  
         :type '(set ,@(loop for x in folder-buttons  
                             for y in folder-docs  
                             collect `(const :tag ,y ,x))))  
        (custom-declare-variable  
         'mh-tool-bar-letter-buttons  
         '(list ,@(mapcar (lambda (x) `(quote ,x)) letter-defaults))  
         "Choose buttons to include in MH-E letter toolbar."  
         :group 'mh-toolbar :set 'mh-tool-bar-letter-buttons-set  
         :type '(set ,@(loop for x in letter-buttons  
                             for y in letter-docs  
                             collect `(const :tag ,y ,x)))))))  
373    
374  (mh-tool-bar-define  (defcustom mh-alias-passwd-gecos-comma-separator-flag t
375      ((:folder mh-inc-folder mh-mime-save-parts mh-previous-undeleted-msg    "*Non-nil means the gecos field in the password file uses a comma separator.
376                mh-page-msg  mh-next-undeleted-msg mh-delete-msg mh-refile-msg  In the example in `mh-alias-local-users-prefix', commas are used to separate
377                mh-undo mh-execute-commands mh-toggle-tick mh-reply  different values within the so-called gecos field. This is a fairly common
378                mh-alias-grab-from-field mh-send mh-rescan-folder  usage. However, in the rare case that the gecos field in your password file is
379                mh-tool-bar-search mh-visit-folder  not separated by commas and whose contents may contain commas, you can turn
380                mh-tool-bar-customize mh-tool-bar-folder-help mh-widen)  this option off."
381       (:letter mh-send-letter mh-compose-insertion ispell-message save-buffer    :type 'boolean
382                undo kill-region menu-bar-kill-ring-save yank mh-fully-kill-draft    :group 'mh-alias)
               mh-tool-bar-customize mh-tool-bar-letter-help))  
   ;; Folder/Show buffer buttons  
   (mh-inc-folder (folder) "mail"  
     "Incorporate new mail in Inbox  
 This button runs `mh-inc-folder' which drags any  
 new mail into your Inbox folder.")  
   (mh-mime-save-parts (folder) "attach"  
     "Save MIME parts from this message  
 This button runs `mh-mime-save-parts' which saves a message's  
 different parts into separate files.")  
   (mh-previous-undeleted-msg (folder) "left_arrow"  
     "Go to the previous undeleted message  
 This button runs `mh-previous-undeleted-msg'")  
   (mh-page-msg (folder) "page-down"  
     "Page the current message forwards\nThis button runs `mh-page-msg'")  
   (mh-next-undeleted-msg (folder) "right_arrow"  
     "Go to the next undeleted message\nThe button runs `mh-next-undeleted-msg'")  
   (mh-delete-msg (folder) "close"  
     "Mark this message for deletion\nThis button runs `mh-delete-msg'")  
   (mh-refile-msg (folder) "refile"  
     "Refile this message\nThis button runs `mh-refile-msg'")  
   (mh-undo (folder) "undo" "Undo last operation\nThis button runs `undo'")  
   (mh-execute-commands (folder) "execute"  
     "Perform moves and deletes\nThis button runs `mh-execute-commands'")  
   (mh-toggle-tick (folder) "highlight"  
     "Toggle tick mark\nThis button runs `mh-toggle-tick'")  
   (mh-toggle-showing (folder) "show"  
     "Toggle showing message\nThis button runs `mh-toggle-showing'")  
   (mh-tool-bar-reply-from (folder) "reply-from" "Reply to \"from\"")  
   (mh-tool-bar-reply-to (folder) "reply-to" "Reply to \"to\"")  
   (mh-tool-bar-reply-all (folder) "reply-all" "Reply to \"all\"")  
   (mh-reply (folder) "mail/reply2"  
     "Reply to this message\nThis button runs `mh-reply'")  
   (mh-alias-grab-from-field (folder) "alias"  
     "Grab From alias\nThis button runs `mh-alias-grab-from-field'"  
     (mh-alias-from-has-no-alias-p))  
   (mh-send (folder) "mail_compose"  
     "Compose new message\nThis button runs `mh-send'")  
   (mh-rescan-folder (folder) "rescan"  
     "Rescan this folder\nThis button runs `mh-rescan-folder'")  
   (mh-pack-folder (folder) "repack"  
     "Repack this folder\nThis button runs `mh-pack-folder'")  
   (mh-tool-bar-search (folder) "search"  
     "Search\nThis button runs `mh-tool-bar-search-function'")  
   (mh-visit-folder (folder) "fld_open"  
     "Visit other folder\nThis button runs `mh-visit-folder'")  
   ;; Letter buffer buttons  
   (mh-send-letter (letter) "mail_send" "Send this letter")  
   (mh-compose-insertion (letter) "attach" "Insert attachment")  
   (ispell-message (letter) "spell" "Check spelling")  
   (save-buffer (letter) "save" "Save current buffer to its file")  
   (undo (letter) "undo" "Undo last operation")  
   (kill-region (letter) "cut"  
     "Cut (kill) text in region between mark and current position")  
   (menu-bar-kill-ring-save (letter) "copy"  
     "Copy text in region between mark and current position")  
   (yank (letter) "paste" "Paste (yank) text cut or copied earlier")  
   (mh-fully-kill-draft (letter) "close" "Kill this draft")  
   ;; Common buttons  
   (mh-tool-bar-customize (folder letter) "preferences" "MH-E Preferences")  
   (mh-tool-bar-folder-help (folder) "help"  
     "Help! (general help)\nThis button runs `Info-goto-node'")  
   (mh-tool-bar-letter-help (letter) "help"  
     "Help! (general help)\nThis button runs `Info-goto-node'")  
   ;; Folder narrowed to sequence buttons  
   (mh-widen (sequence) "widen"  
     "Widen from the sequence\nThis button runs `mh-widen'"))  
383    
384    
385    
386  ;;; Speedbar and folder configuration (:group 'mh-speed)  ;;; Organizing Your Mail with Folders (:group 'mh-folder)
   
 (defcustom mh-large-folder 200  
   "The number of messages that indicates a large folder.  
 If a folder is deemed to be large, that is the number of messages in it exceed  
 this value, then confirmation is needed when it is visited. Even when  
 `mh-show-threads-flag' is non-nil, the folder is not automatically threaded, if  
 it is large. If set to nil all folders are treated as if they are small."  
   :type '(choice (const :tag "No limit") integer)  
   :group 'mh-speed)  
   
 (defcustom mh-speed-flists-interval 60  
   "Time between calls to flists in seconds.  
 If 0, flists is not called repeatedly."  
   :type 'integer  
   :group 'mh-speed)  
387    
388  (defcustom mh-speed-run-flists-flag t  (defcustom mh-recenter-summary-flag nil
389    "Non-nil means flists is used.    "*Non-nil means to recenter the summary window.
390  If non-nil, flists is executed every `mh-speed-flists-interval' seconds to  If this option is turned on, recenter the summary window when the show window
391  update the display of the number of unseen and total messages in each folder.  is toggled off."
 If resources are limited, this can be set to nil and the speedbar display can  
 be updated manually with the \\[mh-speed-flists] command."  
392    :type 'boolean    :type 'boolean
393    :group 'mh-speed)    :group 'mh-folder)
394    
395    
396    
397  ;;; Options for controlling scan listing (:group 'mh-folder)  ;;; Folder Selection (:group 'mh-folder-selection)
398    
399  (defcustom mh-adaptive-cmd-note-flag t  (defcustom mh-default-folder-for-message-function nil
400    "*Non-nil means that the message number width is determined dynamically.    "Function to select a default folder for refiling or `Fcc'.
401  This is done once when a folder is first opened by running scan on the last  The current buffer is set to the message being refiled with point at the start
402  message of the folder. The message number for the last message is extracted  of the message. This function should return the default folder as a string
403  and its width calculated. This width is used when calling `mh-set-cmd-note'.  with a leading `+' sign. It can also return nil so that the last folder name
404    is used as the default, or an empty string to suppress the default entirely."
405  If you prefer fixed-width message numbers, set this variable to nil and call    :type 'function
406  `mh-set-cmd-note' with the width specified by the scan format in    :group 'mh-folder-selection)
 `mh-scan-format-file'. For example, the default width is 4, so you would use  
 \"(mh-set-cmd-note 4)\" if `mh-scan-format-file' were nil."  
   :type 'boolean  
   :group 'mh-folder)  
407    
408  (defcustom mh-default-folder-list nil  (defcustom mh-default-folder-list nil
409    "*Alist of addresses and folders.    "*List of addresses and folders.
410  When refiling messages, these folders are the default that is provided if the  The folder name associated with the first address found in this list is used
411  sender (or recipient if the Check Recipient checkbox has been selected) has  as the default for `mh-refile-msg' and similar functions. Each element in this
412  the associated address, a regexp. The first entry to match will be used, so  list contains a `Check Recipient' item. If this item is turned on, then the
413  order them according to the wanted priority. You do not need to list your  address is checked against the recipient instead of the sender. This is useful
414  aliases here as that lookup is already performed.  for mailing lists.
415    
416  See `mh-prompt-for-refile-folder' and `mh-folder-from-address' for more  See `mh-prompt-for-refile-folder' and `mh-folder-from-address' for more
417  information."  information."
418    :type '(repeat (list (regexp :tag "Address")    :type '(repeat (list (regexp :tag "Address")
419                         (string :tag "Folder")                         (string :tag "Folder")
420                         (boolean :tag "Check Recipient")))                         (boolean :tag "Check Recipient")))
421    :group 'mh-folder)    :group 'mh-folder-selection)
422    
423  (defcustom mh-default-folder-must-exist-flag t  (defcustom mh-default-folder-must-exist-flag t
424    "*Non-nil means guessed folder name must exist to be used.    "*Non-nil means guessed folder name must exist to be used.
425  If this variable is t, then the guessed name is only used if the folder  If the derived folder does not exist, and this option is on, then the last
426  already exists\; if the folder doesn't exist, then the last folder name used  folder name used is suggested. This is useful if you get mail from various
427  is suggested. This is useful if you get mail from various people for whom you  people for whom you have an alias, but file them all in the same project
428  have an alias, but file them all in the same project folder.  folder.
429    
430  See `mh-prompt-for-refile-folder' and `mh-folder-from-address' for more  See `mh-prompt-for-refile-folder' and `mh-folder-from-address' for more
431  information."  information."
432    :type 'boolean    :type 'boolean
433    :group 'mh-folder)    :group 'mh-folder-selection)
434    
435  (defcustom mh-default-folder-prefix ""  (defcustom mh-default-folder-prefix ""
436    "*Prefix used for guessed folder names.    "*Prefix used for folder names generated from aliases.
437  This can be used to put folders associated with your aliases in a sub-folder  The prefix is used to prevent clutter in your mail directory.
438  so as to not clutter your mail directory.  
439  See `mh-prompt-for-refile-folder' and `mh-folder-from-address' for more  See `mh-prompt-for-refile-folder' and `mh-folder-from-address' for more
440  information."  information."
441    :type 'string    :type 'string
442    :group 'mh-folder)    :group 'mh-folder-selection)
443    
444  (defcustom mh-inc-prog "inc"  
   "*Program to run to incorporate new mail into a folder.  
 Normally \"inc\".  This file is searched for relative to  
 the `mh-progs' directory unless it is an absolute pathname."  
   :type 'string  
   :group 'mh-folder)  
   
 (defcustom mh-inc-spool-list nil  
   "*Alist of alternate spool files, corresponding folders and keybindings.  
 Here's an example. Suppose you have subscribed to the MH-E devel mailing  
 list. You could filter its mail into a separate spool file named  
 ~/mail/mh-e using Procmail and a .procmailrc entry like:  
   
 MAILDIR=$HOME/mail      #you'd better make sure it exists  
 :0:  
 * ^From mh-e-devel-admin@lists.sourceforge.net  
 mh-e  
   
 If you wanted to incorporate that spool file into an MH folder called  
 mh-e by pressing \"I m\" in folder-mode or by `M-x mh-inc-spool-mh-e',  
 you would setup  `mh-inc-spool-list' with an entry:  
   
  Spool file:  ~/mail/mh-e  
  Folder:      mh-e  
  Key binding: m  
   
 Then, you could also install `xbuffy' and configure an extra mailbox like so:  
   
 box ~/mail/mh-e  
  title mh-e  
  origMode  
  polltime 10  
  headertime 0  
  command gnudoit -q '(mh-inc-spool-mh-e)'  
   
 Note that the entry above uses the gnuserv package to communicate the  
 command `mh-inc-spool-mh-e' to Emacs. It will incorporate the spool file  
 when clicking the xbuffy box with the middle mouse button."  
   :type '(repeat (list (file :tag "Spool file")  
                        (string :tag "Folder")  
                        (character :tag "Key binding")))  
   :set 'mh-inc-spool-list-set  
   :group 'mh-folder)  
445    
446  (defcustom mh-interpret-number-as-range-flag t  ;;; Identities (:group 'mh-identity)
   "Non-nil means interpret a number as a range.  
 If the variable is non-nil, and you use an integer, N, when asked for a  
 range to scan, then MH-E uses the range \"last:N\"."  
   :type 'boolean  
   :group 'mh-folder)  
447    
448  (defcustom mh-lpr-command-format "lpr -J '%s'"  (defcustom mh-identity-list nil
449    "*Format for Unix command that prints a message.    "*List of identities.
 The string should be a Unix command line, with the string '%s' where  
 the job's name (folder and message number) should appear.  The formatted  
 message text is piped to this command when you type \\<mh-folder-mode-map>`\\[mh-print-msg]'."  
   :type 'string  
   :group 'mh-folder)  
   
 (defcustom mh-mime-save-parts-default-directory t  
   "Default directory to use for `mh-mime-save-parts'.  
 If nil, prompt and set for next time the command is used during same session.  
 If t, prompt always"  
   :type '(choice (const :tag "Prompt the first time" nil)  
                  (const :tag "Prompt always" t)  
                  directory)  
   :group 'mh-folder)  
450    
451  (defcustom mh-print-background-flag nil  Each element consists of an identity label, and a collection of header fields
452    "*Non-nil means messages should be printed in the background.  and a signature to insert if the identity is selected (see
453  WARNING: do not delete the messages until printing is finished;  `mh-identity-default', `mh-insert-identity' and the `Identity' menu in a
454  otherwise, your output may be truncated."  MH-Letter buffer). The `Value Menu' contains the common header fields `From'
455    :type 'boolean  and `Organization'. Other header fields may be added using the `Other Field'
456    :group 'mh-folder)  menu item. The `Signature' menu item is used to insert a signature with
457    `mh-insert-signature'. The `GPG Key ID' menu item is used to specify a
458    different key to sign or encrypt messages."
459      :type '(repeat (list :tag ""
460                           (string :tag "Label")
461                           (repeat :tag "Add at least one item below"
462                                   (choice
463                                    (cons :tag "From Field"
464                                          (const "From")
465                                          (string :tag "Value"))
466                                    (cons :tag "Organization Field"
467                                          (const "Organization")
468                                          (string :tag "Value"))
469                                    (cons :tag "Other Field"
470                                          (string :tag "Field")
471                                          (string :tag "Value"))
472                                    (cons :tag "Attribution Verb"
473                                          (const ":attribution-verb")
474                                          (string :tag "Value"))
475                                    (cons :tag "Signature"
476                                          (const :tag "Signature"
477                                                 ":signature")
478                                          (choice
479                                           (const :tag "mh-signature-file-name"
480                                                  nil)
481                                           (file)
482                                           (function)))
483                                    (cons :tag "GPG Key ID"
484                                          (const :tag "GPG Key ID"
485                                                 ":pgg-default-user-id")
486                                          (string :tag "Value"))))))
487      :set 'mh-identity-list-set
488      :group 'mh-identity)
489    
490  (defcustom mh-recenter-summary-flag nil  (defcustom mh-auto-fields-list nil
491    "*Non-nil means to recenter the summary window.    "List of recipients for which header lines are automatically inserted.
492  Recenter the summary window when the show window is toggled off if non-nil."  Each element consists of the recipient, which is a regular expression, and a
493    :type 'boolean  collection of header fields and identities to insert if the message is sent to
494    :group 'mh-folder)  this recipient. The `Value Menu' contains the common header fields `Fcc' and
495    `Mail-Followup-To'. Other header fields may be added using the `Other Field'
496    menu item. The `Identity' menu item is used to insert entire identities with
497    `mh-insert-identity'."
498      :type `(repeat
499              (list :tag ""
500                    (string :tag "Recipient")
501                    (repeat :tag "Add at least one item below"
502                            (choice
503                             (cons :tag "Identity"
504                                   (const ":identity")
505                                   ,(append
506                                     '(radio)
507                                     (mapcar
508                                      (function (lambda (arg) `(const ,arg)))
509                                      (mapcar 'car mh-identity-list))))
510                             (cons :tag "Fcc Field"
511                                   (const "fcc")
512                                   (string :tag "Value"))
513                             (cons :tag "Mail-Followup-To Field"
514                                   (const "Mail-Followup-To")
515                                   (string :tag "Value"))
516                             (cons :tag "Other Field"
517                                     (string :tag "Field")
518                                     (string :tag "Value"))))))
519      :group 'mh-identity)
520    
521  (defcustom mh-recursive-folders-flag nil  (defcustom mh-auto-fields-prompt-flag t
522    "*Non-nil means that commands which operate on folders do so recursively."    "*Non-nil means to prompt before sending if fields inserted.
523    See `mh-auto-fields-list'."
524    :type 'boolean    :type 'boolean
525    :group 'mh-folder)    :group 'mh-identity)
526    
527  ;;; If `mh-unpropagated-sequences' becomes a defcustom, add the following tot  (defcustom mh-identity-default nil
528  ;;; he docstring: "Additional sequences that should not to be preserved can be    "Default identity to use when `mh-letter-mode' is called."
529  ;;; specified by setting `mh-unpropagated-sequences' appropriately." XXX    :type (append
530             '(radio)
531             (cons '(const :tag "None" nil)
532                   (mapcar (function (lambda (arg) `(const ,arg)))
533                           (mapcar 'car mh-identity-list))))
534      :group 'mh-identity)
535    
536  (defcustom mh-refile-preserves-sequences-flag t  (defcustom mh-identity-handlers
537    "*Non-nil means that sequences are preserved when messages are refiled.    '((":default" . mh-identity-handler-bottom)
538  If this variable is non-nil and a message belonging to a sequence other than      ("from" . mh-identity-handler-top)
539  cur or Previous-Sequence (see mh-profile 5) is refiled then it is put in the      (":attribution-verb" . mh-identity-handler-attribution-verb)
540  same sequence in the destination folder."      (":signature" . mh-identity-handler-signature)
541    :type 'boolean      (":pgg-default-user-id" . mh-identity-handler-gpg-identity))
542    :group 'mh-folder)    "Handler functions for fields in `mh-identity-list'.
543    This is an alist of fields (strings) and handlers (functions). Strings are
544    lowercase. Use \":signature\" for Signature and \":pgg-default-user-id\" for
545    GPG Key ID. The function associated with the string \":default\" is used if no
546    other functions are appropriate."
547      :type '(repeat (cons (string :tag "Field") function))
548      :group 'mh-identity)
549    
550  (defcustom mh-scan-format-file t  
   "Specifies the format file to pass to the scan program.  
 If t, the format string will be taken from the either `mh-scan-format-mh'  
 or `mh-scan-format-nmh' depending on whether MH or nmh is in use.  
 If nil, the default scan output will be used.  
551    
552  If you customize the scan format, you may need to modify a few variables  ;;; Incorporating Your Mail (:group 'mh-inc)
 containing regexps that MH-E uses to identify specific portions of the output.  
 Use `M-x apropos RET mh-scan.*regexp' to obtain a list of these variables. You  
 may also have to call `mh-set-cmd-note' with the width of your message  
 numbers. See also `mh-adaptive-cmd-note-flag'."  
   :type '(choice (const :tag "Use MH-E scan format" t)  
                  (const :tag "Use default scan format" nil)  
                  (file  :tag "Specify a scan format file"))  
   :group 'mh-folder)  
553    
554  (defcustom mh-scan-prog "scan"  (defcustom mh-inc-prog "inc"
555    "*Program to run to generate one-line-per-message listing of a folder.    "*Program to run to incorporate new mail into a folder.
556  Normally \"scan\" or a file name linked to scan.  This file is searched  Normally \"inc\". This program is relative to the `mh-progs' directory unless
557  for relative to the `mh-progs' directory unless it is an absolute pathname."  it is an absolute pathname."
558    :type 'string    :type 'string
559    :group 'mh-folder)    :group 'mh-inc)
 (make-variable-buffer-local 'mh-scan-prog)  
   
 (defcustom mh-show-threads-flag nil  
   "Non-nil means new folders start in threaded mode.  
 Threading large number of messages can be time consuming. So if the flag is  
 non-nil then threading will be done only if the number of messages being  
 threaded is less than `mh-large-folder'."  
   :type 'boolean  
   :group 'mh-folder)  
   
 (defcustom mh-store-default-directory nil  
   "*Last directory used by \\[mh-store-msg]; default for next store.  
 A directory name string, or nil to use current directory."  
   :type '(choice (const :tag "Current" nil)  
                  directory)  
   :group 'mh-folder)  
560    
561  (defcustom mh-tick-seq 'tick  (defcustom mh-inc-spool-list nil
562    "The name of the MH tick sequence."    "*Alist of alternate spool files, corresponding folders and keybindings.
563    :type '(choice (const :tag "Disable ticking" nil)  This option will be described by example.
                  symbol)  
   :group 'mh-folder)  
564    
565  (defcustom mh-update-sequences-after-mh-show-flag t  Suppose you have subscribed to the mh-e-devel mailing list and you use
566    "*Non-nil means `mh-update-sequence' is called from `mh-show-mode'.  procmail to filter its mail into `~/mail/mh-e' with the following
567  If set, `mh-update-sequence' is run every time a message is shown, telling  `.procmailrc' recipe:
568  MH or nmh that this is your current message.  It's useful, for example, to  
569  display MIME content using \"M-! mhshow RET\""      MAILDIR=$HOME/mail
570    :type 'boolean      :0:
571    :group 'mh-folder)      * ^From mh-e-devel-admin@lists.sourceforge.net
572        mh-e
573    
574    If you wanted to incorporate that spool file into an MH folder called mh-e
575    with the \"I m\" or \\[mh-inc-spool-mh-e] commands, you would use the
576    following:
577    
578        Spool File:  ~/mail/mh-e
579        Folder:      mh-e
580        Key Binding: m
581    
582    Then, you could also install `xbuffy' and configure an extra mailbox using the
583    gnuserv package to run the `mh-inc-spool-mh-e' command in Emacs:
584    
585        box ~/mail/mh-e
586            title mh-e
587            origMode
588            polltime 10
589            headertime 0
590            command gnudoit -q '(mh-inc-spool-mh-e)'
591    
592    To incorporate the spool file, click the xbuffy box with the middle mouse
593    button."
594      :type '(repeat (list (file :tag "Spool File")
595                           (string :tag "Folder")
596                           (character :tag "Key Binding")))
597      :set 'mh-inc-spool-list-set
598      :group 'mh-inc)
599    
600    
601    
602  ;;; Indexed searching (:group 'mh-index)  ;;; Searching (:group 'mh-index)
603    
604  (defcustom mh-index-new-messages-folders t  (defcustom mh-index-new-messages-folders t
605    "Folders searched for `mh-unseen-seq'.    "Folders searched for the `unseen' sequence.
606  If t, then `mh-inbox' is searched. If nil, all the top level folders are  This option can be set to `Inbox' to search the `+inbox' folder or `All' to
607  searched. Otherwise the list of folders specified as strings are searched.  search all of the top level folders. Otherwise, list the folders that should
608    be searched with the `Choose Folders' menu item.
609    
610  See also `mh-recursive-folders-flag'."  See also `mh-recursive-folders-flag'."
611    :group 'mh-index    :group 'mh-index
612    :type '(choice (const :tag "Inbox" t)    :type '(choice (const :tag "Inbox" t)
613                   (const :tag "All" nil)                   (const :tag "All" nil)
614                   (repeat :tag "Choose folders" (string :tag "Folder"))))                   (repeat :tag "Choose Folders" (string :tag "Folder"))))
615    
616  (defcustom mh-index-program nil  (defcustom mh-index-program nil
617    "Indexing program that MH-E shall use.    "Indexing program that MH-E shall use.
618  The possible choices are swish++, swish-e, mairix, namazu, glimpse, pick and  The default setting of this option is `Auto-detect' which means that MH-E will
619  grep. By default this variable is nil which means that the programs are tried  automatically choose one of swish++, swish-e, mairix, namazu, pick and grep in
620  in order and the first one found is used.  that order. If, for example, you have both swish++ and mairix installed and
621    you want to use mairix, then you can set this option to `mairix'.
622    
623  More information about setting up an indexing program to use with MH-E can be  More information about setting up an indexing program to use with MH-E can be
624  found in the documentation of `mh-index-search'."  found in the documentation of `mh-index-search'."
# Line 850  found in the documentation of `mh-index- Line 627  found in the documentation of `mh-index-
627                   (const :tag "swish-e" swish)                   (const :tag "swish-e" swish)
628                   (const :tag "mairix" mairix)                   (const :tag "mairix" mairix)
629                   (const :tag "namazu" namazu)                   (const :tag "namazu" namazu)
                  (const :tag "glimpse" glimpse)  
630                   (const :tag "pick" pick)                   (const :tag "pick" pick)
631                   (const :tag "grep" grep))                   (const :tag "grep" grep))
632    :group 'mh-index)    :group 'mh-index)
633    
634  (defcustom mh-index-ticked-messages-folders t  (defcustom mh-index-ticked-messages-folders t
635    "Folders searched for `mh-tick-seq'.    "Folders searched for `mh-tick-seq'.
636  If t, then `mh-inbox' is searched. If nil, all the top level folders are  This option can be set to `Inbox' to search the `+inbox' folder or `All' to
637  searched. Otherwise the list of folders specified as strings are searched.  search all of the top level folders. Otherwise, list the folders that should
638    be searched with the `Choose Folders' menu item.
639    
640  See also `mh-recursive-folders-flag'."  See also `mh-recursive-folders-flag'."
641    :group 'mh-index    :group 'mh-index
642    :type '(choice (const :tag "Inbox" t)    :type '(choice (const :tag "Inbox" t)
643                   (const :tag "All" nil)                   (const :tag "All" nil)
644                   (repeat :tag "Choose folders" (string :tag "Folder"))))                   (repeat :tag "Choose Folders" (string :tag "Folder"))))
645    
646    
647    
648  ;;; Spam Handling (:group 'mh-junk)  ;;; Dealing with Junk Mail (:group 'mh-junk)
649    
650  ;; Spam fighting program chosen  ;; Spam fighting program chosen
651  (defvar mh-junk-choice nil)  (defvar mh-junk-choice nil)
652    
653  ;; Available spam filter interfaces  ;; Available spam filter interfaces
654  (defvar mh-junk-function-alist  (defvar mh-junk-function-alist
655    '((bogofilter mh-bogofilter-blacklist mh-bogofilter-whitelist)    '((spamassassin mh-spamassassin-blacklist mh-spamassassin-whitelist)
656      (spamprobe mh-spamprobe-blacklist mh-spamprobe-whitelist)      (bogofilter mh-bogofilter-blacklist mh-bogofilter-whitelist)
657      (spamassassin mh-spamassassin-blacklist mh-spamassassin-whitelist))      (spamprobe mh-spamprobe-blacklist mh-spamprobe-whitelist))
658    "Available choices of spam programs to use.    "Available choices of spam programs to use.
659  This is an alist. For each element there are functions that blacklist a message  This is an alist. For each element there are functions that blacklist a message
660  as spam and whitelist a message incorrectly classified as spam.")  as spam and whitelist a message incorrectly classified as spam.")
# Line 894  bound to the new value of `mh-junk-progr Line 672  bound to the new value of `mh-junk-progr
672                    finally return (car element)))))                    finally return (car element)))))
673    
674  ;; User customizable variables  ;; User customizable variables
675  (defcustom mh-junk-mail-folder nil  (defcustom mh-junk-disposition nil
676    "Folder to put spam mail in.    "Disposition of junk mail."
677  If nil then the spam is deleted."    :type '(choice (const :tag "Delete Spam" nil)
678    :type '(choice (const :tag "Delete spam" nil)                   (string :tag "Spam Folder"))
                  (string :tag "Spam folder"))  
679    :group 'mh-junk)    :group 'mh-junk)
680    
681  (defcustom mh-junk-program nil  (defcustom mh-junk-program nil
682    "Spam program that MH-E shall use.    "Spam program that MH-E should use.
683  The possible choices are bogofilter, spamprobe, and spamassassin. By default  The default setting of this option is `Auto-detect' which means that MH-E will
684  this variable is nil which means that the programs are tried in order and the  automatically choose one of SpamAssassin, Bogofilter, or SpamProbe in that
685  first one found is used."  order. If, for example, you have both SpamAssassin and Bogofilter installed
686    :type '(choice (const :tag "auto-detect" nil)  and you want to use BogoFilter, then you can set this option to `Bogofilter'."
687                   (const :tag "bogofilter" bogofilter)    :type '(choice (const :tag "Auto-detect" nil)
688                   (const :tag "spamprobe" spamprobe)                   (const :tag "SpamAssassin" spamassassin)
689                   (const :tag "spamassassin" spamassassin))                   (const :tag "Bogofilter" bogofilter)
690                     (const :tag "SpamProbe" spamprobe))
691    :set 'mh-junk-choose    :set 'mh-junk-choose
692    :group 'mh-junk)    :group 'mh-junk)
693    
694    (defcustom mh-junk-background nil
695      "If on, spam programs are run in background.
696    By default, the programs are run in the foreground, but this can be slow when
697    junking large numbers of messages. If you have enough memory or don't junk
698    that many messages at the same time, you might try turning on this option."
699      :type '(choice (const :tag "Off" nil)
700                     (const :tag "On" 0))
701      :group 'mh-junk)
702    
703    
704    
705    ;;; Editing a Draft (:group 'mh-letter)
706    
707    (defcustom mh-mml-method-default (if mh-gnus-pgp-support-flag "pgpmime" "none")
708      "Default method to use in security directives."
709      :type '(choice (const :tag "PGP (MIME)" "pgpmime")
710                     (const :tag "PGP" "pgp")
711                     (const :tag "S/MIME" "smime")
712                     (const :tag "None" "none"))
713      :group 'mh-letter)
714    
715    (defcustom mh-compose-forward-as-mime-flag t
716      "Non-nil means that messages are forwarded as a MIME part."
717      :type 'boolean
718      :group 'mh-letter)
719    
720    (defcustom mh-compose-insertion (if (locate-library "mml") 'gnus 'mhn)
721      "Type of MIME message directives in messages.
722    
723    By default, this option is set to `Gnus' if it is supported. This option can
724    also be set manually to `mhn' if mhn directives are preferred."
725      :type '(choice (const :tag "Gnus" gnus)
726                     (const :tag "mhn"  mhn))
727      :group 'mh-letter)
728    
729    (defcustom mh-compose-skipped-header-fields
730      '("From" "Organization" "References" "In-Reply-To"
731        "X-Face" "Face" "X-Image-URL" "X-Mailer")
732      "List of header fields to skip over when navigating in draft."
733      :type '(repeat (string :tag "Field"))
734      :group 'mh-letter)
735    
736    (defcustom mh-compose-space-does-completion-flag nil
737      "*Non-nil means that <SPC> does completion in message header."
738      :type 'boolean
739      :group 'mh-letter)
740    
741    (defcustom mh-delete-yanked-msg-window-flag nil
742      "*Non-nil means delete any window displaying the message.
743    If this option is on, yanking the current message into a draft letter with
744    \\<mh-letter-mode-map>\\[mh-yank-cur-msg] deletes any windows displaying the
745    message."
746      :type 'boolean
747      :group 'mh-letter)
748    
749    (defcustom mh-extract-from-attribution-verb "wrote:"
750      "*Verb to use for attribution when a message is yanked by \\<mh-letter-mode-map>\\[mh-yank-cur-msg]."
751      :type '(choice (const "wrote:")
752                     (const "a écrit:")
753                     (const "schrieb:")
754                     (string :tag "Custom String"))
755      :group 'mh-letter)
756    
757    (defcustom mh-ins-buf-prefix "> "
758      "*String to put before each non-blank line of a yanked or inserted message.
759    Used when the message is inserted into an outgoing letter
760    by \\<mh-letter-mode-map>\\[mh-insert-letter] or \\[mh-yank-cur-msg]."
761      :type 'string
762      :group 'mh-letter)
763    
764    (defcustom mh-insert-x-mailer-flag t
765      "*Non-nil means append an X-Mailer field to the header."
766      :type 'boolean
767      :group 'mh-letter)
768    
769    (defcustom mh-letter-complete-function 'ispell-complete-word
770      "*Function to call when completing outside of address or folder fields.
771    By default, this is set to `ispell-complete-word'."
772      :type '(choice function (const nil))
773      :group 'mh-letter)
774    
775    (defcustom mh-letter-fill-column 72
776      "*Fill column to use in `mh-letter-mode'.
777    This is usually less than in other text modes because email messages get
778    quoted by some prefix (sometimes many times) when they are replied to,
779    and it's best to avoid quoted lines that span more than 80 columns."
780      :type 'integer
781      :group 'mh-letter)
782    
783    (defcustom mh-reply-show-message-flag t
784      "*Non-nil means the show buffer is displayed using \\<mh-letter-mode-map>\\[mh-reply].
785    
786    The setting of this variable determines whether the MH `show-buffer' is
787    displayed with the current message when using `mh-reply' without a prefix
788    argument.  Set it to nil if you already include the message automatically
789    in your draft using
790     repl: -filter repl.filter
791    in your ~/.mh_profile file."
792      :type 'boolean
793      :group 'mh-letter)
794    
795    (defcustom mh-signature-file-name "~/.signature"
796      "*Source of user's signature.
797    
798    By default, the text of your signature is taken from the file `~/.signature'.
799    You can read from other files by changing this option. This file may contain a
800    vCard in which case an attachment is added with the vCard.
801    
802    This option may also be a symbol, in which case that function is called. You
803    may not want a signature separator to be added for you; instead you may want
804    to insert one yourself. Variables that you may find useful to do this include
805    `mh-signature-separator' (when inserting a signature separator) and
806    `mh-signature-separator-regexp' (for finding said separator). The function
807    `mh-signature-separator-p', which reports t if the buffer contains a
808    separator, may be useful as well.
809    
810    The signature is inserted into your message with the command
811    \\<mh-letter-mode-map>\\[mh-insert-signature] or with the `mh-identity-list'
812    option."
813      :type 'file
814      :group 'mh-letter)
815    
816    (defcustom mh-signature-separator-flag t
817      "*Non-nil means a signature separator should be inserted.
818    It is not recommended that you change this option since various mail user
819    agents, including MH-E, use the separator to present the signature
820    differently, and to suppress the signature when replying or yanking a letter
821    into a draft."
822      :type 'boolean
823      :group 'mh-letter)
824    
825    (defcustom mh-x-face-file "~/.face"
826      "*File containing face header field to insert in outgoing mail.
827    
828    If the file starts with either of the strings `X-Face:', `Face:' or
829    `X-Image-URL:' then the contents are added to the message header verbatim.
830    Otherwise it is assumed that the file contains the value of the `X-Face:'
831    header field.
832    
833    The `X-Face:' header field, which is a low-resolution, black and white image,
834    can be generated using the `compface' command, which can be obtained from
835    ftp://ftp.cs.indiana.edu/pub/faces/compface/compface.tar.Z. The \"Online
836    X-Face Convertor\" at http://www.dairiki.org/xface/ is a useful resource for
837    quick conversion of images into `X-Face:' header fields.
838    
839    Use the `make-face' script (http://quimby.gnus.org/circus/face/make-face) to
840    convert a JPEG image to the higher resolution, color, `Face:' header field.
841    
842    The URL of any image can be used for the `X-Image-URL:' field and no
843    processing of the image is required.
844    
845    To prevent the setting of any of these header fields, either set
846    `mh-x-face-file' to nil, or simply ensure that the file defined by this option
847    doesn't exist."
848      :type 'file
849      :group 'mh-letter)
850    
851    (defcustom mh-yank-from-start-of-msg 'attribution
852      "*Controls which part of a message is yanked by \\<mh-letter-mode-map>\\[mh-yank-cur-msg].
853    If t, include the entire message, with full headers.  This is historically
854    here for use with supercite, but is now deprecated in favor of the setting
855    `supercite' below.
856    
857    If the symbol `body', then yank the message minus the header.
858    
859    If the symbol `supercite', include the entire message, with full headers.
860    This also causes the invocation of `sc-cite-original' without the setting
861    of `mail-citation-hook', now deprecated practice.
862    
863    If the symbol `autosupercite', do as for `supercite' automatically when
864    show buffer matches the message being replied-to.  When this option is used,
865    the -noformat switch is passed to the repl program to override a -filter or
866    -format switch.
867    
868    If the symbol `attribution', then yank the message minus the header and add
869    a simple attribution line at the top.
870    
871    If the symbol `autoattrib', do as for `attribution' automatically when show
872    buffer matches the message being replied-to.  You can make sure this is
873    always the case by setting `mh-reply-show-message-flag' to t (which is the
874    default) and optionally `mh-delete-yanked-msg-window-flag' to t as well such
875    that the show window is never displayed.  When the `autoattrib' option is
876    used, the -noformat switch is passed to the repl program to override a
877    -filter or -format switch.
878    
879    If nil, yank only the portion of the message following the point.
880    
881    If the show buffer has a region, this variable is ignored unless its value is
882    one of `attribution' or `autoattrib' in which case the attribution is added
883    to the yanked region."
884      :type '(choice (const :tag "Below point" nil)
885                     (const :tag "Without header" body)
886                     (const :tag "Invoke supercite" supercite)
887                     (const :tag "Invoke supercite, automatically" autosupercite)
888                     (const :tag "Without header, with attribution" attribution)
889                     (const :tag "Without header, with attribution, automatically"
890                            autoattrib)
891                     (const :tag "Entire message with headers" t))
892      :group 'mh-letter)
893    
894    
895    
896    ;;; Ranges (:group 'mh-ranges)
897    
898    (defcustom mh-interpret-number-as-range-flag t
899      "Non-nil means interpret a number as a range.
900    If the variable is non-nil, and you use an integer, N, when asked for a
901    range to scan, then MH-E uses the range \"last:N\"."
902      :type 'boolean
903      :group 'mh-ranges)
904    
905    
906    
907    ;;; Scan Line Formats (:group 'mh-scan-line-formats)
908    
909    (defcustom mh-adaptive-cmd-note-flag t
910      "*Non-nil means that the message number width is determined dynamically.
911    This is done once when a folder is first opened by running scan on the last
912    message of the folder. The message number for the last message is extracted
913    and its width calculated. This width is used when calling `mh-set-cmd-note'.
914    
915    If you prefer fixed-width message numbers, set this variable to nil and call
916    `mh-set-cmd-note' with the width specified by the scan format in
917    `mh-scan-format-file'. For example, the default width is 4, so you would use
918    \"(mh-set-cmd-note 4)\" if `mh-scan-format-file' were nil."
919      :type 'boolean
920      :group 'mh-scan-line-formats)
921    
922    (defcustom mh-scan-format-file t
923      "Specifies the format file to pass to the scan program.
924    If t, the format string will be taken from the either `mh-scan-format-mh'
925    or `mh-scan-format-nmh' depending on whether MH or nmh is in use.
926    If nil, the default scan output will be used.
927    
928    If you customize the scan format, you may need to modify a few variables
929    containing regexps that MH-E uses to identify specific portions of the output.
930    Use `M-x apropos RET mh-scan.*regexp' to obtain a list of these variables. You
931    may also have to call `mh-set-cmd-note' with the width of your message
932    numbers. See also `mh-adaptive-cmd-note-flag'."
933      :type '(choice (const :tag "Use MH-E scan Format" t)
934                     (const :tag "Use Default scan Format" nil)
935                     (file  :tag "Specify a scan Format File"))
936      :group 'mh-scan-line-formats)
937    
938    (defcustom mh-scan-prog "scan"
939      "*Program to run to generate one-line-per-message listing of a folder.
940    Normally \"scan\" or a file name linked to scan.  This file is searched
941    for relative to the `mh-progs' directory unless it is an absolute pathname."
942      :type 'string
943      :group 'mh-scan-line-formats)
944    (make-variable-buffer-local 'mh-scan-prog)
945    
946    
947    
948    ;;; Sending Mail (:group 'mh-sending-mail)
949    
950    (defcustom mh-compose-letter-function nil
951      "Invoked when setting up a letter draft.
952    It is passed three arguments: TO recipients, SUBJECT, and CC recipients."
953      :type '(choice (const nil) function)
954      :group 'mh-sending-mail)
955    
956    (defcustom mh-compose-prompt-flag nil
957      "*Non-nil means prompt for header fields when composing a new draft."
958      :type 'boolean
959      :group 'mh-sending-mail)
960    
961    (defcustom mh-forward-subject-format "%s: %s"
962      "*Format to generate the Subject: line contents for a forwarded message.
963    The two string arguments to the format are the sender of the original
964    message and the original subject line."
965      :type 'string
966      :group 'mh-sending-mail)
967    
968    (defcustom mh-reply-default-reply-to nil
969      "*Sets the person or persons to whom a reply will be sent.
970    If nil, prompt for recipient.  If non-nil, then \\<mh-folder-mode-map>`\\[mh-reply]' will use this
971    value and it should be one of \"from\", \"to\", \"cc\", or \"all\".
972    The values \"cc\" and \"all\" do the same thing."
973      :type '(choice (const :tag "Prompt" nil)
974                     (const "from") (const "to")
975                     (const "cc") (const "all"))
976      :group 'mh-sending-mail)
977    
978    
979    
980  ;;; Message display (:group 'mh-show)  ;;; Sequences (:group 'mh-sequences)
981    
982    ;;; If `mh-unpropagated-sequences' becomes a defcustom, add the following to
983    ;;; the docstring: "Additional sequences that should not to be preserved can be
984    ;;; specified by setting `mh-unpropagated-sequences' appropriately." XXX
985    
986    (defcustom mh-refile-preserves-sequences-flag t
987      "*Non-nil means that sequences are preserved when messages are refiled.
988    If this variable is non-nil and a message belonging to a sequence other than
989    cur or Previous-Sequence (see mh-profile 5) is refiled then it is put in the
990    same sequence in the destination folder."
991      :type 'boolean
992      :group 'mh-sequences)
993    
994    (defcustom mh-tick-seq 'tick
995      "The name of the MH sequence for ticked messages.
996    You would change this option if you already use the `tick' sequence for your
997    own use. You can also disable all of the ticking functions by choosing the
998    `Disable Ticking' item but there isn't much advantage to that."
999      :type '(choice (const :tag "Disable Ticking" nil)
1000                     symbol)
1001      :group 'mh-sequences)
1002    
1003    (defcustom mh-update-sequences-after-mh-show-flag t
1004      "*Non-nil means flush MH sequences to disk after message is shown.
1005    Three sequences are maintained internally by MH-E and pushed out to MH when a
1006    message is shown. They include the sequence specified by your
1007    `Unseen-Sequence:' profile entry, `cur', and the sequence listed by
1008    the `mh-tick-seq' option which is `tick' by default.
1009    If you do not like this behavior, set this option to nil. You can then update
1010    the state manually with the \\<mh-folder-mode-map>`\\[mh-execute-commands]', `\\[mh-quit]', or `\\[mh-update-sequences]' commands."
1011      :type 'boolean
1012      :group 'mh-sequences)
1013    
1014    
1015    
1016    ;;; Reading Your Mail (:group 'mh-show)
1017    
1018  (defcustom mh-bury-show-buffer-flag t  (defcustom mh-bury-show-buffer-flag t
1019    "*Non-nil means that the displayed show buffer for a folder is buried."    "*Non-nil means that the displayed show buffer for a folder is buried."
# Line 923  first one found is used." Line 1021  first one found is used."
1021    :group 'mh-show)    :group 'mh-show)
1022    
1023  (defcustom mh-clean-message-header-flag t  (defcustom mh-clean-message-header-flag t
1024    "*Non-nil means clean headers of messages that are displayed or inserted.    "*Non-nil means remove extraneous header fields.
1025  The variable `mh-invisible-headers' if set determines the header fields that  The header fields listed in the `mh-invisible-header-fields-default' option
1026  are displayed. If it isn't set, then the variable `mh-invisible-headers'  are hidden, although you can check off any field that you would like to see.
1027  determines the header fields that are removed."  Header fields that you would like to hide that aren't listed can be added to
1028    the `mh-invisible-header-fields' option."
1029    :type 'boolean    :type 'boolean
1030    :group 'mh-show)    :group 'mh-show)
1031    
# Line 960  question." Line 1059  question."
1059    :type 'boolean    :type 'boolean
1060    :group 'mh-show)    :group 'mh-show)
1061    
1062  (defcustom mh-fetch-x-image-url nil  (defcustom mh-fetch-x-image-url 'ask
1063    "Control fetching of X-Image-URL header field image.    "*Control fetching of `X-Image-URL:' header field image.
1064  This setting only has effect if `mh-show-use-xface-flag' is non-nil.  If set to \"Always fetch\" (t), the image is always fetched. You probably want
1065    to avoid this setting for privacy and DOS (denial of service) reasons. For
1066  If set to t, the image is fetched.  example, fetching a URL can tip off a spammer that you've read his email.
1067    Someone may also flood your network and fill your disk drive by sending a
1068  If set to 'ask, the user is prompted before the image is fetched. MH-E will  torrent of messages, each specifying a unique URL to a very large file.
1069  remember your reply and will either use the already fetched image the next time  
1070  the same URL is encountered or silently skip it if you didn't fetch it the  If set to \"Ask before fetching\" ('ask), you are prompted before the image is
1071  first time.  fetched. MH-E will remember your reply and will either use the already fetched
1072    image the next time the same URL is encountered or silently skip it if you
1073    didn't fetch it the first time. This is the default.
1074    
1075    If set to \"Never fetch\" (nil), images are never fetched and only displayed
1076    if they are already present in the cache.
1077    
1078    The cache of images is found in the directory `.mhe-x-image-cache' within your
1079    MH directory. To see how you can add your own face to the `From:' field, see
1080    `mh-x-face-file'.
1081    
1082    This setting only has effect if `mh-show-use-xface-flag' is non-nil."
1083    
 If set to nil, the default, images are not fetched and only displayed if they  
 are already present in the cache."  
1084    :type '(choice (const :tag "Always fetch" t)    :type '(choice (const :tag "Always fetch" t)
1085                   (const :tag "Ask before fetching" ask)                   (const :tag "Ask before fetching" ask)
1086                   (const :tag "Never fetch" nil))                   (const :tag "Never fetch" nil))
# Line 1002  The gnus method uses a different color f Line 1110  The gnus method uses a different color f
1110                   (const :tag "Don't fontify" nil))                   (const :tag "Don't fontify" nil))
1111    :group 'mh-show)    :group 'mh-show)
1112    
 (defvar mh-invisible-headers nil  
   "*Regexp matching lines in a message header that are not to be shown.  
 Customize the variable `mh-invisible-header-fields' to generate this variable;  
 It will in turn automatically use the function `mh-invisible-headers' to  
 generate this variable.  
 If the variable `mh-visible-headers' is non-nil, it is used instead to specify  
 what to keep.")  
   
 (defun mh-invisible-headers ()  
   "Make or remake the variable `mh-invisible-headers'.  
 Done using `mh-invisible-header-fields' as input."  
   (if mh-invisible-header-fields  
       (setq mh-invisible-headers  
             (concat  
              "^"  
              (let ((max-specpdl-size 1000) ;workaround for insufficient default  
                    (fields mh-invisible-header-fields))  
                (regexp-opt fields t))))  
     (setq mh-invisible-headers nil)))  
   
1113  ;; Keep fields alphabetized. Mention source, if known.  ;; Keep fields alphabetized. Mention source, if known.
1114  (defcustom mh-invisible-header-fields  (defvar mh-invisible-header-fields-internal
1115    '("Approved:"    '("Approved:"
1116      "Autoforwarded:"      "Autoforwarded:"
1117      "Bestservhost:"      "Bestservhost:"
# Line 1053  Done using `mh-invisible-header-fields' Line 1141  Done using `mh-invisible-header-fields'
1141      "Old-Return-Path:"      "Old-Return-Path:"
1142      "Original-Encoded-Information-Types:"  ; X400      "Original-Encoded-Information-Types:"  ; X400
1143      "Original-Lines:"                   ; mail to news      "Original-Lines:"                   ; mail to news
     "Original-Newsgroups:"              ; mail to news  
1144      "Original-NNTP-"                    ; mail to news      "Original-NNTP-"                    ; mail to news
1145        "Original-Newsgroups:"              ; mail to news
1146      "Original-Path:"                    ; mail to news      "Original-Path:"                    ; mail to news
1147      "Original-Received:"                ; mail to news      "Original-Received:"                ; mail to news
1148      "Original-To:"                      ; mail to news      "Original-To:"                      ; mail to news
1149      "Original-X-"                       ; mail to news      "Original-X-"                       ; mail to news
1150        "Originator:"
1151      "P1-Content-Type:"                  ; X400      "P1-Content-Type:"                  ; X400
1152      "P1-Message-Id:"                    ; X400      "P1-Message-Id:"                    ; X400
1153      "P1-Recipient:"                     ; X400      "P1-Recipient:"                     ; X400
# Line 1074  Done using `mh-invisible-header-fields' Line 1163  Done using `mh-invisible-header-fields'
1163      "Return-Path:"                      ; RFC 822      "Return-Path:"                      ; RFC 822
1164      "Sensitivity:"                      ; MS Outlook      "Sensitivity:"                      ; MS Outlook
1165      "Status:"                           ; sendmail      "Status:"                           ; sendmail
1166        "Thread-"
1167      "Ua-Content-Id:"                    ; X400      "Ua-Content-Id:"                    ; X400
1168  ;;  "User-Agent:"                       ; Similar to X-Mailer, so display it.  ;;  "User-Agent:"                       ; Similar to X-Mailer, so display it.
1169      "Via:"                              ; MH      "Via:"                              ; MH
1170      "X-Abuse-Info:"      "X-Abuse-Info:"
1171        "X-Abuse-and-DMCA-"
1172      "X-Accept-Language:"      "X-Accept-Language:"
1173      "X-Accept-Language:"                ; Netscape/Mozilla      "X-Accept-Language:"                ; Netscape/Mozilla
1174      "X-Ack:"      "X-Ack:"
1175        "X-Administrivia-To:"
1176        "X-AntiAbuse:"                      ; cPanel
1177      "X-Apparently-From:"                ; MS Outlook      "X-Apparently-From:"                ; MS Outlook
1178      "X-Apparently-To:"           ; Egroups/yahoogroups mailing list manager      "X-Apparently-To:"           ; Egroups/yahoogroups mailing list manager
1179      "X-Authentication-Warning:"         ; sendmail      "X-Authentication-Warning:"         ; sendmail
# Line 1088  Done using `mh-invisible-header-fields' Line 1181  Done using `mh-invisible-header-fields'
1181      "X-Bogosity:"                       ; bogofilter      "X-Bogosity:"                       ; bogofilter
1182      "X-Complaints-To:"      "X-Complaints-To:"
1183      "X-Cron-Env:"      "X-Cron-Env:"
1184        "X-DMCA"
1185      "X-Delivered"      "X-Delivered"
1186        "X-ELNK-Trace:"                     ; Earthlink mailer
1187        "X-Envelope-Date:"                  ; GNU mailutils
1188        "X-Envelope-From:"
1189      "X-Envelope-Sender:"      "X-Envelope-Sender:"
1190      "X-Envelope-To:"      "X-Envelope-To:"
1191      "X-Face:"      "X-Face:"
1192      "X-Folder:"                         ; Spam      "X-Folder:"                         ; Spam
1193      "X-From-Line"      "X-From-Line"
1194      "X-Gnus-Mail-Source:"               ; gnus      "X-Gnus-Mail-Source:"               ; gnus
1195        "X-Greylist:"                       ; milter-greylist-1.2.1
1196      "X-Habeas-SWE-1:"                   ; Spam      "X-Habeas-SWE-1:"                   ; Spam
1197      "X-Habeas-SWE-2:"                   ; Spam      "X-Habeas-SWE-2:"                   ; Spam
1198      "X-Habeas-SWE-3:"                   ; Spam      "X-Habeas-SWE-3:"                   ; Spam
# Line 1104  Done using `mh-invisible-header-fields' Line 1202  Done using `mh-invisible-header-fields'
1202      "X-Habeas-SWE-7:"                   ; Spam      "X-Habeas-SWE-7:"                   ; Spam
1203      "X-Habeas-SWE-8:"                   ; Spam      "X-Habeas-SWE-8:"                   ; Spam
1204      "X-Habeas-SWE-9:"                   ; Spam      "X-Habeas-SWE-9:"                   ; Spam
1205        "X-Image-URL:"                      ; URL equivalent of X-Face and Face
1206      "X-Info:"                           ; NTMail      "X-Info:"                           ; NTMail
1207      "X-Juno-"                           ; Juno      "X-Juno-"                           ; Juno
1208      "X-List-Host:"                      ; Unknown mailing list managers      "X-List-Host:"                      ; Unknown mailing list managers
1209      "X-List-Subscribe:"                 ; Unknown mailing list managers      "X-List-Subscribe:"                 ; Unknown mailing list managers
1210      "X-List-Unsubscribe:"               ; Unknown mailing list managers      "X-List-Unsubscribe:"               ; Unknown mailing list managers
1211        "X-Listprocessor-"                  ; ListProc(tm) by CREN
1212      "X-Listserver:"                     ; Unknown mailing list managers      "X-Listserver:"                     ; Unknown mailing list managers
1213      "X-Loop:"                           ; Unknown mailing list managers      "X-Loop:"                           ; Unknown mailing list managers
1214        "X-MHE-Checksum"                    ; Checksum added during index search
1215      "X-MIME-Autoconverted:"             ; sendmail      "X-MIME-Autoconverted:"             ; sendmail
1216      "X-MIMETrack:"      "X-MIMETrack:"
1217      "X-MS-TNEF-Correlator:"             ; MS Outlook      "X-Mms-"                            ; T-Mobile pictures
1218        "X-MS-"                             ; MS Outlook
1219        "X-MailScanner"                     ; ListProc(tm) by CREN
1220      "X-Mailing-List:"                   ; Unknown mailing list managers      "X-Mailing-List:"                   ; Unknown mailing list managers
1221      "X-Mailman-Version:"                ; Mailman mailing list manager      "X-Mailman-Version:"                ; Mailman mailing list manager
1222      "X-Majordomo:"                      ; Majordomo mailing list manager      "X-Majordomo:"                      ; Majordomo mailing list manager
1223      "X-Message-Id"      "X-Message-Id"
1224      "X-MHE-Checksum"                    ; Checksum added during index search      "X-MessageWall-Score:"              ; Unknown mailing list manager, AUC TeX
1225      "X-MimeOLE:"                        ; MS Outlook      "X-MimeOLE:"                        ; MS Outlook
1226      "X-Mozilla-Status:"                 ; Netscape/Mozilla      "X-Mozilla-Status:"                 ; Netscape/Mozilla
1227      "X-Msmail-"                         ; MS Outlook      "X-Msmail-"                         ; MS Outlook
1228        "X-NAI-Spam-"                       ; Network Associates Inc. SpamKiller
1229      "X-News:"                           ; News      "X-News:"                           ; News
1230      "X-No-Archive:"      "X-No-Archive:"
1231      "X-Notes-Item:"                     ; Lotus Notes Domino structured header      "X-Notes-Item:"                     ; Lotus Notes Domino structured header
1232        "X-OperatingSystem:"
1233        ;;"X-Operator:"                     ; Similar to X-Mailer, so display it
1234      "X-Orcl-Content-Type:"      "X-Orcl-Content-Type:"
1235      "X-Original-Complaints-To:"      "X-Original-Complaints-To:"
1236      "X-Original-Date:"                  ; SourceForge mailing list manager      "X-Original-Date:"                  ; SourceForge mailing list manager
# Line 1132  Done using `mh-invisible-header-fields' Line 1238  Done using `mh-invisible-header-fields'
1238      "X-Original-Trace:"      "X-Original-Trace:"
1239      "X-OriginalArrivalTime:"            ; Hotmail      "X-OriginalArrivalTime:"            ; Hotmail
1240      "X-Originating-IP:"                 ; Hotmail      "X-Originating-IP:"                 ; Hotmail
1241        "X-Postfilter:"
1242      "X-Priority:"                       ; MS Outlook      "X-Priority:"                       ; MS Outlook
1243      "X-Qotd-"                           ; User added      "X-Qotd-"                           ; User added
1244        "X-RM"
1245      "X-Received-Date:"      "X-Received-Date:"
1246      "X-Received:"      "X-Received:"
1247      "X-Request-"      "X-Request-"
# Line 1141  Done using `mh-invisible-header-fields' Line 1249  Done using `mh-invisible-header-fields'
1249      "X-SBNote:"                         ; Spam      "X-SBNote:"                         ; Spam
1250      "X-SBPass:"                         ; Spam      "X-SBPass:"                         ; Spam
1251      "X-SBRule:"                         ; Spam      "X-SBRule:"                         ; Spam
1252        "X-SMTP-"
1253      "X-Scanned-By"      "X-Scanned-By"
1254      "X-Sender:"      "X-Sender:"
1255      "X-Server-Date:"      "X-Server-Date:"
1256      "X-Server-Uuid:"      "X-Server-Uuid:"
1257      "X-Sieve:"                          ; Sieve filtering      "X-Sieve:"                          ; Sieve filtering
1258      "X-Spam-Checker-Version:"           ; Spamassassin      "X-Source"
1259      "X-Spam-Level:"                     ; Spamassassin      "X-Spam-"                           ; Spamassassin
     "X-Spam-Score:"                     ; Spamassassin  
     "X-Spam-Status:"                    ; Spamassassin  
1260      "X-SpamBouncer:"                    ; Spam      "X-SpamBouncer:"                    ; Spam
1261        "X-Status"
1262        "X-Submissions-To:"
1263        "X-Telecom-Digest"
1264      "X-Trace:"      "X-Trace:"
1265        "X-UID"
1266      "X-UIDL:"      "X-UIDL:"
1267      "X-UserInfo1:"      "X-UserInfo1:"
1268      "X-VSMLoop:"                        ; NTMail      "X-VSMLoop:"                        ; NTMail
1269      "X-Vms-To:"      "X-Vms-To:"
1270        "X-WebTV-Signature:"
1271      "X-Wss-Id:"                         ; Worldtalk gateways      "X-Wss-Id:"                         ; Worldtalk gateways
1272        "X-Yahoo"
1273      "X-eGroups-"                 ; Egroups/yahoogroups mailing list manager      "X-eGroups-"                 ; Egroups/yahoogroups mailing list manager
1274      "X-pgp:"      "X-pgp:"
1275      "X-submission-address:"      "X-submission-address:"
1276      "X400-"                             ; X400      "X400-"                             ; X400
1277      "Xref:")      "Xref:")
1278  "*List of header fields that are not to be shown.    "List of default header fields that are not to be shown.
1279  Regexps are not allowed. Unique fields should have a \":\" suffix; otherwise,  Do not alter this variable directly.  Instead, add entries from here that you
1280  the element can be used to render invisible an entire class of fields that  would like to be displayed in `mh-invisible-header-fields-default'
1281  start with the same prefix.  and add entries to hide in `mh-invisible-header-fields'.")
1282  This variable is ignored if the variable `mh-visible-headers' is set."  
1283    (defvar mh-invisible-header-fields-compiled nil
1284      "*Regexp matching lines in a message header that are not to be shown.
1285    Do not alter this variable directly. Instead, customize
1286    `mh-invisible-header-fields-default' checking for fields normally
1287    hidden that you wish to display, and add extra entries to hide in
1288    `mh-invisible-header-fields'.")
1289    
1290    (defun mh-invisible-headers ()
1291      "Make or remake the variable `mh-invisible-header-fields-compiled'.
1292    Done using `mh-invisible-header-fields-internal' as input, from which entries
1293    from `mh-invisible-header-fields-default' are removed and entries
1294    from `mh-invisible-header-fields' are added."
1295      (let ((fields mh-invisible-header-fields-internal))
1296        (when mh-invisible-header-fields-default
1297          ;; Remove entries from `mh-invisible-header-fields-default'
1298          (setq fields
1299                (loop for x in fields
1300                      unless (member x mh-invisible-header-fields-default)
1301                      collect x)))
1302        (when (and (boundp 'mh-invisible-header-fields)
1303                   mh-invisible-header-fields)
1304          (dolist (x mh-invisible-header-fields)
1305            (unless (member x fields) (setq fields (cons x fields)))))
1306        (if fields
1307            (setq mh-invisible-header-fields-compiled
1308                  (concat
1309                   "^"
1310                   ;; workaround for insufficient default
1311                   (let ((max-specpdl-size 1000))
1312                     (regexp-opt fields t))))
1313          (setq mh-invisible-header-fields-compiled nil))))
1314    
1315    (defcustom mh-invisible-header-fields-default nil
1316      "*List of hidden header fields.
1317    The header fields listed in this option are hidden, although you can check off
1318    any field that you would like to see. Header fields that you would like to
1319    hide that aren't listed can be added to the `mh-invisible-header-fields'
1320    option.
1321    
1322    See also `mh-clean-message-header-flag'."
1323      :type `(set ,@(mapcar (lambda (x) `(const ,x))
1324                            mh-invisible-header-fields-internal))
1325      :set (lambda (symbol value)
1326             (set-default symbol value)
1327             (mh-invisible-headers))
1328      :group 'mh-show)
1329    
1330    (defcustom mh-invisible-header-fields nil
1331      "*Additional header fields to hide.
1332    Header fields that you would like to hide that aren't listed in
1333    `mh-invisible-header-fields-default' can be added to this option with a couple
1334    of caveats. Regular expressions are not allowed. Unique fields should have a
1335    `:' suffix; otherwise, the element can be used to render invisible an entire
1336    class of fields that start with the same prefix.
1337    
1338    See also `mh-clean-message-header-flag'."
1339    
1340    :type '(repeat (string :tag "Header field"))    :type '(repeat (string :tag "Header field"))
1341    :set (lambda (symbol value)    :set (lambda (symbol value)
1342           (set-default symbol value)           (set-default symbol value)
1343           (mh-invisible-headers))           (mh-invisible-headers))
1344    :group 'mh-show)    :group 'mh-show)
1345    
1346    (defcustom mh-lpr-command-format "lpr -J '%s'"
1347      "*Format for Unix command that prints a message.
1348    The string should be a Unix command line, with the string '%s' where
1349    the job's name (folder and message number) should appear.  The formatted
1350    message text is piped to this command when you type \\<mh-folder-mode-map>`\\[mh-print-msg]'."
1351      :type 'string
1352      :group 'mh-show)
1353    
1354  (defcustom mh-max-inline-image-height nil  (defcustom mh-max-inline-image-height nil
1355    "*Maximum inline image height if Content-Disposition is not present.    "*Maximum inline image height if Content-Disposition is not present.
1356  If nil, image will be displayed if its height is smaller than the height of  If nil, image will be displayed if its height is smaller than the height of
# Line 1187  window." Line 1365  window."
1365    :type '(choice (const nil) integer)    :type '(choice (const nil) integer)
1366    :group 'mh-show)    :group 'mh-show)
1367    
1368    (defcustom mh-mime-save-parts-default-directory t
1369      "Default directory to use for `mh-mime-save-parts'.
1370    If nil, prompt and set for next time the command is used during same session.
1371    If t, prompt always"
1372      :type '(choice (const :tag "Prompt the first time" nil)
1373                     (const :tag "Prompt always" t)
1374                     directory)
1375      :group 'mh-show)
1376    
1377    (defcustom mh-print-background-flag nil
1378      "*Non-nil means messages should be printed in the background.
1379    WARNING: do not delete the messages until printing is finished;
1380    otherwise, your output may be truncated."
1381      :type 'boolean
1382      :group 'mh-show)
1383    
1384    (defcustom mh-recursive-folders-flag nil
1385      "*Non-nil means that commands which operate on folders do so recursively."
1386      :type 'boolean
1387      :group 'mh-show)
1388    
1389  (defcustom mh-show-maximum-size 0  (defcustom mh-show-maximum-size 0
1390    "*Maximum size of message (in bytes) to display automatically.    "*Maximum size of message (in bytes) to display automatically.
1391  Provides an opportunity to skip over large messages which may be slow to load.  Provides an opportunity to skip over large messages which may be slow to load.
# Line 1194  Use a value of 0 to display all messages Line 1393  Use a value of 0 to display all messages
1393    :type 'integer    :type 'integer
1394    :group 'mh-show)    :group 'mh-show)
1395    
1396    (defcustom mh-show-threads-flag nil
1397      "Non-nil means new folders start in threaded mode.
1398    Threading large number of messages can be time consuming. So if the flag is
1399    non-nil then threading will be done only if the number of messages being
1400    threaded is less than `mh-large-folder'."
1401      :type 'boolean
1402      :group 'mh-show)
1403    
1404  ;; Use goto-addr if it was already loaded (which probably sets this  ;; Use goto-addr if it was already loaded (which probably sets this
1405  ;; variable to t), or if this variable is otherwise set to t.  ;; variable to t), or if this variable is otherwise set to t.
1406  (defcustom mh-show-use-goto-addr-flag (and (boundp 'goto-address-highlight-p)  (defcustom mh-show-use-goto-addr-flag (and (boundp 'goto-address-highlight-p)
# Line 1205  The `goto-addr' module is used." Line 1412  The `goto-addr' module is used."
1412    
1413  (defcustom mh-show-use-xface-flag (>= emacs-major-version 21)  (defcustom mh-show-use-xface-flag (>= emacs-major-version 21)
1414    "*Non-nil means display face images in `mh-show-mode'.    "*Non-nil means display face images in `mh-show-mode'.
 This flag controls the display of three kinds of faces.  
1415    
1416  The first is the traditional X-Face header field. For GNU Emacs 21  MH-E can display the content of `Face:', `X-Face:', and `X-Image-URL:' header
1417  and above, the `uncompface' binary is required to be in the execute  fields. If any of these fields occur in the header of your message, the
1418  PATH for the display of X-Face images. It can be obtained from  sender's face will appear in the `From:' header field. If more than one of
1419  ftp://ftp.cs.indiana.edu/pub/faces/compface/compface.tar.Z.  these fields appear, then the first field found in the order `Face:',
1420    `X-Face:', and `X-Image-URL:' will be used. Note that versions of GNU Emacs
1421  If the XEmacs you are using has internal support for X-Face images, then MH-E  prior to 21.1 don't support the display of inline images, so face images are
1422  will display X-Face images in XEmacs \"out of the box\". Even if you don't have  not displayed in these versions.
1423  X-Face support compiled into your XEmacs, you can still see the X-Face images  
1424  in MH-E with the aid of an external x-face package and `uncompface'. It is  The option `mh-show-use-xface-flag' is used to turn this feature on and off.
1425  available from ftp://ftp.jpl.org/pub/elisp/. Download it, put its files in the  This feature will be turned on by default if your system supports it.
1426  `load-path' and MH-E will invoke it automatically.  
1427    The first header field used, if present, is the Gnus-specific `Face:' field.
1428  Second, MH-E supports the display of the Gnus-specific Face  The `Face:' field appeared in GNU Emacs 21 and XEmacs. For more information,
1429  header field in GNU Emacs >= 21 and XEmacs. No external packages  see http://quimby.gnus.org/circus/face/. Next is the traditional `X-Face:'
1430  are required. More information about the Face header can be found  header field. The display of this field requires the `uncompface' program
1431  at: http://quimby.gnus.org/circus/face/.  which can be obtained from
1432    ftp://ftp.cs.indiana.edu/pub/faces/compface/compface.tar.Z. Recent versions of
1433  Finally, MH-E can also display images from the X-Image-URL header field. The  XEmacs have internal support for `X-Face:' images. If your version of XEmacs
1434  display of the images requires the `wget' program, available from  does not, then you'll need both `uncompface' and the x-face package which is
1435  http://www.gnu.org/software/wget/wget.html, to fetch the image and the  available at ftp://ftp.jpl.org/pub/elisp/.
1436  `convert' program from the ImageMagick suite, available from  
1437    Finally, MH-E will display images referenced by the `X-Image-URL:' header
1438    field if neither the `Face:' nor the `X-Face:' fields are present. The display
1439    of the images requires `wget' (available from
1440    http://www.gnu.org/software/wget/wget.html), `fetch', or `curl' to fetch the
1441    image and the `convert' program from the ImageMagick suite, available from
1442  http://www.imagemagick.org/. Of the three header fields this is the most  http://www.imagemagick.org/. Of the three header fields this is the most
1443  efficient in terms of network usage since the image doesn't need to be  efficient in terms of network usage since the image doesn't need to be
1444  transmitted with every single mail. However its display needs the recipient to  transmitted with every single mail.
 fetch a URL and this can be misused. So it is disabled by default. It can be  
 enabled by customizing `mh-fetch-x-image-url'. Setting that to ask for  
 confirmation before fetching seems like a good choice.  
1445    
1446  Versions of GNU Emacs prior to 21.1 don't support the display of  The option `mh-fetch-x-image-url' controls the fetching of the `X-Image-URL:'
1447  inline images. So face images are not displayed in these versions."  header field image."
1448    :type 'boolean    :type 'boolean
1449    :group 'mh-show)    :group 'mh-show)
1450    
1451    (defcustom mh-store-default-directory nil
1452      "*Last directory used by \\[mh-store-msg]; default for next store.
1453    A directory name string, or nil to use current directory."
1454      :type '(choice (const :tag "Current" nil)
1455                     directory)
1456      :group 'mh-show)
1457    
1458  (defcustom mh-summary-height nil  (defcustom mh-summary-height nil
1459    "*Number of lines in MH-Folder window (including the mode line)."    "*Number of lines in MH-Folder window (including the mode line)."
1460    :type '(choice (const :tag "Automatic" nil)    :type '(choice (const :tag "Automatic" nil)
1461                   (integer :tag "Fixed sized"))                   (integer :tag "Fixed sized"))
1462    :group 'mh-show)    :group 'mh-show)
1463    
 (defvar mh-visible-headers nil  
   "*Regexp matching lines in a message header that are to be shown.  
 Customize the variable `mh-visible-header-fields' to generate this variable;  
 It will in turn automatically use the function `mh-visible-headers' to  
 generate this variable.  
 Only used if `mh-clean-message-header-flag' is non-nil. Setting it overrides  
 the variable `mh-invisible-headers'.")  
   
 (defun mh-visible-headers ()  
   "Make or remake the variable `mh-visible-headers'.  
 Done using `mh-visible-header-fields' as input."  
   (if mh-visible-header-fields  
       (setq mh-visible-headers  
             (concat  
              "^"  
              (let ((max-specpdl-size 1000) ;workaround for insufficient default  
                    (fields mh-visible-header-fields))  
                (regexp-opt fields t))))  
     (setq mh-visible-headers nil)))  
   
 (defcustom mh-visible-header-fields nil  
 "*List of header fields that are to be shown.  
 Regexps are not allowed. Unique fields should have a \":\" suffix; otherwise,  
 the element can be used to render visible an entire class of fields that  
 start with the same prefix.  
 Only used if `mh-clean-message-header-flag' is non-nil.  
 Setting it overrides the variable `mh-invisible-headers'."  
   :type '(repeat (string :tag "Header field"))  
   :set (lambda (symbol value)  
          (set-default symbol value)  
          (mh-visible-headers))  
   :group 'mh-show)  
   
1464  (defcustom mhl-formfile nil  (defcustom mhl-formfile nil
1465    "*Name of format file to be used by mhl to show and print messages.    "*Name of format file to be used by mhl to show and print messages.
1466  A value of t means use the default format file.  A value of t means use the default format file.
# Line 1292  the message continues to conform to RFC Line 1474  the message continues to conform to RFC
1474    
1475    
1476    
1477  ;;; Composing messages (:group 'mh-letter)  ;;; The Speedbar (:group 'mh-speed)
   
 (defcustom mh-compose-insertion (if (locate-library "mml") 'gnus 'mhn)  
   "Use either 'gnus or 'mhn to insert MIME message directives in messages."  
   :type '(choice (const :tag "Use Gnus" gnus)  
                  (const :tag "Use mhn"  mhn))  
   :group 'mh-letter)  
1478    
1479  (defcustom mh-compose-letter-function nil  (defcustom mh-large-folder 200
1480    "Invoked when setting up a letter draft.    "The number of messages that indicates a large folder.
1481  It is passed three arguments: TO recipients, SUBJECT, and CC recipients."  If a folder is deemed to be large, that is the number of messages in it exceed
1482    :type '(choice (const nil) function)  this value, then confirmation is needed when it is visited. Even when
1483    :group 'mh-letter)  `mh-show-threads-flag' is non-nil, the folder is not automatically threaded, if
1484    it is large. If set to nil all folders are treated as if they are small."
1485  (defcustom mh-compose-prompt-flag nil    :type '(choice (const :tag "No limit") integer)
1486    "*Non-nil means prompt for header fields when composing a new draft."    :group 'mh-speed)
   :type 'boolean  
   :group 'mh-letter)  
   
 (defcustom mh-compose-skipped-header-fields  
   '("from" "organization" "references" "in-reply-to" "x-face" "face"  
     "x-mailer")  
   "List of header fields to skip over when navigating in draft."  
   :type '(repeat (string :tag "Field"))  
   :group 'mh-letter)  
   
 (defcustom mh-compose-space-does-completion-flag nil  
   "*Non-nil means that SPACE does completion in message header."  
   :type 'boolean  
   :group 'mh-letter)  
   
 (defcustom mh-delete-yanked-msg-window-flag nil  
   "*Non-nil means delete any window displaying the message.  
 Controls window display when a message is yanked by \\<mh-letter-mode-map>\\[mh-yank-cur-msg].  
 If non-nil, yanking the current message into a draft letter deletes any  
 windows displaying the message."  
   :type 'boolean  
   :group 'mh-letter)  
   
 (defcustom mh-extract-from-attribution-verb "wrote:"  
   "*Verb to use for attribution when a message is yanked by \\<mh-letter-mode-map>\\[mh-yank-cur-msg]."  
   :type '(choice (const "wrote:")  
                  (const "a écrit :")  
                  (string :tag "Custom string"))  
   :group 'mh-letter)  
   
 (defcustom mh-forward-subject-format "%s: %s"  
   "*Format to generate the Subject: line contents for a forwarded message.  
 The two string arguments to the format are the sender of the original  
 message and the original subject line."  
   :type 'string  
   :group 'mh-letter)  
   
 (defcustom mh-ins-buf-prefix "> "  
   "*String to put before each non-blank line of a yanked or inserted message.  
 \\<mh-letter-mode-map>Used when the message is inserted into an outgoing letter  
 by \\[mh-insert-letter] or \\[mh-yank-cur-msg]."  
   :type 'string  
   :group 'mh-letter)  
   
 (defcustom mh-insert-x-mailer-flag t  
   "*Non-nil means append an X-Mailer field to the header."  
   :type 'boolean  
   :group 'mh-letter)  
   
 (defcustom mh-letter-complete-function 'ispell-complete-word  
   "*Function to call when completing outside of fields specific to aliases."  
   :type '(choice function (const nil))  
   :group 'mh-letter)  
1487    
1488  (defcustom mh-letter-fill-column 72  (defcustom mh-speed-flists-interval 60
1489    "*Fill column to use in `mh-letter-mode'.    "Time between calls to flists in seconds.
1490  This is usually less than in other text modes because email messages get  If 0, flists is not called repeatedly."
 quoted by some prefix (sometimes many times) when they are replied to,  
 and it's best to avoid quoted lines that span more than 80 columns."  
1491    :type 'integer    :type 'integer
1492    :group 'mh-letter)    :group 'mh-speed)
   
 (defcustom mh-reply-default-reply-to nil  
   "*Sets the person or persons to whom a reply will be sent.  
 If nil, prompt for recipient.  If non-nil, then \\<mh-folder-mode-map>`\\[mh-reply]' will use this  
 value and it should be one of \"from\", \"to\", \"cc\", or \"all\".  
 The values \"cc\" and \"all\" do the same thing."  
   :type '(choice (const :tag "Prompt" nil)  
                  (const "from") (const "to")  
                  (const "cc") (const "all"))  
   :group 'mh-letter)  
   
 (defcustom mh-reply-show-message-flag t  
   "*Non-nil means the show buffer is displayed using \\<mh-letter-mode-map>\\[mh-reply].  
1493    
1494  The setting of this variable determines whether the MH `show-buffer' is  (defcustom mh-speed-run-flists-flag t
1495  displayed with the current message when using `mh-reply' without a prefix    "Non-nil means flists is used.
1496  argument.  Set it to nil if you already include the message automatically  If non-nil, flists is executed every `mh-speed-flists-interval' seconds to
1497  in your draft using  update the display of the number of unseen and total messages in each folder.
1498   repl: -filter repl.filter  If resources are limited, this can be set to nil and the speedbar display can
1499  in your ~/.mh_profile file."  be updated manually with the \\[mh-speed-flists] command."
1500    :type 'boolean    :type 'boolean
1501    :group 'mh-letter)    :group 'mh-speed)
   
 (defcustom mh-signature-file-name "~/.signature"  
   "*Name of file containing the user's signature.  
 Inserted into message by \\<mh-letter-mode-map>\\[mh-insert-signature]."  
   :type 'file  
   :group 'mh-letter)  
   
 (defcustom mh-x-face-file "~/.face"  
   "*File containing X-Face or Face header field to insert in outgoing mail.  
   
 If the file starts with either of the strings \"X-Face: \", \"Face: \" or  
 \"X-Image-URL: \" then it is assumed to contain the whole field and is added to  
 the message header verbatim. Otherwise it is assumed that the file contains the  
 value of the X-Face header field.  
   
 X-Face header fields can be generated using `compface', which can be obtained  
 from ftp://ftp.cs.indiana.edu/pub/faces/compface/compface.tar.Z. The \"Online  
 X-Face Convertor\" at http://www.dairiki.org/xface/ is a useful resource for  
 quick conversion of images into X-Face header fields.  
   
 There is a `make-face' script that converts a jpeg image to a Face header  
 field at http://quimby.gnus.org/circus/face/make-face.  
1502    
1503  The URL of any image can be used for the X-Image-URL field and no processing  
 of the image is required.  
1504    
1505  If nil, or the file does not exist, nothing is added to the message header."  ;;; The Toolbar (:group 'mh-toolbar)
   :type 'file  
   :group 'mh-letter)  
1506    
1507  (defcustom mh-yank-from-start-of-msg 'attribution  (defcustom mh-tool-bar-search-function 'mh-search-folder
1508    "*Controls which part of a message is yanked by \\<mh-letter-mode-map>\\[mh-yank-cur-msg].    "*Function called by the tool-bar search button.
1509  If t, include the entire message, with full headers.  This is historically  See `mh-search-folder' and `mh-index-search' for details."
1510  here for use with supercite, but is now deprecated in favor of the setting    :type '(choice (const mh-search-folder)
1511  `supercite' below.                   (const mh-index-search)
1512                     (function :tag "Other function"))
1513  If the symbol `body', then yank the message minus the header.    :group 'mh-toolbar)
1514    
1515  If the symbol `supercite', include the entire message, with full headers.  ;; Functions called from the tool bar
1516  This also causes the invocation of `sc-cite-original' without the setting  (defun mh-tool-bar-search (&optional arg)
1517  of `mail-citation-hook', now deprecated practice.    "Interactively call `mh-tool-bar-search-function'.
1518    Optional argument ARG is not used."
1519      (interactive "P")
1520      (call-interactively mh-tool-bar-search-function))
1521    
1522  If the symbol `autosupercite', do as for `supercite' automatically when  (defun mh-tool-bar-customize ()
1523  show buffer matches the message being replied-to.  When this option is used,    "Call `mh-customize' from the toolbar."
1524  the -noformat switch is passed to the repl program to override a -filter or    (interactive)
1525  -format switch.    (mh-customize t))
1526    
1527  If the symbol `attribution', then yank the message minus the header and add  (defun mh-tool-bar-folder-help ()
1528  a simple attribution line at the top.    "Visit \"(mh-e)Top\"."
1529      (interactive)
1530      (Info-goto-node "(mh-e)Top")
1531      (delete-other-windows))
1532    
1533  If the symbol `autoattrib', do as for `attribution' automatically when show  (defun mh-tool-bar-letter-help ()
1534  buffer matches the message being replied-to.  You can make sure this is    "Visit \"(mh-e)Draft Editing\"."
1535  always the case by setting `mh-reply-show-message-flag' to t (which is the    (interactive)
1536  default) and optionally `mh-delete-yanked-msg-window-flag' to t as well such    (Info-goto-node "(mh-e)Draft Editing")
1537  that the show window is never displayed.  When the `autoattrib' option is    (delete-other-windows))
 used, the -noformat switch is passed to the repl program to override a  
 -filter or -format switch.  
1538    
1539  If nil, yank only the portion of the message following the point.  (defmacro mh-tool-bar-reply-generator (function recipient folder-buffer-flag)
1540      "Generate FUNCTION that replies to RECIPIENT.
1541    If FOLDER-BUFFER-FLAG is nil then the function generated
1542    When INCLUDE-FLAG is non-nil, include message body being replied to."
1543      `(defun ,function (&optional arg)
1544         ,(format "Reply to \"%s\".\nWhen ARG is non-nil include message in reply."
1545                  recipient)
1546         (interactive "P")
1547         ,(if folder-buffer-flag nil '(set-buffer mh-show-folder-buffer))
1548         (mh-reply (mh-get-msg-num nil) ,recipient arg)))
1549    
1550  If the show buffer has a region, this variable is ignored unless its value is  (mh-tool-bar-reply-generator mh-tool-bar-reply-from "from" t)
1551  one of `attribution' or `autoattrib' in which case the attribution is added  (mh-tool-bar-reply-generator mh-show-tool-bar-reply-from "from" nil)
1552  to the yanked region."  (mh-tool-bar-reply-generator mh-tool-bar-reply-to "to" t)
1553    :type '(choice (const :tag "Below point" nil)  (mh-tool-bar-reply-generator mh-show-tool-bar-reply-to "to" nil)
1554                   (const :tag "Without header" body)  (mh-tool-bar-reply-generator mh-tool-bar-reply-all "all" t)
1555                   (const :tag "Invoke supercite" supercite)  (mh-tool-bar-reply-generator mh-show-tool-bar-reply-all "all" nil)
                  (const :tag "Invoke supercite, automatically" autosupercite)  
                  (const :tag "Without header, with attribution" attribution)  
                  (const :tag "Without header, with attribution, automatically"  
                         autoattrib)  
                  (const :tag "Entire message with headers" t))  
   :group 'mh-letter)  
1556    
1557    ;; XEmacs has a couple of extra customizations...
1558    (mh-do-in-xemacs
1559      (defcustom mh-xemacs-use-toolbar-flag (if (and (featurep 'toolbar)
1560                                                     (featurep 'xpm)
1561                                                     (device-on-window-system-p))
1562                                                t
1563                                              nil)
1564        "*If non-nil, use toolbar.
1565    
1566  ;;; Alias handling (:group 'mh-alias)  This will default to t if you are in an environment that supports
1567    toolbars and xpm."
1568        :type 'boolean
1569        :group 'mh-toolbar)
1570    
1571  (defcustom mh-alias-completion-ignore-case-flag t    (defcustom mh-xemacs-toolbar-position (if mh-xemacs-use-toolbar-flag
1572    "*Non-nil means don't consider case significant in MH alias completion.                                              'default
1573  This is the default in plain MH, so it is the default here as well. It                                            nil)
1574  can be useful to set this to t if, for example, you use lowercase      "*Where to put the toolbar.
 aliases for people and uppercase for mailing lists."  
   :type 'boolean  
   :group 'mh-alias)  
1575    
1576  (defcustom mh-alias-expand-aliases-flag nil  Valid non-nil values are \"default\", \"top\", \"bottom\", \"left\",
1577    "*Non-nil means to expand aliases entered in the minibuffer.  \"right\".  These match the four edges of the frame, with \"default\"
1578  In other words, aliases entered in the minibuffer will be expanded to the full  meaning \"use the same position as the default-toolbar\".
 address in the message draft. By default, this expansion is not performed."  
   :type 'boolean  
   :group 'mh-alias)  
1579    
1580  (defcustom mh-alias-flash-on-comma t  A nil value means do not use a toolbar.
   "*Specify whether to flash or warn on translation.  
 When a [comma] is pressed while entering aliases or addresses, setting this  
 variable to the following values has the listed effects:  
 t   Flash alias translation but don't warn if there is no translation.  
 1   Flash alias translation and warn if there is no translation.  
 nil Do not flash alias translation nor warn if there is no translation."  
   :type '(choice (const :tag "Flash but don't warn if no translation" t)  
                  (const :tag "Flash and warn if no translation" 1)  
                  (const :tag "Don't flash nor warn if no translation" nil))  
   :group 'mh-alias)  
1581    
1582  (defcustom mh-alias-insert-file nil  If this variable is set to anything other than \"default\" and the
1583    "*Filename to use to store new MH-E aliases.  default-toolbar has a different positional setting from the value of
1584  This variable can also be a list of filenames, in which case MH-E will prompt  this variable, then two toolbars will be displayed.  The MH-E toolbar
1585  for one of them. If nil, the default, then MH-E will use the first file found  and the default-toolbar."
1586  in the \"AliasFile\" component of the MH profile."      :type '(radio (const :tag "Same position as the \"default-toolbar\""
1587    :type '(choice (const :tag "Use AliasFile MH profile component" nil)                           :value default)
1588                   (file :tag "Alias file")                    (const :tag "Along the top edge of the frame"
1589                   (repeat :tag "List of alias files" file))                           :value top)
1590    :group 'mh-alias)                    (const :tag "Along the bottom edge of the frame"
1591                             :value bottom)
1592                      (const :tag "Along the left edge of the frame"
1593                             :value left)
1594                      (const :tag "Along the right edge of the frame"
1595                             :value right)
1596                      (const :tag "Don't use a toolbar" nil))
1597        :group 'mh-toolbar))
1598    
1599  (defcustom mh-alias-insertion-location 'sorted  (defmacro mh-tool-bar-define (defaults &rest buttons)
1600    "Specifies where new aliases are entered in alias files.    "Define a tool bar for MH-E.
1601  Options are sorted alphabetically, at the top of the file or at the bottom."  DEFAULTS is the list of buttons that are present by default. It is a list of
1602    :type '(choice (const :tag "Sorted alphabetically" sorted)  lists where the sublists are of the following form:
                  (const :tag "At the top of file" top)  
                  (const :tag "At the bottom of file" bottom))  
   :group 'mh-alias)  
1603    
1604  (defcustom mh-alias-local-users t    (:KEYWORD FUNC1 FUNC2 FUNC3 ...)
   "*If t, local users are completed in MH-E To: and Cc: prompts.  
1605    
1606  Users with a userid greater than some magic number (usually 200) are available  Here :KEYWORD is one of :folder or :letter. If it is :folder then the default
1607  for completion.  buttons in the folder and show mode buffers are being specified. If it is
1608    :letter then the default buttons in the letter mode are listed. FUNC1, FUNC2,
1609    FUNC3, ... are the names of the functions that the buttons would execute.
1610    
1611  If you set this variable to a string, it will be executed to generate a  Each element of BUTTONS is a list consisting of four mandatory items and one
1612  password file. A value of \"ypcat passwd\" is helpful if NIS is in use."  optional item as follows:
   :type '(choice (boolean) (string))  
   :group 'mh-alias)  
1613    
1614  (defcustom mh-alias-local-users-prefix "local."    (FUNCTION MODES ICON DOC &optional ENABLE-EXPR)
   "*String prepended to the real names of users from the passwd file.  
 If nil, use the username string unmodified instead of the real name from  
 the gecos field of the passwd file.  
1615    
1616  For example, given the following passwd file line:  where,
1617    
1618   psg:x:1000:1000:Peter S Galbraith,,,:/home/psg:/bin/tcsh    FUNCTION is the name of the function that will be executed when the button
1619      is clicked.
1620    
1621  here are the derived aliases for different values of this variable:    MODES is a list of symbols. List elements must be from `folder', `letter' and
1622      `sequence'. If `folder' is present then the button is available in the
1623      folder and show buffer. If the name of FUNCTION is of the form \"mh-foo\",
1624      where foo is some arbitrary string, then we check if the function
1625      `mh-show-foo' exists. If it exists then that function is used in the show
1626      buffer. Otherwise the original function `mh-foo' is used in the show buffer
1627      as well. Presence of `sequence' is handled similar to the above. The only
1628      difference is that the button is shown only when the folder is narrowed to a
1629      sequence. If `letter' is present in MODES, then the button is available
1630      during draft editing and runs FUNCTION when clicked.
1631    
1632   \"local.\"  -> local.peter.galbraith    ICON is the icon that is drawn in the button.
  \"\"        -> peter.galbraith  
  nii       -> psg  
1633    
1634  This variable is only meaningful if the variable `mh-alias-local-users' is    DOC is the documentation for the button. It is used in tool-tips and in
1635  non-nil."    providing other help to the user. GNU Emacs uses only the first line of the
1636    :type '(choice (const :tag "Use username instead of real name" nil)    string. So the DOC should be formatted such that the first line is useful and
1637                   (string))    complete without the rest of the string.
   :group 'mh-alias)  
1638    
1639  (defcustom mh-alias-passwd-gecos-comma-separator-flag t    Optional item ENABLE-EXPR is an arbitrary lisp expression. If it evaluates
1640    "*Non-nil means the gecos field in the passwd file uses comma as a separator.    to nil, then the button is deactivated, otherwise it is active. If is in't
1641  Used to construct aliases for users in the passwd file."    present then the button is always active."
1642    :type 'boolean    ;; The following variable names have been carefully chosen to make code
1643    :group 'mh-alias)    ;; generation easier. Modifying the names should be done carefully.
1644      (let (folder-buttons folder-docs folder-button-setter sequence-button-setter
1645                           show-buttons show-button-setter show-seq-button-setter
1646                           letter-buttons letter-docs letter-button-setter
1647                           folder-defaults letter-defaults
1648                           folder-vectors show-vectors letter-vectors)
1649        (dolist (x defaults)
1650          (cond ((eq (car x) :folder) (setq folder-defaults (cdr x)))
1651                ((eq (car x) :letter) (setq letter-defaults (cdr x)))))
1652        (dolist (button buttons)
1653          (unless (and (listp button)
1654                       (or (equal (length button) 4) (equal (length button) 5)))
1655            (error "Incorrect MH-E tool-bar button specification: %s" button))
1656          (let* ((name (nth 0 button))
1657                 (name-str (symbol-name name))
1658                 (icon (nth 2 button))
1659                 (xemacs-icon (mh-do-in-xemacs
1660                                (cdr (assoc (intern icon) mh-xemacs-icon-map))))
1661                 (full-doc (nth 3 button))
1662                 (doc (if (string-match "\\(.*\\)\n" full-doc)
1663                          (match-string 1 full-doc)
1664                        full-doc))
1665                 (enable-expr (or (nth 4 button) t))
1666                 (modes (nth 1 button))
1667                 functions show-sym)
1668            (when (memq 'letter modes) (setq functions `(:letter ,name)))
1669            (when (or (memq 'folder modes) (memq 'sequence modes))
1670              (setq functions
1671                    (append `(,(if (memq 'folder modes) :folder :sequence) ,name)
1672                            functions))
1673              (setq show-sym
1674                    (if (string-match "^mh-\\(.*\\)$" name-str)
1675                        (intern (concat "mh-show-" (match-string 1 name-str)))
1676                      name))
1677              (setq functions
1678                    (append `(,(if (memq 'folder modes) :show :show-seq)
1679                              ,(if (fboundp show-sym) show-sym name))
1680                            functions)))
1681            (do ((functions functions (cddr functions)))
1682                ((null functions))
1683              (let* ((type (car functions))
1684                     (function (cadr functions))
1685                     (type1 (substring (symbol-name type) 1))
1686                     (vector-list (cond ((eq type :show) 'show-vectors)
1687                                        ((eq type :show-seq) 'show-vectors)
1688                                        ((eq type :letter) 'letter-vectors)
1689                                        (t 'folder-vectors)))
1690                     (list (cond ((eq type :letter) 'mh-tool-bar-letter-buttons)
1691                                 (t 'mh-tool-bar-folder-buttons)))
1692                     (key (intern (concat "mh-" type1 "toolbar-" name-str)))
1693                     (setter (intern (concat type1 "-button-setter")))
1694                     (mbuttons (cond ((eq type :letter) 'letter-buttons)
1695                                     ((eq type :show) 'show-buttons)
1696                                     ((eq type :show-seq) 'show-buttons)
1697                                     (t 'folder-buttons)))
1698                     (docs (cond ((eq mbuttons 'letter-buttons) 'letter-docs)
1699                                 ((eq mbuttons 'folder-buttons) 'folder-docs))))
1700                (add-to-list vector-list `[,xemacs-icon ,function t ,full-doc])
1701                (add-to-list
1702                 setter `(when (member ',name ,list)
1703                           (mh-funcall-if-exists
1704                            tool-bar-add-item ,icon ',function ',key
1705                            :help ,doc :enable ',enable-expr)))
1706                (add-to-list mbuttons name)
1707                (if docs (add-to-list docs doc))))))
1708        (setq folder-buttons (nreverse folder-buttons)
1709              letter-buttons (nreverse letter-buttons)
1710              show-buttons (nreverse show-buttons)
1711              letter-docs (nreverse letter-docs)
1712              folder-docs (nreverse folder-docs)
1713              folder-vectors (nreverse folder-vectors)
1714              show-vectors (nreverse show-vectors)
1715              letter-vectors (nreverse letter-vectors))
1716        (dolist (x folder-defaults)
1717          (unless (memq x folder-buttons)
1718            (error "Folder defaults contains unknown button '%s'" x)))
1719        (dolist (x letter-defaults)
1720          (unless (memq x letter-buttons)
1721            (error "Letter defaults contains unknown button '%s'" x)))
1722        `(eval-when (compile load eval)
1723           (defvar mh-folder-tool-bar-map nil)
1724           (defvar mh-folder-seq-tool-bar-map nil)
1725           (defvar mh-show-tool-bar-map nil)
1726           (defvar mh-show-seq-tool-bar-map nil)
1727           (defvar mh-letter-tool-bar-map nil)
1728           ;; GNU Emacs tool bar specific code
1729           (mh-do-in-gnu-emacs
1730             ;; Custom setter functions
1731             (defun mh-tool-bar-folder-buttons-set (symbol value)
1732               "Construct toolbar for `mh-folder-mode' and `mh-show-mode'."
1733               (set-default symbol value)
1734               (setq mh-folder-tool-bar-map
1735                     (let ((tool-bar-map (make-sparse-keymap)))
1736                       ,@(nreverse folder-button-setter)
1737                       tool-bar-map))
1738               (setq mh-show-tool-bar-map
1739                     (let ((tool-bar-map (make-sparse-keymap)))
1740                       ,@(nreverse show-button-setter)
1741                       tool-bar-map))
1742               (setq mh-show-seq-tool-bar-map
1743                     (let ((tool-bar-map (copy-keymap mh-show-tool-bar-map)))
1744                       ,@(nreverse show-seq-button-setter)
1745                       tool-bar-map))
1746               (setq mh-folder-seq-tool-bar-map
1747                     (let ((tool-bar-map (copy-keymap mh-folder-tool-bar-map)))
1748                       ,@(nreverse sequence-button-setter)
1749                       tool-bar-map)))
1750             (defun mh-tool-bar-letter-buttons-set (symbol value)
1751               "Construct toolbar for `mh-letter-mode'."
1752               (set-default symbol value)
1753               (setq mh-letter-tool-bar-map
1754                     (let ((tool-bar-map (make-sparse-keymap)))
1755                       ,@(nreverse letter-button-setter)
1756                       tool-bar-map))))
1757           ;; XEmacs specific code
1758           (mh-do-in-xemacs
1759             (defvar mh-toolbar-folder-vector-map
1760               ',(loop for button in folder-buttons
1761                       for vector in folder-vectors
1762                       collect (cons button vector)))
1763             (defvar mh-toolbar-show-vector-map
1764               ',(loop for button in show-buttons
1765                       for vector in show-vectors
1766                       collect (cons button vector)))
1767             (defvar mh-toolbar-letter-vector-map
1768               ',(loop for button in letter-buttons
1769                       for vector in letter-vectors
1770                       collect (cons button vector)))
1771             (defvar mh-toolbar-folder-buttons nil)
1772             (defvar mh-toolbar-show-buttons nil)
1773             (defvar mh-toolbar-letter-buttons nil)
1774             ;; Custom setter functions
1775             (defun mh-tool-bar-letter-buttons-set (symbol value)
1776               (set-default symbol value)
1777               (when mh-xemacs-has-toolbar-flag
1778                 (setq mh-toolbar-letter-buttons
1779                       (loop for b in value
1780                             collect (cdr (assoc b mh-toolbar-letter-vector-map))))))
1781             (defun mh-tool-bar-folder-buttons-set (symbol value)
1782               (set-default symbol value)
1783               (when mh-xemacs-has-toolbar-flag
1784                 (setq mh-toolbar-folder-buttons
1785                       (loop for b in value
1786                             collect (cdr (assoc b mh-toolbar-folder-vector-map))))
1787                 (setq mh-toolbar-show-buttons
1788                       (loop for b in value
1789                             collect (cdr (assoc b mh-toolbar-show-vector-map))))))
1790             ;; Initialize toolbar
1791             (defun mh-toolbar-init (mode)
1792               "Install toolbar in MODE."
1793               (let ((toolbar (cond ((eq mode :folder) mh-toolbar-folder-buttons)
1794                                    ((eq mode :letter) mh-toolbar-letter-buttons)
1795                                    ((eq mode :show) mh-toolbar-show-buttons)))
1796                     (height 37)
1797                     (width 40)
1798                     (buffer (current-buffer)))
1799                 (when (and mh-xemacs-toolbar-position mh-xemacs-use-toolbar-flag
1800                            mh-xemacs-has-toolbar-flag)
1801                   (cond
1802                    ((eq mh-xemacs-toolbar-position 'top)
1803                     (set-specifier top-toolbar toolbar buffer)
1804                     (set-specifier top-toolbar-visible-p t)
1805                     (set-specifier top-toolbar-height height))
1806                    ((eq mh-xemacs-toolbar-position 'bottom)
1807                     (set-specifier bottom-toolbar toolbar buffer)
1808                     (set-specifier bottom-toolbar-visible-p t)
1809                     (set-specifier bottom-toolbar-height height))
1810                    ((eq mh-xemacs-toolbar-position 'left)
1811                     (set-specifier left-toolbar toolbar buffer)
1812                     (set-specifier left-toolbar-visible-p t)
1813                     (set-specifier left-toolbar-width width))
1814                    ((eq mh-xemacs-toolbar-position 'right)
1815                     (set-specifier right-toolbar toolbar buffer)
1816                     (set-specifier right-toolbar-visible-p t)
1817                     (set-specifier right-toolbar-width width))
1818                    (t (set-specifier default-toolbar toolbar buffer)))))))
1819           ;; Declare customizable toolbars
1820           (custom-declare-variable
1821            'mh-tool-bar-folder-buttons
1822            '(list ,@(mapcar (lambda (x) `(quote ,x)) folder-defaults))
1823            "Choose buttons to include in MH-E folder/show toolbar."
1824            :group 'mh-toolbar :set 'mh-tool-bar-folder-buttons-set
1825            :type '(set ,@(loop for x in folder-buttons
1826                                for y in folder-docs
1827                                collect `(const :tag ,y ,x))))
1828           (custom-declare-variable
1829            'mh-tool-bar-letter-buttons
1830            '(list ,@(mapcar (lambda (x) `(quote ,x)) letter-defaults))
1831            "Choose buttons to include in MH-E letter toolbar."
1832            :group 'mh-toolbar :set 'mh-tool-bar-letter-buttons-set
1833            :type '(set ,@(loop for x in letter-buttons
1834                                for y in letter-docs
1835                                collect `(const :tag ,y ,x)))))))
1836    
1837  (defcustom mh-alias-system-aliases  (mh-tool-bar-define
1838    '("/etc/nmh/MailAliases" "/usr/lib/mh/MailAliases" "/etc/passwd")      ((:folder mh-inc-folder mh-mime-save-parts mh-previous-undeleted-msg
1839    "*A list of system files from which to cull aliases.                mh-page-msg  mh-next-undeleted-msg mh-delete-msg mh-refile-msg
1840  If these files are modified, they are automatically reread. This list need                mh-undo mh-execute-commands mh-toggle-tick mh-reply
1841  include only system aliases and the passwd file, since personal alias files                mh-alias-grab-from-field mh-send mh-rescan-folder
1842  listed in your \"AliasFile\" MH profile component are automatically included.                mh-tool-bar-search mh-visit-folder
1843  You can update the alias list manually using \\[mh-alias-reload]."                mh-tool-bar-customize mh-tool-bar-folder-help mh-widen)
1844    :type '(choice (file) (repeat file))       (:letter mh-send-letter mh-compose-insertion ispell-message save-buffer
1845    :group 'mh-alias)                undo kill-region menu-bar-kill-ring-save yank mh-fully-kill-draft
1846                  mh-tool-bar-customize mh-tool-bar-letter-help))
1847      ;; Folder/Show buffer buttons
1848      (mh-inc-folder (folder) "mail"
1849        "Incorporate new mail in Inbox
1850    This button runs `mh-inc-folder' which drags any
1851    new mail into your Inbox folder.")
1852      (mh-mime-save-parts (folder) "attach"
1853        "Save MIME parts from this message
1854    This button runs `mh-mime-save-parts' which saves a message's
1855    different parts into separate files.")
1856      (mh-previous-undeleted-msg (folder) "left_arrow"
1857        "Go to the previous undeleted message
1858    This button runs `mh-previous-undeleted-msg'")
1859      (mh-page-msg (folder) "page-down"
1860        "Page the current message forwards\nThis button runs `mh-page-msg'")
1861      (mh-next-undeleted-msg (folder) "right_arrow"
1862        "Go to the next undeleted message\nThe button runs `mh-next-undeleted-msg'")
1863      (mh-delete-msg (folder) "close"
1864        "Mark this message for deletion\nThis button runs `mh-delete-msg'")
1865      (mh-refile-msg (folder) "refile"
1866        "Refile this message\nThis button runs `mh-refile-msg'")
1867      (mh-undo (folder) "undo" "Undo last operation\nThis button runs `undo'"
1868        (mh-outstanding-commands-p))
1869      (mh-execute-commands (folder) "execute"
1870        "Perform moves and deletes\nThis button runs `mh-execute-commands'"
1871        (mh-outstanding-commands-p))
1872      (mh-toggle-tick (folder) "highlight"
1873        "Toggle tick mark\nThis button runs `mh-toggle-tick'")
1874      (mh-toggle-showing (folder) "show"
1875        "Toggle showing message\nThis button runs `mh-toggle-showing'")
1876      (mh-tool-bar-reply-from (folder) "reply-from" "Reply to \"from\"")
1877      (mh-tool-bar-reply-to (folder) "reply-to" "Reply to \"to\"")
1878      (mh-tool-bar-reply-all (folder) "reply-all" "Reply to \"all\"")
1879      (mh-reply (folder) "mail/reply2"
1880        "Reply to this message\nThis button runs `mh-reply'")
1881      (mh-alias-grab-from-field (folder) "alias"
1882        "Grab From alias\nThis button runs `mh-alias-grab-from-field'"
1883        (and (mh-extract-from-header-value) (not (mh-alias-for-from-p))))
1884      (mh-send (folder) "mail_compose"
1885        "Compose new message\nThis button runs `mh-send'")
1886      (mh-rescan-folder (folder) "rescan"
1887        "Rescan this folder\nThis button runs `mh-rescan-folder'")
1888      (mh-pack-folder (folder) "repack"
1889        "Repack this folder\nThis button runs `mh-pack-folder'")
1890      (mh-tool-bar-search (folder) "search"
1891        "Search\nThis button runs `mh-tool-bar-search-function'")
1892      (mh-visit-folder (folder) "fld_open"
1893        "Visit other folder\nThis button runs `mh-visit-folder'")
1894      ;; Letter buffer buttons
1895      (mh-send-letter (letter) "mail_send" "Send this letter")
1896      (mh-compose-insertion (letter) "attach" "Insert attachment")
1897      (ispell-message (letter) "spell" "Check spelling")
1898      (save-buffer (letter) "save" "Save current buffer to its file"
1899        (buffer-modified-p))
1900      (undo (letter) "undo" "Undo last operation")
1901      (kill-region (letter) "cut"
1902        "Cut (kill) text in region between mark and current position")
1903      (menu-bar-kill-ring-save (letter) "copy"
1904        "Copy text in region between mark and current position")
1905      (yank (letter) "paste" "Paste (yank) text cut or copied earlier")
1906      (mh-fully-kill-draft (letter) "close" "Kill this draft")
1907      ;; Common buttons
1908      (mh-tool-bar-customize (folder letter) "preferences" "MH-E Preferences")
1909      (mh-tool-bar-folder-help (folder) "help"
1910        "Help! (general help)\nThis button runs `Info-goto-node'")
1911      (mh-tool-bar-letter-help (letter) "help"
1912        "Help! (general help)\nThis button runs `Info-goto-node'")
1913      ;; Folder narrowed to sequence buttons
1914      (mh-widen (sequence) "widen"
1915        "Widen from the sequence\nThis button runs `mh-widen'"))
1916    
1917    
1918    
1919  ;;; Multiple personalities (:group 'mh-identity)  ;;; Hooks (:group 'mh-hooks + group where hook described)
   
 (defcustom mh-identity-list nil  
   "*List holding MH-E identity.  
 Omit the colon and trailing space from the field names.  
 The keyword name \"none\" is reserved for internal use.  
 Use the keyname name \"signature\" to specify either a signature file or a  
 function to call to insert a signature at point.  
   
 Providing an empty Value (\"\") will cause the field to be deleted.  
   
 Example entries using the customize interface:  
    Keyword name: work  
             From  
             Value: John Doe <john@work.com>  
             Organization  
             Value: Acme Inc.  
    Keyword name: home  
             From  
             Value: John Doe <johndoe@home.net>  
             Organization  
             Value:  
   
 This would produce the equivalent of:  
  (setq mh-identity-list  
       '((\"work\"  
          ((\"From\" . \"John Doe <john@work.com>\")  
           (\"Organization\" . \"Acme Inc.\")))  
         (\"home\"  
          ((\"From\" . \"John Doe <johndoe@home.net>\")  
           (\"Organization\" . \"\")))))"  
   :type '(repeat (list :tag ""  
                        (string :tag "Keyword name")  
                        (repeat :tag "At least one pair from below"  
                                (choice (cons :tag "From field"  
                                              (const "From")  
                                              (string :tag "Value"))  
                                        (cons :tag "Organization field"  
                                              (const "Organization")  
                                              (string :tag "Value"))  
                                        (cons :tag "Signature"  
                                              (const "signature")  
                                              (choice (file) (function)))  
                                        (cons :tag "Other field & value pair"  
                                              (string :tag "Field")  
                                              (string :tag "Value"))))))  
   :set 'mh-identity-list-set  
   :group 'mh-identity)  
   
 (defcustom mh-auto-fields-list nil  
   "Alist of addresses for which header lines are automatically inserted.  
 Each element has the form (REGEXP ((KEYWORD VALUE) (KEYWORD VALUE)).  
 When the REGEXP appears in the To or cc fields of a message, the corresponding  
 KEYWORD header field is insert with its VALUE in the message header.  
   
 There is one special case for KEYWORD, that of \"identity\", which means to  
 insert that identity using `mh-insert-identity'.  
1920    
1921  The common KEYWORD cases of \"Mail-Followup-To\" and \"fcc\" are also  (defcustom mail-citation-hook nil
1922  prompted for in the customization interface."    "*Hook for modifying a citation just inserted in the mail buffer.
1923    :type `(repeat  Each hook function can find the citation between point and mark.
1924            (list :tag ""  And each hook function should leave point and mark around the citation
1925                  (string :tag "Regular expression to match")  text as modified.
1926                  (repeat :tag "At least one pair from below"  
1927                          (choice  If this hook is entirely empty (nil), the text of the message is inserted
1928                           (cons :tag "Identity entry"  with `mh-ins-buf-prefix' prefixed to each line.
1929                            (const "identity")  
1930                            ,(append  See also the variable `mh-yank-from-start-of-msg', which controls how
1931                              '(radio)  much of the message passed to the hook.
1932                              (mapcar (function (lambda (arg) `(const ,arg)))  
1933                                      (mapcar 'car mh-identity-list))))  This hook was historically provided to set up supercite.  You may now leave
1934                           (cons :tag "fcc field"  this nil and set up supercite by setting the variable
1935                                 (const "fcc")  `mh-yank-from-start-of-msg' to 'supercite or, for more automatic insertion,
1936                                 (string :tag "Value"))  to 'autosupercite.
1937                           (cons :tag "Mail-Followup-To field"  
1938                                 (const "Mail-Followup-To")  The hook 'trivial-cite is NOT part of Emacs.  It is provided from tc.el,
1939                                 (string :tag "Value"))  available here:
1940                           (cons :tag "Other field and value pair"   http://shasta.cs.uiuc.edu/~lrclause/tc.html
1941                                   (string :tag "Field")  If you use it, customize `mh-yank-from-start-of-msg' to
1942                                   (string :tag "Value"))))))   \"Entire message with headers\"."
1943    :group 'mh-identity)    :type 'hook
1944      :options '(trivial-cite)
1945  (defcustom mh-identity-default nil    :group 'mh-hooks
1946    "Default identity to use when `mh-letter-mode' is called."    :group 'mh-letter)
   ;; Dynamically render :type corresponding to `mh-identity-list' entries,  
   ;; e.g.:  
   ;;  :type '(radio (const :tag "none" nil)  
   ;;                (const "home")  
   ;;                (const "work"))  
   :type (append  
          '(radio)  
          (cons '(const :tag "None" nil)  
                (mapcar (function (lambda (arg) `(const ,arg)))  
                        (mapcar 'car mh-identity-list))))  
   :group 'mh-identity)  
   
   
   
 ;;; Hooks (:group 'mh-hooks + group where hook defined)  
1947    
1948  ;;; These are alphabetized. All hooks should be placed in the 'mh-hook group;  (defcustom mh-alias-reloaded-hook nil
1949  ;;; in addition, add the group in which the hook is defined in the manual (or,    "Invoked by `mh-alias-reload' after reloading aliases."
1950  ;;; if it is new, where it would be defined).    :type 'hook
1951      :group 'mh-hooks
1952      :group 'mh-alias)
1953    
1954  (defcustom mh-before-quit-hook nil  (defcustom mh-before-quit-hook nil
1955    "Invoked by \\<mh-folder-mode-map>`\\[mh-quit]' before quitting MH-E.    "Invoked by \\<mh-folder-mode-map>`\\[mh-quit]' before quitting MH-E.
1956  See also `mh-quit-hook'."  See also `mh-quit-hook'."
1957    :type 'hook    :type 'hook
1958    :group 'mh-hooks    :group 'mh-hooks
1959    :group 'mh-folder)    :group 'mh-show)
1960    
1961  (defcustom mh-before-send-letter-hook nil  (defcustom mh-before-send-letter-hook nil
1962    "Invoked at the beginning of the \\<mh-letter-mode-map>\\[mh-send-letter] command."    "Invoked at the beginning of the \\<mh-letter-mode-map>\\[mh-send-letter] command."
# Line 1684  See also `mh-quit-hook'." Line 1968  See also `mh-quit-hook'."
1968    "Invoked after marking each message for deletion."    "Invoked after marking each message for deletion."
1969    :type 'hook    :type 'hook
1970    :group 'mh-hooks    :group 'mh-hooks
1971    :group 'mh-folder)    :group 'mh-show)
1972    
1973  (defcustom mh-edit-mhn-hook nil  (defcustom mh-edit-mhn-hook nil
1974    "Invoked on the formatted letter by \\<mh-letter-mode-map>\\[mh-edit-mhn]."    "Invoked on the formatted letter by \\<mh-letter-mode-map>\\[mh-edit-mhn]."
# Line 1696  See also `mh-quit-hook'." Line 1980  See also `mh-quit-hook'."
1980    "Invoked by `mh-find-path' after reading the user's MH profile."    "Invoked by `mh-find-path' after reading the user's MH profile."
1981    :type 'hook    :type 'hook
1982    :group 'mh-hooks    :group 'mh-hooks
1983    :group 'mh-folder)    :group 'mh-show)
1984    
1985  (defcustom mh-folder-mode-hook nil  (defcustom mh-folder-mode-hook nil
1986    "Invoked in `mh-folder-mode' on a new folder."    "Invoked in `mh-folder-mode' on a new folder."
1987    :type 'hook    :type 'hook
1988    :group 'mh-hooks    :group 'mh-hooks
1989    :group 'mh-folder)    :group 'mh-show)
1990    
1991  (defcustom mh-folder-updated-hook nil  (defcustom mh-folder-updated-hook nil
1992    "Invoked when the folder actions (such as moves and deletes) are performed.    "Invoked when the folder actions (such as moves and deletes) are performed.
# Line 1712  current folder, `mh-current-folder'." Line 1996  current folder, `mh-current-folder'."
1996    :type 'hook    :type 'hook
1997    :group 'mh-hooks)    :group 'mh-hooks)
1998    
1999    (defcustom mh-forward-hook nil
2000      "Invoked on the forwarded letter by \\<mh-folder-mode-map>\\[mh-forward]."
2001      :type 'hook
2002      :group 'mh-hooks
2003      :group 'mh-folder)
2004    
2005  (defcustom mh-inc-folder-hook nil  (defcustom mh-inc-folder-hook nil
2006    "Invoked by \\<mh-folder-mode-map>`\\[mh-inc-folder]' after incorporating mail into a folder."    "Invoked by \\<mh-folder-mode-map>`\\[mh-inc-folder]' after incorporating mail into a folder."
2007    :type 'hook    :type 'hook
2008    :group 'mh-hooks    :group 'mh-hooks
2009    :group 'mh-folder)    :group 'mh-inc)
2010    
2011  (defcustom mh-kill-folder-suppress-prompt-hook '(mh-index-p)  (defcustom mh-kill-folder-suppress-prompt-hook '(mh-index-p)
2012    "Invoked at the beginning of the  \\<mh-folder-mode-map>`\\[mh-kill-folder]' command.    "Invoked at the beginning of the  \\<mh-folder-mode-map>`\\[mh-kill-folder]' command.
# Line 1733  t on +inbox and you hit \\<mh-folder-mod Line 2023  t on +inbox and you hit \\<mh-folder-mod
2023  in the +inbox buffer, you will not be happy."  in the +inbox buffer, you will not be happy."
2024    :type 'hook    :type 'hook
2025    :group 'mh-hooks    :group 'mh-hooks
2026    :group 'mh-folder)    :group 'mh-show)
2027    
2028  (defcustom mh-letter-insert-signature-hook nil  (defcustom mh-letter-insert-signature-hook nil
2029    "Invoked at the beginning of the \\<mh-letter-mode-map>\\[mh-insert-signature] command.    "Invoked after signature has been inserted.
2030  Can be used to determine which signature file to use based on message content.  This hook may access the actual name of the file or the function used to
2031  On return, if `mh-signature-file-name' is non-nil that file will be inserted at  insert the signature with `mh-signature-file-name'."
 the current point in the buffer."  
2032    :type 'hook    :type 'hook
2033    :group 'mh-hooks    :group 'mh-hooks
2034    :group 'mh-letter)    :group 'mh-letter)
# Line 1748  the current point in the buffer." Line 2037  the current point in the buffer."
2037    "Invoked in `mh-letter-mode' on a new letter."    "Invoked in `mh-letter-mode' on a new letter."
2038    :type 'hook    :type 'hook
2039    :group 'mh-hooks    :group 'mh-hooks
2040    :group 'mh-letter)    :group 'mh-sending-mail)
2041    
2042  (defcustom mh-pick-mode-hook nil  (defcustom mh-pick-mode-hook nil
2043    "Invoked upon entry to `mh-pick-mode'."    "Invoked upon entry to `mh-pick-mode'."
2044    :type 'hook    :type 'hook
2045    :group 'mh-hooks    :group 'mh-hooks
2046    :group 'mh-folder)    :group 'mh-index)
2047    
2048  (defcustom mh-quit-hook nil  (defcustom mh-quit-hook nil
2049    "Invoked after \\<mh-folder-mode-map>`\\[mh-quit]' quits MH-E.    "Invoked after \\<mh-folder-mode-map>`\\[mh-quit]' quits MH-E.
2050  See also `mh-before-quit-hook'."  See also `mh-before-quit-hook'."
2051    :type 'hook    :type 'hook
2052    :group 'mh-hooks    :group 'mh-hooks
2053    :group 'mh-folder)    :group 'mh-show)
2054    
2055  (defcustom mh-refile-msg-hook nil  (defcustom mh-refile-msg-hook nil
2056    "Invoked after marking each message for refiling."    "Invoked after marking each message for refiling."
2057    :type 'hook    :type 'hook
2058    :group 'mh-hooks    :group 'mh-hooks
2059    :group 'mh-folder)    :group 'mh-show)
2060    
2061  (defcustom mh-show-hook nil  (defcustom mh-show-hook nil
2062    "Invoked after \\<mh-folder-mode-map>`\\[mh-show]' shows a message."    "Invoked after \\<mh-folder-mode-map>`\\[mh-show]' shows a message."
# Line 1787  The variable `mh-seen-list' can be used Line 2076  The variable `mh-seen-list' can be used
2076  will be removed from the unseen sequence."  will be removed from the unseen sequence."
2077    :type 'hook    :type 'hook
2078    :group 'mh-hooks    :group 'mh-hooks
2079    :group 'mh-folder)    :group 'mh-show)
2080    
2081    
2082    
2083  ;;; Faces  ;;; Faces (:group 'mh-*-faces + group where faces described)
   
 ;;; Faces used in speedbar (:group mh-speed-faces)  
   
 (defface mh-speedbar-folder-face  
   '((((class color) (background light))  
      (:foreground "blue4"))  
     (((class color) (background dark))  
      (:foreground "light blue")))  
   "Face used for folders in the speedbar buffer."  
   :group 'mh-speed-faces)  
   
 (defface mh-speedbar-selected-folder-face  
   '((((class color) (background light))  
      (:foreground "red" :underline t))  
     (((class color) (background dark))  
      (:foreground "red" :underline t))  
     (t (:underline t)))  
   "Face used for the current folder."  
   :group 'mh-speed-faces)  
   
 (defface mh-speedbar-folder-with-unseen-messages-face  
   '((t (:inherit mh-speedbar-folder-face :bold t)))  
   "Face used for folders in the speedbar buffer which have unread messages."  
   :group 'mh-speed-faces)  
   
 (defface mh-speedbar-selected-folder-with-unseen-messages-face  
   '((t (:inherit mh-speedbar-selected-folder-face :bold t)))  
   "Face used for the current folder when it has unread messages."  
   :group 'mh-speed-faces)  
   
   
2084    
2085  ;;; Faces used in scan listing (:group mh-folder-faces)  ;;; Faces Used in Scan Listing (:group 'mh-folder-faces)
2086    
2087  (defvar mh-folder-body-face 'mh-folder-body-face  (defvar mh-folder-body-face 'mh-folder-body-face
2088    "Face for highlighting body text in MH-Folder buffers.")    "Face for highlighting body text in MH-Folder buffers.")
# Line 1962  will be removed from the unseen sequence Line 2220  will be removed from the unseen sequence
2220    
2221    
2222    
2223  ;;; Faces used in message display (:group mh-show-faces)  ;;; Faces Used in Searching (:group 'mh-index-faces)
2224    
2225    (defvar mh-index-folder-face 'mh-index-folder-face
2226      "Face for highlighting folders in MH-Index buffers.")
2227    (defface mh-index-folder-face
2228      '((((class color) (background light))
2229         (:foreground "dark green" :bold t))
2230        (((class color) (background dark))
2231         (:foreground "indian red" :bold t))
2232        (t
2233         (:bold t)))
2234      "Face for highlighting folders in MH-Index buffers."
2235      :group 'mh-index-faces)
2236    
2237    
2238    
2239    ;;; Faces Used in Message Drafts (:group 'mh-letter-faces)
2240    
2241    (defface mh-letter-header-field-face
2242      '((((class color) (background light))
2243         (:background "gray90"))
2244        (((class color) (background dark))
2245         (:background "gray10"))
2246        (t (:bold t)))
2247      "Face for displaying header fields in draft buffers."
2248      :group 'mh-letter-faces)
2249    
2250    
2251    
2252    ;;; Faces Used in Message Display (:group 'mh-show-faces)
2253    
2254  (defvar mh-show-cc-face 'mh-show-cc-face  (defvar mh-show-cc-face 'mh-show-cc-face
2255    "Face for highlighting cc header fields.")    "Face for highlighting cc header fields.")
# Line 2002  will be removed from the unseen sequence Line 2289  will be removed from the unseen sequence
2289    "Face used to deemphasize unspecified header fields."    "Face used to deemphasize unspecified header fields."
2290    :group 'mh-show-faces)    :group 'mh-show-faces)
2291    
2292    (defface mh-show-signature-face
2293      '((t (:italic t)))
2294      "Face for highlighting message signature."
2295      :group 'mh-show-faces)
2296    
2297  (defvar mh-show-to-face 'mh-show-to-face  (defvar mh-show-to-face 'mh-show-to-face
2298    "Face for highlighting the To: header field.")    "Face for highlighting the To: header field.")
2299  (if (boundp 'facemenu-unlisted-faces)  (if (boundp 'facemenu-unlisted-faces)
# Line 2041  The background and foreground is used in Line 2333  The background and foreground is used in
2333    
2334    
2335    
2336  ;;; Faces used in indexed searches (:group mh-index-faces)  ;;; Faces Used in Speedbar (:group 'mh-speed-faces)
2337    
2338  (defvar mh-index-folder-face 'mh-index-folder-face  (defface mh-speedbar-folder-face
   "Face for highlighting folders in MH-Index buffers.")  
 (defface mh-index-folder-face  
2339    '((((class color) (background light))    '((((class color) (background light))
2340       (:foreground "dark green" :bold t))       (:foreground "blue4"))
2341      (((class color) (background dark))      (((class color) (background dark))
2342       (:foreground "indian red" :bold t))       (:foreground "light blue")))
2343      (t    "Face used for folders in the speedbar buffer."
2344       (:bold t)))    :group 'mh-speed-faces)
   "Face for highlighting folders in MH-Index buffers."  
   :group 'mh-index-faces)  
   
   
   
 ;;; Faces used when composing messages.  
2345    
2346  (defface mh-letter-header-field-face  (defface mh-speedbar-selected-folder-face
2347    '((((class color) (background light))    '((((class color) (background light))
2348       (:background "gray90"))       (:foreground "red" :underline t))
2349      (((class color) (background dark))      (((class color) (background dark))
2350       (:background "gray10"))       (:foreground "red" :underline t))
2351      (t (:bold t)))      (t (:underline t)))
2352    "Face for displaying header fields in draft buffers."    "Face used for the current folder."
2353    :group 'mh-letter-faces)    :group 'mh-speed-faces)
2354    
2355    (defface mh-speedbar-folder-with-unseen-messages-face
2356      '((t (:inherit mh-speedbar-folder-face :bold t)))
2357      "Face used for folders in the speedbar buffer which have unread messages."
2358      :group 'mh-speed-faces)
2359    
2360    (defface mh-speedbar-selected-folder-with-unseen-messages-face
2361      '((t (:inherit mh-speedbar-selected-folder-face :bold t)))
2362      "Face used for the current folder when it has unread messages."
2363      :group 'mh-speed-faces)
2364    
2365  ;;; Local Variables:  ;;; Local Variables:
2366  ;;; indent-tabs-mode: nil  ;;; indent-tabs-mode: nil

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.6.2.1

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26