Jika Anda menggunakan versi "development" dari mutt (v1.5 +) - dan Anda benar-benar harus - ada kemungkinan untuk menggunakan filter eksternal seperti yang dijelaskan dalam manual .
Pertama, Anda memerlukan skrip yang dapat menampilkan berbagai hal sesuai dengan usia pesan. Berikut ini adalah contoh dalam 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))
Simpan ini sebagai mutt-fmt-date
suatu tempat di PATH Anda.
Dua hal penting di sini:
- String format harus mengandung satu kejadian
{}
yang diganti dengan nilai pengembalian age_fmt()
oleh Python.
- String format harus diakhiri dengan
%
sehingga Mutt akan menafsirkannya.
Maka Anda dapat menggunakannya di Anda .muttrc
sebagai berikut:
set index_format="mutt-fmt-date %[%s] |"
Mutt akan melakukannya
- menafsirkan
%[%s]
sesuai dengan aturan untuk format string.
- panggilan
mutt-fmt-date
dengan hasil 1. sebagai argumen (karena |
di bagian akhir).
- menafsirkan apa yang didapatnya dari skrip sebagai format string lagi (karena
%
di bagian akhir).
Peringatan : skrip akan dieksekusi untuk setiap pesan yang akan ditampilkan. Penundaan yang dihasilkan bisa sangat terlihat ketika menggulir kotak surat.
Berikut adalah versi dalam C yang berkinerja cukup memadai:
#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;
}
Ini sejalan dengan baris muttrc:
set index_format='mfdate "%[%d.%m.%y]" "%8[%e. %b]" "%8[%H:%m]" "%Z %%s %-20.20L %?y?[%-5.5y]& ? %?M?+& ?%s%%" "%[%s]" |'
Sayangnya, itu tampaknya tidak mungkin dilakukan dengan versi Mutt saat ini.
$index_format
mendukung satu set spesifik penentu format, menggambar dari berbagai metadata pesan. Ini dijelaskan dalam manual Mutt (atau di sini adalah dokumentasi versi "stable" untuk hal yang sama ), dan seperti yang Anda lihat dari tabel, hanya ada beberapa penentu format yang bersyarat. Yaitu%M
,%y
dan%Y
; % M adalah jumlah pesan tersembunyi jika utasnya diciutkan, dan% y dan% Y adalah header X-Label jika ada.Pemformatan aktual dari tanggal dan waktu pesan dilakukan oleh
strftime(3)
, yang sama sekali tidak mendukung pemformatan bersyarat.Ini mungkin menjadi mungkin untuk melakukan jelek solusi dengan terus menulis ulang file pesan
Date:
header, tapi saya tidak ingin melakukan itu setidaknya. Namun, itu adalah kemungkinan terburuk yang bisa saya pikirkan.Satu-satunya solusi nyata yang dapat saya pikirkan adalah mengimplementasikan dukungan semacam itu di Mutt (yang hampir pasti adalah bagaimana Thunderbird melakukannya), atau menulis pengganti
strftime
yang mendukung pemformatan bersyarat dan menyuntikkan yang menggunakan LD_PRELOAD atau mekanisme serupa. Yang terakhir, bagaimanapun, akan memengaruhi semua tampilan tanggal dan waktu dalam Mutt yang melewati strftime, tidak hanya terkait dengan indeks pesan.sumber
Untuk beberapa alasan, versi mutt yang lebih baru (1,7 menunjukkan masalah itu) awali string tanggal dengan karakter '14' dan '32', yang mencegah atoi dari mengonversi string ke int. Mengubah jalur ke
Mungkin solusi yang bodoh, tetapi itu berhasil untuk saya.
sumber
Versi c @Marcus yang sudah diedit sedikit (masih belum ada solusi untuk
%
masalah pokoknya ):Format ini tanggal sebagai berikut (sepanjang waktu dalam format 24 jam):
02:04
untuk surat hari iniydy 02:04
untuk surat kemarinThu 02:04
untuk email 7 hari terakhir27.Mar
untuk surat tahun ini13.12.16
untuk surat tahun sebelumnyaFormat indeks lengkap dalam contoh ini adalah
#no [flags] #no_of_attachments date sender subject msg_size
sumber
Membuat beberapa modifikasi, tetapi tidak menyelesaikan masalah "% dalam subjek"
sumber
index_format
Variabel inibersama-sama dengan ini diubah
mfdate.c
disajikan dalam jawaban ini oleh pengguna hop :berfungsi dengan benar untuk saya
mutt 1.6.1
dan seperti yang Anda lihat tidak ada masalah dengan%
masuknya subjek, jika ini yang menjadi masalah sebenarnya:Ini adalah versi "hanya berfungsi" awal karena setelah melihat lebih dekat pertanyaan awal Anda , saya tidak yakin apakah ini yang Anda inginkan. Namun, jika ini adalah apa yang Anda inginkan beritahu saya dan kami akan berpikir bagaimana membuatnya lebih baik.
EDIT :
Ini juga dapat bekerja dengan pilihan Anda
index_format
:mfdate.c:
EDIT :
Biarkan saya jelaskan cara kerjanya:
The
mfdate
mengambil 2 argumen:dan:
Argumen pertama hanya
time of the message
, seperti yang dijelaskan dalamindex_format
dokumentasi di.muttrc
:Dalam hal ini
fmt
diganti dengan%s
, karena sebagai%s
saranaThe number of seconds since the Epoch
seperti yang dijelaskan dalamman strftime
. Argumen pertama digunakan untuk menghitung berapa lama pesan dan apa label:old
,recent
atautoday
seharusnya.Argumen kedua adalah bagian yang tersisa dari
index_format
variabel. Ini digunakanmfdate
hanya untuk mencetak tetapi tambahan%
ditambahkan pada akhirprintf
karena seperti yang tertulis dalam manual mutt :Setiap
%
digandakan di sini karena kami ingin meneruskan literal%
ke pemformatan kedua yang dilakukan olehmutt
.sumber