4.3BSD-Reno/contrib/lib/emacs/lisp/mh-e.elc


(defvar mh-e-RCS-id)

(setq mh-e-RCS-id "$Header: mh-e.el,v 2.24 88/08/29 12:07:53 larus Exp $")

(provide (quote mh-e))

(defvar mh-redist-full-contents t "\
Non-nil if the `dist' command needs whole letter for redistribution (i.e.,
when `send' is compiled with the BERK option).  Nil otherwise.")

(defvar mh-folder-mode-hook nil "\
*Invoked in mh-folder-mode on a new folder.")

(defvar mh-letter-mode-hook nil "\
*Invoked in mh-letter-mode on a new letter.")

(defvar mh-compose-letter-hook nil "\
*Invoked in mh-compose-and-send-mail on an outgoing letter.  It is passed
three arguments: TO recipients, SUBJECT, and CC recipients.")

(defvar mh-inc-folder-hook nil "\
*Invoked after incorporating new mail into a folder.")

(defvar mh-clean-message-header nil "\
*Non-nil means remove invisible header lines or only show visible header
lines in messages.")

(defvar mh-visible-headers nil "\
*If non-nil, it contains a regexp specifying the headers that are shown in
a message if mh-clean-message-header is non-nil.  Setting this variable
overrides mh-invisible-headers.")

(defvar mhl-formfile nil "\
*Name of format file to be used by mhl to show messages.
A value of T means use the default format file.
Nil means don't use mhl to format messages.")

(defvar mh-lpr-command-format "lpr -p -J '%s'" "\
*Format for Unix command line to print a message. The format should be
a unix command line, with the string \"%s\" where the folder and message
number should appear.")

(defvar mh-print-background nil "\
*Print messages in the background if non-nil.  WARNING: do not delete
the messages until printing is finished; otherwise, your output may be
truncated.")

(defvar mh-summary-height 4 "\
*Number of lines in summary window.")

(defvar mh-recenter-summary-p nil "\
*Recenter summary window when the show window is toggled off if
this is non-nil.")

(defvar mh-ins-buf-prefix ">> " "\
*String to put before each non-blank line of the the current message
as it is inserted in an outgoing letter.")

(defvar mh-do-not-confirm nil "\
*Non-nil means do not prompt for confirmation before executing some
innocuous commands.")

(defvar mh-bury-show-buffer t "\
*Non-nil means that the displayed show buffer for a folder is buried.")

(defvar mh-delete-yanked-msg-window nil "\
*If non-nil, yanking the current message into a letter being composed,
with \\[mh-yank-cur-msg], deletes any windows displaying the message.")

(defvar mh-yank-from-start-of-msg t "\
*If non-nil, \\[mh-yank-cur-msg] will include the entire message.  If
`body' then the message minus the header will be yanked.  If nil, only the
portion of the message following the point will be yanked.  If there is a
region in the show buffer, this variable is ignored.")

(defvar mh-reply-default-reply-to nil "\
*If non-nil, then \\[mh-reply] will use this as the person or persons to
which the reply will be sent.  The value should be one of \"from\", \"to\", or
\"cc\".")

(defvar mh-recursive-folders nil "\
*If non-nil, then commands which operate on folders do so recursively.")

(defvar mh-cmd-note 4 "\
Offset to insert notation")

(defvar mh-good-msg-regexp "^....[^D^]" "\
Regexp specifiying the scan lines that are 'good' messages.")

(defvar mh-deleted-msg-regexp "^....D" "\
Regexp matching scan lines of deleted messages.")

(defvar mh-refiled-msg-regexp "^....\\^" "\
Regexp matching scan lines of refiled messages.")

(defvar mh-valid-scan-line "^[ ]*[0-9]" "\
Regexp matching scan lines for messages (not error messages).")

(defvar mh-msg-number-regexp "^[ ]*\\([0-9]+\\)" "\
Regexp matching the number of a message in a scan line.  It must surround
the number with \\( \\)")

(defvar mh-msg-search-regexp "^[^0-9]*%d[^0-9]" "\
String for format that will return a regexp matching the scan listing for
a given message number.")

(defvar mh-flagged-scan-msg-regexp "^....\\D\\|^....\\^\\|^....\\+\\|^.....%" "\
Regexp matching scan lines marked as deleted, refiled, in a sequence, or
the cur message.")

(defvar mh-cur-scan-msg-regexp "^....\\+" "\
regexp matching scan line for the cur message.")

(defvar mh-invisible-headers "^Received: \\|^Message-Id: \\|^Remailed-\\|^Via: \\|^Mail-from: \\|^Return-Path: \\|^In-Reply-To: \\|^Resent-" "\
Regexp specifying headers that are not to be shown.")

(defvar mh-rejected-letter-start "^   ----- Unsent message follows -----$" "\
Regexp specifying the beginning of the wrapper around a letter returned
by the mail system.")

(defvar mh-to-field-choices (quote ((116 . "To:") (115 . "Subject:") (99 . "Cc:") (98 . "Bcc:") (102 . "Fcc:"))) "\
A-list of (character . field name) strings for mh-to-field.")

(defvar mh-user-path "" "\
User's mail folder.")

(defvar mh-last-destination nil "\
Destination of last `refile' command.")

(defvar mh-folder-mode-map (make-keymap) "\
Keymap for MH folders.")

(defvar mh-letter-mode-map (make-sparse-keymap) "\
Keymap for composing mail.")

(defvar mh-pick-mode-map (make-sparse-keymap) "\
Keymap for searching folder.")

(defvar mh-letter-mode-syntax-table nil "\
Syntax table used while in mh-e letter mode.")

(if mh-letter-mode-syntax-table nil (setq mh-letter-mode-syntax-table (make-syntax-table text-mode-syntax-table)) (set-syntax-table mh-letter-mode-syntax-table) (modify-syntax-entry 37 "." mh-letter-mode-syntax-table))

(defvar mh-folder-list nil "\
List of folder names for completion.")

(defvar mh-draft-folder nil "\
Name of folder containing draft messages.
NIL means do not use draft folder.")

(defvar mh-unseen-seq nil "\
Name of the unseen sequence.")

(defmacro mh-push (v l) (byte-code "	EE" [l v setq cons] 5))

(defmacro when (pred &rest body) (byte-code "	BD" [pred body cond] 3))

(defun mapc (func list) (byte-code "	@\"A" [list func funcall] 4))

(defun mh-list* (&rest args) (byte-code "!" [args mh-make-list*] 2))

(defun mh-make-list* (arglist) (byte-code "?	A?@@A!B" [arglist nil t mh-make-list*] 3))

(defun mh-rmail (&optional arg) "\
Inc(orporate) new mail (no arg) or scan a MH mail box (arg given).
This front end uses the MH mail system, which uses different conventions
from the usual mail system." (interactive "P") (byte-code " ! " [arg nil mh-find-path call-interactively mh-visit-folder mh-inc-folder] 4))

(defun mh-smail nil "\
Send mail using the MH mail system." (interactive) (byte-code " !" [nil mh-find-path call-interactively mh-send] 3))

(defun mh-smail-other-window nil "\
Send mail in other window using the MH mail system." (interactive) (byte-code " !" [nil mh-find-path call-interactively mh-send-other-window] 3))

(defun mh-burst-digest nil "\
Burst apart the current message, which should be a digest.  Message is
replaced by its table of contents and the letters from the digest are inserted
into the folder after that message." (interactive) (byte-code "Ĉ!
!!
$
\"\"!)" [digest t mh-current-folder mh-first-msg-num nil mh-get-msg-num mh-process-or-undo-commands message "Bursting digest..." mh-exec-cmd "burst" "-inplace" mh-scan-folder format "%d-last" "Bursting digest...done"] 9))

(defun mh-copy-msg (prefix-provided msg-or-seq dest) "\
Copy specified MESSAGE(s) (default: displayed message) to another
FOLDER without deleting them.
If (optional) prefix argument provided, then prompt for the message sequence." (interactive (byte-code "

#!#E" [current-prefix-arg t mh-narrowed-to-seq mh-read-seq "Copy" mh-get-msg-num mh-prompt-for-folder "Copy to" ""] 8)) (byte-code "Ȉ
&# #" [current-prefix-arg t mh-narrowed-to-seq msg-or-seq mh-current-folder dest prefix-provided mh-cmd-note nil mh-exec-cmd "refile" "-link" "-src" mh-notate-seq 67 mh-notate] 7))

(defun mh-delete-msg (prefix-provided msg-or-seq) "\
Mark the specified MESSAGE(s) (default: displayed message) for later
deletion.
If (optional) prefix argument provided, then prompt for the message sequence." (interactive (byte-code "

#!D" [current-prefix-arg t mh-narrowed-to-seq mh-read-seq "Delete" mh-get-msg-num] 5)) (byte-code "ň
\"! " [current-prefix-arg t mh-narrowed-to-seq prefix-provided msg-or-seq nil mh-map-to-seq-msgs mh-delete-a-msg mh-next-msg] 4))

(defun mh-delete-msg-from-seq (prefix-provided msg-or-seq &optional from-seq) "\
Delete MESSAGE (default: displayed message) from SEQUENCE.
If (optional) prefix argument provided, then delete all messages from a
sequence." (interactive (byte-code "	#!?#E)" [argp current-prefix-arg t mh-narrowed-to-seq mh-read-seq "Delete" mh-get-msg-num "Delete from"] 8)) (byte-code "Lj
!
\"" [argp current-prefix-arg t mh-narrowed-to-seq prefix-provided msg-or-seq from-seq nil mh-remove-seq mh-remove-msg-from-seq] 4))

(defun mh-edit-again (msg) "\
Clean-up a draft or a message previously sent and make it resendable." (interactive (byte-code "!C" [t mh-get-msg-num] 2)) (byte-code "Lj
 
	
\"&!!\"! .!#e#eb!	&
+" [t from-folder mh-current-folder config draft mh-draft-folder msg nil current-window-configuration equal find-file mh-msg-filename rename-buffer format "draft-%d" buffer-name mh-read-draft "clean-up" mh-clean-msg-header "^Date:\\|^Received:\\|^Message-Id:\\|^From:" set-buffer-modified-p mh-compose-and-send-mail ""] 22))

(defun mh-execute-commands nil "\
Process outstanding delete and refile requests." (interactive) (byte-code "ˆ 	!)   " [mh-narrowed-to-seq mh-current-folder nil mh-widen mh-process-commands mh-goto-cur-msg mh-set-scan-mode mh-make-folder-mode-line] 6))

(defun mh-extract-rejected-mail (msg) "\
Extract a letter returned by the mail system (default: displayed message)
and make it resendable." (interactive (byte-code "!C" [t mh-get-msg-num] 2)) (byte-code "ƈ
 
!#eb#,!e`\"e#/!eb!	
!!!&
+" [t from-folder mh-current-folder config draft msg nil mh-rejected-letter-start current-window-configuration mh-read-draft "extraction" mh-msg-filename re-search-forward forward-char 1 delete-region mh-clean-msg-header "^Date:\\|^Received:\\|^Message-Id:\\|^From:\\|^Sender:" message "Does not appear to be a rejected letter." set-buffer-modified-p mh-compose-and-send-mail "" mh-get-field "To" "From" "cc"] 23))

(defun mh-forward (prefix-provided msg-or-seq to cc) "\
Forward MESSAGE(s) (default: displayed message).
If (optional) prefix argument provided, then prompt for the message sequence." (interactive (byte-code "

#!!!F" [current-prefix-arg t mh-narrowed-to-seq mh-read-seq "Forward" mh-get-msg-num read-string "To: " "Cc: "] 8)) (byte-code "̈ \"!?!:	$#
$!@#eb!!`d\"!)

\"!)w
ZO
 
#\") 	!#	#	


&
+," [current-prefix-arg t mh-narrowed-to-seq folder mh-current-folder config draft-name mh-user-path draft msg-or-seq to cc nil subject trim forw-subject prefix-provided current-window-configuration mh-expand-file-name "draft" file-exists-p y-or-n-p "The file 'draft' exists.  Discard it? " mh-exec-cmd "forw" "-build" mh-read-draft "" mh-insert-fields "To:" "Cc:" set-buffer-modified-p re-search-forward "^------- Forwarded Message" previous-line 1 narrow-to-region mh-get-field "From:" string-match "<" "Subject:" 0 widen format "[%s: %s]" delete-other-windows mh-add-msgs-to-seq mh-seq-to-msgs forwarded mh-compose-and-send-mail "F" "Forwarded:"] 33))

(defun mh-goto-msg (number &optional no-error-if-no-message dont-show) "\
Position the cursor at message NUMBER.
Non-nil second argument means do not signal an error if message does not exist.
Non-nil third argument means not to show the message.
Return non-nil if cursor is at message." (interactive "NMessage number? ") (byte-code "!`!UłN)W)#0łN?V?#FłNeb#b ?]!łq
b?o\"+" [cur-msg nil starting-place msg-pattern number t dont-show no-error-if-no-message mh-get-msg-num mh-msg-search-pat re-search-forward re-search-backward beginning-of-line mh-maybe-show error "No message %d "] 10))

(defun mh-inc-folder (&optional maildrop-name) "\
Inc(orporate) new mail into +inbox.
Optional prefix argument specifies an alternate maildrop from the default.
If this is given, mail is incorporated into the current folder, rather
than +inbox." (interactive (byte-code "
	\"!C" [current-prefix-arg mh-user-path expand-file-name read-file-name "inc mail from file: "] 4)) (byte-code "ň ?+!?!
+p!=?+!
)!!" [current-prefix-arg mh-user-path config maildrop-name mh-previous-window-config nil current-window-configuration get-buffer "+inbox" mh-make-folder switch-to-buffer mh-get-new-mail run-hooks mh-inc-folder-hook] 8))

(defun mh-kill-folder nil "\
Remove the current folder." (interactive) (byte-code "È	\"!%	
\"
!!
!)(!" [mh-do-not-confirm mh-current-folder folder nil yes-or-no-p format "Remove folder %s? " mh-exec-cmd-demon "rmf" mh-remove-folder-from-folder-list message "Folder removed" kill-buffer "Folder not removed"] 8))

(defun mh-list-folders nil "\
List mail folders." (interactive) (byte-code "! !\"eb!)" [t nil " *mh-temp*" switch-to-buffer erase-buffer message "listing folders..." mh-exec-cmd-output "folders" "listing folders...done"] 7))

(defun mh-msg-is-in-seq (msg) "\
Display the sequences that contain MESSAGE (default: displayed message)." (interactive (byte-code "!C" [t mh-get-msg-num] 2)) (byte-code "ˆ		!!##" [t msg nil message "Message %d is in sequences: %s" mapconcat concat mh-list-to-string mh-seq-containing-msg " "] 9))

(defun mh-narrow-to-seq (seq) "\
Restrict display of this folder to just messages in a sequence.
Reads which sequence.  Use \\[mh-widen] to undo this command." (interactive (byte-code "\"C" [t mh-read-seq "Narrow to"] 3)) (byte-code "Èd!%	\"	d\"!! +!\"*" [t eob buffer-read-only nil seq mh-narrowed-to-seq mh-seq-to-msgs mh-copy-seq-to-point narrow-to-region mh-make-folder-mode-line symbol-name recenter error "No messages in sequence `%s'"] 10))

(defun mh-next-undeleted-msg (&optional arg) "\
Move to next undeleted message in window." (interactive "p") (byte-code "È!ȉ
$& !!3!
!3
!" [arg mh-next-direction mh-good-msg-regexp nil t mh-show-buffer forward-line 1 forward re-search-forward 0 beginning-of-line mh-maybe-show mh-get-msg-num -1 get-buffer delete-windows-on] 9))

(defun mh-pack-folder nil "\
Execute any outstanding commands for the current folder, then renumber the
remaining messages to be 1..N." (interactive) (byte-code "!  !" [nil message "packing buffer..." mh-pack-folder-1 mh-goto-cur-msg "packing buffer...done"] 5))

(defun mh-refile-msg (prefix-provided msg-or-seq dest) "\
Refile MESSAGE(s) (default: displayed message) in FOLDER.
If (optional) prefix argument provided, then prompt for message sequence." (interactive (byte-code "

#!@=!A!\"#!E" [current-prefix-arg t mh-narrowed-to-seq mh-last-destination mh-read-seq "Refile" mh-get-msg-num intern mh-prompt-for-folder "Destination" refile symbol-name ""] 10)) (byte-code "LjB
#\" " [current-prefix-arg t mh-narrowed-to-seq mh-last-destination dest prefix-provided msg-or-seq nil refile mh-map-to-seq-msgs mh-refile-a-msg mh-next-msg] 4))

(defun mh-refile-or-write-again (msg) "\
Re-execution the last refile or write command on the given MESSAGE (default:
displayed message).
Use the same folder or file as the previous refile or write command." (interactive (byte-code "!C" [t mh-get-msg-num] 2)) (byte-code "È	?
!	@= 
	A\"	A\"+
	A\"	A\" " [t mh-last-destination msg nil error "No previous refile" refile mh-refile-a-msg message "Destination folder: %s" mh-write-msg-to-file "Destination: %s" mh-next-msg] 7))

(defun mh-reply (prefix-provided msg) "\
Reply to a MESSAGE (default: displayed message).
If (optional) prefix argument provided, then include the message in the reply." (interactive (byte-code "!D" [current-prefix-arg t mh-get-msg-num] 3)) (byte-code "ň$!	 
!\"0\"M	
GD&\"\"n	
hD&\"\"y\"	
D&
\"\"# !!!!eb!
?
##!&
+)-)" [current-prefix-arg t minibuffer-help-form reply-to mh-reply-default-reply-to nil msg-filename msg folder mh-current-folder show-buffer mh-show-buffer config prefix-provided draft mh-user-path to subject cc "from => Sender only
to => Sender and primary recipients
cc or all => Sender and all recipients" completing-read "Reply to whom: " (("from") ("to") ("cc") ("all")) mh-msg-filename current-window-configuration message "Composing a reply..." equal "from" "" apply mh-exec-cmd mh-list* "repl" "-build" "-nodraftfolder" "-nocc" "all" "-filter" "mhl.reply" "to" "-cc" "cc" "me" mh-read-draft "reply" mh-expand-file-name delete-other-windows set-buffer-modified-p mh-get-field "To:" "Subject:" "Cc:" mh-goto-header-end 1 mh-display-msg mh-add-msgs-to-seq answered "Composing a reply...done" mh-compose-and-send-mail "-" "Replied:"] 37))

(defun mh-restore-window-config nil "\
Restore the previous window configuration, if one exists." (interactive) (byte-code "	!" [mh-previous-window-config nil set-window-configuration] 2))

(defun mh-page-digest nil "\
Advance displayed message to next digested message." (interactive) (byte-code " !##?$!!)#!!!)" [case-fold-search nil t mh-show-message-in-other-window move-to-window-line 0 search-forward "

" "From:" other-window -1 error "No more messages." search-backward forward-line 2 recenter] 11))

(defun mh-page-digest-backwards nil "\
Back up displayed message to previous digested message." (interactive) (byte-code " ! ##?'!!)#!!!)" [case-fold-search nil t mh-show-message-in-other-window move-to-window-line 0 beginning-of-line search-backward "

" "From:" other-window -1 error "No more messages." forward-line 2 recenter] 12))

(defun mh-page-msg (&optional arg) "\
Page the displayed message forwards ARG lines or a full screen if no
argument is supplied." (interactive "P") (byte-code "!" [arg nil scroll-other-window] 2))

(defun mh-previous-page (&optional arg) "\
Page the displayed message backwards ARG lines or a full screen if no
argument is supplied." (interactive "P") (byte-code " Î!))" [arg nil mh-show-message-in-other-window ((byte-code "!" [other-window -1] 2)) scroll-down] 3))

(defun mh-previous-undeleted-msg (&optional arg) "\
Move to previous undeleted message in window." (interactive "p") (byte-code "ˆƉ!	$!!$
!$
!" [mh-next-direction mh-good-msg-regexp nil arg t mh-show-buffer backward beginning-of-line 1 re-search-backward 0 mh-maybe-show mh-get-msg-num get-buffer delete-windows-on] 7))

(defun mh-print-msg (prefix-provided msg-or-seq) "\
Print MESSAGE(s) (default: displayed message) on a line printer.
If (optional) prefix argument provided, then prompt for the message sequence." (interactive (byte-code "
#!!!CD" [current-prefix-arg t mh-narrowed-to-seq reverse mh-seq-to-msgs mh-read-seq "Print" mh-get-msg-num] 7)) (byte-code "͈!!P
#\";.\"/
\"	C
\"J

@#\"&\"
\";j\"k	z
\"

@#\"%#&
#
@#
#!!)" [current-prefix-arg t mh-narrowed-to-seq prefix-provided command msg-or-seq mh-lib mhl-formfile mh-folder-filename mh-lpr-command-format mh-current-folder mh-print-background shell-file-name nil mh-cmd-note message "printing sequence..." "printing message..." format "(scan -clear %s ; %s -nobell -clear %s %s) | %s" mapconcat (lambda (msg) (byte-code "" [msg] 1)) " " mh-expand-file-name "mhl" "-form %s" "" mh-msg-filenames "Sequence from %s" "%s/%d" "%s -nobell -clear %s %s | %s" mh-exec-cmd-demon "-c" call-process mh-notate-seq 80 mh-notate mh-add-msgs-to-seq printed "printing sequence...done" "printing message...done"] 25))

(defun mh-put-msg-in-seq (prefix-provided from to) "\
Add MESSAGE(s) (default: displayed message) to SEQUENCE.
If (optional) prefix argument provided, then prompt for the message sequence." (interactive (byte-code "
#!!
#E" [current-prefix-arg t mh-narrowed-to-seq nil mh-seq-to-msgs mh-read-seq "Add messages from" mh-get-msg-num "Add to"] 9)) (byte-code "È
\"" [current-prefix-arg t mh-narrowed-to-seq nil from to mh-add-msgs-to-seq] 3))

(defun mh-rescan-folder (range) "\
Rescan a folder after optionally processing the outstanding commands.
If (optional) prefix argument provided, prompt for the range of messages to
display.  Otherwise show the entire folder." (interactive (byte-code "
!C" [current-prefix-arg read-string "Range [all]? " "all"] 2)) (byte-code "Ĉʼn
\"" [current-prefix-arg mh-next-direction mh-current-folder range nil forward mh-scan-folder] 3))

(defun mh-redistribute (to cc msg) "\
Redistribute a letter." (interactive (byte-code "!!!E" [t read-string "Redist-To: " "Redist-Cc: " mh-get-msg-num] 6)) (byte-code "Ljˋ" [t msg-filename msg folder mh-current-folder draft mh-redist-full-contents nil to cc mh-progs ((byte-code "	!
	!#!#\"?0#e# !
Y 	\" $&l	\" $&	
#&!!+" [msg-filename msg folder mh-current-folder draft mh-redist-full-contents nil to cc mh-progs mh-msg-filename mh-read-draft "redistribution" mh-goto-header-end 0 insert "Resent-To: " "
" equal "" "Resent-cc: " mh-clean-msg-header "^Message-Id:\\|^Received:\\|^Return-Path:\\|^Sender:\\|^Date:\\|^From:" save-buffer message "Redistributing..." call-process "/bin/sh" "-c" format "mhdist=1 mhaltmsg=%s %s -push %s" buffer-file-name mh-expand-file-name "send" "mhdist=1 mhaltmsg=%s mhannotate=1 %s -push %s" mh-annotate-msg "R" "-component" "Resent:" "-text" "\"%s %s\"" kill-buffer "Redistributing...done"] 30))] 1))

(defun mh-write-msg-to-file (msg file) "\
Append MESSAGE to the end of a FILE." (interactive (byte-code "!	@=	A\"!D" [t mh-last-destination mh-get-msg-num expand-file-name read-file-name "Save message in file: " write ""] 7)) (byte-code "ň
B!!q !ed
#))" [t mh-last-destination file file-name msg nil write mh-msg-filename get-buffer-create " *mh-temp*" erase-buffer insert-file-contents append-to-file] 8))

(defun mh-search-folder (folder) "\
Search FOLDER for messages matching a pattern." (interactive (byte-code "#C" [mh-current-folder t mh-prompt-for-folder "Search"] 4)) (byte-code "Ĉ! !!? !" [mh-current-folder t mh-searching-folder folder nil switch-to-buffer-other-window "pick-pattern" zerop buffer-size y-or-n-p "Reuse pattern? " mh-make-pick-template message ""] 8))

(defun mh-send (to cc subject) "\
Compose and send a letter." (interactive "sTo: 
sCc: 
sSubject: ") (byte-code "Ĉ  	
$)" [config to cc subject nil current-window-configuration delete-other-windows mh-send-sub] 7))

(defun mh-send-other-window (to cc subject) "\
Compose and send a letter in another window.." (interactive "sTo: 
sCc: 
sSubject: ") (byte-code "ň
 $)" [pop-up-windows t to cc subject nil mh-send-sub current-window-configuration] 6))

(defun mh-send-sub (to cc subject config) "\
Do the real work of composing and sending a letter.
Expects the TO, CC, and SUBJECT fields as arguments.
CONFIG is the window configuration before sending mail." (byte-code "!	!!
\"!\"
\"7\"!4\"7!#	&!db!
	
&
)*" [folder mh-current-folder msg-num nil draft mh-user-path mh-lib to subject cc config boundp mh-get-msg-num message "Composing a message..." mh-read-draft "message" file-exists-p mh-expand-file-name "components" error "Can't find components file" mh-insert-fields "To:" "Subject:" "Cc:" set-buffer-modified-p "Composing a message...done" mh-compose-and-send-mail ""] 25))

(defun mh-show (msg) "\
Show MESSAGE (default: displayed message)." (interactive (byte-code "!C" [t mh-get-msg-num] 2)) (byte-code "ˆ‰!

!#!  ! Z!!8!
	>?H
	B	)" [t mh-summarize nil folder mh-current-folder msg mh-show-buffer mh-summary-height mh-bury-show-buffer mh-seen-list mh-set-mode-name "mh-e show" mh-display-msg mh-msg-filename switch-to-buffer-other-window delete-other-windows mh-show-message-in-other-window shrink-window window-height recenter (4) bury-buffer] 13))

(defun mh-sort-folder nil "\
Sort the messages in the current folder by date." (interactive "") (byte-code "ˆ!ĉ!\"!\"" [mh-current-folder mh-next-direction nil mh-process-or-undo-commands forward message "sorting folder..." mh-exec-cmd "sortm" "sorting folder...done" mh-scan-folder "all"] 7))

(defun mh-toggle-summarize nil "\
Turn the summary mode of displaying messages on or off." (interactive) (byte-code "ˆ!! " [mh-summarize t nil mh-show mh-get-msg-num mh-set-scan-mode] 4))

(defun mh-undo (prefix-provided msg-or-seq) "\
Undo the deletion or refile of the specified MESSAGE(s)
(default: displayed message).
If (optional) prefix argument provided, then prompt for the message sequence." (interactive (byte-code "

#!D" [current-prefix-arg t mh-narrowed-to-seq mh-read-seq "Undo" mh-get-msg-num] 5)) (byte-code "ʈ !7
!\"
#4
\"
#
#b!aR
!\"
#^	\"
#bʈ k!" [current-prefix-arg t mh-narrowed-to-seq mh-deleted-msg-regexp prefix-provided msg-or-seq mh-cmd-note mh-delete-list mh-refiled-msg-regexp mh-refile-list nil beginning-of-line looking-at mapc (lambda (msg) (byte-code "	\"	#" [mh-delete-list msg t delq mh-remove-msg-from-seq deleted] 5)) mh-seq-to-msgs mh-notate-seq 32 delq mh-remove-msg-from-seq deleted mh-notate (lambda (msg) (byte-code "\"" [mh-refile-list mapc (lambda (dest) (byte-code "	#" [msg dest t mh-remove-msg-from-seq] 4))] 3)) (lambda (dest) (byte-code "	#" [msg-or-seq dest t mh-remove-msg-from-seq] 4)) mh-outstanding-commands-p mh-set-folder-modified-p] 17))

(defun mh-undo-folder nil "\
Undo all commands in current folder." (interactive "") (byte-code "ˆ	! ɉ!!'!!" [mh-do-not-confirm mh-delete-list nil mh-refile-list mh-seq-list mh-next-direction t yes-or-no-p "Undo all commands in folder? " forward mh-unmark-all-headers mh-set-folder-modified-p message "Commands not undone." sit-for 2] 6))

(defun mh-visit-folder (folder range config) "\
Visit FOLDER and display RANGE of messages." (interactive (byte-code "#! E" [t mh-prompt-for-folder "Visit" "+inbox" read-string "Range [all]? " current-window-configuration] 6)) (byte-code "ň	
\"ɂ
\"" [t folder range mh-previous-window-config config nil mh-scan-folder equal "" "all"] 5))

(defun mh-widen nil "\
Remove restrictions from the current folder, thereby showing all messages." (interactive "") (byte-code "ed\"  )" [buffer-read-only nil mh-narrowed-to-seq delete-region widen mh-make-folder-mode-line] 5))

(defun mh-delete-a-msg (msg) (byte-code "#
!\"B#
#!)" [msg nil mh-refiled-msg-regexp mh-delete-list t mh-cmd-note mh-goto-msg looking-at error "Message %d is refiled.  Undo refile before deleting." mh-add-msgs-to-seq deleted mh-notate 68 mh-set-folder-modified-p] 8))

(defun mh-refile-a-msg (msg destination) (byte-code "#
!\"1
>? 
B##!)" [msg nil mh-deleted-msg-regexp t destination mh-refile-list mh-cmd-note mh-goto-msg looking-at error "Message %d is deleted.  Undo delete before moving." mh-add-msgs-to-seq mh-notate 94 mh-set-folder-modified-p] 8))

(defun mh-display-msg (msg-num msg-filename show-buffer) (byte-code "!?	\"
	
!%p!\"?   
V
;M
&S$Z\"eboe#eb# !)!!\"	\"F," [msg-filename msg-num formfile mhl-formfile clean-message-header mh-clean-message-header invisible-headers mh-invisible-headers visible-headers mh-visible-headers show-buffer mh-bury-show-buffer buffer-file-name t case-fold-search nil mode-line-buffer-identification folder file-exists-p error "Message %d does not exist." switch-to-buffer bury-buffer equal clear-visited-file-modtime unlock-buffer erase-buffer mh-exec-lib-cmd-output "mhl" "-nobell" "-noclear" "-form" insert-file-contents mh-clean-msg-header re-search-forward "^To:\\|^From:\\|^Subject:\\|^Date:" beginning-of-line recenter 0 set-buffer-modified-p set-mark "{%b}  " format "%s" "/" "%d"] 24))

(defun mh-show-message-in-other-window nil (byte-code "	!

p!)" [buffer mh-show-buffer mh-bury-show-buffer switch-to-buffer-other-window bury-buffer] 3))

(defun mh-clean-msg-header (start invisible-headers visible-headers) (byte-code "
b#!
`\"eb\\`dWY !A!!>!1U!!U !E
# !!{ !k\\ ))" [case-fold-search t start nil visible-headers invisible-headers search-forward "

" backward-char 2 narrow-to-region beginning-of-line looking-at forward-line 1 "^[ 	]+" mh-delete-line re-search-forward unlock-buffer] 21))

(defun mh-delete-line (lines) (byte-code "`!`)\"" [lines delete-region forward-line] 4))

(defun mh-read-draft (use initial-contents delete-contents-file) (byte-code " \"! \"!U\"! 3!0!3!
  
!J
\"?T
!
!)j !j\"!?~ !~!!  " [mh-draft-folder t draft-name mh-user-path nil buffer-file-name initial-contents use delete-contents-file pop-to-buffer find-file-noselect mh-new-draft-name rename-buffer format "draft-%s" buffer-name mh-expand-file-name "draft" buffer-modified-p y-or-n-p "Draft has been modified; kill anyway? " set-buffer-modified-p error "Draft preserved." clear-visited-file-modtime unlock-buffer file-exists-p equal insert-file-contents delete-file zerop buffer-size "A draft exists.  Use for %s? " erase-buffer auto-save-mode 1 save-buffer] 29))

(defun mh-new-draft-name nil (byte-code "!q 	$` Z\")" [nil mh-draft-folder get-buffer-create " *mh-temp*" erase-buffer mh-exec-cmd-output "mhpath" "new" buffer-substring mark 1] 8))

(defun mh-next-msg nil (byte-code "=!!" [mh-next-direction forward mh-next-undeleted-msg 1 mh-previous-undeleted-msg] 3))

(defun mh-set-scan-mode nil (byte-code "!	!!‰ \"!" [mh-show-buffer mh-summarize t mh-recenter-summary-p get-buffer delete-windows-on mh-set-mode-name "mh-e scan" recenter / window-height 2] 8))

(defun mh-maybe-show (msg) (byte-code "?	!" [mh-summarize msg mh-show] 2))

(defun mh-set-mode-name (mode-name-string) (byte-code "	 q) !" [mode-name mode-name-string other-buffer set-buffer-modified-p buffer-modified-p] 4))

(defvar mh-current-folder nil "\
Name of current folder")

(defvar mh-show-buffer nil "\
Buffer that displays mesage for this folder")

(defvar mh-folder-filename nil "\
Full path of directory for this folder")

(defvar mh-summarize nil "\
If non-nil, show scan list only")

(defvar mh-next-seq-num nil "\
Index of free sequence id")

(defvar mh-delete-list nil "\
list of msg numbers to delete")

(defvar mh-refile-list nil "\
list of folder names in mh-seq-list")

(defvar mh-seq-list nil "\
alist of (seq .msgs ) numbers")

(defvar mh-seen-list nil "\
list of displayed messages")

(defvar mh-next-direction (quote forward) "\
direction to move to next message")

(defvar mh-narrowed-to-seq nil "\
sequence display is narrowed to")

(defvar mh-first-msg-num nil "\
number of first msg in buffer")

(defvar mh-last-msg-num nil "\
number of last msg in buffer")

(defun mh-make-folder (name) (byte-code "! ‰ \"!!& É!!É!" [name buffer-read-only nil t buffer-offer-save switch-to-buffer kill-all-local-variables erase-buffer make-local-vars mh-current-folder mh-show-buffer format "show-%s" mh-folder-filename file-name-as-directory mh-expand-file-name mh-summarize mh-next-seq-num 0 mh-delete-list mh-refile-list mh-seq-list mh-seen-list mh-next-direction forward mh-narrowed-to-seq mh-first-msg-num mh-last-msg-num mh-previous-window-config mh-folder-mode mh-set-folder-modified-p auto-save-mode -1 mh-set-mode-name "mh-e scan"] 35))

(defun make-local-vars (&rest pairs) (byte-code "@!@A@LAA" [pairs make-variable-buffer-local] 4))

(defun mh-folder-mode nil "\
Major mode for \"editing\" an MH folder scan listing.
Messages can be marked for refiling and deletion.  However, both actions
are deferred until you request execution with \\[mh-execute-commands].
\\{mh-folder-mode-map}
  A prefix argument (\\[universal-argument]) to delete, refile, list, or undo applies the action to a message sequence.

Variables controlling mh-e operation are (defaults in parentheses):

 mh-bury-show-buffer (t)
    Non-nil means that the buffer used to display message is buried.
    It will never be offered as the default other buffer.

 mh-clean-message-header (nil)
    Non-nil means remove header lines matching the regular expression
    specified in mh-invisible-headers from messages.

 mh-visible-headers (nil)
    If non-nil, it contains a regexp specifying the headers that are shown in
    a message if mh-clean-message-header is non-nil.  Setting this variable
    overrides mh-invisible-headers.

 mh-do-not-confirm (nil)
    Non-nil means do not prompt for confirmation before executing some
    non-recoverable commands such as mh-kill-folder and mh-undo-folder.

 mhl-formfile (nil)
    Name of format file to be used by mhl to show messages.
    A value of T means use the default format file.
    Nil means don't use mhl to format messages.

 mh-lpr-command-format (\"lpr -p -J '%s'\")
    Format for command used to print a message on a system printer.

 mh-recenter-summary-p (nil)
    If non-nil, then the scan listing is recentered when the window displaying
    a messages is toggled off.

 mh-summary-height (4)
    Number of lines in the summary window.

 mh-ins-buf-prefix (\">> \")
    String to insert before each non-blank line of a message as it is
    inserted in a letter being composed." (byte-code "!É!!" [mh-folder-mode-map major-mode use-local-map mh-folder-mode mh-set-mode-name "mh-e folder" run-hooks mh-folder-mode-hook] 4))

(defun mh-scan-folder (folder range) (byte-code "!?
!!!
!ed\"U9
\"0\"5
#! " [folder t range get-buffer mh-make-folder mh-process-or-undo-commands switch-to-buffer mh-regenerate-headers count-lines 0 equal "all" message "Folder %s is empty" "No messages in %s, range %s" sit-for 5 mh-goto-cur-msg] 12))

(defun mh-regenerate-headers (range) (byte-code " 
\"!  
&eb!+!4!4!!
\"  !
\"!*" [buffer-read-only nil folder range mh-valid-scan-line t mh-seq-list buffer-name message format "scanning %s..." erase-buffer mh-exec-cmd-output "scan" "-noclear" "-noheader" "-width" window-width looking-at "scan: no messages in" keep-lines "scan: " mh-delete-seq-locally cur mh-read-folder-sequences mh-notate-user-sequences mh-make-folder-mode-line mh-set-folder-modified-p "scanning %s...done"] 19))

(defun mh-get-new-mail (maildrop-name) (byte-code "`  

#\"!!҉!db`
F
! &M $
[
#_\"!!\"	 b!! 
b
傐

#! 
b!!  )!," [buffer-read-only nil point-before-inc folder folder-modified-flag maildrop-name mh-next-direction mh-valid-scan-line start-of-inc mh-seq-list t buffer-name buffer-modified-p message format "inc %s -file %s..." "inc %s..." mh-unmark-all-headers forward keep-lines mh-exec-cmd-output "inc" "-file" expand-file-name "-width" window-width "-truncate" "inc %s -file %s...done" "inc %s...done" mh-delete-seq-locally cur mh-read-folder-sequences mh-notate-user-sequences looking-at "inc: no mail" mh-make-folder-mode-line "No new mail%s%s." " in " "" "inc:" "inc error" mh-goto-cur-msg mh-set-folder-modified-p] 30))

(defun mh-make-folder-mode-line (&optional annotation) (byte-code "eb!ed\"db!!-\".

U9ЂK
VG#K\"$C*)" [mh-first-msg-num nil lines case-fold-search mh-last-msg-num mode-line-buffer-identification annotation mh-get-msg-num count-lines previous-line 1 format "{%%b%s}  %d msg%s" "/%s" "" 0 "s" "s (%d-%d)" " (%d)"] 13))

(defun mh-unmark-all-headers (remove-all-flags) (byte-code "eb##*!c *)" [buffer-read-only nil case-fold-search remove-all-flags mh-flagged-scan-msg-regexp t mh-cur-scan-msg-regexp re-search-forward delete-backward-char 1 " " beginning-of-line] 6))

(defun mh-goto-cur-msg nil (byte-code "!@?#? db!!-#!!)" [cur-msg t nil mh-cmd-note mh-seq-to-msgs cur mh-goto-msg forward-line -1 message "No current message" mh-notate 43 recenter 0 mh-maybe-show] 8))

(defun mh-pack-folder-1 nil (byte-code "!
!!
$)!!)" [buffer-read-only nil mh-current-folder message "closing folder..." mh-process-or-undo-commands "packing folder..." mh-exec-cmd-quiet " *mh-temp*" "folder" "-pack" mh-regenerate-headers "all" "packing done"] 8))

(defun mh-process-or-undo-commands (folder) (byte-code "q 	!!  " [folder mh-do-not-confirm mh-outstanding-commands-p y-or-n-p "Process outstanding deletes and refiles (or lose them)? " mh-process-commands mh-undo-folder mh-invalidate-show-cache] 6))

(defun mh-process-commands (folder) (byte-code "!q!\"
\"3\"#\"!!=C\" \"‰! !!)" [folder buffer-read-only nil mh-seen-list mh-unseen-seq mh-refile-list mh-delete-list mh-seq-list mh-current-folder t message "Processing deletes and refiles..." mh-seq-to-msgs mh-undefine-sequence mapc (lambda (dest) (byte-code "	!!B
	!E\"\")" [msgs dest folder mh-seq-to-msgs mh-delete-scan-msgs apply mh-exec-cmd nconc "refile" "-src" symbol-name] 10)) apply mh-exec-cmd mh-list* "rmm" format "%s" mh-delete-scan-msgs mh-define-sequence cur mh-get-msg-num "last" mh-invalidate-show-cache mh-read-folder-sequences mh-unmark-all-headers mh-notate-user-sequences mh-set-folder-modified-p "Processing deletes and refiles...done"] 17))

(defun mh-invalidate-show-cache nil (byte-code "!q‰)" [mh-show-buffer buffer-file-name nil get-buffer] 3))

(defun mh-delete-scan-msgs (msgs) (byte-code "eb#!)" [msgs flush-lines mapconcat mh-msg-search-pat "\\|"] 5))

(defun mh-set-folder-modified-p (flag) "\
Mark current folder as modified or unmodified according to FLAG." (byte-code "!" [flag set-buffer-modified-p] 2))

(defun mh-outstanding-commands-p nil (byte-code "	" [mh-delete-list mh-refile-list] 1))

(defun mh-letter-mode nil "\
Mode for composing letters in mh-e.
When you have finished composing, type \\[mh-send-letter] to send the letter.

Variables controlling this mode (defaults in parentheses):

 mh-delete-yanked-msg-window (nil)
    If non-nil, \\[mh-yank-cur-msg] will delete any windows displaying
    the yanked message.

 mh-yank-from-start-of-msg (t)
    If non-nil, \\[mh-yank-cur-msg] will include the entire message.
    If `body', just yank the body (no header).
    If nil, only the portion of the message following the point will be yanked.
    If there is a region, this variable is ignored.

Upon invoking mh-letter-mode, text-mode-hook and mh-letter-mode-hook are
invoked with no args, if those values are non-nil.

\\{mh-letter-mode-map}" (interactive) (byte-code "ň !P!	P!!!!
!Ή!!\"" [paragraph-start paragraph-separate mh-letter-mode-map major-mode mh-letter-mode-syntax-table nil kill-all-local-variables make-local-variable "^[ 	]*[-_][-_][-_]+$\\|" mh-send-args mh-annotate-char mh-sent-from-folder mh-sent-from-msg use-local-map mh-letter-mode mh-set-mode-name "mh-e letter" set-syntax-table run-hooks text-mode-hook mh-letter-mode-hook] 13))

(defun mh-to-field nil "\
Move point to the end of the header field indicated by the previous
keystroke.  Create the field if it does not exist.  Set the mark to the
point before moving." (interactive "") (byte-code "ň 	\"
\"A\"#!? cEeb!!!;!.\"c!*" [target last-input-char mh-to-field-choices case-fold-search t nil expand-abbrev assoc logior 96 mh-position-on-field looking-at "[ 	]" " " re-search-forward "^To:" forward-line 1 "^[ 	]" format "%s 
" backward-char] 12))

(defun mh-to-fcc nil "\
Insert a Fcc: field in the current message, prompting for the field
name with a completion list of the current folders." (interactive) (byte-code " #O\")" [t nil expand-abbrev mh-insert-fields "Fcc:" mh-prompt-for-folder "Fcc" "" 1] 7))

(defun mh-insert-signature nil "\
Insert the file ~/.signature at the current point." (interactive "") (byte-code "!" [nil insert-file-contents "~/.signature"] 2))

(defun mh-check-whom nil "\
Verify recipients of the current letter." (interactive) (byte-code "ˆ ! !!p! #!!)" [file-name t nil buffer-file-name set-buffer-modified-p save-buffer message "Checking recipients..." switch-to-buffer-other-window "*Mail Recipients*" bury-buffer erase-buffer mh-exec-cmd-output "whom" other-window -1 "Checking recipients...done"] 11))

(defun mh-make-pick-template nil (byte-code "  !& !eb " [mh-pick-mode-map erase-buffer kill-all-local-variables make-local-variable mh-searching-folder insert "From: 
" "To: 
" "Cc: 
" "Date: 
" "Subject: 
" "---------
" mh-letter-mode use-local-map end-of-line] 10))

(defun mh-do-pick-search nil "\
Find messages in the folder named in mh-searching-folder that match the
qualifications in current buffer.  Put messages found in a sequence
named `search'." (interactive) (byte-code "Ĉ 
	!$	q#0	!щɉ)!eb!\\	
B	%\"#
ۉ9!n	
\"q	! \\#-" [pattern-buffer searching-buffer mh-searching-folder range nil pattern new-buffer mh-first-msg-num mh-last-msg-num t msgs mh-cmd-note buffer-name get-buffer format "%d-%d" mh-make-folder "all" message "Searching..." mh-next-pick-field mh-seq-from-command search nconc "pick" list "-sequence" "search" "-list" "Searching...done" mh-scan-folder switch-to-buffer delete-other-windows mh-notate-seq 37 1] 18))

(defun mh-next-pick-field (buffer) (byte-code "qm
Âg#7!!\"!\"!!\"!
D*g#f!`d\"GVW\"?aDb)g)" [buffer case-fold-search t nil component pat body re-search-forward "^\\([a-z].*\\):[ 	]*\\([a-z0-9].*\\)$" format "-%s" downcase buffer-substring match-beginning 1 match-end 2 forward-line "^-*$" forward-char 0 equal "
" "-search"] 16))

(defun mh-compose-and-send-mail (draft send-args sent-from-folder sent-from-msg to subject cc annotate-char annotate-field config) (byte-code "! 	
$
	C!1JpJ<D@=?eb@
$AGo
$)" [draft annotate-field config mh-sent-from-folder sent-from-folder mh-sent-from-msg sent-from-msg mh-send-args send-args mh-annotate-char annotate-char mode-line-buffer-identification value to subject cc mh-compose-letter-hook pop-to-buffer mh-letter-mode make-local-vars mh-annotate-field mh-previous-window-config "{%b}" boundp lambda funcall] 10))

(defun mh-send-letter (&optional arg) "\
Send the draft letter in the current buffer.
If (optional) prefix argument provided, monitor delivery." (interactive "P") (byte-code "ˈ! !  
?! 3
&<
&UO
%U
$q	
!!#&
?z!	!!!+" [t buffer-name file-name config mh-previous-window-config arg mh-send-args mh-annotate-char mh-sent-from-msg mh-sent-from-folder mh-annotate-field nil set-buffer-modified-p save-buffer message "Sending..." buffer-file-name pop-to-buffer "MH mail delivery" erase-buffer mh-exec-cmd-output "send" "-watch" "-nopush" "-nodraftfolder" mh-exec-cmd-demon "-noverbose" mh-annotate-msg "-component" "-text" format "\"%s %s\"" mh-get-field "To:" "Cc:" y-or-n-p "Kill draft buffer? " kill-buffer set-window-configuration "Sending...done"] 24))

(defun mh-insert-letter (prefix-provided folder msg) "\
Insert a message from any folder into the current letter.
Removes the message's headers using mh-invisible-headers.
Prefixes each non-blank line with mh-ins-buf-prefix (default \">> \").
If (optional) prefix argument provided, do not indent and do not delete
headers.
Leaves the mark before the letter and point after it." (interactive (byte-code "	#\"\"!E" [current-prefix-arg mh-sent-from-folder nil mh-sent-from-msg mh-prompt-for-folder "Message from" read-input format "Message number%s: " " [%d]" ""] 9)) (byte-code "ˆ``\"e
\"\"
!\"$?;	#!
!))" [current-prefix-arg mh-sent-from-folder nil mh-sent-from-msg start msg folder prefix-provided mh-invisible-headers mh-visible-headers mh-ins-buf-prefix narrow-to-region equal "" format "%d" mh-exec-lib-cmd-output "mhl" "-nobell" "-noclear" mh-expand-file-name mh-clean-msg-header set-mark mh-insert-prefix-string] 11))

(defun mh-yank-cur-msg nil "\
Insert the currently displayed message into the draft buffer.  Prefix each
non-blank line in the message with the string in mh-ins-buf-prefix.  If a
region is set in the message's buffer, then only the region will be inserted.
Otherwise, the entire message will be inserted if mh-yank-from-start-of-msg is
non-nil.   If this variable is nil, the portion of the message following the
point will be yanked.  If mh-delete-yanked-msg-window is non-nil, any window
displaying the yanked message will be deleted." (interactive) (byte-code "ʈ!

	p`pq
!
q /` \"S=CΊ!`)d\"SOed\"S`d\"q

\"c	!c )*s!" [mh-sent-from-folder mh-sent-from-msg to-point to-buffer mh-delete-yanked-msg-window mh-show-buffer mh-ins-str mh-yank-from-start-of-msg t mh-ins-buf-prefix nil boundp delete-windows-on mark buffer-substring body mh-goto-header-end 1 narrow-to-region mh-insert-prefix-string "
" widen error "There is no current message."] 14))

(defun mh-insert-prefix-string (ins-string) (byte-code "ebm?c!" [ins-string forward-line 1] 3))

(defun mh-fully-kill-draft nil "\
Kill the draft message file and the draft message buffer.
Use \\[kill-buffer] if you don't want to delete the draft message file." (interactive "") (byte-code "ˆ!*	 ! !! !&!)-!" [config mh-previous-window-config nil y-or-n-p "Kill draft message? " file-exists-p buffer-file-name delete-file set-buffer-modified-p kill-buffer buffer-name set-window-configuration error "Message not killed"] 11))

(defun mh-make-seq (name msgs) (byte-code "	B" [name msgs] 2))

(defmacro mh-seq-name (pair) (byte-code "D" [pair car] 2))

(defmacro mh-seq-msgs (pair) (byte-code "D" [pair cdr] 2))

(defun mh-find-seq (name) (byte-code "	\"" [name mh-seq-list assoc] 3))

(defun mh-seq-to-msgs (seq) "\
Return a list of the messages in SEQUENCE." (byte-code "!A" [seq mh-find-seq] 2))

(defun mh-seq-containing-msg (msg) (byte-code "	 @A>@@
BA
*" [l mh-seq-list seqs nil msg] 3))

(defun mh-msg-to-seq (msg) (byte-code "!@" [msg mh-seq-containing-msg] 2))

(defun mh-read-seq (prompt not-empty &optional default) (byte-code "	

\"$!\"\"&!!4\"1
4!!?BK\"!+" [input prompt default mh-seq-list seq t msgs not-empty completing-read format "%s %s %s" "sequence:" "[%s] " "" mh-seq-names equal "%" mh-msg-to-seq mh-get-msg-num intern mh-seq-to-msgs error "No messages in sequence `%s'"] 14))

(defun mh-read-folder-sequences (folder define-sequences) (byte-code "
!\"$eb#8!!\"! \"B))" [seqs nil define-sequences mh-seq-list folder t mh-define-sequences mapc (lambda (seq) (byte-code "@!	B" [seq seqs mh-folder-name] 3)) mh-exec-cmd-quiet " *mh-temp*" "mark" "-list" re-search-forward "\\(^[a-zA-Z][a-zA-Z]*\\)" mh-make-seq intern buffer-substring match-beginning 1 match-end mh-read-msg-list] 13))

(defun mh-seq-names (seq-list) (byte-code "\"" [seq-list mapcar (lambda (entry) (byte-code "@!C" [entry symbol-name] 2))] 3))

(defun mh-seq-from-command (folder seq command) (byte-code "ɋq
!
\"B
)+" [msg nil msgs case-fold-search t command folder mh-seq-list seq ((byte-code "B\"eb @	
B!
" [command msg msgs apply mh-exec-cmd-quiet " *mh-temp*" mh-read-msg-list forward-line 1] 5)) nreverse mh-make-seq] 4))

(defun mh-read-msg-list nil (byte-code " `)
#m!!\"!!\\!
#!!\"!
WB
#
XXB\\C)h!?hB)	*" [msgs nil end-of-line t num num2 re-search-forward "\\([0-9]+\\)" string-to-int buffer-substring match-beginning 1 match-end looking-at "-" forward-char error "Bad message range: %d-%d" zerop] 18))

(defun mh-remove-seq (seq) (byte-code "	\\%C\"!" [seq mh-cmd-note mh-map-to-seq-msgs mh-notate-if-in-one-seq 32 1 mh-undefine-sequence "all" mh-delete-seq-locally] 6))

(defun mh-delete-seq-locally (seq) (byte-code "	!
\")" [entry seq mh-seq-list mh-find-seq delq] 4))

(defun mh-remove-msg-from-seq (msg seq &optional internal-flag) (byte-code "	!%
\\@$?	
C\"
A\"\")" [entry seq msg mh-cmd-note internal-flag mh-find-seq mh-notate-if-in-one-seq 32 1 mh-undefine-sequence setcdr delq] 8))

(defun mh-add-msgs-to-seq (msgs seq &optional internal-flag) (byte-code "	!

!
C?#	
\"B/
/
A\"\"?A	
\"	
\\#)" [entry seq msgs mh-seq-list internal-flag mh-cmd-note mh-find-seq atom mh-make-seq setcdr append mh-add-to-sequence mh-notate-seq 37 1] 11))

(defun mh-rename-seq (seq new-name) "\
Rename a SEQUENCE to have a new NAME." (interactive "SOld sequence name: 
SNew name: ") (byte-code "È	!
\"	\"	A\"
A\")" [old-seq seq new-name nil mh-find-seq rplaca error "Sequence %s does not exists" mh-undefine-sequence mh-define-sequence] 7))

(defun mh-notate-user-sequences nil (byte-code "	\"@@
!?
\\#A))" [seqs mh-seq-list name mh-cmd-note mh-internal-seq mh-notate-seq 37 1] 7))

(defun mh-internal-seq (name) (byte-code ">	=!" [name mh-unseen-seq (answered cur deleted forwarded printed) mh-folder-name] 2))

(defun mh-folder-name (name) (byte-code "9
!!O\"" [name mh-folder-name symbol-name equal 0 1 "+"] 6))

(defun mh-notate-seq (seq notation offset) (byte-code "	
$" [seq notation offset mh-map-to-seq-msgs mh-notate] 5))

(defun mh-notate-if-in-one-seq (msg notation offset seq) (byte-code "	!
@=A?	#)" [in-seqs msg seq notation offset mh-seq-containing-msg mh-notate] 5))

(defun mh-map-to-seq-msgs (func seq &rest args) (byte-code "	!\"@#@B\"A))" [msgs seq t func args mh-seq-to-msgs mh-goto-msg apply] 7))

(defun mh-map-over-seqs (func seq-list) (byte-code "	@@@A#A" [seq-list func funcall] 5))

(defun mh-define-sequences (seq-list) (byte-code "\"" [seq-list mh-map-over-seqs mh-define-sequence] 3))

(defun mh-add-to-sequence (seq msgs) (byte-code "!O\"? 	 
\"	&\"" [seq msgs mh-current-folder equal symbol-name 0 1 "+" apply mh-exec-cmd mh-list* "mark" "-sequence" format "%s" "-add"] 12))

(defun mh-define-sequence (seq msgs) (byte-code "	!O\"?$
	\"&\")" [msgs seq mh-current-folder equal symbol-name 0 1 "+" apply mh-exec-cmd-quiet mh-list* " *mh-temp*" "mark" "-sequence" format "%s" "-add" "-zero"] 14))

(defun mh-undefine-sequence (seq msgs) (byte-code "	\"
&\"" [mh-current-folder seq msgs apply mh-exec-cmd mh-list* "mark" "-sequence" format "%s" "-delete"] 10))

(defun mh-copy-seq-to-point (seq location) (byte-code "	#" [seq location mh-map-to-seq-msgs mh-copy-line-to-point] 4))

(defun mh-copy-line-to-point (msg location) (byte-code " `!`\"	b b)" [beginning-of-line location forward-line 1 copy-region-as-kill yank] 5))

(defun mh-exec-cmd (command &rest args) (byte-code "ŋ" [command mh-progs nil t args ((byte-code "! 	\"!%\" V!!" [command mh-progs nil t args switch-to-buffer-other-window " *mh-temp*" erase-buffer apply call-process mh-list* mh-expand-file-name mh-list-to-string buffer-size 0 sit-for 5] 12))] 1))

(defun mh-exec-cmd-quiet (buffer command &rest args) (byte-code ";! 	
\"!%\"" [buffer command mh-progs nil args switch-to-buffer erase-buffer apply call-process mh-list* mh-expand-file-name mh-list-to-string] 12))

(defun mh-exec-cmd-output (command display &rest args) (byte-code "`\"	
\"
!%\" " [t command mh-progs nil display args push-mark apply call-process mh-list* mh-expand-file-name mh-list-to-string exchange-point-and-mark] 11))

(defun mh-exec-cmd-demon (command &rest args) (byte-code "! )
\"!$\"\")" [process nil command mh-progs args switch-to-buffer " *mh-temp*" erase-buffer apply start-process mh-list* "mh-output" expand-file-name mh-list-to-string set-process-filter mh-process-demon] 11))

(defun mh-process-demon (process output) (byte-code "!c!" [output pop-to-buffer " *mh-temp*" other-window 1] 3))

(defun mh-exec-lib-cmd-output (command &rest args) (byte-code "`\"	
\"!%\" " [t command mh-lib nil args push-mark apply call-process mh-list* mh-expand-file-name mh-list-to-string exchange-point-and-mark] 11))

(defun mh-list-to-string (l) (byte-code "
h
@?_
@9
@!B_
@!/
@!B_
@\"_
@;F
@B_
@<Z
@!!\"_
@\"
A!)" [new-list nil l t symbol-name numberp int-to-string equal "" nconc nreverse mh-list-to-string error "Bad argument %s"] 11))

(defun mh-annotate-msg (msg buffer note &rest args) (byte-code "	
$\"q	9	\\#$	\\#)" [buffer msg args note mh-cmd-note apply mh-exec-cmd mh-list* "anno" mh-notate-seq 1 mh-notate] 8))

(defun mh-notate (msg notation offset) (byte-code "#\"  `
\\b!c!*)" [msg t buffer-read-only nil folder-modified-flag offset notation mh-goto-msg buffer-modified-p beginning-of-line delete-char 1 mh-set-folder-modified-p] 6))

(defun mh-prompt-for-folder (prompt default can-create) (byte-code "	\"˂	\"#? %7
\"7	\"?Ĉ 
\"K
\"T	e
O\"?e
\"
!!?
w
\"!
\"
!%
\"
CB
OCB
!
\"?
CB
OCB)
*" [prompt default name mh-folder-list nil new-file-p t format "%s folder%s" equal "" "? " " [%s]? " mh-make-folder-list completing-read "+" 0 1 "+%s" file-exists-p mh-expand-file-name y-or-n-p "Folder %s does not exist. Create it? " message "Creating %s" call-process "mkdir" "Creating %s...done" error assoc] 24))

(defun mh-make-folder-list nil "\
Return a list of the user's folders.
Result is in a form suitable for completing read." (interactive) (byte-code "ˆ!ȋ" [mh-recursive-folders list nil start t folder message "Collecting folder names..." ((byte-code "ʂ
$ebm?7`#`Z\"
\"C	B))!	)" [mh-recursive-folders list nil start t folder mh-exec-cmd-quiet " *mh-temp*" "folders" "-fast" "-recurse" "-norecurse" search-forward "
" buffer-substring 1 format "+%s" message "Collecting folder names...done"] 7))] 2))

(defun mh-remove-folder-from-folder-list (folder) (byte-code "	O\"\"" [mh-folder-list folder nil delq assoc 1] 5))

(defun mh-get-msg-num (error-if-no-message) (byte-code " !!!\"!\"	!!\")" [mh-msg-number-regexp error-if-no-message t nil beginning-of-line looking-at string-to-int buffer-substring match-beginning 1 match-end error "Cursor not pointing to message"] 8))

(defun mh-msg-search-pat (n) (byte-code "	\"" [mh-msg-search-regexp n format] 3))

(defun mh-msg-filename (msg) (byte-code "!	\"" [msg mh-folder-filename mh-expand-file-name int-to-string] 4))

(defun mh-msg-filenames (msgs folder) (byte-code "	
#)" [mh-folder-filename folder msgs mapconcat (lambda (msg) (byte-code "!" [msg mh-msg-filename] 2)) " "] 4))

(defun mh-find-path nil (byte-code "ŋ" [profile mh-draft-folder nil mh-user-path mh-unseen-seq ((byte-code "!!?!! !!	\"1‰B	O\"?B	\"!\"Sى!\"!	i	!!?o!!\"!)" [profile mh-draft-folder nil mh-user-path mh-unseen-seq getenv "MH" "~/.mh_profile" file-exists-p error "Cannot find ~/.mh_profile" switch-to-buffer " *mh-temp*" erase-buffer insert-file-contents mh-get-field "Draft-Folder:" equal "" 0 1 "+" format "+%s" "Path:" "Mail" file-name-as-directory expand-file-name "~" mh-expand-file-name "Draft folder does not exist.  Create it and try again." "Unseen-Sequence:" unseen intern] 23))] 1))

(defun mh-expand-file-name (filename &optional default) "\
Just like expand-file-name, but also handles MH folder names.
Assumes that any filename that starts with '+' is a folder name." (byte-code "O\"O	\"
\"" [filename mh-user-path default string-equal 0 1 "+" expand-file-name nil] 5))

(defun mh-get-field (field) (byte-code "eb
#?ƂU!ƂU#!!\"` !=!0!`XL
T
`\"#*)" [case-fold-search t field nil end-of-match search-forward "" looking-at "[	 ]*$" re-search-forward "[	 ]*\\([^	 
].*\\)$" buffer-substring match-beginning 1 match-end forward-line "[ 	]" backward-char format "%s%s"] 16))

(defun mh-insert-fields (&rest name-values) (byte-code "
C
@
A@\"?8eb\"#?1!$8 \"
AA*)" [case-fold-search t name-values field-name value nil equal "" re-search-forward format "^%s" mh-goto-header-end 0 insert " " "
" end-of-line] 10))

(defun mh-position-on-field (field set-mark) (byte-code "
 eb!\"#\" #)" [case-fold-search t set-mark field nil push-mark mh-goto-header-end 0 re-search-backward format "^%s" end-of-line] 7))

(defun mh-goto-header-end (arg) (byte-code "#	!" [nil arg re-search-forward "^$\\|^-+$" forward-line] 4))

(suppress-keymap mh-folder-mode-map)

(define-key mh-folder-mode-map "q" (quote mh-restore-window-config))

(define-key mh-folder-mode-map "b" (quote mh-restore-window-config))

(define-key mh-folder-mode-map "?" (quote mh-msg-is-in-seq))

(define-key mh-folder-mode-map "%" (quote mh-put-msg-in-seq))

(define-key mh-folder-mode-map "a" (quote mh-edit-again))

(define-key mh-folder-mode-map "%" (quote mh-delete-msg-from-seq))

(define-key mh-folder-mode-map "n" (quote mh-narrow-to-seq))

(define-key mh-folder-mode-map "w" (quote mh-widen))

(define-key mh-folder-mode-map "b" (quote mh-burst-digest))

(define-key mh-folder-mode-map "u" (quote mh-undo-folder))

(define-key mh-folder-mode-map " " (quote mh-page-digest))

(define-key mh-folder-mode-map "" (quote mh-page-digest-backwards))

(define-key mh-folder-mode-map "e" (quote mh-extract-rejected-mail))

(define-key mh-folder-mode-map "f" (quote mh-visit-folder))

(define-key mh-folder-mode-map "k" (quote mh-kill-folder))

(define-key mh-folder-mode-map "l" (quote mh-list-folders))

(define-key mh-folder-mode-map "p" (quote mh-pack-folder))

(define-key mh-folder-mode-map "s" (quote mh-search-folder))

(define-key mh-folder-mode-map "r" (quote mh-rescan-folder))

(define-key mh-folder-mode-map "l" (quote mh-print-msg))

(define-key mh-folder-mode-map "t" (quote mh-toggle-summarize))

(define-key mh-folder-mode-map "c" (quote mh-copy-msg))

(define-key mh-folder-mode-map ">" (quote mh-write-msg-to-file))

(define-key mh-folder-mode-map "i" (quote mh-inc-folder))

(define-key mh-folder-mode-map "x" (quote mh-execute-commands))

(define-key mh-folder-mode-map "e" (quote mh-execute-commands))

(define-key mh-folder-mode-map "r" (quote mh-redistribute))

(define-key mh-folder-mode-map "f" (quote mh-forward))

(define-key mh-folder-mode-map "s" (quote mh-send))

(define-key mh-folder-mode-map "m" (quote mh-send))

(define-key mh-folder-mode-map "a" (quote mh-reply))

(define-key mh-folder-mode-map "j" (quote mh-goto-msg))

(define-key mh-folder-mode-map "g" (quote mh-goto-msg))

(define-key mh-folder-mode-map "" (quote mh-previous-page))

(define-key mh-folder-mode-map " " (quote mh-page-msg))

(define-key mh-folder-mode-map "." (quote mh-show))

(define-key mh-folder-mode-map "u" (quote mh-undo))

(define-key mh-folder-mode-map "!" (quote mh-refile-or-write-again))

(define-key mh-folder-mode-map "^" (quote mh-refile-msg))

(define-key mh-folder-mode-map "d" (quote mh-delete-msg))

(define-key mh-folder-mode-map "p" (quote mh-previous-undeleted-msg))

(define-key mh-folder-mode-map "n" (quote mh-next-undeleted-msg))

(define-key mh-letter-mode-map "" (quote mh-to-field))

(define-key mh-letter-mode-map "" (quote mh-to-field))

(define-key mh-letter-mode-map "" (quote mh-to-field))

(define-key mh-letter-mode-map "" (quote mh-to-field))

(define-key mh-letter-mode-map "" (quote mh-to-field))

(define-key mh-letter-mode-map "b" (quote mh-to-field))

(define-key mh-letter-mode-map "c" (quote mh-to-field))

(define-key mh-letter-mode-map "f" (quote mh-to-field))

(define-key mh-letter-mode-map "s" (quote mh-to-field))

(define-key mh-letter-mode-map "t" (quote mh-to-field))

(define-key mh-letter-mode-map "" (quote mh-fully-kill-draft))

(define-key mh-letter-mode-map "" (quote mh-check-whom))

(define-key mh-letter-mode-map "	" (quote mh-insert-letter))

(define-key mh-letter-mode-map "" (quote mh-yank-cur-msg))

(define-key mh-letter-mode-map "" (quote mh-insert-signature))

(define-key mh-letter-mode-map "" (quote mh-send-letter))

(define-key mh-pick-mode-map "" (quote mh-do-pick-search))

(define-key mh-pick-mode-map "" (quote mh-to-field))

(define-key mh-pick-mode-map "" (quote mh-to-field))

(define-key mh-pick-mode-map "" (quote mh-to-field))

(define-key mh-pick-mode-map "" (quote mh-to-field))

(define-key mh-pick-mode-map "" (quote mh-to-field))

(define-key mh-pick-mode-map "b" (quote mh-to-field))

(define-key mh-pick-mode-map "c" (quote mh-to-field))

(define-key mh-pick-mode-map "f" (quote mh-to-field))

(define-key mh-pick-mode-map "s" (quote mh-to-field))

(define-key mh-pick-mode-map "t" (quote mh-to-field))

(define-key mh-pick-mode-map "" (quote mh-check-whom))