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ń.

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.