├── img ├── tip.gif ├── correspondence-arcs.png └── correspondence-arcs-widescreen.png ├── KeyBindings ├── composer.plist ├── trackpad-gestures.plist ├── gmail.plist └── gmail-extended.plist ├── README.md ├── Layouts └── Mailboxes │ ├── correspondence-arcs.plist │ └── correspondence-arcs-widescreen.plist └── Gmail Shortcuts.md /img/tip.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chauncey-garrett/mailmate/HEAD/img/tip.gif -------------------------------------------------------------------------------- /img/correspondence-arcs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chauncey-garrett/mailmate/HEAD/img/correspondence-arcs.png -------------------------------------------------------------------------------- /img/correspondence-arcs-widescreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chauncey-garrett/mailmate/HEAD/img/correspondence-arcs-widescreen.png -------------------------------------------------------------------------------- /KeyBindings/composer.plist: -------------------------------------------------------------------------------- 1 | { 2 | "@D" = "sendAndArchiveParent:"; 3 | // "@N" = ( "reply:", "insertFormatString:", "Hi ${from.name.first},\n\n"); 4 | } 5 | -------------------------------------------------------------------------------- /KeyBindings/trackpad-gestures.plist: -------------------------------------------------------------------------------- 1 | { 2 | // 3 | // Trackpad Gestures 4 | // 5 | 6 | "→" = "nextMessage:"; // \U2193 - Swipe right 7 | "←" = "previousMessage:"; // \U2190 - Swipe left 8 | "↑" = "previousThread:"; // \U2192 - Swipe up 9 | "↓" = "nextThread:"; // \U2191 - Swipe down 10 | 11 | "^→" = "nextUnreadMessage:"; 12 | "^←" = "previousUnreadMessage:"; 13 | "^↑" = "previousUnreadThread:"; 14 | "^↓" = "nextUnreadThread:"; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /KeyBindings/gmail.plist: -------------------------------------------------------------------------------- 1 | { 2 | /* 3 | * Gmail defaults for MailMate 4 | * 5 | * Based on: http://mail.google.com/support/bin/answer.py?answer=6594 6 | */ 7 | 8 | /* 9 | * | Keybindings | 10 | * | Shortcut | Code | Description | 11 | * | -------- | ---- | ----------- | 12 | * | a | a | - | 13 | * | ⌃ a | ^a | Control-a | 14 | * | ⌥ a | ~a | Option-a | 15 | * | ⇧ a | A | Shift-a | 16 | * | ⌘ a | @a | Command-a | 17 | */ 18 | 19 | /* Single-Keys */ 20 | 21 | "c" = "newMessage:"; 22 | /* TODO: d = Compose in new tab */ 23 | /* "/" = "mailboxSearch:"; */ /* Alternative to just search the current mailbox. */ 24 | "/" = "searchAllMessages:"; 25 | "k" = "previousThread:"; 26 | "j" = "nextThread:"; 27 | "p" = "previousMessage:"; 28 | "n" = "nextMessage:"; 29 | "~" = "selectPreviousMailboxRow:"; 30 | "`" = "selectNextMailboxRow:"; 31 | "o" = "openMessages:"; 32 | "u" = ( "goToMailbox:", "INBOX" ); 33 | "e" = "archive:"; 34 | "m" = "markAsMuted:"; 35 | /* TODO: x = Select conversation */ 36 | "s" = "toggleFlag:"; 37 | /* TODO: + = Mark as important */ 38 | /* TODO: - = Mark as unimportant */ 39 | "!" = "moveToJunk:"; 40 | "r" = "reply:"; 41 | /* "R" = "reply:"; [> In Gmail, ⇧R will reply in a new window. Kept for consistency. <] */ 42 | "a" = "replyAll:"; 43 | /* "A" = "replyAll:"; [> In Gmail, ⇧A will reply all in a new window. Kept for consistency. <] */ 44 | "f" = "forwardMessage:"; 45 | /* "F" = "forwardMessage:"; [> In Gmail, ⇧F will forward in a new window. Kept for consistency. <] */ 46 | /* ⎋ = escape from the input field; native in MailMate */ 47 | "@s" = "saveDocument:"; 48 | "#" = "deleteMessage:"; 49 | /* l = open the tag editor; t is native in MailMate but to change this you must enable a hidden preference pane. See the README for more info. */ 50 | "v" = "moveToMailbox:"; 51 | "I" = ( "markAsRead:", "nextMessage:" ); 52 | "U" = "markAsUnRead:"; 53 | /* TODO: [ = remove from current view and go to previous */ 54 | /* TODO: ] = remove from current view and go to next */ 55 | /* TODO: { = archive and go to previous */ 56 | /* TODO: } = archive and go to next */ 57 | "z" = "undo:"; 58 | /* ⇧N = update current conversation. i.e., synchronize mailboxes */ 59 | /* "y" = "archive:"; */ 60 | /* y should: archive from inbox, unflag from flagged, move to inbox from trash, remove label from any label but this is not feasible in MailMate. */ 61 | 62 | /* 63 | * Combo keys 64 | */ 65 | 66 | "g" = { 67 | "a" = ( "goToMailbox:", "ALL_MESSAGES" ); 68 | "s" = ( "goToMailbox:", "FLAGGED" ); 69 | /* TODO: g then c = Go to 'Contacts' takes you to your Contacts list. */ 70 | "d" = ( "goToMailbox:", "DRAFTS" ); 71 | "l" = "goToMailbox:"; 72 | "i" = ( "goToMailbox:", "INBOX" ); 73 | "t" = ( "goToMailbox:", "SENT" ); 74 | }; 75 | 76 | "*" = { 77 | "a" = "selectAll:"; /* Selects all */ 78 | "n" = "deselectAll:"; /* Deselect all */ 79 | "r" = ( "selectWithFilter:", "#flags.flag = '\\Seen'" ); /* Selects all mail you've read. */ 80 | "u" = ( "selectWithFilter:", "#flags.flag !=[x] '\\Seen'" ); /* Selects all unread mail. */ 81 | "s" = ( "selectWithFilter:", "#flags.flag = '\\Flagged'" ); /* Selects all starred mail. */ 82 | "t" = ( "selectWithFilter:", "#flags.flag !=[x] '\\Flagged'" ); /* Selects all unstarred mail. */ 83 | }; 84 | 85 | /* 86 | * Composing 87 | */ 88 | 89 | "@\U000A" = "send:"; // ⌘+return 90 | "@\U000D" = "send:"; // ⌘+enter 91 | /* ⌘. = advance to next window */ 92 | /* ⌘, = go to previous window */ 93 | /* ⌘⇧c = add cc recipients */ 94 | /* ⌘⇧b = add bcc recipients */ 95 | /* ⌘⇧f = change from address */ 96 | 97 | } 98 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MailMate Customizations 2 | 3 | ## Mailbox Layouts 4 | 5 | The files [correspondence-arcs.plist](Layouts/Mailboxes/correspondence-arcs.plist) and [correspondence-arcs-widescreen.plist](Layouts/Mailboxes/correspondence-arcs-widescreen.plist) combine the *Correspondence* view with the *Thread Arcs* view. **Correspondence Arcs** is designed more for a taller, more narrow, view, while **Correspondence Arcs (Widescreen)** is designed for more for a widescreen layout. Additionally, in **Correspondence Arcs** I often hide the Messages sidebar and either use the Gmail shortcuts or ⌘T to access the *Go to Mailbox* feature. 6 | 7 | ![Correspondence Arcs, with hidden sidebar](img/correspondence-arcs.png) 8 | 9 | ![Correspondence Arcs (Widescreen)](img/correspondence-arcs-widescreen.png) 10 | 11 | ## Key bindings 12 | 13 | | File | Description 14 | | :--- | :--- 15 | | [composer.plist](KeyBindings/composer.plist) | Shortcuts for the email composition window 16 | | [gmail.plist](KeyBindings/gmail.plist) | Gmail style shortcuts in the main viewer window 17 | | [gmail-extended.plist](KeyBindings/gmail-extended.plist) | **Custom** Gmail style shortcuts in the main viewer window 18 | | [trackpad-gestures.plist](KeyBindings/trackpad-gestures.plist) | Trackpad gestures as outlined in the manual 19 | 20 | These are fairly self-explanatory if you look through the `plist` files. They should be placed in 21 | 22 | ```sh 23 | ~/Library/Application Support/MailMate/Resources/KeyBindings 24 | ``` 25 | 26 | NOTE: You may need to make the `KeyBindings` folder if you don't already have one. See [Installation](#installation) below. 27 | 28 | ### Gmail Keybindings 29 | 30 | The key bindings in [gmail.plist](KeyBindings/gmail.plist) **are written to provide parity with Gmail,** to the extent that is feasible in MailMate. These go beyond what has already been done with the Gmail key bindings included in MailMate. A table of feature parity may be found in the file [Gmail Shortcuts.md](Gmail Shortcuts.md). 31 | 32 | I have additionally included a couple of (IMHO) improvements to the standard version, which are in [gmail-extended.plist](KeyBindings/gmail-extended.plist): 33 | 34 | | Shortcut | Description 35 | | :---: | :--- 36 | | gu | go to smart mailbox, Unread 37 | | gg | move to the top of the list (Vim-style) 38 | | ⇧G | move to the bottom (Vim-style) 39 | | r | reply to message and insert salutation in message 40 | | ⌘⇧F | forward message as an attachment 41 | | ⇧E | archive all messages in the current thread 42 | | Z | redo 43 | | N | select next message for modification 44 | | P | select previous message for modification 45 | 46 | ## Installation 47 | 48 | Mailmate user customizations are stored in `~/Library/Application Support/MailMate/Resources`. If you don't have any customizations, I'll suggest doing this: 49 | 50 | ```sh 51 | mkdir -p "$HOME/Library/Application Support/MailMate/Resources" 52 | git clone https://github.com/chauncey-garrett/mailmate.git "$HOME/Library/Application Support/MailMate/Resources" 53 | ``` 54 | 55 | To set the tags shortcut to `l`, type this in terminal: 56 | 57 | ```sh 58 | defaults write com.freron.MailMate MmTagsPreferencesKeyEquivalentsColumnEnabled -bool YES 59 | ``` 60 | 61 | Now, relaunch MailMate and set the shortcut in the preferences pane (MailMate > Preferences... > General > Custom Key Bindings > Enable). Enable the key bindings that you want by entering them in the box below, e.g. `trackpad-gestures,composer,gmail-extended`. 62 | 63 | ## Like it? 64 | 65 | Add it to your toolbox; if not, open an [issue!](https://github.com/chauncey-garrett/mailmate/issues "chauncey-garrett/mailmate/issues") I appreciate all feedback. 66 | 67 | ## Author(s) 68 | 69 | I specifically want to thank [Benny Kjær Nielsen](http://freron.com/about/index.html#about_me) for making this repository possible by producing [MailMate](http://freron.com), and for providing excellent customer support in regard to how to best make these customizations. 70 | 71 | *The author(s) of this module should be contacted via the [issue tracker](https://github.com/chauncey-garrett/mailmate/issues "chauncey-garrett/mailmate/issues").* 72 | 73 | - [Chauncey Garrett](https://github.com/chauncey-garrett "chauncey-garrett") 74 | 75 | [![](/img/tip.gif)](http://chauncey.io/reader-support/) 76 | 77 | -------------------------------------------------------------------------------- /KeyBindings/gmail-extended.plist: -------------------------------------------------------------------------------- 1 | { 2 | /* 3 | * Gmail (extended) defaults for MailMate 4 | * 5 | * Based on: http://mail.google.com/support/bin/answer.py?answer=6594 6 | */ 7 | 8 | /* 9 | * | Keybindings | 10 | * | Shortcut | Code | Description | 11 | * | -------- | ---- | ----------- | 12 | * | a | a | - | 13 | * | ⌃ a | ^a | Control-a | 14 | * | ⌥ a | ~a | Option-a | 15 | * | ⇧ a | A | Shift-a | 16 | * | ⌘ a | @a | Command-a | 17 | */ 18 | 19 | /* Single-Keys */ 20 | 21 | "c" = "newMessage:"; 22 | /* TODO: d = Compose in new tab */ 23 | /* "/" = "mailboxSearch:"; */ /* Alternative to just search the current mailbox. */ 24 | "/" = "searchAllMessages:"; 25 | "k" = "previousThread:"; 26 | "j" = "nextThread:"; 27 | "p" = "previousMessage:"; 28 | "n" = "nextMessage:"; 29 | "~" = "selectPreviousMailboxRow:"; 30 | "`" = "selectNextMailboxRow:"; 31 | "o" = "openMessages:"; 32 | "u" = ( "goToMailbox:", "INBOX" ); 33 | "e" = "archive:"; 34 | "E" = ("moveThreadToMailbox:", "archive"); /* archive the entire thread */ 35 | "m" = "markAsMuted:"; 36 | /* TODO: x = Select conversation */ 37 | "s" = "toggleFlag:"; 38 | /* TODO: + = Mark as important */ 39 | /* TODO: - = Mark as unimportant */ 40 | "!" = "moveToJunk:"; 41 | /* "r" = "reply:"; */ 42 | /* "R" = "reply:"; [> In Gmail, ⇧R will reply in a new window. Kept for consistency. <] */ 43 | "r" = ( "reply:", "insertFormatString:", "${to.name.first},\n\n"); /* Smart reply */ 44 | "a" = "replyAll:"; 45 | /* "A" = "replyAll:"; [> In Gmail, ⇧A will reply all in a new window. Kept for consistency. <] */ 46 | "f" = "forwardMessage:"; 47 | /* "F" = "forwardMessage:"; [> In Gmail, ⇧F will forward in a new window. Kept for consistency. <] */ 48 | "@F" = "forwardAsAttachment:"; /* Added b/c MailMate doesn't yet work well with HTML messages w/o embedded text */ 49 | /* ⎋ = escape from the input field; native in MailMate */ 50 | "@s" = "saveDocument:"; 51 | "#" = "deleteMessage:"; 52 | /* l = open the tag editor; t is native in MailMate but to change this you must enable a hidden preference pane. See the README for more info. */ 53 | "v" = "moveToMailbox:"; 54 | "I" = ( "markAsRead:", "nextMessage:" ); 55 | "U" = "markAsUnRead:"; 56 | /* TODO: [ = remove from current view and go to previous */ 57 | /* TODO: ] = remove from current view and go to next */ 58 | /* TODO: { = archive and go to previous */ 59 | /* TODO: } = archive and go to next */ 60 | "z" = "undo:"; 61 | "Z" = "redo:"; 62 | /* ⇧N = update current conversation. i.e., synchronize mailboxes */ 63 | /* "y" = "archive:"; */ 64 | /* y should: archive from inbox, unflag from flagged, move to inbox from trash, remove label from any label but this is not feasible in MailMate. */ 65 | 66 | /* 67 | * Combo keys 68 | */ 69 | 70 | "g" = { 71 | "a" = ( "goToMailbox:", "ALL_MESSAGES" ); 72 | "s" = ( "goToMailbox:", "FLAGGED" ); 73 | /* TODO: g then c = Go to 'Contacts' takes you to your Contacts list. */ 74 | "d" = ( "goToMailbox:", "DRAFTS" ); 75 | "g" = "selectFirstMessageRow:"; /* gg, like in Vim */ 76 | "l" = "goToMailbox:"; 77 | "i" = ( "goToMailbox:", "INBOX" ); 78 | "t" = ( "goToMailbox:", "SENT" ); 79 | "u" = ( "goToMailbox:", "0CE5FC71-F7DC-4D08-842D-0556FA57CDB9" ); /* Goto smart mailbox, Unread. Obtain the UUID from ~/Library/Application Support/MailMate/Mailboxes.plist */ 80 | }; 81 | "G" = "selectLastMessageRow:"; /* G, like in Vim */ 82 | 83 | "*" = { 84 | "a" = "selectAll:"; /* Selects all */ 85 | "n" = "deselectAll:"; /* Deselect all */ 86 | "r" = ( "selectWithFilter:", "#flags.flag = '\\Seen'" ); /* Selects all mail you've read. */ 87 | "u" = ( "selectWithFilter:", "#flags.flag !=[x] '\\Seen'" ); /* Selects all unread mail. */ 88 | "s" = ( "selectWithFilter:", "#flags.flag = '\\Flagged'" ); /* Selects all starred mail. */ 89 | "t" = ( "selectWithFilter:", "#flags.flag !=[x] '\\Flagged'" ); /* Selects all unstarred mail. */ 90 | }; 91 | "N" = "moveDownAndModifySelection:"; 92 | "P" = "moveUpAndModifySelection:"; 93 | 94 | /* 95 | * Composing 96 | */ 97 | 98 | "@\U000A" = "send:"; // ⌘+return 99 | "@\U000D" = "send:"; // ⌘+enter 100 | /* ⌘. = advance to next window */ 101 | /* ⌘, = go to previous window */ 102 | /* ⌘⇧c = add cc recipients */ 103 | /* ⌘⇧b = add bcc recipients */ 104 | /* ⌘⇧f = change from address */ 105 | } 106 | -------------------------------------------------------------------------------- /Layouts/Mailboxes/correspondence-arcs.plist: -------------------------------------------------------------------------------- 1 | { 2 | name = "Correspondence Arcs"; 3 | rootViewer = 4 | { 5 | viewerType = "MmSplitView"; 6 | orientation = "horizontal"; 7 | children = 8 | ( 9 | { 10 | // Mailboxes sidebar 11 | viewerType = "MmBoxView"; 12 | orientation = "vertical"; 13 | defaultSize = 200; 14 | minWidth = 100; 15 | autoresize = 0; 16 | toggleMenuTitle = "Mailboxes"; 17 | toggleKeyEquivalent = "^~@d"; 18 | 19 | dragRect = { width = 16.0; height = 16.0; location = "bottomRight"; }; 20 | 21 | children = 22 | ( 23 | { 24 | identifier = "mailboxesOutline"; 25 | viewerType = "MmMailboxesOutlineView"; 26 | stickyMessages = 1; 27 | }, 28 | { 29 | viewerType = "MmMailboxesStatusBar"; 30 | }, 31 | ); 32 | }, 33 | { 34 | // Main window view 35 | // Split the entire window vertically to separate sidebar from mailbox view 36 | viewerType = "MmSplitView"; 37 | orientation = "vertical"; 38 | collapsibleSubview = 2; // Incomplete support -- no way to get it back (1 = first, 2 = last) 39 | children = 40 | ( 41 | { 42 | // Top of main view 43 | identifier = "pathOutlineBox"; 44 | viewerType = "MmBoxView"; 45 | orientation = "vertical"; 46 | defaultSize = 1000; 47 | autoresize = 0; 48 | children = 49 | ( 50 | { 51 | identifier = "pathControl"; 52 | viewerType = "MmPathControlView"; 53 | sources = ( { sourceIdentifier = "mailboxesOutline"; } ); 54 | }, 55 | { 56 | viewerType = "MmSeparatorView"; showWithViews = ( "pathControl" ); 57 | }, 58 | { 59 | viewerType = "MmSplitView"; 60 | minHeight = 50; 61 | orientation = "horizontal"; 62 | children = 63 | ( 64 | { 65 | // Message list 66 | viewerType = "MmBoxView"; 67 | orientation = "vertical"; 68 | defaultSize = 800; 69 | minWidth = 500; 70 | autoresize = 0; 71 | children = 72 | ( 73 | { 74 | viewerType = "MmLabelView"; 75 | // TODO: Make label state current mailbox 76 | label = "Messages"; 77 | }, 78 | { viewerType = "MmSeparatorView"; }, 79 | { 80 | identifier = "mainOutline"; 81 | viewerType = "MmMessagesOutlineView"; 82 | /* columnSettings = "outlineColumns"; */ 83 | sources = ( { sourceIdentifier = "pathControl"; } ); 84 | }, 85 | ); 86 | }, 87 | { 88 | // Correspondence view 89 | viewerType = "MmBoxView"; 90 | orientation = "vertical"; 91 | defaultSize = 300; 92 | minWidth = 300; 93 | autoresize = 0; 94 | children = 95 | ( 96 | { 97 | viewerType = "MmLabelView"; 98 | label = "Correspondence"; 99 | }, 100 | { viewerType = "MmSeparatorView"; }, 101 | { 102 | identifier = "correspondenceOutline"; 103 | viewerType = "MmMessagesOutlineView"; 104 | minWidth = 100; 105 | sources = ( { sourceIdentifier = "mainOutline"; } ); 106 | selectionSources = ( { sourceIdentifier = "mainOutline"; } ); 107 | // FIXME: The transformation does not work 'per' message, i.e., it tries to combine any 'from' with any 'to' in $mainOutline. 108 | transformation = "$ALL_MESSAGES.filter((from.address = $mainOutline.from.address and #recipient.address = $mainOutline.#recipient.address) or (from.address = $mainOutline.#recipient.address and #recipient.address = $mainOutline.from.address))"; 109 | defaultColumns = ( "subject", "relativeDate" ); 110 | outlineColumn = "subject"; 111 | }, 112 | ); 113 | toggleMenuTitle = "Correspondence View"; 114 | toggleKeyEquivalent = "^~@c"; 115 | }, 116 | { 117 | // Thread arcs view 118 | viewerType = "MmThreadArcsView"; 119 | sources = ( { sourceIdentifier = "mainOutline"; } ); 120 | selectionSources = ( { sourceIdentifier = "mainOutline"; } ); 121 | transformation = "$ALL_MESSAGES.filter(#thread-id =[c] $mainOutline.#thread-id)"; 122 | minWidth = 40; 123 | defaultSize = 40; 124 | orientation = "vertical"; 125 | toggleMenuTitle = "Thread Arc View"; 126 | toggleKeyEquivalent = ""; 127 | }, 128 | ); 129 | }, 130 | ); 131 | }, 132 | { 133 | // Bottom of main view 134 | // Split the main window horizontally to separate messages from message list 135 | viewerType = "MmSplitView"; 136 | orientation = "horizontal"; 137 | children = 138 | ( 139 | { 140 | // Email view 141 | viewerType = "MmBoxView"; 142 | orientation = "vertical"; 143 | children = 144 | ( 145 | { 146 | identifier = "headersView"; 147 | viewerType = "MmHeadersView"; 148 | sources = ( { sourceIdentifier = "correspondenceOutline"; } ); 149 | inject = ( "headersFormatting.plist" ); 150 | }, 151 | { viewerType = "MmSeparatorView"; showWithViews = ( "headersView" ); }, 152 | { 153 | identifier = "tagsEditor"; 154 | viewerType = "MmTagsEditor"; 155 | sources = ( { sourceIdentifier = "correspondenceOutline"; } ); 156 | }, 157 | { viewerType = "MmSeparatorView"; showWithViews = ( "tagsEditor" ); }, 158 | { 159 | identifier = "blockingView"; 160 | viewerType = "MmImageBlockingView"; 161 | sources = ( { sourceIdentifier = "correspondenceOutline"; } ); 162 | transformation = "$correspondenceOutline.filter(##blocked-count exists)"; 163 | }, 164 | { viewerType = "MmSeparatorView"; showWithViews = ( "blockingView" ); }, 165 | { 166 | identifier = "securityView"; 167 | viewerType = "MmSecurityView"; 168 | sources = ( { sourceIdentifier = "correspondenceOutline"; } ); 169 | transformation = "$correspondenceOutline.filter(##security-problem exists)"; 170 | }, 171 | { viewerType = "MmSeparatorView"; showWithViews = ( "securityView" ); }, 172 | { 173 | identifier = "messageView"; 174 | viewerType = "MmWebView"; 175 | sources = ( { sourceIdentifier = "correspondenceOutline"; } ); 176 | minWidth = 175; 177 | minHeight = 50; 178 | }, 179 | ); 180 | } 181 | ); 182 | 183 | toggleMenuTitle = "Message View"; 184 | toggleKeyEquivalent = "^~@h"; 185 | }, 186 | ); 187 | }, 188 | ); 189 | }; 190 | } 191 | -------------------------------------------------------------------------------- /Layouts/Mailboxes/correspondence-arcs-widescreen.plist: -------------------------------------------------------------------------------- 1 | { 2 | name = "Correspondence Arcs (Widescreen)"; 3 | rootViewer = 4 | { 5 | viewerType = "MmSplitView"; 6 | orientation = "horizontal"; 7 | children = 8 | ( 9 | { 10 | // Mailboxes sidebar 11 | viewerType = "MmBoxView"; 12 | orientation = "vertical"; 13 | defaultSize = 200; 14 | minWidth = 100; 15 | autoresize = 0; 16 | toggleMenuTitle = "Mailboxes"; 17 | toggleKeyEquivalent = "^~@d"; 18 | 19 | dragRect = { width = 16.0; height = 16.0; location = "bottomRight"; }; 20 | 21 | children = 22 | ( 23 | { 24 | identifier = "mailboxesOutline"; 25 | viewerType = "MmMailboxesOutlineView"; 26 | stickyMessages = 1; 27 | }, 28 | { 29 | viewerType = "MmMailboxesStatusBar"; 30 | }, 31 | ); 32 | }, 33 | { 34 | // Main window view 35 | // Split the entire window vertically to separate sidebar from mailbox view 36 | viewerType = "MmSplitView"; 37 | orientation = "horizontal"; 38 | // collapsibleSubview = 2; // Incomplete support -- no way to get it back (1 = first, 2 = last) 39 | children = 40 | ( 41 | { 42 | // Top of main view 43 | identifier = "pathOutlineBox"; 44 | viewerType = "MmBoxView"; 45 | orientation = "vertical"; 46 | defaultSize = 1000; 47 | autoresize = 0; 48 | children = 49 | ( 50 | { 51 | identifier = "pathControl"; 52 | viewerType = "MmPathControlView"; 53 | sources = ( { sourceIdentifier = "mailboxesOutline"; } ); 54 | }, 55 | { 56 | viewerType = "MmSeparatorView"; showWithViews = ( "pathControl" ); 57 | }, 58 | { 59 | viewerType = "MmSplitView"; 60 | minHeight = 50; 61 | orientation = "vertical"; 62 | children = 63 | ( 64 | { 65 | // Message list 66 | viewerType = "MmBoxView"; 67 | orientation = "vertical"; 68 | defaultSize = 800; 69 | minWidth = 500; 70 | autoresize = 0; 71 | children = 72 | ( 73 | { 74 | viewerType = "MmLabelView"; 75 | // TODO: Make label state current mailbox 76 | label = "Messages"; 77 | }, 78 | { viewerType = "MmSeparatorView"; }, 79 | { 80 | identifier = "mainOutline"; 81 | viewerType = "MmMessagesOutlineView"; 82 | /* columnSettings = "outlineColumns"; */ 83 | sources = ( { sourceIdentifier = "pathControl"; } ); 84 | }, 85 | ); 86 | }, 87 | { 88 | // Correspondence view 89 | viewerType = "MmBoxView"; 90 | orientation = "vertical"; 91 | defaultSize = 300; 92 | minWidth = 300; 93 | autoresize = 0; 94 | children = 95 | ( 96 | { 97 | viewerType = "MmLabelView"; 98 | label = "Correspondence"; 99 | }, 100 | { viewerType = "MmSeparatorView"; }, 101 | { 102 | identifier = "correspondenceOutline"; 103 | viewerType = "MmMessagesOutlineView"; 104 | minWidth = 100; 105 | sources = ( { sourceIdentifier = "mainOutline"; } ); 106 | selectionSources = ( { sourceIdentifier = "mainOutline"; } ); 107 | // FIXME: The transformation does not work 'per' message, i.e., it tries to combine any 'from' with any 'to' in $mainOutline. 108 | transformation = "$ALL_MESSAGES.filter((from.address = $mainOutline.from.address and #recipient.address = $mainOutline.#recipient.address) or (from.address = $mainOutline.#recipient.address and #recipient.address = $mainOutline.from.address))"; 109 | defaultColumns = ( "subject", "relativeDate" ); 110 | outlineColumn = "subject"; 111 | }, 112 | ); 113 | toggleMenuTitle = "Correspondence View"; 114 | toggleKeyEquivalent = "^~@c"; 115 | }, 116 | ); 117 | }, 118 | ); 119 | }, 120 | { 121 | viewerType = "MmSplitView"; 122 | minHeight = 50; 123 | orientation = "horizontal"; 124 | children = 125 | ( 126 | { 127 | // Thread arcs view 128 | viewerType = "MmThreadArcsView"; 129 | sources = ( { sourceIdentifier = "mainOutline"; } ); 130 | selectionSources = ( { sourceIdentifier = "mainOutline"; } ); 131 | transformation = "$ALL_MESSAGES.filter(#thread-id =[c] $mainOutline.#thread-id)"; 132 | minWidth = 40; 133 | defaultSize = 40; 134 | orientation = "vertical"; 135 | toggleMenuTitle = "Thread Arc View"; 136 | toggleKeyEquivalent = ""; 137 | }, 138 | ); 139 | }, 140 | { 141 | // Bottom of main view 142 | // Split the main window horizontally to separate messages from message list 143 | viewerType = "MmSplitView"; 144 | orientation = "vertical"; 145 | children = 146 | ( 147 | { 148 | // Email view 149 | viewerType = "MmBoxView"; 150 | orientation = "vertical"; 151 | children = 152 | ( 153 | { 154 | identifier = "headersView"; 155 | viewerType = "MmHeadersView"; 156 | sources = ( { sourceIdentifier = "correspondenceOutline"; } ); 157 | inject = ( "headersFormatting.plist" ); 158 | }, 159 | { viewerType = "MmSeparatorView"; showWithViews = ( "headersView" ); }, 160 | { 161 | identifier = "tagsEditor"; 162 | viewerType = "MmTagsEditor"; 163 | sources = ( { sourceIdentifier = "correspondenceOutline"; } ); 164 | }, 165 | { viewerType = "MmSeparatorView"; showWithViews = ( "tagsEditor" ); }, 166 | { 167 | identifier = "blockingView"; 168 | viewerType = "MmImageBlockingView"; 169 | sources = ( { sourceIdentifier = "correspondenceOutline"; } ); 170 | transformation = "$correspondenceOutline.filter(##blocked-count exists)"; 171 | }, 172 | { viewerType = "MmSeparatorView"; showWithViews = ( "blockingView" ); }, 173 | { 174 | identifier = "securityView"; 175 | viewerType = "MmSecurityView"; 176 | sources = ( { sourceIdentifier = "correspondenceOutline"; } ); 177 | transformation = "$correspondenceOutline.filter(##security-problem exists)"; 178 | }, 179 | { viewerType = "MmSeparatorView"; showWithViews = ( "securityView" ); }, 180 | { 181 | identifier = "messageView"; 182 | viewerType = "MmWebView"; 183 | sources = ( { sourceIdentifier = "correspondenceOutline"; } ); 184 | minWidth = 175; 185 | minHeight = 50; 186 | }, 187 | ); 188 | } 189 | ); 190 | 191 | toggleMenuTitle = "Message View"; 192 | toggleKeyEquivalent = "^~@h"; 193 | }, 194 | ); 195 | }, 196 | ); 197 | }; 198 | } 199 | -------------------------------------------------------------------------------- /Gmail Shortcuts.md: -------------------------------------------------------------------------------- 1 | # Gmail style shortcuts for MailMate 2 | 3 | Based on the shortcuts list at https://support.google.com/mail/answer/6594. 4 | 5 | ## Legend 6 | 7 | | Mark | Description | 8 | | :-----------: | :----------- | 9 | | ✓ | Available | 10 | | ✘ | No plan to implement or not currently applicable to MailMate | 11 | | *blank* | Not yet implemented | 12 | 13 | ## Single-keys 14 | 15 | | Shortcut Key | Action | Description | Available? | 16 | | :------------: | :----------- | :----------- | :-----------: | 17 | | c | Compose | Allows you to compose a new message. | ✓ | 18 | | d | Compose in a new tab | Opens a compose window in a new tab. | ✘ | 19 | | / | Search | Puts your cursor in the search box. | ✓ | 20 | | k | Move to newer conversation | Opens or moves your cursor to a more recent conversation. You can hit ↩ to expand or collapse a message. | ✓ | 21 | | j | Move to older conversation | Opens or moves your cursor to the next oldest conversation. You can hit ↩ to expand or collapse a message. | ✓ | 22 | | n | Newer message | In 'Conversation view', moves your cursor to the newer message. You can hit ↩ to expand or collapse a message. | ✓ | 23 | | p | Previous message | In 'Conversation view', moves your cursor to the older message. You can hit ↩ to expand or collapse a message. | ✓ | 24 | | \` | Go to next inbox section | If you use an inbox style with tabs or sections, you can quickly navigate to the next section. | ✓ | 25 | | ~ | Go to previous inbox section | If you use an inbox style with tabs or sections, you can quickly navigate to the previous section. | ✓ | 26 | | o or ↩ | Open | Opens your conversation. Also expands or collapses a message if you are in 'Conversation View.' | ✓ | 27 | | u | Return to conversation list | Refreshes your page and returns you to the inbox, or list of conversations. | ✓ | 28 | | e | Archive | Archive your conversation from any view. | ✓ | 29 | | m | Mute | Archives the conversation, and all future messages skip the Inbox unless sent or cc'd directly to you. Learn more. | ✓ | 30 | | x | Select conversation | Automatically checks and selects a conversation so that you can archive, apply a label, or choose an action from the drop-down menu to apply to that conversation. | ✘ | 31 | | s | Star a message or conversation | Adds or removes a star to a message or conversation. Stars allow you to give a message or conversation a special status. | ✓ | 32 | | + | Mark as important | Helps Gmail learn what's important to you by marking misclassified messages. (Specific to Priority Inbox) | | 33 | | - | Mark as unimportant | Helps Gmail learn what's not important to you by marking misclassified messages. (Specific to Priority Inbox) | | 34 | | ! | Report spam | Marks a message as spam and removes it from your conversation list. | ✓ | 35 | | r | Reply | Replies to the message sender. ⇧ + r allows you to reply to a message in a new window. (Only applicable in 'Conversation View.') | ✓ | 36 | | a | Reply all | Replies to all message recipients. ⇧ + a allows you to reply to all message recipients in a new window. (Only applicable in 'Conversation View.') | ✓ | 37 | | f | Forward | Forwards a message. ⇧ + f allows you to forward a message in a new window. (Only applicable in 'Conversation View.') | ✓ | 38 | | ⎋ | Escape from input field | Removes the cursor from your current input field. | ✓ | 39 | | ⌘ + s | Save draft | Saves the current text as a draft when composing a message. Hold the Ctrl/⌘ key while pressing s and make sure your cursor is in one of the text fields -- either the composition pane, or any of the To, CC, BCC, or Subject fields -- when using this shortcut. | ✓ | 40 | | # | Delete | Moves the conversation to Trash. | ✓ | 41 | | l | Label | Opens the Labels menu to label a conversation. | | 42 | | v | Move to | Moves the conversation from the inbox to a different label, Spam or Trash. | | 43 | | ⇧ + i | Mark as read | Marks your message as 'read' and skip to a newer message. | ✓ | 44 | | ⇧ + u | Mark as unread | Marks your message as 'unread' so you can go back to it later. | ✓ | 45 | | \[ | Removes from current view and previous | Removes the current view's label from your conversation and moves to the older one. | | 46 | | \] | Removes from current view and next | Removes the current view's label from your conversation and moves to the newer one. | | 47 | | { | Archive and previous | Archives the current conversation and moves to the older one. | | 48 | | } | Archive and next | Archives the current conversation and moves to the next one. | | 49 | | z | Undo | Undoes your previous action, if possible (works for actions with an 'undo' link). | ✓ | 50 | | ⇧ + n | Update current conversation | Updates your current conversation when there are new messages. | | 51 | | q | Move cursor to chat search | Moves your cursor directly to the chat search box. | ✘ | 52 | | y | Remove from Current View* | Automatically removes the message or conversation from your current view. | ✓ | 53 | | | | From 'Inbox,' 'y' means Archive | ✓ | 54 | | | | From 'Starred,' 'y' means Unstar | ✘ | 55 | | | | From 'Trash,' 'y' means Move to inbox | ✘ | 56 | | | | From any label, 'y' means Remove the label | ✘ | 57 | | | | * 'y' has no effect if you're in 'Spam,' 'Sent,' or 'All Mail.' | ✘ | 58 | | . | Show more actions | Displays the 'More Actions' drop-down menu. | ✘ | 59 | | , | Moves cursor to the first button in your Gmail toolbar | Displays the 'More Actions' drop-down menu. | ✘ | 60 | | ⌘ + Down arrow | Opens options in Chat | ⌘ + Down arrow moves from edit field in your chat window to select the 'Video and more' menu | ✘ | 61 | | | | Next, press ⇥ to select the emoticon menu | ✘ | 62 | | | | Press ↩ to open the selected menu | ✘ | 63 | 64 | ## Combo-keys 65 | 66 | | Shortcut Key | Action | Description | Available? | 67 | | :------------: | :----------- | :----------- | :-----------: | 68 | | ⇥ then ↩ | Send message | After composing your message, use this combination to send it. | ✘ | 69 | | y then o | Archive and next | Archives your conversation and moves to the next one. | ✓ | 70 | | g then a | Go to 'All Mail' | Takes you to 'All Mail,' the storage site for all mail you've ever sent or received (and have not deleted). | | 71 | | g then s | Go to 'Starred' | Takes you to all conversations you have starred. | ✓ | 72 | | g then c | Go to 'Contacts' | Takes you to your Contacts list. | | 73 | | g then d | Go to 'Drafts' | Takes you to all drafts you have saved. | ✓ | 74 | | g then l | Go to 'Label' | Takes you to the search box with the "label:" operator filled in for you. | ✓ | 75 | | g then i | Go to 'Inbox' | Returns you to the inbox. | ✓ | 76 | | g then t | Go to 'Sent Mail' | Takes you to all mail you've sent. | ✓ | 77 | | * then a | Select all | Selects all mail. | ✓ | 78 | | * then n | Select none | Deselects all mail. | ✓ | 79 | | * then r | Select read | Selects all mail you've read. | ✓ | 80 | | * then u | Select unread | Selects all unread mail. | ✓ | 81 | | * then s | Select starred | Selects all starred mail. | ✓ | 82 | | * then t | Select unstarred | Selects all unstarred mail. | ✓ | 83 | 84 | ## Composing 85 | 86 | | Shortcut Key | Action | Description | Available? | 87 | | :------------: | :----------- | :----------- | :-----------: | 88 | | ⌘ + ↩ | Send message | After composing your message, use this combination to send it. | ✓ | 89 | | ⌘ + . | Advance to next window | Use this shortcut to move the cursor to the next chat or compose window, or to the main window. | | 90 | | ⌘ + , | Go to previous window | Use this shortcut to move the cursor to the previous chat or compose window, or to the main window. | | 91 | | ⌘ + ⇧ + c | Add Cc recipients | While composing, takes you to the Cc field to add new recipients. | | 92 | | ⌘ + ⇧ + b | Add Bcc recipients | While composing, takes you to the Bcc field to add new blind recipients. | | 93 | | ⌘ + ⇧ + f | Change "from" address | While composing, takes you to the From field to change your sending address. This shortcut only works if you have configured additional sending addresses. | | 94 | --------------------------------------------------------------------------------