Wenn Sie die "Entwicklungs" -Version von mutt (v1.5 +) verwenden - und das sollten Sie unbedingt -, besteht die Möglichkeit, einen externen Filter wie im Handbuch beschrieben zu verwenden .
Zuerst benötigen Sie ein Skript, das je nach Alter einer Nachricht unterschiedliche Dinge ausgeben kann. Hier ist ein Beispiel in Python:
#!/usr/bin/env python
"""mutt format date
Prints different index_format strings for mutt according to a
messages age.
The single command line argument should be a unix timestamp
giving the message's date (%{}, etc. in Mutt).
"""
import sys
from datetime import datetime
INDEX_FORMAT = "%Z {} %?X?(%X)& ? %-22.22F %.100s %> %5c%"
def age_fmt(msg_date, now):
# use iso date for messages of the previous year and before
if msg_date.date().year < now.date().year:
return '%[%Y-%m-%d]'
# use "Month Day" for messages of this year
if msg_date.date() < now.date():
return '%10[%b %e]'
# if a message appears to come from the future
if msg_date > now:
return ' b0rken'
# use only the time for messages that arrived today
return '%10[%H:%m]'
if __name__ == '__main__':
msg_date = datetime.fromtimestamp(int(sys.argv[1]))
now = datetime.now()
print INDEX_FORMAT.format(age_fmt(msg_date, now))
Speichern Sie dies als mutt-fmt-date
irgendwo auf Ihrem Pfad.
Zwei Dinge sind hier wichtig:
- Die Formatzeichenfolge muss ein Vorkommen enthalten,
{}
das durch den Rückgabewert age_fmt()
von Python ersetzt wird.
- Die Formatzeichenfolge muss mit einem enden,
%
damit Mutt sie interpretiert.
Dann können Sie es .muttrc
wie folgt verwenden:
set index_format="mutt-fmt-date %[%s] |"
Mutt wird dann
- interpretiere
%[%s]
nach den Regeln für Formatstrings.
- Aufruf
mutt-fmt-date
mit dem Ergebnis von 1. als Argument (wegen der |
am Ende).
- interpretiere, was es aus dem Skript zurückerhält, wieder als Formatstring (wegen der
%
am Ende).
Vorsichtsmaßnahme : Das Skript wird für jede Nachricht ausgeführt, die angezeigt werden soll. Die daraus resultierende Verzögerung kann beim Blättern durch eine Mailbox sehr auffällig sein.
Hier ist eine Version in C, die einigermaßen zufriedenstellend funktioniert:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define DAY (time_t)86400
#define YEAR (time_t)31556926
int main(int argc, const char *argv[]) {
time_t current_time;
time_t message_time;
const char *old, *recent, *today;
const char *format;
current_time = time(NULL);
if (argc!=6) {
printf("Usage: %s old recent today format timestamp\n", argv[0]);
return 2;
}
old = argv[1];
recent = argv[2];
today = argv[3];
format = argv[4];
message_time = atoi(argv[5]);
if ((message_time/YEAR) < (current_time/YEAR)) {
printf(format, old);
} else if ((message_time/DAY) < (current_time/DAY)) {
printf(format, recent);
} else {
printf(format, today);
}
return 0;
}
Dies geht zusammen mit der muttrc-Zeile:
set index_format='mfdate "%[%d.%m.%y]" "%8[%e. %b]" "%8[%H:%m]" "%Z %%s %-20.20L %?y?[%-5.5y]& ? %?M?+& ?%s%%" "%[%s]" |'
Leider scheint dies mit aktuellen Versionen von Mutt nicht möglich zu sein.
$index_format
unterstützt einen bestimmten Satz von Formatspezifizierern, die aus verschiedenen Nachrichtenmetadaten stammen. Es ist im Mutt-Handbuch beschrieben (oder hier ist die Dokumentation der "Stable" -Version ), und wie Sie aus der Tabelle ersehen können, gibt es nur wenige Formatspezifizierer, die bedingt sind. Das ist%M
,%y
und%Y
; % M ist die Anzahl der ausgeblendeten Nachrichten, wenn der Thread ausgeblendet ist, und% y und% Y sind X-Label-Header, falls vorhanden.Die eigentliche Formatierung des Datums und der Uhrzeit der Nachricht erfolgt durch
strftime(3)
, wobei die bedingte Formatierung überhaupt nicht unterstützt wird.Es könnte möglich sein, eine hässliche Lösung zu finden, indem die
Date:
Header der Nachrichtendateien ständig neu geschrieben werden , aber das würde ich zumindest nicht wollen. Es ist jedoch die am wenigsten schlechte Möglichkeit, die ich mir vorstellen kann.Die einzige wirkliche Lösung, die ich mir
strftime
vorstellen kann, wäre, entweder eine solche Unterstützung in Mutt zu implementieren (wie Thunderbird es mit ziemlicher Sicherheit tut) oder eine Ersetzung zu schreiben , die bedingte Formatierungen unterstützt und diese mit LD_PRELOAD oder einem ähnlichen Mechanismus einfügt. Letzteres wirkt sich jedoch nicht nur auf den Nachrichtenindex aus , sondern auch auf die gesamte Datums- und Uhrzeitanzeige in Mutt, die durch die Arbeitszeit geht.quelle
Aus irgendeinem Grund haben neuere Versionen von mutt (1.7 dieses Problem gezeigt) dem Datumsstring die Zeichen '14' und '32' vorangestellt, die atoi davon abhalten, den String in ein int zu konvertieren. Ändern der Zeile in
Möglicherweise eine blöde Lösung, aber es funktioniert bei mir.
quelle
@Marcus 'c-Version etwas überarbeitet (allerdings noch keine Lösung für das
%
im Betreff angegebene Problem):Dieses Format ist wie folgt datiert (alle Zeiten sind im 24-Stunden-Format):
02:04
für die heutige Mailydy 02:04
für die gestrige MailThu 02:04
für die letzten 7 Tage mail27.Mar
für die Post des laufenden Jahres13.12.16
für die Mail der VorjahreDas vollständige Indexformat in diesem Beispiel lautet
#no [flags] #no_of_attachments date sender subject msg_size
quelle
Es wurden einige Änderungen vorgenommen, das Problem "% im Betreff" wurde jedoch nicht behoben
quelle
Diese
index_format
Variablezusammen mit dieser modifizierten
mfdate.c
in dieser Antwort von Benutzer hop vorgestellt :Funktioniert bei mir einwandfrei
mutt 1.6.1
und wie Sie sehen gibt es keine Probleme mit dem%
Anmelden im Betreff, wenn dies das eigentliche Problem ist:Dies ist die erste "nur funktionierende" Version, denn nachdem ich mir Ihre ursprüngliche Frage genauer angesehen habe, bin ich mir nicht sicher, ob dies das ist, was Sie wollen. Wenn Sie dies jedoch möchten, lassen Sie es mich wissen und wir überlegen, wie wir es verbessern können.
EDIT :
Es kann auch mit Ihrem bevorzugten arbeiten
index_format
:mfdate.c:
EDIT :
Lassen Sie mich erklären, wie es funktioniert:
Das
mfdate
braucht 2 Argumente:und:
Das erste Argument ist nur
time of the message
, wie in derindex_format
Dokumentation in beschrieben.muttrc
:In diesem Fall
fmt
wird ersetzt durch%s
, weil als%s
MittelThe number of seconds since the Epoch
wie in erläutertman strftime
. Das erste Argument wird verwendet , wie alt zu berechnen die Nachricht ist und was Etikett:old
,recent
odertoday
es haben sollte.Das zweite Argument ist der verbleibende Teil der
index_format
Variablen. Es wirdmfdate
nur zum Drucken verwendet, aber%
am Ende von wird ein zusätzliches hinzugefügt,printf
weil, wie es im Handbuch von mutt steht :Jeder
%
wird hier verdoppelt, weil wir ein Literal%
an die zweite Formatierung übergeben möchten, die von vorgenommen wirdmutt
.quelle