Se você estiver usando a versão "development" do mutt (v1.5 +) - e absolutamente deve - existe a possibilidade de usar um filtro externo, conforme descrito no manual .
Primeiro, você precisa de um script que possa produzir coisas 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
um local no seu CAMINHO.
Duas coisas são importantes aqui:
- A string de formato deve conter uma ocorrência, a
{}
qual é substituída pelo valor de retorno de age_fmt()
Python.
- A string de formato precisa terminar com um
%
para que o Mutt a interprete.
Em seguida, você pode usá-lo da .muttrc
seguinte maneira:
set index_format="mutt-fmt-date %[%s] |"
Mutt então
- interpretar de
%[%s]
acordo com as regras para formatar strings.
- chamar
mutt-fmt-date
com o resultado de 1. como argumento (por causa do |
no final).
- interprete o que é recuperado do script como string de formato novamente (por causa do
%
no final).
Advertência : o script será executado para todas as mensagens que serão exibidas. O atraso resultante pode ser bastante perceptível ao rolar pela caixa de correio.
Aqui está uma versão em C que tem um desempenho adequado:
#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]" |'
Infelizmente, isso não parece ser possível com as versões atuais do Mutt.
$index_format
suporta um conjunto específico de especificadores de formato, com base em vários metadados da mensagem. É descrito no manual do Mutt (ou aqui está a documentação da versão "estável" para o mesmo ) e, como você pode ver na tabela, existem apenas alguns especificadores de formato condicionais. Aqueles são%M
,%y
e%Y
; % M é o número de mensagens ocultas se o encapsulamento for recolhido e% y e% Y são cabeçalhos de rótulo X, se presentes.A formatação real da data e hora da mensagem é feita por
strftime(3)
, que não suporta formatação condicional.Ele pode ser possível fazer um feio solução por reescrever continuamente os arquivos de mensagens
Date:
cabeçalhos, mas eu não gostaria de fazer isso, pelo menos. No entanto, é a possibilidade menos ruim que posso pensar.A única solução real em que posso pensar seria implementar esse suporte no Mutt (que quase certamente é como o Thunderbird o faz) ou escrever uma substituição
strftime
que suporte a formatação condicional e injetar isso usando LD_PRELOAD ou um mecanismo semelhante. Este último, no entanto, afetará toda a exibição de data e hora no Mutt que passar por tempo de strft, não apenas relacionado ao índice de mensagens.fonte
Por alguma razão, versões mais recentes do mutt (1.7 mostraram esse problema) prefixam a string de data com os caracteres '14' e '32', que impedem o atoi de converter a string em um int. Alterando a linha para
Possivelmente uma solução estúpida, mas funciona para mim.
fonte
Edição da versão c de @Marcus um pouco (ainda não há solução para a
%
questão no assunto):Isso formata as datas da seguinte maneira (todos os horários estão no formato 24h):
02:04
para o correio de hojeydy 02:04
para o correio de ontemThu 02:04
correio dos últimos 7 dias27.Mar
para o correio do ano atual13.12.16
para correio dos anos anterioresO formato de índice completo neste exemplo é
#no [flags] #no_of_attachments date sender subject msg_size
fonte
Fez algumas modificações, mas não resolveu o problema "% no assunto"
fonte
Essa
index_format
variáveljunto com este modificado
mfdate.c
apresentado nesta resposta pelo salto do usuário :funciona corretamente para mim
mutt 1.6.1
e, como você vê, não há problemas com o%
login no assunto, se é esse o problema real:Esta é a versão inicial "apenas funcionando" porque, depois de examinar mais de perto sua pergunta original, não tenho certeza se é isso que você deseja. No entanto, se é isso que você deseja, me avise e pensaremos em como torná-lo melhor.
EDIT :
Também pode funcionar com o seu preferido
index_format
:mfdate.c:
EDIT :
Deixe-me explicar como funciona:
São
mfdate
necessários 2 argumentos:e:
O primeiro argumento é apenas
time of the message
, conforme descrito naindex_format
documentação em.muttrc
:Nesse caso,
fmt
é substituído por%s
, porque como os%s
meiosThe number of seconds since the Epoch
explicados emman strftime
. O primeiro argumento é usado para calcular quantos anos a mensagem é eo que etiqueta:old
,recent
outoday
que deveria ter.O segundo argumento é a parte restante da
index_format
variável. É usadomfdate
apenas para impressão, mas um acréscimo%
é adicionado no finalprintf
porque, como diz o manual do mutt :Todo
%
aqui é duplicado porque queremos passar um literal%
para a segunda formatação feita pormutt
.fonte