Si está utilizando la versión de "desarrollo" de mutt (v1.5 +), y debería hacerlo, existe la posibilidad de utilizar un filtro externo como se describe en el manual .
Primero necesita un script que pueda generar diferentes cosas según la antigüedad de un mensaje. Aquí hay un ejemplo 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))
Guarda esto como en mutt-fmt-date
algún lugar de tu RUTA.
Aquí hay dos cosas importantes:
- La cadena de formato debe contener una ocurrencia de la
{}
cual se reemplaza con el valor de retorno de age_fmt()
Python.
- La cadena de formato tiene que terminar con un
%
para que Mutt la interprete.
Entonces puedes usarlo en tu .muttrc
como sigue:
set index_format="mutt-fmt-date %[%s] |"
Mutt entonces
- interpretar de
%[%s]
acuerdo con las reglas para cadenas de formato.
- llame
mutt-fmt-date
con el resultado de 1. como argumento (debido |
al final).
- interpreta de nuevo lo que obtiene del script como cadena de formato (debido
%
al final).
Advertencia : el script se ejecutará para cada mensaje que se va a mostrar. El retraso resultante puede ser bastante notable cuando se desplaza por un buzón.
Aquí hay una versión en C que funciona de manera algo adecuada:
#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;
}
Esto va junto con la línea muttrc:
set index_format='mfdate "%[%d.%m.%y]" "%8[%e. %b]" "%8[%H:%m]" "%Z %%s %-20.20L %?y?[%-5.5y]& ? %?M?+& ?%s%%" "%[%s]" |'
Desafortunadamente, eso no parece ser posible con las versiones actuales de Mutt.
$index_format
admite un conjunto específico de especificadores de formato, que se basan en varios metadatos de mensajes. Se describe en el manual de Mutt (o aquí está la documentación de la versión "estable" para el mismo ), y como puede ver en la tabla, solo hay unos pocos especificadores de formato que son condicionales. Esos son%M
,%y
y%Y
; % M es el número de mensajes ocultos si el hilo está colapsado, y% y y% Y son encabezados de etiqueta X si están presentes.El formato real de la fecha y hora del mensaje se realiza mediante
strftime(3)
, que no admite el formato condicional en absoluto.Que podría ser posible hacer un feo solución reescribiendo continuamente los archivos de mensajes
Date:
cabeceras, pero no me gustaría hacer eso por lo menos. Sin embargo, es la posibilidad menos mala que se me ocurre.La única solución real que se me ocurre sería implementar dicho soporte en Mutt (que casi seguro es cómo lo hace Thunderbird) o escribir un reemplazo
strftime
que admita el formato condicional e inyectarlo usando LD_PRELOAD o un mecanismo similar. Sin embargo, esto último afectará toda la visualización de fecha y hora en Mutt que pase por el tiempo de ejecución, no solo en relación con el índice de mensajes.fuente
Por alguna razón, las versiones más recientes de mutt (1.7 mostraron ese problema) prefieren la cadena de fecha con los caracteres '14' y '32', que evitan que atoi convierta la cadena a int. Cambiar la línea a
Posiblemente una solución estúpida, pero funciona para mí.
fuente
Se editó un poco la versión de @Marcus 'c (aunque todavía no hay solución para
%
el tema):Este formatea las fechas de la siguiente manera (todos los horarios están en formato de 24 horas):
02:04
para el correo de hoyydy 02:04
para el correo de ayerThu 02:04
por los últimos 7 días de correo27.Mar
para el correo del año actual13.12.16
para el correo de años anterioresEl formato de índice completo en este ejemplo es
#no [flags] #no_of_attachments date sender subject msg_size
fuente
Hizo algunas modificaciones, pero no resolvió el problema "% en el sujeto"
fuente
Esta
index_format
variablejunto con esta modificación
mfdate.c
presentada en esta respuesta por el usuario hop :funciona correctamente para mí
mutt 1.6.1
y, como puede ver, no hay problemas con el%
inicio de sesión en el tema, si de eso se trataba el problema real:Esta es la versión inicial "simplemente funciona" porque después de analizar más de cerca su pregunta original , no estoy seguro de si esto es lo que desea. Sin embargo, si esto es lo que quieres, házmelo saber y pensaremos cómo mejorarlo.
EDITAR :
También puede funcionar con su preferido
index_format
:mfdate.c:
EDITAR :
Déjame explicarte cómo funciona:
El
mfdate
toma 2 argumentos:y:
El primer argumento es solo
time of the message
, como se describe en laindex_format
documentación en.muttrc
:En este caso
fmt
se reemplaza con%s
, porque como%s
significaThe number of seconds since the Epoch
como se explica enman strftime
. El primer argumento se utiliza para calcular la edad que el mensaje es y lo etiqueta:old
,recent
otoday
que debería tener.El segundo argumento es la parte restante de la
index_format
variable. Se usamfdate
solo para imprimir, pero%
se agrega un extra al finalprintf
porque, como dice en el manual de mutt :Cada
%
se duplica aquí porque queremos pasar un literal%
al segundo formateo realizado pormutt
.fuente