Эта index_format
переменная
set index_format='mfdate "%[%s]" "%4C %Z %[!%b %d %Y] %-17.17F (%3l) %s" |'
вместе с этим изменением, mfdate.c
представленным в этом ответе пользователем 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;
}
у меня работает правильно, 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 <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;
}
РЕДАКТИРОВАТЬ :
Позвольте мне объяснить, как это работает:
The mfdate
принимает 2 аргумента:
"%[%s]"
и:
"%%Z %%{%%Y %%b %%e %%H:%%M} %%?X?(%%X)& ? %%-22.22F %%.100s %%> %%5c"
Первый аргумент только time of the message
, как описано в
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
средство , The
number of seconds since the Epoch
как объяснено man strftime
. Первый аргумент используется для вычисления как старые сообщения и какие меток: old
, recent
или today
он должен иметь.
Второй аргумент - это оставшаяся часть index_format
переменной. Он используется mfdate
только для печати, но дополнительный %
добавляется в конце, printf
потому что, как сказано в руководстве Mutt :
Возвращенная строка будет использоваться для отображения. Если возвращаемая строка оканчивается на%, она будет передана через средство форматирования во второй раз.
Здесь каждый %
удваивается, потому что мы хотим передать литерал %
во второе форматирование, выполненное с помощью mutt
.