Jak powiedzieć Muttowi, aby nie czekał na powrót programu dołączającego?

9

Używam tej linii do obrazów w moim mailcap:

image/*; eog %s &;

ale mutt natychmiast usuwa plik tymczasowy i eog nie może go załadować.
Kiedy &usuwam kundel czeka, aż eog zostanie zamknięty, dopóki nie ucieknie z linii poleceń.

Profpatsch
źródło

Odpowiedzi:

9

Oto, czego używam:

.mailcap:

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

.mutt / muttrc:

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

Za każdym razem, gdy podejmowana jest próba otwarcia załącznika, jest on kopiowany do dedykowanego katalogu tymczasowego i kopia jest otwierana.
Za każdym razem, gdy zaczynasz mutt, wszelkie trwałe kopie są czyszczone.

Na &końcu możesz, ale nie musisz , w zależności od użytej komendy. (Niektóre wersje xdg-openblokują, a inne nie.)

Nie trzeba dodawać, że można tego użyć z dowolnym poleceniem. xdg-openjest tylko wygodnym, kompleksowym programem obsługi.


źródło
To jest fajny ogólny sposób na zastąpienie mailcap! Dzięki!
Profpatsch
Potrzebowałem &po xdg-open. W każdym razie nie może zaszkodzić mieć go tam, prawda?
Profpatsch
Może można zrobić pytanie: Jak wymienić mailcapz xdg-open? i skopiuj tę odpowiedź. Jestem pewien, że są ludzie z tym pytaniem.
Profpatsch
2
Czy nie byłoby to problematyczne, jeśli masz wiele aplikacji otwartych przez foldery zmieniające mutt, które wymazałyby wszystko z twojego folderu / tmp / mutt /. Ponieważ xdg-open może blokować lub nie, używam tylko aplikacji (Firefox) text/html; t=$(mktemp /tmp/XXXXXXXXXX) \; cp %s "$t" \; /bin/sh -c "firefox $t \; rm $t \;" &
Derek Schrock
Wiem, że to stare pytanie, ale właśnie je znalazłem, ponieważ eksperymentuję z konfiguracją Mutt. Moim rozwiązaniem było użycie shutdown-hookzamiast tego Neomutta ; to po prostu opróżnia katalog tmp, gdy mutt jest wyłączony.
Kwitnie
3

Możesz użyć polecenia otoki, które:

  1. zmienia nazwę pliku
  2. uruchamia przeglądarkę w tle
  3. czyści po powrocie przeglądarki, zamiast pozwalać muttna to.

Coś jak:

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

I umieść coś takiego:

image/*; muttv eog %s;

Gdzie muttvjest powyższy skrypt?

Powyższe nie zakłada, gdzie nazwa (-y) pliku (-ów) występuje (-ą) na liście argumentów lub jaki znak zawiera. Właśnie dlatego najpierw pytamy, muttco to tmpdirjest (dlatego używamy tego, aby określić, do których plików widok ).

W większości przypadków byłoby to jednak przesadą i, jak podkreśla Gilles, może nie działać, jeśli tmpdir jest określony w stosunku do folderu skrzynki pocztowej.

Prostszym byłoby:

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

Wymień mvsię cp, jeśli nie chce się dotknąć oryginalnego pliku dostarczonego przez mutt.

Stéphane Chazelas
źródło
Boże, czy właśnie napisałeś to od zera? 15 minut zajęło mi zrozumienie tego, co robisz i nawet teraz nie jestem pewien, jak dokładnie działają niektóre części.
Profpatsch
Nie pasuje do mnie, .muttrcponieważ tmpdir="=tmp". Dlaczego nie pobrać katalogu z nazwy pliku?
Gilles „SO- przestań być zły”
@Gilles, dobra uwaga na temat „+”, „=” ... Chodziło o to, aby uzyskać tmpdir z mutta, abyśmy wiedzieli, który z argumentów to nazwa pliku. Cała sprawa jest jednak przesadna, ponieważ w 99% przypadków nazwa pliku pojawi się tylko raz i będzie ostatnim argumentem, a my możemy po prostu zmienić jej nazwę nanew-$original
Stéphane Chazelas
Inną kwestią jest to, że ten skrypt wejściowy nie zawsze jest wywoływany w imieniu mutt, można go wywołać w okolicznościach, w których plik nie jest plikiem tymczasowym i nie można go usunąć. (Często dzwonię seew wierszu poleceń, nie oczekuję, że usunie plik, nawet jeśli jest w /tmpśrodku!) Rozwiązanie: zrób twardy link.
Gilles „SO- przestań być zły”
@Gilles, myślałem o hardlink, ale dla mutta to nie działa, ponieważ po uruchomieniu polecenia mutt obcina plik przed jego odłączeniem. (otwórz za pomocą O_TRUNC i zamknij, sprawdziłem to).
Stéphane Chazelas