Ця 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;
}
Редагувати :
Дозвольте пояснити, як це працює:
Триває mfdate
аргументи:
"%[%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
.