¿Cómo decirle a mutt que no espere a que regrese un programa de archivos adjuntos?

9

Yo uso esta línea para imágenes en mi mailcap:

image/*; eog %s &;

pero mutt elimina inmediatamente el archivo temporal y eog no puede cargarlo.
Cuando quito el &perro callejero espera a que se cierre eog hasta que se escape de la línea de comando.

Profpatsch
fuente

Respuestas:

9

Esto es lo que 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/*`

Cada vez que se realiza un intento de abrir un archivo adjunto, se copia en un directorio temporal dedicado y se abre la copia.
Cada vez que comienza mutt, se limpian las copias persistentes.

Puede que necesite o no &al final, según el comando que haya utilizado. (Algunas versiones de xdg-openestán bloqueando, mientras que otras no).

No hace falta decir que puede usar esto con cualquier comando. xdg-openes solo un práctico controlador de ventanilla única.


fuente
¡Esta es una forma general genial de reemplazar mailcap! ¡Gracias!
Profpatsch
Necesitaba el &xdg-open posterior. No puede hacer daño tenerlo allí en cualquier caso, ¿verdad?
Profpatsch
Tal vez podría hacer una pregunta: ¿Cómo reemplazar mailcapcon xdg-open? y copia esa respuesta. Estoy seguro de que hay algunas personas con esa pregunta.
Profpatsch
2
¿No sería esto problemático si tienes múltiples aplicaciones abiertas por mutt cambiando carpetas borraría cualquier cosa en tu / tmp / mutt / carpeta? Dado que xdg-open podría o no bloquearse, solo estoy usando la aplicación (firefox) text/html; t=$(mktemp /tmp/XXXXXXXXXX) \; cp %s "$t" \; /bin/sh -c "firefox $t \; rm $t \;" &
Derek Schrock
Sé que esta es una vieja pregunta, pero la acabo de encontrar ahora porque estoy experimentando con la configuración de Mutt. Mi solución fue usar Neomutt's shutdown-hooken su lugar; esto solo vacía el directorio tmp cuando mutt se apaga.
Thriveth
3

Puede usar un comando de contenedor que:

  1. cambia el nombre del archivo
  2. ejecuta el visor en segundo plano
  3. se limpia cuando el espectador ha regresado en lugar de dejar muttque lo haga.

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 -- "$@"
) &

Y pon algo como:

image/*; muttv eog %s;

¿Dónde muttvestá ese guión de arriba?

Lo anterior no presupone dónde aparecen los nombres de los nombres de archivo en la lista de argumentos o qué caracteres contienen ... Por eso primero preguntamos muttqué tmpdires (por lo que usamos eso para determinar a qué archivos pertenecen) vista ).

Sin embargo, en la mayoría de los casos, sería excesivo, y como señala Gilles, puede no funcionar si tmpdir se especifica como relativo a la carpeta de su buzón.

Una más simple sería:

#! /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"
) &

Reemplace mvcon cpsi no desea tocar el archivo original proporcionado por mutt.

Stéphane Chazelas
fuente
Gosh, ¿acabas de escribir eso desde cero? Me llevó 15 minutos entender lo que está haciendo y, aun ahora, no estoy seguro de cómo funcionan exactamente algunas partes.
Profpatsch
Falla con mi .muttrcporque tmpdir="=tmp". ¿Por qué no tomar el directorio del nombre del archivo?
Gilles 'SO- deja de ser malvado'
@Gilles, buen punto sobre el "+", "=" ... Todo el punto era obtener tmpdir de mutt para que sepamos cuál de los argumentos es el nombre del archivo. Todo esto es un poco exagerado, aunque de todas formas, en el 99% de los casos el nombre del archivo que va a ocurrir sólo una vez y ser el último argumento, y que sólo puede cambiar el nombre anew-$original
Stéphane Chazelas
Otro punto es que este script de entrada no siempre se llama en nombre de mutt, podría llamarse en circunstancias en las que el archivo no es un archivo temporal y no debe eliminarse. (A menudo llamo seea la línea de comando, ¡no espero que elimine el archivo, incluso si está dentro /tmp!) Solución: cree un enlace duro.
Gilles 'SO- deja de ser malvado'
@Gilles, pensé en el enlace duro, pero para mutt, no funciona, porque después de ejecutar el comando, mutt trunca el archivo antes de desvincularlo. (abrir con O_TRUNC y cerrar, lo verifiqué).
Stéphane Chazelas