Montag, Juni 18, 2012

Labels in Mutt

Nachdem ich wieder zu Mutt gewechselt bin, wollte ich jetzt endlich meine Emails auch über Labels verwalten. Leider funktioniert das in Mutt nicht out-of-the-box, aber auch nicht schwer umzusetzen.

Mutt unterstützt seit einiger Zeit das Arbeiten mit dem Header X-Label. Das heißt man kann nach diesem mit ~y filtern und auch über %y diese Labels im Index anzeigen lassen. Das heißt es muß nur noch eine Möglichkeit geschaffen werden diese Labels zu setzen. Es gibt auch einen Patch dazu für Mutt aber ich wollte meinen Mutt nicht patchen und deshalb entschied ich mich zu einer selbst geschriebenen Lösung. Folgendes stellt ein ganz einfaches Skript dar dies umzusetzen.

file=$1
tmpfile=$file.$$

old_labels=`formail -x "X-Label:" < $file | tr -d '\n' | sed 's/^[ \t]*//'`

read -e -p "Edit Labels: " -i "$old_labels" new_labels

formail -I "X-Label: $new_labels" < $file > $tmpfile
mv $tmpfile $file

Hier wird mit dem Programm formail gearbeitet, das mit procmail mitgeliefert wird und das Bearbeiten von Emails unterstützt. Hier werden zunächst alle Labels die in diesem Email gesetzt sind ermittelt und danach von der Kommandozeile gefragt welche Labels hinzugefügt werden sollen. Danach werden diese gesammelten Labels wieder in dieser Nachricht geschrieben.

Jetzt muß man Mutt nur noch einen Keyboard-Shortcut lernen damit man mit diesem Script arbeiten kann.

macro index Y ':set editor=mutt_label_editor<return><edit>:set \
editor="emacsclient -c"<return><sync-mailbox>' "edit X-Label for message"

Diese definiert ein Macro in Mutt, welches man mit Y aufruft. Hier wird dann das Skript muttlabeleditor aufgerufen, das den obigen Inhalt hat. Wichtig zu erwähnen ist hier noch das ich am Schluß auch noch die Mailbox synchronisiere. Das kann zu Problemen führen wenn vor dem Starten dieses Skriptes schon Nachrichten zum löschen markiert wurden. Diese sind danach gelöscht. Wenn man nun folgende Zeile in die .muttrc einträgt sieht man auch die definierten Labels im Index.

set index_format="%4C|%?M?+& ?%2M|%Z|%2N|%D| %-30.30F %s %> %?y?%.30y?|%4c"

Danach kann man schon recht komfortabel mit den Labels arbeiten.

Back to Mutt

Nachdem ich von Vim auf Emacs umgestiegen bin, wollte ich natürlich auch meine Emails mit Emacs schreiben, betrachten und vor allem verwalten. Ich hatte in den letzten Monaten einige Email-Clients für Emacs ausprobiert, dazu gehören Gnus, RMail, VM und Wanderlust.

Begonnen hatte ich mit Gnus. Es ist meiner Meinung der bekannteste Email-Client für Emacs und läßt sich auch äußerst gut konfigurieren. Man kann so ziemlich alles was man sich wünscht damit anstellen. Manche Dinge gehen leichter und manche wieder umständlicher. Nachdem Gnus immer langsamer wurde und ich auch nach Monaten noch keine zufriedenstellende Konfiguration für mich hatte sah ich mich um Alternativen um. Wie schon oben erwähnt sah ich mir danach RMail, VM und Wanderlust an.

RMail ist in Emacs standardmäßig enthalten und verwendet standardmäßig, seit Emacs 23, das mbox-Format. Hier habe ich es nicht geschafft eine für mich arbeitsfähige Konfiguration zu erstellen, damit ich gut mit RMail arbeiten konnte.

Danach sah ich mir VM an. VM sollte RMail ablösen und dieses verbessern und auch noch Wanderlust, welches eine sehr gute IMAP-Unterstützung haben soll. Da ich diese aber nicht brauche, weil ich meine Emails per POP auf meinen Rechner hole war dies nicht relevant für mich.

Alles in Allem kam ich aber mit keinen der genannten Mailclients zurecht. Entweder unterstützte einer das von mir gewünschte Format nicht oder die Konfiguration war zu umständlich. Das hieß ich wechselte wieder zurück zu der Kombination procmail, mutt und Emacs als Editor. In Gnus habe ich die Emails direkt in Gnus in verschiedenste Ordner einsortiert, dies geschieht jetzt wieder mit procmail und ich bin sehr zufrieden damit weil ich z.B. durch folgende Regel allen Emails die von einer speziellen Mailingliste kommen einen Header-Eintrag hinzufügen.

:0
* ^(TO|CC).*mailing-list.*
{
   LABELS=`formail -x "X-Label:" | tr -d '\n'`
   :0
   | /usr/bin/formail -I"X-Label: $LABELS lists" \
   >> $MAILDIR/inbox
}

In dieser Rule wird von einer bestimmten Mailinglist der Header nach X-Label durchsucht und diese Labels gespeichert und ein neuer Header-Eintrag erstellt mit den alten Labels und einen neuen Label lists.

Mutt habe ich schon sehr lange verwendet und diesen auch sehr gerne genutzt. Da ich von Vim auf Emacs gewechselt bin wollte ich mir auch einen Email-Client ansehen der direkt in elisp geschrieben wurde. Leider bin ich mit keinen dieser klar gekommen und bin jetzt wieder sehr zufriedener Mutt-User. Als Editor für neue Emails verwende ich nach wie vor Emacs. Wenn man folgende Einstellung in der .muttrc macht wird auch der Emacs schnell gestartet.

set editor = "emacsclient -c"

Hier wird Emacs in einem neuen Frame gestartet und dies geschieht bei einer laufenden Emacs-Instanz sehr schnell.