lamy@utegc.UUCP (04/28/87)
The code below allows GNU Emacs version 18 mh-e mode to support multiple draft
messages using the draft folder facility. mh-read-draft stores a copy of the
completed draft buffer at the appropriate place (in the standard draft file
by default, or in a newly allocated file in the draft folder if the
.mh_profile enables the draft folder facility). Multiple draft buffers
are supported. It is also possible (of course) to reuse a draft message or
even a message previously sent.
;; Support for using the MH draft folder facility automatically if defined
;; in .mh_profile. Also adds command to reuse existing message or draft.
;; Modifications by: Jean-Francois Lamy, lamy@ai.toronto.edu (CSNet,UUCP)
(defun mh-read-draft (use initial-contents)
"Read draft file into a draft buffer. USE is a message used for prompting
about the intended use of the message. INITIAL-CONTENTS is filename that
is read into an empty buffer, or NIL if buffer should not be modified.
Returns T if the buffer is set to the contents of this file, NIL otherwise.
If the draft folder facility is enabled in the profile a new buffer is used
each time and saved in the draft folder. The draft file can then be reused."
(let ((draft-name (format "%sdraft" mh-user-path)))
(cond (mh-use-draft-folder
(find-file (mh-new-draft-name)))
(t
(pop-to-buffer "draft") ; Create if necessary
(if (buffer-modified-p)
(if (y-or-n-p "Draft has been modified; kill anyway? ")
(set-buffer-modified-p nil)
(error "Draft preserved.")))
(setq buffer-file-name draft-name)
(clear-visited-file-modtime)
(unlock-buffer)))
(if (file-exists-p draft-name)
(insert-file-contents draft-name))
(prog1
(cond ((and initial-contents
(or (zerop (buffer-size))
(not (y-or-n-p
(format "A draft exists. Use for %s? "
use)))))
(delete-region (point-min) (point-max))
(insert-file-contents initial-contents)
t)
(t nil))
(auto-save-mode 1)
(setq mh-last-draft-buffer (buffer-name))
(if mh-use-draft-folder ; the draft message was only a scratchpad
(progn
(save-buffer); so mh-new-draft-name does not reuse this file
(if (file-exists-p draft-name)
(delete-file draft-name)))); scratchpad no more needed
)))
(defun mh-new-draft-name ()
"Returns the filename where the standard draft is to be stored,
assuming that the draft folder facility is enabled"
(save-excursion
(switch-to-buffer " *mh_temp*")
(erase-buffer)
(mh-exec-cmd-output "mhpath" nil mh-draft-folder "new")
(buffer-substring (point) (1- (mark)))))
(defun mh-find-path ()
"Set mh-user-path and mh-draft-folder from ~/.mh_profile."
(save-window-excursion
(if (not (file-exists-p "~/.mh_profile"))
(error "Cannot find .mh_profile file."))
(switch-to-buffer " *mh_temp*")
(erase-buffer)
(insert-file-contents "~/.mh_profile")
(setq mh-use-draft-folder
(not (equal (setq mh-draft-folder
(format "+%s" (mh-get-field "Draft-Folder:" )))
"+")))
(if (equal (setq mh-user-path (mh-get-field "Path:")) "")
(setq mh-user-path "Mail/")
(setq mh-user-path (format "%s/" mh-user-path)))
(if (not (equal (substring mh-user-path 0 1) "/"))
(setq mh-user-path (format "%s/%s" (getenv "HOME") mh-user-path)))))
(defun mh-compose-and-send-mail (send-args sent-from-folder sent-from-msg
to subject cc
&optional annotate-char
annotate-field search-prefix)
"Edit and compose a draft message and send or save it.
SENT-FROM-FOLDER is buffer containing scan listing of current folder, or
nil if none exists.
SENT-FROM-MSG is the message number or sequence name or nil.
SEND-ARGS is an optional argument passed to the send command.
The TO, SUBJECT, and CC fields are passed to the mh-compose-letter-hook.
If ANNOTATE-CHAR is non-null, it is used to notate the scan listing of the
message. In that case, the ANNOTATE-FIELD is used to build a string
for mh-annotate-msg."
(pop-to-buffer mh-last-draft-buffer); ugly, I know
(mh-letter-mode)
(make-local-vars
'mh-send-args send-args
'mh-sent-from-folder sent-from-folder
'mh-sent-from-msg sent-from-msg
'mh-annotate-field annotate-field
'mh-annotate-char annotate-char
'mh-annotate-search-prefix (if search-prefix search-prefix ""))
(setq mode-line-buffer-identification (list "mh-e: {%b} Mail/draft"))
(if (and (boundp 'mh-compose-letter-hook) mh-compose-letter-hook)
(funcall mh-compose-letter-hook to subject cc)))
(defun mh-edit-again (msg)
"Clean-up a draft or a message previously sent and make it resendable."
(interactive (list (mh-get-msg-num t)))
(let ((from-folder mh-current-folder))
(cond
((and mh-use-draft-folder (equal from-folder mh-draft-folder))
(find-file (format "%s%d" mh-folder-filename msg)))
(t (mh-read-draft "clean-up" (format "%s%d" mh-folder-filename msg))))
(mh-clean-msg-header (point-min)
"^Date:\\|^Received:\\|^Message-Id:\\|^From:"
nil)
(goto-char (point-min))
(set-buffer-modified-p nil)
(mh-compose-and-send-mail "" from-folder nil nil nil nil)
))
(define-key mh-folder-mode-map "\ea" 'mh-edit-again)