Como dizer ao mutt para não esperar que um programa de anexos retorne?

10

Eu uso esta linha para imagens no meu mailcap :

image/*; eog %s &;

, mas o mutt exclui imediatamente o arquivo temporário e o eog não pode carregá-lo.
Quando eu removo o & mutt, espera que o eog seja fechado até que escape da linha de comando.

    
por Profpatsch 19.02.2013 / 21:49

2 respostas

7

Veja o que eu uso:

.mailcap:

application/*; mkdir -p /tmp/mutt \; cp %s /tmp/mutt \; xdg-open /tmp/mutt/$(basename %s) &

.mutt / muttrc:

folder-hook . 'rm -f /tmp/mutt/*'

Sempre que uma tentativa de abrir um anexo é feita, ela é copiada em um diretório temporário dedicado e a cópia é aberta.
Toda vez que você inicia mutt , todas as cópias remanescentes são limpas.

Você pode ou não precisar do & no final, dependendo do comando usado. (Algumas versões de xdg-open estão bloqueando, enquanto outras não.)

Escusado será dizer que você pode usar isso com qualquer comando. xdg-open é apenas um manipulador único e conveniente.

    
por 17.01.2014 / 09:37
3

Você pode usar um comando wrapper que:

  1. renomeia o arquivo
  2. executa o visualizador em segundo plano
  3. limpa quando o visualizador retorna, em vez de deixar mutt fazer isso.

Algo como:

#! /bin/sh -

TMPDIR=$(
  mutt -D 2> /dev/null |
    awk -F\" '
      $1 == "tmpdir=" {
        gsub("~", ENVIRON["HOME"], $2)
        print $2
        exit
      }'
)
[ -n "$TMPDIR" ] || exit
export TMPDIR

nargs=$#
nfiles=0
for i do
  case $i in
    ("$TMPDIR"/?*)
      new_file=$(mktemp -ut "XXXXX${i##*/}") &&
        mv -- "$i" "$new_file" &&
        nfiles=$(($nfiles + 1)) &&
        set -- "$new_file" "$@" "$new_file" &&
        continue
  esac
  set -- "$@" "$i"
done

run_command() (
  shift "$(($nargs + $nfiles))"
  exec "$@"
)

(
  run_command "$@"
  while [ "$nfiles" -gt 0 ]; do
    set -- "$@" "$1"
    shift
    nfiles=$(($nfiles - 1))
  done
  shift "$((2*$nargs))"
  rm -f -- "$@"
) &

E coloque algo como:

image/*; muttv eog %s;

Onde muttv é o script acima.

O acima não faz nenhuma suposição sobre onde o (s) nome (s) do (s) arquivo (s) aparecem na lista de argumentos ou qual caractere eles contêm ... É por isso que perguntamos primeiro ao mutt o que é tmpdir use isso para determinar quais são os arquivos para ver ).

Na maioria dos casos, seria um exagero e, como Gilles aponta, pode não funcionar se o tmpdir for especificado como relativo à sua pasta de caixa de correio.

Um mais simples seria:

#! /bin/sh -
nargs=$#
eval "file=\${$nargs}"
newfile=$(dirname -- "$file")/new-$(basename -- "$file")
while [ "$nargs" -gt 1 ]; do
  set -- "$@" "$1"
  shift
  nargs=$(($nargs - 1))
done
shift
mv -- "$file" "$newfile" || exit
(
  "$@" "$newfile"
  rm -f -- "$newfile"
) &

Substitua mv por cp se você não quiser tocar no arquivo original fornecido por mutt .

    
por 19.02.2013 / 23:36