# Working with Draft Messages

If you use the quit command at a `What now?` prompt, it leaves the draft message for you to work on later.

MH also has a very useful feature called draft folders that lets you keep many draft messages, work on them, and send them "in the background" while you do something else. This section explains how to work with draft messages in MH. (If you have nmh, your mh-draft(1) manual page has a summary.)

## Single Draft Messages

If you started using MH from scratch, your account probably uses just a single draft message. (It has to be set up especially to use an MH draft folder instead of the draft message.) A "single draft message" means that whenever you start to send a message with comp, repl, forw, or dist, the draft is always written to a file named draft in your MH directory. If you start one of those programs and the draft file already exists, you'll see this message:

        Draft '/yourMHdir/draft' exists; disposition?

Press RETURN for a list of what you can do. Here are the choices:

`list` (or `l`)
  Shows you the existing draft.
`quit` (or `q`)
  Exits from MH and leaves the draft alone.
`refile +folder`
  Moves the draft message into the folder you name. The draft won't be sent. Instead, the draft is moved and replaced with a new, empty form; you start over with a new draft. There's more about folders in Section Folders.
`replace` (or `rep`)
  Deletes the draft and replaces it with a new, empty form. You start fresh, as if the old draft were never there.
`use` (or `u`)
  Starts up your draft editor (by default, prompter) to keep working on the existing draft. You only have this choice if you're running comp. Note that if you start repl, forw, or dist before you get the `disposition?` prompt, they won't let you use an existing draft -- you'll need to quit and run comp.

  You can also get here directly and skip the `disposition?` prompt by starting with the command:

            % comp -use

  That's the normal way to re-edit an existing draft message.

> NOTE: If you're re-editing a draft that you started with repl, forw, or dist and its -annotate switch, the original message won't be annotated. That's because there's no way for MH to find the original message number just by looking at the leftover draft. You can annotate the message yourself with anno.

## Draft Folder

Instead of using a single draft file, you can set up an MH folder that holds many drafts. This has some great advantages:

- You don't have to finish and send a draft before you start on another.
- If you use job control, shell layers, or window systems, or if you're just logging on to your account from more than one place at the same time, you can work on several draft messages at once.
- If you use:

            What now? push

  to send your messages, you don't have to wait to start a new message until the previous draft has been sent. This is because push doesn't process the draft right away -- it takes a few seconds, especially on a busy computer. Without a draft folder, with only one draft file, the draft exists until it's been sent. A draft folder avoids this problem by letting push take its time sending a draft while you work on a new draft.
- If several users share the same account, each user can work on a separate message.

One disadvantage of a draft folder is that it can be easier for you to forget about an old draft message.

To set up a draft folder, you may want to skip ahead and read about folders. Once you've set up a draft folder, though, you don't need to think about folders much. Here's how you do it:

