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á-
mutt
lo.
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 muttv
está 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 mutt
que 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 mv
por cp
se você não quiser tocar no arquivo original fornecido por mutt
.