Como eu configuro o mutt para exibir o cabeçalho da data em meu fuso horário local no pager?

10

Quando vejo uma mensagem no pager, o mutt exibe a hora no cabeçalho Data no UTC, em vez do meu fuso horário local. A visualização de índice exibe a hora local corretamente. Eu encontrei esta antiga lista de discussão que descreve como obter a hora local para exibir na barra de status na parte inferior da tela, mas isso ainda não "conserta" a hora no cabeçalho Data na parte superior da tela. Existe alguma maneira de obter o pager para converter o cabeçalho de data para a hora local?

    
por Ben Williams 12.08.2011 / 20:39

7 respostas

9

A formatação no índice é controlada pela configuração index_format - é gerada pelo mutt. O cabeçalho Date não é controlado pelo mutt, é um cabeçalho incluído com a mensagem que é exibida. Se mostrar a hora UTC é porque o servidor de envio decidiu usar o UTC ao gerar o cabeçalho. A única maneira de alterá-lo é alterar a própria mensagem, seja quando você a receber ou quando você a visualizar.

Alterá-lo quando ele chega significa adicionar um filtro ao seu agente de entrega de mensagens, mas ele precisa ser sofisticado o suficiente para analisar o cabeçalho Date existente e reescrevê-lo. É quase certamente melhor apenas ter reformatado a mensagem quando você olha para ela. Você pode definir a propriedade display_filter como um arquivo executável, e ela canalizará qualquer mensagem que você abre através do executável antes de exibi-lo.

Você precisará escrever um programa ou script de shell que leia cada linha da mensagem e substitua aquela pelo cabeçalho Date, ou encontre um script existente (há um aqui que pode funcionar, embora não pareça ser realmente necessário envolver um arquivo temporário)

    
por 12.08.2011 / 21:12
5

Seguindo o conselho de Gilles, aqui está uma versão que usa um arquivo temporário e formail .

#!/bin/bash
TMPFILE=$(mktemp)

# save the message to a file
cat - >"$TMPFILE"
# extract the date header
DATE=$( formail -xDate: < "$TMPFILE" )
# convert to the current timezone (defined by TZ)
DATE=$( date -R -d "$DATE" )
# output the modified message
echo "Date: $DATE"
formail -fI Date < "$TMPFILE"
# clean up
rm -f "$TMPFILE"
    
por 15.08.2011 / 20:15
4

link

Isso sugere o uso do 'pager_format', para mostrar a data da letra no fuso horário local:

set pager_format="% 4C% Z% [!% b% e% I:% M% p]% .20n% s% * - (% P)"

    
por 07.01.2013 / 00:34
2

set display_filter="/PATH/TO/THIS/PYTHON/FILE" no seu .muttrc .

Python 3.3:

#!/usr/bin/env python3
import sys
import re
# import subprocess
from email.utils import format_datetime, parsedate_to_datetime

in_headers = True
for line in sys.stdin.readlines():
    if line == "\n": in_headers = False
    match = re.match(r'^Date: (.+)', line)

    if not in_headers or not match:
        print(line, end="")
        continue

    date_string = match.group(1)
    # use this if you do not have python 3.3+
    # converted_date = subprocess.Popen(['date','-d',date_string], stdout=subprocess.PIPE).communicate()[0].strip()
    converted_date = format_datetime(parsedate_to_datetime(date_string).astimezone(tz=None))
    print('Date:', converted_date)
    
por 14.09.2015 / 18:54
2

Solução Perl obrigatória que preserva o cabeçalho "Data" ao adicionar um cabeçalho "Local-Date" adicional para conter a versão do horário local:

#!/usr/bin/perl -n

use Date::Parse;
use POSIX;
use strict;

if (/^Date: (.*)$/) {
    my $datestr = $1;
    my $date = strftime ("%a, %d %b %Y %H:%M:%S",
                         localtime (str2time ($datestr)));
    print "Local-Date: $date\n";
}

print;
    
por 21.06.2013 / 08:46
1

Aqui está uma solução do procmail:

# extract date from mail
:0
TMPDATE=| formail -x Date

# get local date
LOCALDATE='date --rfc-2822 -d "$TMPDATE"'

# add it new header to the mail
:0 f
| formail -I "LocalDate: $LOCALDATE"

E mostre LocalDate: em muttrc:

unignore localdate
    
por 10.07.2015 / 16:33
0

Eu fiz um script de shell como descrito no final da resposta de Michael que faz o trabalho para mim:

#!/bin/bash
while IFS= read -r LINE; do
    if [[ "${LINE}" =~ ^Date:\ .* ]]; then
        DATE=${LINE#Date: }
        # convert to the current timezone (defined by TZ)
        DATE=$(date -d "${DATE}")
        printf '%s' "Date: ${DATE}"
    elif [[ -n $LINE ]]; then
      # We've reach the end of the headers, so stop parsing
      echo
      exec cat
    else
        printf '%s\n' "${LINE}"
    fi
done
    
por 15.08.2011 / 17:52