1. Pick a name for the draft folder (xmh uses the name drafts; that might be a good choice even if you don't use xmh).
2. Create the folder from a shell prompt, like this:

             % folder -push +drafts
             Folder /yourMHdir/drafts doesn't exist; create? y
                       drafts+ has no messages.
             % folder -pop
             [previousfolder+ now current.]

3. Add this entry to your MH profile:

             Draft-folder: drafts

Try using your draft folder. Type `comp` (or `repl` or...). When you get to the `What now?` prompt, type `quit`. You'll get a message that tells you where the draft message was left:

        What now? q
        whatnow: draft left on /yourMHdir/drafts/1

That shows that the draft message is number 1. Then start another draft (with comp or repl or...). Instead of the old prompt:

        Draft '/yourMHdir/draft' exists; disposition?

MH will give you a fresh draft. Then, if you type `quit` again, you'll see that this new draft has the next higher message number in the draft folder:

        What now? q
        whatnow: draft left on /yourMHdir/drafts/2

How do you finish a draft that you've left in the draft folder? An easy way is with the following command:

        % comp -use n

where `n` is the draft message number that you want to resume. Easier: if you want to re-edit the draft you started most recently, that draft should still be the current message in the draft folder... in which case you can omit the message number `n`.

If you're not sure which message you want, you can scan the draft folder to get a summary of your draft messages:

        % scan +drafts

Or, the recomp shell script is probably the easiest way of all.

As explained in the Section Single Draft Messages, if you're re-editing a draft that you started with repl, forw, or dist and its -annotate switch, the original message won't be annotated.

## Deleted Draft Messages

After you send a draft, MH renames it with a leading comma (`,`) or hash mark (`#`). For instance, without a draft folder, your draft file could be renamed ,draft. In a draft folder, draft number 3 would be "deleted" by changing its name to ,3. If you need to recover a draft message, just rename it without the comma or hash mark. The techniques are in the Section Removing and Recovering Messages.

If you type `quit -delete` at a `What now?` prompt -- or, if your editor program returns a nonzero exit status to whatnow (see the Section Aborted Draft Messages) -- whatnow will delete your draft as explained above. When that happened, versions of MH before 6.7.2 just said that the draft was "deleted." MH 6.7.2 changed the message to a user-friendly:

        whatnow: problems with edit -- draft left in /yourMHdir/drafts/,2

## Aborted Draft Messages

Here's one editing feature that isn't user-friendly. Some editors return a nonzero exit status when the file they were editing is perfectly fine. (Versions of vi from AT&T and Sun have this "feature.") whatnow will think that the editor failed -- and delete your draft.

If you use an editor like that, find out whether your version of MH was built with the `[ATTVIBUG]` configuration option. If you can't use `[ATTVIBUG]`, you can make a shell script like the one below, myvi, that edits the draft and always returns a zero exit status. (You can also get the script from this book's online archive. It's at examples/mh/bin/myvi.)

Example: Workaround for vi editor problem: myvi

        #! /bin/sh
        # myvi - workaround for "vi" that returns non-zero exit status
        # and makes MH "whatnow" delete draft message.
        # Usage (in MH profile)    Editor: myvi
        vi $*
        exit 0

To install myvi, see the Section Writing Shell Scripts for MH and the Section Changing Default Editors. The Section Writing Your Own Draft Message Editor(s) explains more about writing draft editors.

## Finish Draft Messages: recomp

When you type `q` at a `What now?` prompt, it leaves the draft message without sending it. If you have a draft folder, the command line you'd type to recompose the draft is long. Also, it can be hard to remember the draft number -- so you have to scan the draft folder, then remember to change your folder back.

The recomp script helps with that. If you give it a message number in the draft folder, it starts comp -use on that message with your favorite editor program. Without a message number, recomp scans the draft folder, then lets you enter the number of the message you want to recompose, and then starts comp -use. When you exit your editor, you get the usual `What now?` prompt.

Another section shows how to set up recomp.

## Work on Draft Folder: scandrafts

The scandrafts script is nice when you're wondering what's in your draft folder or you need to work in it.

- By default, scandrafts shows a list of the messages you've already sent (these messages are in files with a comma (`,`) or hash mark (`#`) before their names). Then, it scans your draft folder for drafts you're working on and finally pops you back to your current folder.
- If you use its -stay option, scandrafts will start a shell with both the current directory and current folder set to the draft folder. That way, you can restore one of the messages already sent and/or refile the message to another folder (in case you forgot to give yourself a copy when you sent it). Or you can do extensive work on the drafts more directly than a script like recomp will let you.

Here's a demonstration using -stay (without -stay, there wouldn't be a `scandrafts` prompt):

        $ scandrafts -stay
        Draft message(s) you've already sent:

        ,1:Subject: Re: SC or GA islands
        ,5:Subject: Re: our previous message about banners dialups
        ,6:Subject: Re: Can you help?
        ,7:Subject: Out this morning

        To get them back, use 'mv'.
        ===========================================================
        Draft message(s) you haven't sent:

           1  03/07*To:alison@mvus.cs  Project status<<Alison, the
        scan: message 2: empty
           3+ 03/07*To:kx9cq@cornell.  Scientific Visualization Dem

                You'll be in a /bin/ksh shell in the +drafts folder
                To quit, type control-d.
        scandrafts> rmm 2
        scandrafts> mv ,6 6
        scandrafts> scan
           1  03/07*To:alison@mvus.cs  Project status<<Alison, the p
           3+ 03/07*To:kx9cq@cornell.  Scientific Visualization Demo
           6  03/04*To:"Warren Z. Von  Re: Can you help?<<Warren, yo
        scandrafts> refile 6 +outbox

        scandrafts> CTRL-D

        [folder +inbox now current]
        $

First, you see four messages that have already been sent. The send program put commas at the beginnings of their names. Next come the messages that haven't been sent. One draft is empty (this can happen if you have trouble composing a message).

