Você pode usar um comando wrapper que:
- renomeia o arquivo
- executa o visualizador em segundo plano
- limpa quando o espectador retorna em vez de deixá-
muttlo.
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 colocar algo como:
image/*; muttv eog %s;
Onde muttvestá esse script acima.
O exemplo acima não assume como os nomes dos arquivos aparecem na lista de argumentos ou que caractere eles contêm ... Por isso, perguntamos primeiro o muttque tmpdiré (então usamos isso para determinar quais são os arquivos vista ).
Na maioria dos casos, isso seria um exagero e, como aponta Gilles, pode não funcionar se tmpdir for especificado como relativo à sua pasta da 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 mvpor cpse você não quiser tocar no arquivo original fornecido por mutt.