Muttのindex_format
に次の値を設定しています:
"%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 +)を使用していて、絶対に使用する必要がある場合は、 manual で説明されているように外部フィルターを使用する可能性があります。
まず、メッセージの古さに応じてさまざまなものを出力できるスクリプトが必要です。 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のどこかに保存します。
ここでは2つのことが重要です。
age_fmt()
の戻り値で置き換えられる_{}
_の1つの出現が含まれている必要があります。%
_で終わる必要があります。その後、次のように_.muttrc
_で使用できます。
_set index_format="mutt-fmt-date %[%s] |"
_
Muttは
%[%s]
_を解釈します。mutt-fmt-date
_を呼び出します(末尾に_|
_があるため)。%
_のため)。警告:スクリプトは、表示されるメッセージごとに実行されます。結果として生じる遅延は、メールボックスをスクロールするときにかなり顕著になる可能性があります。
これは、ある程度適切に機能する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は非表示メッセージの数ifスレッドは折りたたまれており、%yと%YはX-Labelヘッダーifが存在します。
メッセージの日付と時刻の実際のフォーマットは strftime(3)
で行われ、条件付きフォーマットはまったくサポートされていません。
mightメッセージファイルの_Date:
_ヘッダーを継続的に書き換えることでglyの回避策を実行できますが、少なくともそれはしたくありません。しかし、それは私が考えることができる最も悪い可能性です。
私が考えることができる唯一の本当の解決策は、Muttでそのようなサポートを実装する(これはほぼ確実にThunderbirdが行う方法です)か、条件付きフォーマットをサポートする置換strftime
を記述し、LD_PRELOADまたは類似のものを使用して注入することです機構。ただし、後者は、メッセージインデックスだけでなく、strftimeを通過するMuttのall日時表示にも影響します。
何らかの理由で、muttの新しいバージョン(1.7はその問題を示しました)は、日付文字列の前に文字「14」と「32」を付けます。これにより、atoiは文字列をintに変換できなくなります。行を
message_time = atoi(2+argv[7]);
おそらく愚かな解決策ですが、私にとってはうまくいきます。
@Marcusのcバージョンを少し編集しました(ただし、件名の%
に対する解決策はまだありません)。
// -*- coding:utf-8-unix; mode:c; -*-
/*
Sets mutt index date based on mail age.
build:
gcc mutt-index-date-formatter.c -o mutt-index-format
use this line in .muttrc:
set index_format = 'mutt-index-format "%9[%d.%m.%y]" "%9[%e.%b]" "%8[%a %H:%m]" "%[%H:%m]" "%3C [%Z] %?X?%2X& -? %%s %-20.20L %?M?+%-2M& ? %s %> [%4c]asladfg" "%[%s]" |'*/
// ////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define DAY (time_t)86400
#define WEEK (time_t)604800
#define YEAR (time_t)31556926
int main(int argc, const char *argv[]) {
time_t current_time;
time_t message_time;
struct tm *ltime;
unsigned int todays_seconds=0;
unsigned int seconds_this_morning=0;
const char *last_year, *this_year, *last_months, *last_week, *today;
const char *format;
char *concat_str;
current_time = time(NULL);
ltime = localtime(¤t_time);
todays_seconds = ltime->tm_hour*3600 + ltime->tm_min*60 + ltime->tm_sec;
seconds_this_morning = current_time - todays_seconds; // unix time @ 00:00
if (argc != 7) {
printf("Usage: %s last_year this_year last_week today format timestamp\n", argv[0]);
return 2;
}
last_year = argv[1];
this_year = argv[2];
last_week = argv[3];
today = argv[4];
format = argv[5];
message_time = atoi(2 + argv[6]);
if (message_time >= seconds_this_morning) {
asprintf(&concat_str, " %s", today);
printf(format, concat_str);
} else if (message_time >= seconds_this_morning - DAY) {
asprintf(&concat_str, "ydy %s", today);
printf(format, concat_str);
} else if (message_time > seconds_this_morning - WEEK) {
printf(format, last_week);
} else if (message_time/YEAR < current_time/YEAR) {
printf(format, last_year);
} else {
printf(format, this_year);
}
return 0;
}
これは日付を次のようにフォーマットします(すべての時間は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
です
いくつかの変更を加えましたが、「件名の%」の問題は解決しませんでした
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define DAY (time_t)86400
#define WEEK (time_t)604800
#define MONTH (time_t)2678400
#define YEAR (time_t)31556926
/*I use this line in .muttrc:
* set index_format = '/home/marcus/.mutt/mfdate "%9[%d.%m.%y]" "%9[%e.%b]" " [%6[%e.%b]]" "%8[%a %H:%m]" " %[%H:%m]" "%Z %%s %?X?%2X& ? %-20.20L %?M?+%-2M& ? %.86s %> [%4c]asladfg" "%[%s]" |'*/
int main(int argc, const char *argv[]) {
time_t current_time;
time_t message_time;
struct tm *ltime;
unsigned int todays_seconds=0;
unsigned int seconds_this_morning=0;
const char *last_year, *this_year, *last_months, *last_week, *today;
const char *format;
current_time = time(NULL);
ltime = localtime(¤t_time);
todays_seconds = ltime->tm_hour*3600 + ltime->tm_min*60 + ltime->tm_sec;
seconds_this_morning = current_time - todays_seconds;
if (argc!=8) {
printf("Usage: %s last_year this_year today format timestamp\n", argv[0]);
return 2;
}
last_year = argv[1];
this_year = argv[2];
last_months = argv[3];
last_week = argv[4];
today = argv[5];
format = argv[6];
message_time = atoi(argv[7]);
/*
*if ((message_time+YEAR) < current_time) {
* printf(format, last_year);
*} else if ((message_time+MONTH) < current_time) {
* printf(format, this_year);
*} else if ((message_time+WEEK) < current_time) {
* printf(format, last_months);
*} else if ((message_time+DAY) < current_time) {
* printf(format, last_week);
*} else {
* printf(format, today);
*}
*/
if ((message_time/YEAR) < (current_time/YEAR)) {
printf(format, last_year);
} else if ((message_time/MONTH) < (current_time/MONTH)) {
printf(format, this_year);
} else if ((message_time + WEEK) < current_time) {
/*} else if ((message_time/DAY) < (current_time/DAY)) {*/
printf(format, last_months);
/*
*} else if ((message_time+DAY) < current_time) {
* printf(format, last_week);
*/
} else if ((message_time ) < seconds_this_morning) {
printf(format, last_week);
} else {
printf(format, today);
}
return 0;
}
このindex_format
変数
set index_format='mfdate "%[%s]" "%4C %Z %[!%b %d %Y] %-17.17F (%3l) %s" |'
この変更されたmfdate.c
とともに、 this answer by user 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
は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
この場合、%s
は%s
で説明されているようにThe number of seconds since the Epoch
を意味するため、fmt
はman strftime
に置き換えられます。最初の引数は、メッセージの古さおよびラベルを計算するために使用されます:old
、recent
、またはtoday
が必要です。
2番目の引数は、index_format
変数の残りの部分です。これは、印刷のためだけにmfdate
で使用されますが、 mutt manual に記載されているように、printf
の最後に余分な%
が追加されます。
返された文字列は表示に使用されます。返された文字列が%で終わる場合は、もう一度フォーマッタを通過します。
mutt
によって行われる2番目のフォーマットにリテラル%
を渡したいので、すべての%
はここで2倍になります。