Then, because the -stay switch was used, scandrafts starts the default shell (this person uses the Korn shell). The shell prompt is set to `scandrafts>`. The current folder and current directory are the draft folder, so rmm removes the empty draft and mv takes the comma off message 6. A scan shows the cleaned-up folder. CTRL-D ends the shell and the scandrafts script.

Another section explains how to set up scandrafts.

## Building MIME Drafts

mhn (in MH, and nmh before version 0.21) and mhbuild (nmh-0.21+) edits drafts that contain directives. (There are examples in the Sections Sending MIME Mail, MIME Draft Directives, and many others.) It replaces the draft with an encoded MIME message, ready to send. You can run mhn by hand, before you send the draft:

        What now? edit mhn

(or just `e mhn`). Or, if you use nmh, you can type `mime` instead.

It can be easy to forget to do MIME processing by hand. If you forget, the recipient will get a message full of your directives -- instead of the encoded MIME message you meant to send. If you want all the messages you send to be MIME messages, you can do MIME processing automatically by adding an MH profile `automhnproc:` entry -- or, for nmh, `automimeproc:` and maybe `buildmimeproc:`. There are advantages and disadvantages; the section Building MIME Drafts Automatically has the story.

Running mhn or mhbuild automatically has another advantage if you use 8-bit (non-ASCII) characters: the minimum required character set (for example, us-ascii for English-only text) will be used. This makes it more likely that people with lousy mail-reading setups can still read what you send.

Whether you run mhn/mhbuild automatically or by hand, though -- after you have some MIME experience, you may not always agree with the automatically-chosen encoding. If you don't use automatic processing, you can edit the encoded draft and change the encoding.

In cases like those, you have a few choices. One is to remember to run mhn or mhbuild by hand when you need it. Another is to add this header field to your draft:

        MIME-Version: 1.0

When send sees that field, it won't invoke the automatic MIME draft processing. But if you add that field, be sure that your message really is in legal MIME format! (There are too many bogus MIME messages already.)

## Recovering MIME Drafts

When mhn or mhbuild reads the directives in your draft message and encodes it, the original draft message file is also preserved for a while. Recovering the original draft takes a little work, but it can be easier than trying to undo what mhn did. For instance, you might have given the wrong filename at the end of a directive, and you don't want to re-enter the whole draft just to fix that one mistake. This section explains how to recover the draft with the original directives. The end of this section describes a shell script that makes the job easier.

Let's start this example by sending a message:

        What now? edit mhn           (...on nmh, mime)

        What now? list
            ...message appears; you see mistake...

Use these steps to recover the original directives:

1. Quit and leave the encoded draft there:

             What now? quit
             whatnow: draft left on /mh/jerry/drafts/3

2. Change your current directory to the directory where your draft message was. whatnow will print the pathname of the draft (see above).

   Here are examples with a draft folder and without. Use backquotes (```), not single quotes (`'`), in the commands below. The command ls -lt lists the most recently modified files first.

   With a draft folder:

             % cd `mhpath +drafts`
             % ls -lt
             total 357
                 ...
             -rw-------  1 jerry       86340 Oct 16 10:46 3
             -rw-------  1 jerry        1419 Oct 16 10:43 ,3.orig
                 ...

   No draft folder:

             % cd `mhpath +`
             % ls -lt
             total 289
                 ...
             -rw-------  1 jerry       86340 Oct 16 10:46 draft
             -rw-------  1 jerry        1419 Oct 16 10:43 ,draft.orig
                 ...

3. You should see your original draft in a file named ,n.orig (if you use a draft folder) or ,draft.orig (if you don't). The filename without the comma (`,`) and the .orig is the encoded draft. (Note: your MH may have been configured to use a character other than a comma -- for example, `#`.) If you want to read the drafts, you can use a pager like more(1) or less(1). If you need to save the encoded draft for some reason, do it now. Otherwise, replace the encoded draft with the original draft:

             % mv ,3.orig 3

4. Re-edit the recovered draft with the comp -use command (if you have a draft folder, see the Section Draft Folder; otherwise, see the Section Single Draft Messages).

You're done. Now, think about installing the shell script named original from this book's online archive. It replaces all those steps with the simple command edit original. For example, if you run mhn and then see you've made a mistake, here's how you can replace the encoded draft with the original:

        What now? edit mhn

        What now? list
            ...oops...
        What now? edit original

        What now? edit vi

The original draft, with directives, will open inside your editor. You can fix the problem, save the file, quit the editor, and then type edit mhn again. Here's how to install original.