After sharing my MailMate work flow for “Waiting on Reply,” I decided to continue the MailMate post on my blog and share my custom Keybindings. MailMate gives one the ability to bind just about any key to any command or sequence of commands through a Key Bindings plist file located at

~/Library/Application Support/MailMate/Resources/KeyBindings/filename.plist

Filename can of course be anything you would like.

I have broken my key bindings into several logical sections in the file to help me maintain it. You will notice that I use a scheme of lower case letters for common operations and then the same letter but capitalized for a similar “alternate” action.

Composition

Key Purpose
c Compose a new message
r Reply to All
R Reply to Sender Only
f Forward Message

Early Example

The entire file will be included at the bottom of this post, but for an early example, if you were to have only the above four bindings, your Keybindings plist file would look like:

{
    // Email Creation
    "c"    = "newMessage:";
    "r" = "replyAll:";
    "R" = "replySender:";
    "f" =  "forwardMessage:";
}

These are simple bindings. Later, we will get into using multiple keys to perform an action and also a single key performing multiple actions.

Full information on the format of this file can be found in the MailMate Manual under the section “Custom Key Bindings.” You probably also want to look at the “Key Binding Selectors” section as well went developing your own key bindings, as it shows all the available selectors as given by MailMate. The “Selectors” are the commands to perform, such as “newMessage:“, “replyAll:“, etc…

Sending from the Composer

Key Purpose
⌘+Return Send Message
⌘+Enter Send Message
⌘+\ Send Message and move to “Delegated” folder

More on my “Delegated” folder is explained below.

Filtering

Now, right here is where most of my workflow is defined and how I am able to quickly work through email, spending as little time as possible with it, a good thing.

Key Purpose
s Move to Junk
h Train falsely marked spam as ham
x Delete Message
X Delete Thread
m Move Message to Mailbox (will prompt)
M Move Thread to Mailbox (will prompt)
d Move Message to Deferred
D Move Thread to Deferred
e Move Message to Delegated
E Move Thread to Delegated
a Archive Message

My email server has a few special boxes setup for handling Spam. I have a Spam folder which includes messages the server was reasonably sure was spam. I then

Occasionally, I will then go to my “Spam” folder (not TrainBad/TrainGood) and see if there are any false positives. If so, I can press the h key which will copy the message to my INBOX and also move the one from “Spam” to “Spam.TrainGood”, thus teaching my server the message was good not bad.

I debated the e and E (“Delegated”) commands because typically one would reply to an email, with instructions to who person who the task has been delegated to, and then mark the original as delegated. When composing a new message, you can send with ⌘+\ to perform this exact action. I added the e and E commands in, though, because I also communicate with my co-workers via IM and sometimes many times a message includes multiple people in my department. Thus, I’ll say on IM, “Please handle email XYZ.” and mark it as delegated via e or E.

Navigation

Key Purpose
. Goto the root message in a thread, the message that started it all
, Goto the last message in the thread
/ Search all messages
j Goto the next message
k Goto the previous message
J Goto the next thread
K Goto the previous thread

Now, here I also have a command g which is a key prefix for “Goto”. When pressing it, one must then press another key (that is then unique to this key sequence) to achieve a result.

Key Purpose
gg Goto a mailbox (prompts)
g Goto the INBOX (g SPACE)
gi Goto the INBOX (duplicate, sometimes easier)
gf Goto the FLAGGED mailbox
ga Goto ALL MESSAGES
gA Goto the ARCHIVE mailbox
gd Goto the Deferred mailbox
ge Goto the Delegated mailbox
gw Goto the Waiting on Reply mailbox
gs Goto the Spam mailbox

Message State

Key Purpose
! Toggle message Flag
n Toggle the Read/New state
- Toggle the Mute state

Miscellaneous

Key Purpose
u Undo
z Redo
o Show thread

Comments on my Workflow

Basically I keep an INBOX that is clear of any messages. When processing my email, I’ll either handle it, defer it, delegate it, delete it or mark it as spam. That handles all of my incoming email situations and the keybindings enables me to accomplish that task very quickly. At my leisure, I can then browse my Deferred, Delegated or Waiting on Reply folders looking for real work to be done. No other mail program I have used allows me to perform this so efficiently.

