Jeśli używasz „rozwojowej” wersji mutt (v1.5 +) - i absolutnie powinieneś - istnieje możliwość użycia zewnętrznego filtra, jak opisano w instrukcji .
Najpierw potrzebujesz skryptu, który może wypisywać różne rzeczy w zależności od wieku wiadomości. Oto przykład w Pythonie:
#!/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))
Zapisz to mutt-fmt-date
gdzieś na swojej ŚCIEŻCE.
Ważne są tutaj dwie rzeczy:
- Łańcuch formatu musi zawierać jedno wystąpienie,
{}
które zostanie zastąpione wartością zwracaną age_fmt()
przez Python.
- Ciąg formatu musi kończyć się znakiem
%
, aby Mutt go zinterpretował.
Następnie możesz użyć go w .muttrc
następujący sposób:
set index_format="mutt-fmt-date %[%s] |"
Mutt to zrobi
- interpretować
%[%s]
zgodnie z regułami dla ciągów formatujących.
- wywołanie
mutt-fmt-date
z wynikiem 1. jako argumentem (ze względu |
na koniec).
- interpretuje to, co otrzymuje ze skryptu, ponownie jako ciąg formatujący (ze względu
%
na koniec).
Uwaga : skrypt zostanie wykonany dla każdej wiadomości, która ma być wyświetlana. Wynikające z tego opóźnienie może być dość zauważalne podczas przewijania skrzynki pocztowej.
Oto wersja w C, która działa nieco odpowiednio:
#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;
}
Jest to zgodne z linią muttrc:
set index_format='mfdate "%[%d.%m.%y]" "%8[%e. %b]" "%8[%H:%m]" "%Z %%s %-20.20L %?y?[%-5.5y]& ? %?M?+& ?%s%%" "%[%s]" |'
Niestety nie wydaje się to możliwe w przypadku obecnych wersji Mutt.
$index_format
obsługuje określony zestaw specyfikatorów formatu, czerpiąc z różnych metadanych wiadomości. Jest to opisane w podręczniku Mutt (lub tutaj jest dokumentacja „stabilnej” wersji tego samego ), a jak widać z tabeli, istnieje tylko kilka specyfikatorów formatu, które są warunkowe. Są to%M
,%y
i%Y
; % M to liczba ukrytych wiadomości, jeśli wątek jest zwinięty, a% y i% Y są nagłówkami X-Label, jeśli są obecne.Rzeczywiste formatowanie daty i godziny wiadomości jest wykonywane przez
strftime(3)
, co wcale nie obsługuje formatowania warunkowego.To może być możliwe, aby zrobić brzydki obejścia poprzez ciągłe przepisywanie pliki komunikat
Date:
nagłówków, ale nie chcę tego robić przynajmniej. Jest to jednak najmniej zła możliwość, o której mogę myśleć.Jedyne realne rozwiązanie, jakie mogę wymyślić, to albo zaimplementować taką obsługę w Mutt (co prawie na pewno robi to Thunderbird), albo napisać zamiennik,
strftime
który obsługuje formatowanie warunkowe i wstrzyknąć to za pomocą LD_PRELOAD lub podobnego mechanizmu. To ostatnie wpłynie jednak na wyświetlanie wszystkich dat i godzin w Mutt, które przechodzi przez strftime, nie tylko odnosząc się do indeksu komunikatów.źródło
Z jakiegoś powodu nowsze wersje mutt (1.7 pokazały ten problem) poprzedzają łańcuch daty znakami „14” i „32”, które powstrzymują atoi przed konwersją łańcucha na wartość int. Zmiana linii na
Być może to głupie rozwiązanie, ale dla mnie działa.
źródło
Zmieniono nieco wersję @Marcus 'c (wciąż nie ma rozwiązania
%
w temacie tematu):Formatuje daty w następujący sposób (wszystkie czasy są w formacie 24-godzinnym):
02:04
dla dzisiejszej pocztyydy 02:04
na wczorajszą pocztęThu 02:04
za ostatnie 7 dni poczta27.Mar
na bieżący rok13.12.16
za pocztę z poprzednich latPełny format indeksu w tym przykładzie to
#no [flags] #no_of_attachments date sender subject msg_size
źródło
Wprowadzono pewne zmiany, ale nie rozwiązano problemu „% w temacie”
źródło
Ta
index_format
zmiennarazem z tym zmodyfikowanym
mfdate.c
prezentowane w tej odpowiedzi przez użytkownika hop :działa dla mnie poprawnie
mutt 1.6.1
i jak widzisz, nie ma problemów z%
logowaniem się w temacie, jeśli o to właśnie chodziło:Jest to początkowa „tylko działająca” wersja, ponieważ po bliższym przyjrzeniu się pierwotnemu pytaniu nie jestem pewien, czy tego właśnie chcesz. Jednakże, jeśli to jest to, co chcesz dać mi znać i będziemy myśleć, jak zrobić to lepiej.
EDYCJA :
Może również działać z twoimi preferowanymi
index_format
:mfdate.c:
EDYCJA :
Pozwól mi wyjaśnić, jak to działa:
Przyjmuje
mfdate
2 argumenty:i:
Pierwszy argument jest tylko
time of the message
opisany windex_format
dokumentacji w.muttrc
:W tym przypadku
fmt
jest zastąpiony przez%s
, ponieważ jako%s
środkiThe number of seconds since the Epoch
wyjaśnione wman strftime
. Pierwszy argument jest używany do obliczenia jak stary wiadomość jest i co etykietę:old
,recent
lubtoday
powinien on mieć.Drugi argument to pozostała część
index_format
zmiennej. Jest używanymfdate
tylko do drukowania, ale%
na końcu dodaje się dodatkowy,printf
ponieważ, jak mówi w podręczniku mutt :Wszystko
%
jest tutaj podwojone, ponieważ chcemy przekazać literał%
do drugiego formatowania wykonanego przezmutt
.źródło