Если вы используете "Mutt" версию разработки (v1.5 +) - и вам это обязательно нужно - есть возможность использовать внешний фильтр, как описано в руководстве .
Сначала вам нужен скрипт, который может выводить разные вещи в зависимости от возраста сообщения. Вот пример в Python:
#!/usr/bin/env python
"""mutt format date
Prints different index_format strings for mutt according to a
messages age.
The single command line argument should be a unix timestamp
giving the message's date (%{}, etc. in Mutt).
"""
import sys
from datetime import datetime
INDEX_FORMAT = "%Z {} %?X?(%X)& ? %-22.22F %.100s %> %5c%"
def age_fmt(msg_date, now):
# use iso date for messages of the previous year and before
if msg_date.date().year < now.date().year:
return '%[%Y-%m-%d]'
# use "Month Day" for messages of this year
if msg_date.date() < now.date():
return '%10[%b %e]'
# if a message appears to come from the future
if msg_date > now:
return ' b0rken'
# use only the time for messages that arrived today
return '%10[%H:%m]'
if __name__ == '__main__':
msg_date = datetime.fromtimestamp(int(sys.argv[1]))
now = datetime.now()
print INDEX_FORMAT.format(age_fmt(msg_date, now))
Сохраните это как mutt-fmt-date
где-нибудь на вашем пути.
Здесь важны две вещи:
- Строка формата должна содержать одно вхождение,
{}
которое заменяется возвращаемым значением age_fmt()
Python.
- Строка формата должна заканчиваться символом
%
так, чтобы Mutt ее интерпретировал.
Тогда вы можете использовать его .muttrc
следующим образом:
set index_format="mutt-fmt-date %[%s] |"
Матт будет тогда
- интерпретировать в
%[%s]
соответствии с правилами для строк формата.
- вызов
mutt-fmt-date
с результатом 1. в качестве аргумента (потому что |
в конце).
- интерпретировать то, что он возвращает из скрипта, как строку формата снова (из-
%
за конца).
Предостережение : скрипт будет выполняться для каждого сообщения, которое должно быть отображено. Получающаяся задержка может быть весьма заметна при прокрутке почтового ящика.
Вот версия на 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, *recent, *today;
const char *format;
current_time = time(NULL);
if (argc!=6) {
printf("Usage: %s old recent today format timestamp\n", argv[0]);
return 2;
}
old = argv[1];
recent = argv[2];
today = argv[3];
format = argv[4];
message_time = atoi(argv[5]);
if ((message_time/YEAR) < (current_time/YEAR)) {
printf(format, old);
} else if ((message_time/DAY) < (current_time/DAY)) {
printf(format, recent);
} else {
printf(format, today);
}
return 0;
}
Это идет вместе с строкой muttrc:
set index_format='mfdate "%[%d.%m.%y]" "%8[%e. %b]" "%8[%H:%m]" "%Z %%s %-20.20L %?y?[%-5.5y]& ? %?M?+& ?%s%%" "%[%s]" |'
К сожалению, это не представляется возможным в текущих версиях Mutt.
$index_format
поддерживает определенный набор спецификаторов формата, используя различные метаданные сообщения. Он описан в руководстве Mutt (или здесь приведена документация «стабильной» версии для того же самого ), и, как вы можете видеть из таблицы, существует только несколько спецификаторов формата, которые являются условными. Те%M
,%y
и%Y
; % M - это количество скрытых сообщений, если поток свернут, а% y и% Y - это заголовки X-Label, если они есть.Фактическое форматирование даты и времени сообщения выполняется
strftime(3)
, который вообще не поддерживает условное форматирование.Можно было бы сделать уродливый обходной путь, постоянно переписывая
Date:
заголовки файлов сообщений , но я бы не хотел этого делать по крайней мере. Тем не менее, это наименее плохая возможность, о которой я могу думать.Единственное реальное решение, о котором я могу подумать, - это реализовать такую поддержку в Mutt (что почти наверняка так и делает Thunderbird) или написать замену,
strftime
которая поддерживает условное форматирование, и внедрить ее с помощью LD_PRELOAD или аналогичного механизма. Последнее, однако, повлияет на все отображение даты и времени в Mutt, которое проходит через strftime, а не только в отношении индекса сообщения.источник
По какой-то причине более новые версии mutt (1.7 показали, что проблема) префикс строки даты с символами '14' и '32', которые мешают atoi преобразовать строку в int. Изменение строки на
Возможно, глупое решение, но оно работает для меня.
источник
Немного отредактировал @Marcus 'c версию (но пока нет решения
%
этой проблемы):Даты форматируются следующим образом (все время в 24-часовом формате):
02:04
для сегодняшней почтыydy 02:04
за вчерашнюю почтуThu 02:04
за последние 7 дней27.Mar
на почту текущего года13.12.16
за почту предыдущих летПолный индексный формат в этом примере
#no [flags] #no_of_attachments date sender subject msg_size
источник
Внесены некоторые изменения, но проблема «% в теме» не решена
источник
Эта
index_format
переменнаявместе с этим изменением,
mfdate.c
представленным в этом ответе пользователем hop :у меня работает правильно,
mutt 1.6.1
и, как видите, проблем со%
знаком в теме нет, если реальная проблема была в следующем:Это первоначальная «просто рабочая» версия, потому что после более внимательного изучения исходного вопроса я не уверен, что вы этого хотите. Однако, если это является то , что вы хотите , дайте мне знать , и мы будем думать , как сделать его лучше.
РЕДАКТИРОВАТЬ :
Он также может работать с вашими предпочтениями
index_format
:mfdate.c:
РЕДАКТИРОВАТЬ :
Позвольте мне объяснить, как это работает:
The
mfdate
принимает 2 аргумента:и:
Первый аргумент только
time of the message
, как описано вindex_format
документации в.muttrc
:В этом случае
fmt
заменяется%s
, потому что , как%s
средство ,The number of seconds since the Epoch
как объясненоman strftime
. Первый аргумент используется для вычисления как старые сообщения и какие меток:old
,recent
илиtoday
он должен иметь.Второй аргумент - это оставшаяся часть
index_format
переменной. Он используетсяmfdate
только для печати, но дополнительный%
добавляется в конце,printf
потому что, как сказано в руководстве Mutt :Здесь каждый
%
удваивается, потому что мы хотим передать литерал%
во второе форматирование, выполненное с помощьюmutt
.источник