Coping with busy mailing lists with Mutt

I’m on a couple of fairly busy mailing lists which by their nature have loose or no moderation. It’s natural that some mailing lists work well with tight moderation, even perhaps requiring every post to be approved, but it’s more common for there to be little or no moderation. This is not a bad thing; people have very different ideas about what sort of posts are interesting.

As a consequence though, I tend to find that many (sometimes the majority) of posts are uninteresting. Clearly if they are all uninteresting then I need to just unsubscribe, but I’m on plenty of lists that do come up with gems from time to time. I find Mutt, the text-based (console) email client to be really helpful at quickly getting through these mailing lists without missing too many interesting things, and I thought I’d share some ways I do that.

These are primarily simple tips for dealing with other people’s sub-optimal mailing list behaviour. In some cases it’s the poster who’s clearly in the wrong, but asking people to give a toss about those reading their words of wisdom is apparently considered offensive in many places, and doesn’t actually modify behaviour.

First off, Mutt is kind of a culture shock for most people. This post is only really for people who already use Mutt, or maybe who were already considering using it. I’m not even going to try convincing the typical gmail web user to switch. Or anyone really. Depending on how you configure it, Mutt looks a bit like this:

Screenshot of Mutt; click for bigger version

(Click for higher-resolution version)

If that freaks you out, it may be best to stop reading, move along. Run, don’t walk.

Context is useful ^

Like, I suspect, most Mutt users, I don’t really know most of its features. It’s pretty complicated to configure. When other Mutt users glance at my email they quite commonly ask, “how did you split the window like that!?” I didn’t, it’s not split, it’s just a different layout of message window. Here’s how:

set pager_index_lines=5

Just handy for being able to see a bit of the context of where the current post is in regards to the rest of the thread.

Threading matters ^

Once a thread has gone bad, it’s usually going to stay bad. The most useful tricks involve operating on whole threads at once, so you don’t have to tediously click something on every email. So while it might not seem like the most annoying thing at first, people not threading properly becomes one of the more annoying things later as it slows down whatever you are trying to do on the thread.

Sort your folders by thread:

set sort=threads

Unfortunately Mutt doesn’t seem to have a feature to break a thread when the subject header changes, so you might instead prefer to sort by subject. That had too many false positives for me though, even with sort_re.

Get rid of a whole thread ^

If you’re looking at the start of a thread, and it’s uninteresting, and you can see all of the thread below it, chances are that it’s all going to be uninteresting. You can mark it all read with ctrl-r. I prefer to see the whole thread on the screen before doing that, because there’s some chance that someone might change the subject line into something that becomes interesting.

I find myself reading some lists mostly with ctrl-r without even looking at the content of the posts. For example, a thread that starts with “Mandriva v Windows” isn’t very likely to contain anything except trolling and counter-trolling (If you are unaware of what Mandriva is, you are reading the wrong blog post and only need know that it is a brand name for a popular USB personal massager product).

The risk is that someone will go off at a tangent and post something that is actually interesting, without changing the subject. I’m willing to take the risk; they should have changed the subject IMHO. And anyway, you still have the mail, it’s only been marked as read.

Deal with subthreads ^

If you can see that the subject of a thread has changed or there’s some other reason why you might want to treat every message below the current one differently, then you can operate on subthreads.

The most simple thing is to break the subthread off into a new thread of its own. # will do that. You can then treat it differently, use the thread commands on it in isolation. That’s how I usually do it because if this happened then it means that the content of the subthread is very different to the rest of the thread, to me.

If you want to keep it as part of the same thread, you can mark the subthread read with esc-r (or alt-r).

Also useful for when someone decides that the right way to start a new email is to just press reply on some other random email.

Tagging ^

Occasionally a bunch of posts are the same sort of thing but they’re not in a thread. If you can find something about them that’s common then you can tag them based on that, with T. e.g. T followed by ~h @luser.example.com tags every email that has “@luser.example.com” in its headers.

If you can’t think of anything to match on then at the very least, just hitting t on each of the posts will tag it.

Once tagged, you’ll find that many existing Mutt commands that operate on a single email will work on a bunch of tagged emails as well, by prefixing the command with ;. So, if you imagine you’d tagged the above emails and wanted to mark them read, the next thing you’d do would be ;N.

Rejoin broken threading ^

Some people continue to use broken email clients that don’t do threading properly. All of their posts appear in a new thread. You can easily rejoin errant posts into an existing thread by tagging them, moving to the post they should be replies of, and using the & command. It may seem like a lot of hassle, but the benefit is that every reply to that one will then be in the right place too.

Useful for those pointless flamewars that just won’t die. “Oh look it’s that thread again, I’ll just mark it read again.”

More info ^

That’s about all I can think of in terms of the simple stuff I do every day when reading email. I hope it helped some newcomers to Mutt. There’s a lot of great tips in the documentation but it can seem a bit impenetrable at first: