Date

mutt:“index_format”中的條件日期格式

  • May 7, 2017

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] |"

穆特隨後將

  1. %[%s]根據格式字元串的規則進行解釋。
  2. mutt-fmt-date以 1. 的結果作為參數呼叫(因為最後|是 )。
  3. 再次將它從腳本中返回的內容解釋為格式字元串(因為%在結尾處)。

警告:將為要顯示的每條消息執行腳本。滾動瀏覽郵箱時,由此產生的延遲可能非常明顯。

這是 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]" |'

引用自:https://unix.stackexchange.com/questions/103936