Эта переменная index_format
set index_format='mfdate "%[%s]" "%4C %Z %[!%b %d %Y] %-17.17F (%3l) %s" |'
вместе с этим модифицированным mfdate.c
, представленным в этом ответе от пользователя hop:
#include
#include
#include
#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;
}
у меня корректно работает в mutt 1.6.1
и как видите проблем со знаком %
в теме нет , если это
вот в чем заключалась настоящая проблема:
Это первоначальная «просто рабочая» версия, потому что, внимательно изучив ваш первоначальный вопрос, я не уверен, что это то, что вы хотите. Однако, если это то то, что вам нужно, дайте мне знать, и мы подумаем, как сделать его лучше.
Он также может работать с вашим предпочтительным index_format
:
set index_format='mfdate "%[%s]" "%%Z %%{%%Y %%b %%e %%H:%%M} %%?X?(%%X)& ? %%-22.22F %%.100s %%> %%5c" |'
mfdate.c:
#include
#include
#include
#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;
}
Позвольте мне объяснить, как это работает:
mfdate
принимает 2 аргумента:
"%[%s]"
и:
"%%Z %%{%%Y %%b %%e %%H:%%M} %%?X?(%%X)& ? %%-22.22F %%.100s %%> %%5c"
Первый аргумент только время сообщения
, как описано в
Документация index_format
в .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
В этом случае fmt
заменяется на %s
, поскольку %s
означает
количество секунд с начала Эпохи
, как описано в man strftime
. То
Первый аргумент используется для вычисления того, сколько лет сообщению и что
ярлык: старый
, недавний
или сегодня
должен быть.
Второй аргумент — оставшаяся часть index_format
Переменная. Он используется в mfdate
только для печати, но дополнительный %
используется
добавлено в конец printf
, потому что, как сказано в руководстве по Mutt:
Возвращаемая строка будет использоваться для отображения. Если возвращенная строка оканчивается на %, он будет пропущен через средство форматирования во второй раз.
Каждый %
удваивается здесь, потому что мы хотим передать литерал %
в
второе форматирование сделал mutt
.