Essa index_format
variável
set index_format='mfdate "%[%s]" "%4C %Z %[!%b %d %Y] %-17.17F (%3l) %s" |'
junto com este modificado mfdate.c
apresentado nesta resposta pelo salto do usuário :
#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 = "old";
char *recent = "recent";
char *today = "today";
const char *format;
current_time = time(NULL);
if (argc != 3) {
printf("Usage: %s format\n", argv[0]);
return EXIT_FAILURE;
}
format = argv[2];
message_time = atoi(argv[1]);
if ((message_time/YEAR) < (current_time/YEAR)) {
printf("%s,%s", old, format);
} else if ((message_time/DAY) < (current_time/DAY)) {
printf("%s,%s", recent, format);
} else {
printf("%s,%s", today, format);
}
return EXIT_SUCCESS;
}
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
:
set index_format='mfdate "%[%s]" "%%Z %%{%%Y %%b %%e %%H:%%M} %%?X?(%%X)& ? %%-22.22F %%.100s %%> %%5c" |'
mfdate.c:
#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 = "old";
char *recent = "recent";
char *today = "today";
const char *format;
current_time = time(NULL);
if (argc != 3) {
printf("Usage: %s format\n", argv[0]);
return EXIT_FAILURE;
}
format = argv[2];
message_time = atoi(argv[1]);
if ((message_time/YEAR) < (current_time/YEAR)) {
printf("%s,%s%%", old, format);
} else if ((message_time/DAY) < (current_time/DAY)) {
printf("%s,%s%%", recent, format);
} else {
printf("%s,%s%%", today, format);
}
return 0;
}
EDIT :
Deixe-me explicar como funciona:
São mfdate
necessários 2 argumentos:
"%[%s]"
e:
"%%Z %%{%%Y %%b %%e %%H:%%M} %%?X?(%%X)& ? %%-22.22F %%.100s %%> %%5c"
O primeiro argumento é apenas time of the message
, conforme descrito na
index_format
documentação em .muttrc
:
# %[fmt] the date and time of the message is converted to the local
# time zone, and ``fmt'' is expanded by the library function
# ``strftime''; a leading bang disables locales
Nesse caso, fmt
é substituído por %s
, porque como os %s
meios The
number of seconds since the Epoch
explicados em man strftime
. O primeiro argumento é usado para calcular quantos anos a mensagem é eo que etiqueta: old
, recent
ou today
que deveria ter.
O segundo argumento é a parte restante da index_format
variável. É usado mfdate
apenas para impressão, mas um acréscimo %
é adicionado no final printf
porque, como diz o manual do mutt :
A string retornada será usada para exibição. Se a sequência retornada terminar em%, ela será passada pelo formatador uma segunda vez.
Todo %
aqui é duplicado porque queremos passar um literal %
para a segunda formatação feita por mutt
.