Wie kann man mutt anweisen, nicht auf die Rückkehr eines Anhangsprogramms zu warten?

9

Ich benutze diese Zeile für Bilder in meinem mailcap:

image/*; eog %s &;

aber mutt löscht die temporäre Datei sofort und eog kann sie nicht laden.
Wenn ich den &Köter entferne, wartet er darauf, dass Eog geschlossen wird, bis er aus der Befehlszeile entweicht.

Profpatsch
quelle

Antworten:

9

Folgendes verwende ich:

.mailcap:

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

.mutt / muttrc:

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

Jedes Mal, wenn versucht wird, einen Anhang zu öffnen, wird dieser in ein dediziertes temporäres Verzeichnis kopiert und die Kopie wird geöffnet.
Jedes Mal mutt, wenn Sie beginnen , werden alle verbleibenden Kopien bereinigt.

&Abhängig von dem von Ihnen verwendeten Befehl benötigen Sie möglicherweise das am Ende. (Einige Versionen von xdg-openblockieren, andere nicht.)

Natürlich können Sie dies mit jedem Befehl verwenden. xdg-openist nur ein praktischer One-Stop-Handler.


quelle
Dies ist eine coole allgemeine Möglichkeit, Mailcap zu ersetzen! Vielen Dank!
Profpatsch
Ich brauchte das &nach xdg-open. Kann nicht schaden, es auf jeden Fall dort zu haben, oder?
Profpatsch
Vielleicht könnten Sie eine Frage stellen: Wie ersetzen mailcapmit xdg-open? und kopieren Sie diese Antwort über. Ich bin sicher, es gibt einige Leute mit dieser Frage.
Profpatsch
2
Wäre dies nicht problematisch, wenn Sie mehrere Anwendungen geöffnet hätten, die durch das Ändern von Ordnern durch Mutt geöffnet wurden, und alles in Ihrem Ordner / tmp / mutt / auslöschen würden. Da xdg-open möglicherweise blockiert oder nicht blockiert, verwende ich nur die Anwendung (Firefox) text/html; t=$(mktemp /tmp/XXXXXXXXXX) \; cp %s "$t" \; /bin/sh -c "firefox $t \; rm $t \;" &
Derek Schrock
Ich weiß, dass dies eine alte Frage ist, aber ich habe sie gerade gefunden, weil ich mich mit der Einrichtung von Mutt auskenne. Meine Lösung bestand darin, shutdown-hookstattdessen Neomutt zu verwenden. Dies leert nur das tmp-Verzeichnis, wenn mutt heruntergefahren wird.
Thriveth
3

Sie können einen Wrapper-Befehl verwenden, der:

  1. benennt die Datei um
  2. führt den Viewer im Hintergrund aus
  3. Bereinigt, wenn der Betrachter zurückgekehrt ist, anstatt es mutttun zu lassen.

Etwas wie:

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

Und setzen Sie etwas wie:

image/*; muttv eog %s;

Wo muttvist das Skript oben?

Das Obige macht keine Annahme darüber, wo die Dateinamen in der Liste der Argumente erscheinen oder welche Zeichen sie enthalten ... Deshalb fragen wir zuerst, muttwas es tmpdirist (also verwenden wir das, um zu bestimmen, wozu die Dateien gehören Ansicht ).

In den meisten Fällen wäre es jedoch übertrieben, und wie Gilles betont, funktioniert es möglicherweise nicht, wenn tmpdir relativ zu Ihrem Postfachordner angegeben wird.

Eine einfachere wäre:

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

Ersetzen Sie mvdurch, cpwenn Sie die von bereitgestellte Originaldatei nicht berühren möchten mutt.

Stéphane Chazelas
quelle
Meine Güte, hast du das gerade von Grund auf neu geschrieben? Ich habe 15 Minuten gebraucht, um zu verstehen, was Sie tun, und selbst jetzt bin ich mir nicht sicher, wie einige Teile genau funktionieren.
Profpatsch
Scheitert mit meinem .muttrcweil tmpdir="=tmp". Warum nicht das Verzeichnis aus dem Dateinamen holen?
Gilles 'SO - hör auf böse zu sein'
@ Gilles, guter Punkt über das "+", "=" ... Der springende Punkt war, tmpdir von mutt zu bekommen, damit wir wissen, welches der Argumente der Dateiname ist. Das Ganze ist allerdings ein bisschen übertrieben, da in 99% der Fälle der Dateiname nur einmal vorkommt und das letzte Argument ist, und wir können ihn einfach innew-$original
Stéphane Chazelas
Ein weiterer Punkt ist, dass dieses Eintragsskript nicht immer im Namen von mutt aufgerufen wird. Es kann unter Umständen aufgerufen werden, in denen die Datei keine temporäre Datei ist und nicht gelöscht werden darf. (Ich rufe oft seeüber die Befehlszeile auf, ich erwarte nicht, dass die Datei entfernt wird, auch wenn sie sich in befindet /tmp!) Lösung: Stellen Sie einen festen Link her.
Gilles 'SO - hör auf böse zu sein'
@ Gilles, ich dachte an den Hardlink, aber für Mutt funktioniert es nicht, weil Mutt nach dem Ausführen des Befehls die Datei abschneidet, bevor die Verknüpfung aufgehoben wird. (Öffnen Sie mit O_TRUNC und schließen Sie, ich habe es überprüft).
Stéphane Chazelas