Come dire a mutt di non attendere il ritorno di un programma allegato?


9

Uso questa linea per le immagini nel mio mailcap:

image/*; eog %s &;

ma mutt elimina immediatamente il file temporaneo e eog non può caricarlo.
Quando rimuovo il &cane, attende che Eog sia chiuso fino a quando non fuoriesce dalla riga di comando.

Risposte:


9

Ecco cosa 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/*`

Ogni volta che si tenta di aprire un allegato, questo viene copiato in una directory temporanea dedicata e la copia viene aperta.
Ogni volta che si avvia mutt, eventuali copie persistenti vengono ripulite.

Potrebbe essere necessario o meno &alla fine, a seconda del comando utilizzato. (Alcune versioni di xdg-openstanno bloccando, mentre altre no.)

Inutile dire che puoi usarlo con qualsiasi comando. xdg-openè solo un comodo gestore one-stop.


Questo è un bel modo generale per sostituire il mailcap! Grazie!
Profpatsch,

Avevo bisogno di &after xdg-open. Non può far male averlo lì in ogni caso, giusto?
Profpatsch,

Forse si potrebbe fare una domanda: Come sostituire mailcapcon xdg-open? e copia quella risposta. Sono sicuro che ci sono alcune persone con questa domanda.
Profpatsch,

2
Questo non sarebbe problematico se hai più applicazioni aperte da mutt cambiando le cartelle cancellerebbe qualsiasi cosa nella tua cartella / tmp / mutt /. Dal momento che xdg-open potrebbe o non potrebbe bloccare sto solo usando l'applicazione (firefox) text/html; t=$(mktemp /tmp/XXXXXXXXXX) \; cp %s "$t" \; /bin/sh -c "firefox $t \; rm $t \;" &
Derek Schrock,

So che questa è una vecchia domanda, ma l'ho appena trovata perché sto sperimentando con Mutt. La mia soluzione era di usare shutdown-hookinvece Neomutt ; questo svuota la directory tmp quando mutt viene chiuso.
Prosegue il

3

È possibile utilizzare un comando wrapper che:

  1. rinomina il file
  2. esegue il visualizzatore in background
  3. ripulisce quando lo spettatore è tornato invece di lasciarlo muttfare.

Qualcosa di simile a:

#! /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 metti qualcosa come:

image/*; muttv eog %s;

Dove muttvè che lo script di cui sopra.

Quanto sopra non presuppone dove compaiano i nomi di file nell'elenco degli argomenti o quale carattere contengano ... Ecco perché chiediamo prima di muttcosa si tmpdirtratta (quindi lo usiamo per determinare quali sono i file da vista ).

Nella maggior parte dei casi, tuttavia, sarebbe eccessivo e, come sottolinea Gilles, potrebbe non funzionare se tmpdir è specificato come relativo alla cartella della propria cassetta postale.

Uno più semplice sarebbe:

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

Sostituisci mvcon cpse non vuoi toccare il file originale fornito da mutt.


Accidenti, l'hai appena scritto da zero? Mi ci sono voluti 15 minuti per capire cosa stai facendo e anche ora non sono sicuro di come funzionino esattamente alcune parti.
Profpatsch,

Non riesce con il mio .muttrcperché tmpdir="=tmp". Perché non prendere la directory dal nome del file?
Gilles 'SO- smetti di essere malvagio' il

@Gilles, buon punto su "+", "=" ... Il punto era prendere tmpdir da mutt, quindi sappiamo quale degli argomenti è il nome del file. Il tutto è un po 'eccessivo, comunque, come nel 99% dei casi il nome del file ricadrà una sola volta ed è l'ultimo argomento, e possiamo semplicemente rinominarlo innew-$original
Stéphane Chazelas,

Un altro punto è che questo script di voce non è sempre chiamato per conto di mutt, potrebbe essere chiamato in circostanze in cui il file non è un file temporaneo e non deve essere eliminato. (Chiamo spesso seedalla riga di comando, non mi aspetto che rimuova il file, anche se è dentro /tmp!) Soluzione: crea un collegamento reale.
Gilles 'SO- smetti di essere malvagio' il

@Gilles, ho pensato al hardlink, ma per mutt, non funziona, perché dopo aver eseguito il comando, mutt tronca il file prima di scollegarlo. (apri con O_TRUNC e chiudi, l'ho verificato).
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.