Si vous utilisez la version "développement" de mutt (v1.5 +) - et vous devez absolument - il y a la possibilité d'utiliser un filtre externe comme décrit dans le manuel .
Vous avez d'abord besoin d'un script qui peut produire différentes choses en fonction de l'âge d'un message. Voici un exemple en 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))
Enregistrez-le mutt-fmt-date
quelque part sur votre CHEMIN.
Deux choses sont importantes ici:
- La chaîne de format doit contenir une occurrence
{}
qui est remplacée par la valeur de retour de age_fmt()
par Python.
- La chaîne de format doit se terminer par un
%
afin que Mutt l'interprète.
Ensuite, vous pouvez l'utiliser dans votre .muttrc
comme suit:
set index_format="mutt-fmt-date %[%s] |"
Mutt va alors
- interpréter
%[%s]
selon les règles des chaînes de format.
- appeler
mutt-fmt-date
avec le résultat de 1. comme argument (à cause de |
la fin).
- interpréter à nouveau ce qu'il récupère du script en tant que chaîne de formatage (à cause de
%
la fin).
Attention : le script sera exécuté pour chaque message qui va être affiché. Le retard résultant peut être tout à fait notable lors du défilement d'une boîte aux lettres.
Voici une version en C qui fonctionne assez bien:
#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;
}
Cela va de pair avec la ligne muttrc:
set index_format='mfdate "%[%d.%m.%y]" "%8[%e. %b]" "%8[%H:%m]" "%Z %%s %-20.20L %?y?[%-5.5y]& ? %?M?+& ?%s%%" "%[%s]" |'
Malheureusement, cela ne semble pas possible avec les versions actuelles de Mutt.
$index_format
prend en charge un ensemble spécifique de spécificateurs de format, à partir de diverses métadonnées de message. Il est décrit dans le manuel de Mutt (ou voici la documentation de la version "stable" pour le même ), et comme vous pouvez le voir dans le tableau, il n'y a que quelques spécificateurs de format conditionnels. Ce sont%M
,%y
et%Y
; % M est le nombre de messages masqués si le thread est réduit, et% y et% Y sont des en-têtes X-Label s'ils sont présents.La mise en forme réelle de la date et de l'heure du message est effectuée par
strftime(3)
, qui ne prend pas du tout en charge la mise en forme conditionnelle.Il pourrait être possible de faire une solution de contournement laide en réécrivant continuellement les en-
Date:
têtes des fichiers de messages , mais je ne voudrais pas faire cela au moins. Cependant, c'est la moins mauvaise possibilité à laquelle je puisse penser.La seule vraie solution à laquelle je peux penser serait d'implémenter un tel support dans Mutt (qui est presque certainement la façon dont Thunderbird le fait), ou d'écrire un remplacement
strftime
qui prend en charge le formatage conditionnel et d'injecter cela en utilisant LD_PRELOAD ou un mécanisme similaire. Ce dernier, cependant, affectera tous les affichages de date et d'heure dans Mutt qui passent par strftime, non seulement concernant l'index des messages.la source
Pour une raison quelconque, les versions plus récentes de mutt (1.7 ont montré ce problème) préfixent la chaîne de date avec les caractères '14' et '32', ce qui empêche atoi de convertir la chaîne en entier. Changer la ligne en
Peut-être une solution stupide, mais cela fonctionne pour moi.
la source
Modification de la version c de @Marcus un peu (toujours pas de solution au problème
%
dans le sujet):Ce format date comme suit (toutes les heures sont au format 24h):
02:04
pour le courrier d'aujourd'huiydy 02:04
pour le courrier d'hierThu 02:04
pour les 7 derniers jours de courrier27.Mar
pour le courrier de l'année en cours13.12.16
pour le courrier des années précédentesLe format d'index complet dans cet exemple est
#no [flags] #no_of_attachments date sender subject msg_size
la source
Apporté quelques modifications, mais n'a pas résolu le problème "% dans le sujet"
la source
Cette
index_format
variableavec cette modification
mfdate.c
présentée dans cette réponse par l'utilisateur hop :fonctionne correctement pour moi
mutt 1.6.1
et comme vous le voyez, il n'y a pas de problème de%
connexion dans le sujet, si c'est le vrai problème:Il s'agit de la version initiale "qui fonctionne" car après avoir examiné de plus près votre question d' origine, je ne sais pas si c'est ce que vous voulez. Cependant, si c'est ce que vous voulez, faites le moi savoir et nous réfléchirons à la façon de l'améliorer.
MODIFIER :
Il peut également fonctionner avec votre préféré
index_format
:mfdate.c:
MODIFIER :
Permettez-moi d'expliquer comment cela fonctionne:
Le
mfdate
prend 2 arguments:et:
Le premier argument est uniquement
time of the message
, comme décrit dans laindex_format
documentation dans.muttrc
:Dans ce cas,
fmt
est remplacé par%s
, car comme%s
moyenThe number of seconds since the Epoch
comme expliqué dansman strftime
. Le premier argument est utilisé pour calculer l'âge du message est et ce que l' étiquette:old
,recent
outoday
il devrait avoir.Le deuxième argument est la partie restante de la
index_format
variable. Il est utilisémfdate
uniquement pour l'impression, mais un supplément%
est ajouté à la finprintf
car, comme il est indiqué dans le manuel mutt :Tout
%
est doublé ici parce que nous voulons passer un littéral%
au deuxième formatage effectué parmutt
.la source