I have smart mailboxes setup that will look at each of my accounts (3) and include the proper mailbox from each account. For example, I have a Delegated folder in each of my accounts, and then a smart mailbox that simply includes All Messages from Account 1 > Delegated, Account 2 > Delegated, and Account 3 > Delegated. The same for Deferred.

I then have a little more complex setup for messages Waiting on Reply, but you can read about that in my “Waiting on Reply“ blog post I did a few days ago.

Keybindings File

So, here is my entire keybindings file.

{
    // Jeremy's person key bindings for MailMate

    // Email Creation
    "c"    = "newMessage:";
    "r" = "replyAll:";
    "R" = "replySender:";
    "f" =  "forwardMessage:";

    // Sending
    "@\U000A" = "send:"; // ⌘+return
    "@\U000D" = "send:"; // ⌘+enter
    "@\\" = ( "sendAndMoveParentToMailbox:", "/Delegated" );

    // Filtering
    "s" = "moveToJunk:";
    "h" = (
        "copyToMailbox:", "/Spam.TrainGood",
        "moveToMailbox:", "INBOX" );
    "x" = "deleteMessage:";
    "X" = ( "moveThreadToMailbox:", "trash" );
    "m" = "moveToMailbox:";
    "M" = "moveThreadToMailbox:";
    "d" = ( "moveToMailbox:", "/Deferred" );
    "D" = ( "moveThreadToMailbox:", "/Deferred" );
    "e" = ( "moveToMailbox:", "/Delegated" );
    "E" = ( "moveThreadToMailbox:", "/Delegated" );
    "a" = "archive:";

    // Navigation
    "." = "rootOfThread:";
    "," = "lastOfThread:";
    "/" = "searchAllMessages:";
    "j" = "nextMessage:";
    "k" = "previousMessage:";
    "J" = "nextThread:";
    "K" = "previousThread:";

    "g" = {
        "g" = "goToMailbox:";
        " " = ( "goToMailbox:", "INBOX");
        "i" = ( "goToMailbox:", "INBOX" );
        "f" = ( "goToMailbox:", "FLAGGED" );
        "a" = ( "goToMailbox:", "ALL_MESSAGES" );
        "A" = ( "goToMailbox:", "ARCHIVE" );
        "d" = ( "goToMailbox:", "F5DEB018-5694-4805-AB01-6EF1E94CDAB8" ); // Deferred
        "e" = ( "goToMailbox:", "016DB3A1-1BE6-4468-A04D-468A727D11FB" ); // Delegated
        "w" = ( "goToMailbox:", "4BC9DBA9-ED59-4D90-A66F-5472477ED9D4" ); // Waiting on Reply
        "s" = ( "goToMailbox:", "Spam" );
    };

    // Message State
    "!" = "toggleFlag:";
    "n" = "toggleReadState:";
    "-" = "toggleMuteState:";

    // Miscellaneous
    "u" = "undo:";
    "z" = "redo:";
    "o" = "showThread:";
}

To make this file work, it must be placed into:

~/Library/Application Support/MailMate/Resources/KeyBindings/filename.plist

Where “filename” is any name you wish to give to this Keybinding. In MailMate preferences, General > Custom Key Bindings, you enable and fill in the name you gave to this set of key bindings, the name alone, not the path or extension.

For example, I named mine:

~/Library/Application Support/MailMate/Resources/KeyBindings/Jeremy.plist

and my General > Preferences screen looks like:

MailMate Keybinding Screenshot

goToMailbox commands for Deferred, Delegated and Waiting on Reply

These mailboxes are not standard mailboxes and MailMate does not understand them by name. The reasoning being, I am guessing, is that which mailbox would you be referring to when you say “Delegated,” for example. I have a smart folder named “Delegated” as well as a “Delegated” folder in all three of my accounts. Thus, I had to get the UUID of the exact folder I wanted to access. Luckily, MailMate provides a quick and easy way of doing this. Simply click on the folder you want to get the UUID for, and press ⌘C. This will place the UUID for the selected folder into the clipboard.

Conclusion

This is in a state of flux. I would be very happy to have comments on how I set rethings up, suggestions for improvement, etc… I’d also be interested in hearing how you have configured MailMate to do specific things for you that you find increases your productivity.