Se você estiver usando a versão "desenvolvimento" do mutt (v1.5 +) - e você absolutamente deveria - existe a possibilidade de usar um filtro externo como descrito no manual .
Primeiro, você precisa de um script que possa gerar resultados diferentes de acordo com a idade de uma mensagem. Aqui está um exemplo em 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))
Salve isso como mutt-fmt-date
em algum lugar no seu PATH.
Duas coisas são importantes aqui:
- A string de formato deve conter uma ocorrência de
{}
, que é substituído pelo valor de retorno deage_fmt()
por Python. - A string de formatação deve terminar com
%
para que o Mutt a interprete.
Você pode usá-lo no seu .muttrc
da seguinte forma:
set index_format="mutt-fmt-date %[%s] |"
Mutt então
- interprete
%[%s]
de acordo com as regras para as strings de formato. - chame
mutt-fmt-date
com o resultado de 1. como argumento (por causa do|
no final). - interprete o que retorna do script como string de formato novamente (por causa do
%
no final).
Advertência : o script será executado para cada mensagem que será exibida. O atraso resultante pode ser bastante perceptível ao percorrer uma caixa de correio.
Aqui está uma versão em C que funciona de forma adequada:
#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;
}
Isso vai junto com a linha muttrc:
set index_format='mfdate "%[%d.%m.%y]" "%8[%e. %b]" "%8[%H:%m]" "%Z %%s %-20.20L %?y?[%-5.5y]& ? %?M?+& ?%s%%" "%[%s]" |'