Skip to content

Instantly share code, notes, and snippets.

@maxandersen
Last active October 30, 2024 17:42
Show Gist options
  • Save maxandersen/40b70477ad8594565f24f9b7b45abf5d to your computer and use it in GitHub Desktop.
Save maxandersen/40b70477ad8594565f24f9b7b45abf5d to your computer and use it in GitHub Desktop.
Threaded view for recent versions of mailmate. Put this in `~/Library/Application Support/MailMate/Resources/Layouts/Mailboxes/threaded.plist` and enable it via `View > Layout > Threaded`
{
name = "Threaded";
rootViewer =
{
viewerType = "MmSplitView";
orientation = "horizontal";
children =
(
{
viewerType = "MmBoxView";
orientation = "vertical";
defaultSize = 200;
minWidth = 100;
autoresize = 0;
toggleMenuTitle = "Mailboxes";
toggleKeyEquivalent = "^~@d";
dragRect = { width = 16.0; height = 16.0; location = "bottomRight"; };
children =
(
{
identifier = "mailboxesOutline";
viewerType = "MmMailboxesOutlineView";
stickyMessages = 1;
},
{
viewerType = "MmMailboxesStatusBar";
},
);
},
{
viewerType = "MmSplitView";
orientation = "vertical";
collapsibleSubview = 2; // Incomplete support -- no way to get it back (1 = first, 2 = last)
children =
(
{
identifier = "pathOutlineBox";
viewerType = "MmBoxView";
orientation = "vertical";
defaultSize = 250;
autoresize = 0;
children =
(
{
identifier = "pathControl";
viewerType = "MmPathControlView";
sources = ( { sourceIdentifier = "mailboxesOutline"; } );
},
{ viewerType = "MmSeparatorView"; showWithViews = ( "pathControl" ); },
{
identifier = "mainOutline";
viewerType = "MmMessagesOutlineView";
// columnSettings = "outlineColumns";
// Keeps selected messages in the view even if they no longer match the main query
// sources = ( { sourceIdentifier = "mainOutline"; }, { sourceIdentifier = "pathControl"; } );
sources = ( { sourceIdentifier = "pathControl"; } );
minHeight = 50;
},
);
},
{
viewerType = "MmSplitView";
orientation = "horizontal";
children =
(
{
viewerType = "MmBoxView";
orientation = "vertical";
defaultSize = 200;
autoresize = 0;
children =
(
{
viewerType = "MmLabelView";
label = "Correspondence";
},
{ viewerType = "MmSeparatorView"; },
{
identifier = "correspondenceOutline";
viewerType = "MmMessagesOutlineView";
minWidth = 100;
sources = ( { sourceIdentifier = "mainOutline"; } );
selectionSources = ( { sourceIdentifier = "mainOutline"; } );
// FIXME: The transformation does not work 'per' message, i.e., it tries to combine any 'from' with any 'to' in $mainOutline.
// mailmate does not always honor thread-id found in references so we try
// and make it pickup other threads by using the subject body to find
// the related threads. Has the advantage to also find forwarded mails
// or separate mails that have 'broken' off the thread.
transformation = "$ALL_MESSAGES.filter(#thread-id = $mainOutline.#thread-id or subject.body = $mainOutline.subject.body)";
// 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))";
defaultColumns = ( "subject", "relativeDate" );
outlineColumn = "subject";
},
);
toggleMenuTitle = "Correspondence View";
toggleKeyEquivalent = "^~@c";
},
{
// FIXME: Currently a copy of the messageView.plist which is not a robust solution.
// It's needed to change the sourceIdentifier. Maybe drop messageView.plist again?
viewerType = "MmBoxView";
orientation = "vertical";
children =
(
{
identifier = "tagsEditor";
viewerType = "MmTagsEditor";
sources = ( { sourceIdentifier = "correspondenceOutline"; } );
},
{ viewerType = "MmSeparatorView"; showWithViews = ( "tagsEditor" ); },
{
viewerType = "MmMultiMessageView";
identifier = "messageView";
minHeight = 150;
minWidth = 250;
sources = ( { sourceIdentifier = "correspondenceOutline"; } );
},
);
}
);
toggleMenuTitle = "Message View";
toggleKeyEquivalent = "^~@h";
},
);
},
);
};
}
@odysseus90210
Copy link

This is fantastic!

@afsoltys
Copy link

afsoltys commented Mar 3, 2022

hey there! is there a way to easily make this compatible with the latest beta? thanks so much.

@kassirh
Copy link

kassirh commented May 24, 2023

Unfortunately didn't work for me on MM version 5964 :-(

@klanchman
Copy link

Quick workaround for newer betas, remove every MmSeparatorView. It's been working well for me on build 5964 like that 😄

@kassirh
Copy link

kassirh commented May 26, 2023

Quick workaround for newer betas, remove every MmSeparatorView. It's been working well for me on build 5964 like that 😄

That worked on version 5964. Thank you sir!

@danpritts
Copy link

This is great, thanks!

I'm looking to modify the thread selection code, which I assume is the line

transformation = "$ALL_MESSAGES.filter(#thread-id = $mainOutline.#thread-id or subject.body = $mainOutline.subject.body)";

I'm looking to group similar but not identical subjects from my monitoring system by filtering out the non-identical words. Here's an example:

  • ** PROBLEM Service Alert: foobar is WARNING **
  • ** RECOVERY Service Alert: foobar is OK **

Can someone point me in the right direction for the documentation for the filter syntax? Hoping i can do something like a regex on the subject.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment