Date
mutt:“index_format”中的條件日期格式
我
index_format
在 mutt 中設置了以下值:"%Z %{%Y %b %e %H:%M} %?X?(%X)& ? %-22.22F %.100s %> %5c "
它將日期顯示為
2013 Dec 5
我想知道是否可以根據電子郵件的年齡有不同的日期格式。我的意思是:
for less than 7 days: today, yesterday, tuesday, monday this year: Dec 5 older than this year: 2013 Dec 5
我想我已經在 Thunderbird 中看到了這個功能。要是能在 mutt 裡就好了
如果您正在使用 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
在 PATH 中的某個位置。這裡有兩件事很重要:
- 格式字元串必須包含一個由 Python
{}
替換為返回值的出現。age_fmt()
- 格式字元串必須以 a 結尾,
%
這樣 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]" |'