#!/bin/bash # written by Johannes Weißl # muttjump_fallback # # This is a fallback solution for muttjump which doesn't use any mail # indexer to find the original mail (which is of course way slower in # most cases). # # This requires two folder-hooks in .muttrc: # # # hack: set my_cwd to current folder path, abusing $record # # todo: better solution? # folder-hook . 'set my_backup_record=$record ; set record=^ ; set my_cwd=$record ; set record=$my_backup_record' # # set macro for jumping to original message # # needs to be set for every folder after my_cwd (see above) has been set # # todo: better solution? # folder-hook . 'macro generic ,J "push \"muttjump_fallback $my_cwd $folder\"" "jump to original message"' # program paths MUTT=${MUTT:-mutt} function die () { echo -e >&2 "$0: $1" exit 1 } # Check command-line arguments and STDIN if tty -s || [ $# -gt 2 ] || [ $# -lt 1 ] ; then cat >&2 <$/\1/') maildir=$1 # If $folder is given as second argument, replace "+" or "=" in $maildir if [ $# -gt 1 ] ; then folder=$2 maildir=$(echo "$maildir" | sed "s@^[+=]@$folder/@") fi if [ ! -d "$maildir/cur" ] ; then die "directory \"$maildir\" doesn't exist or is no Maildir" fi # grep for Message-ID in the current Maildir # TODO: This is definitely not what we want, but there seems to be no way # to pass the filename of the currently selected mail to an external # program, as this is dependent on the folder format. num_files=$(ls -1 "$maildir"/cur/ | wc -l) if [ $num_files -ge 100 ] ; then echo "Grepping through $num_files messages, this could take a while!" fi msgfile=$(grep -HlFx "$msgid_line" "$maildir"/cur/* | head -n1) if [ -z "$msgfile" ] ; then die "could not find Message-ID in maildir: grep -HlFx \"Message-ID: $msgid\" \"$maildir\"/cur/*" fi # find out original message-file of linked message orig_msgfile=$(readlink "$msgfile") if [ -z "$orig_msgfile" ] ; then die "message \"$msgfile\" is no link to another message, aborting!" fi # get containing maildir of $orig_msgfile orig_maildir=$(dirname $(dirname "$orig_msgfile")) if [ ! -d "$orig_maildir/cur" ] ; then die "directory \"$orig_maildir\" doesn't exist or is no Maildir" fi # Close message-stdin and open terminal-stdin instead. # mutt behaves different if STDIN is no terminal # TODO: Find cleaner solution (e.g. mutt command-line argument?) exec 0<&- term="/dev/$(ps -p$$ --no-heading | awk '{print $2}')" exec < $term # start mutt, open original folder and jump to the original message $MUTT -e "push $orig_maildir\"~i $msgid\""