Esta index_format
variable
set index_format='mfdate "%[%s]" "%4C %Z %[!%b %d %Y] %-17.17F (%3l) %s" |'
junto con esta modificación mfdate.c
presentada en esta respuesta por el usuario 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;
}
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
:
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;
}
EDITAR :
Déjame explicarte cómo funciona:
El mfdate
toma 2 argumentos:
"%[%s]"
y:
"%%Z %%{%%Y %%b %%e %%H:%%M} %%?X?(%%X)& ? %%-22.22F %%.100s %%> %%5c"
El primer argumento es solo time of the message
, como se describe en la
index_format
documentación en .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
En este caso fmt
se reemplaza con %s
, porque como %s
significa The
number of seconds since the Epoch
como se explica en man strftime
. El primer argumento se utiliza para calcular la edad que el mensaje es y lo etiqueta: old
, recent
o today
que debería tener.
El segundo argumento es la parte restante de la index_format
variable. Se usa mfdate
solo para imprimir, pero %
se agrega un extra al final printf
porque, como dice en el manual de mutt :
La cadena devuelta se utilizará para mostrar. Si la cadena devuelta termina en%, se pasará por el formateador por segunda vez.
Cada %
se duplica aquí porque queremos pasar un literal %
al segundo formateo realizado por mutt
.