Colorizing messages in mutt (stab 2)

mutt-score-colors-example-scaledThis image shows the different scores (“[1000]” scores red background, “[800]” magenta text, etc.). At work I use a slightly different set.

I think I got it, at least in the index (for some reason it doesn’t work from the pager, maybe it’s the source command there)! I’m able to tag a message with a score, and have that score translate into a different color. Here’s the relevant part of my .muttrc:

# Star scoring 
source ~/.mutt/stars
bind index,pager s noop # I use 'y' to archive messages, no need for 's' to be bound to <save-message>.  This frees it up so I can use it below.

set my_red_star = 1000
set my_magenta_question = 800
set my_yellow_bang = 600
set my_green_star = 400
set my_green_check = 200
set my_blue_info = 100
set my_del_star = 0

macro index,pager sr "<pipe-entry>~/bin/stars $my_red_star<enter><enter-command>source ~/.muttrc<enter>" "Mark the current message with RED"
macro index,pager sm "<pipe-entry>~/bin/stars $my_magenta_question<enter><enter-command>source ~/.muttrc<enter>" "Mark the current message with MAGENTA"
macro index,pager sy "<pipe-entry>~/bin/stars $my_yellow_bang<enter><enter-command>source ~/.muttrc<enter>" "Mark the current message with YELLOW"
macro index,pager sc "<pipe-entry>~/bin/stars $my_green_check<enter><enter-command>source ~/.muttrc<enter>" "Mark the current message with GREEN"
macro index,pager si "<pipe-entry>~/bin/stars $my_blue_info<enter><enter-command>source ~/.muttrc<enter>" "Mark the current message with BLUE"
macro index,pager sg "<pipe-entry>~/bin/stars $my_green_check<enter><enter-command>source ~/.muttrc<enter>" "Mark the current message with GREEN"
macro index,pager sd "<pipe-entry>~/bin/stars $my_del_star<enter><pipe-entry>~/bin/del_stars<enter><enter-command>source ~/.muttrc<enter><sync-mailbox>" "Remove color marking from the current message"

color index default brightred '~n 1000-1100'  # Mark the message with red!
color index magenta default '~n 800-999'  # Mark the message with magenta!
color index black brightyellow '~n 600-799'  # Mark the message with yellow!
color index default green '~n 400-599'  # Mark the message with green!
color index green default '~n 200-399'  # Mark the message with green (check)!
color index brightblue default '~n 100-199'  # Mark the message with blue!

Not much different than I had before. The problems I had were the .mutt/stars, bin/stars, bin/del_stars. It mostly worked once I got it set up, except for messages that had special regular-expression reserved characters in the message ID. Here’s the bin/stars file I have:

#!/bin/bash
SCORE=$1                                
msgid=$(sed '/^Message-I[Dd]:[[:space:]]*/!d; s///; s/[<>]//g; s/[][$|]/\\&/g; q')
echo "score \"~i '$msgid'\" $SCORE" >> ~/.mutt/stars 

The key was the single quotes around the actual message ID. And the del_stars file:

#!/bin/bash

msgid=$(grep -m 1 '^Message-I[Dd]' | awk '{print $2}' | sed 's/[<>]//g; s/[^^]/[&]/g; s/\^/\\^/g')
sed -i "/$msgid/d" ~/.mutt/stars

After some further testing, it still doesn’t work. I have one company that sends me a bill summary, and the Message-Id has square-brackets around an RFC1918 address. Rather than fight with mutt trying to get it to read and score the message properly, I just added the company’s bill email address to my .mutt/stars file, with the following line:

score "~f CompanyEmail@company.com" 600

Also, to get the del_star script to work most times I have to close mutt completely before the score is removed. But otherwise it works!

Leave a Reply