Cette index_formatvariable
set index_format='mfdate "%[%s]" "%4C %Z %[!%b %d %Y] %-17.17F (%3l) %s" |'
avec cette modification mfdate.cprésentée dans cette réponse par l'utilisateur hop :
#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;
}
fonctionne correctement pour moi mutt 1.6.1et comme vous le voyez, il n'y a pas de problème de %connexion dans le sujet, si c'est le vrai problème:
Il s'agit de la version initiale "qui fonctionne" car après avoir examiné de plus près votre question d' origine, je ne sais pas si c'est ce que vous voulez. Cependant, si c'est ce que vous voulez, faites le moi savoir et nous réfléchirons à la façon de l'améliorer.
MODIFIER :
Il peut également fonctionner avec votre préféré 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;
}

MODIFIER :
Permettez-moi d'expliquer comment cela fonctionne:
Le mfdateprend 2 arguments:
"%[%s]"
et:
"%%Z %%{%%Y %%b %%e %%H:%%M} %%?X?(%%X)& ? %%-22.22F %%.100s %%> %%5c"
Le premier argument est uniquement time of the message, comme décrit dans la
index_formatdocumentation dans .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
Dans ce cas, fmtest remplacé par %s, car comme %smoyen The
number of seconds since the Epochcomme expliqué dans man strftime. Le premier argument est utilisé pour calculer l'âge du message est et ce que l' étiquette: old, recentou todayil devrait avoir.
Le deuxième argument est la partie restante de la index_format
variable. Il est utilisé mfdateuniquement pour l'impression, mais un supplément %est ajouté à la fin printfcar, comme il est indiqué dans le manuel mutt :
La chaîne retournée sera utilisée pour l'affichage. Si la chaîne retournée se termine par%, elle sera passée par le formateur une seconde fois.
Tout %est doublé ici parce que nous voulons passer un littéral %au deuxième formatage effectué par mutt.