Bagaimana cara memberitahu mutt untuk tidak menunggu program lampiran kembali?

9

Saya menggunakan baris ini untuk gambar di mailcap:

image/*; eog %s &;

tetapi mutt segera menghapus file temp dan eog tidak dapat memuatnya.
Ketika saya menghapus &mutt, menunggu eog ditutup sampai lolos dari baris perintah.

Profpatsch
sumber

Jawaban:

9

Inilah yang saya gunakan:

.mailcap:

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

.mutt / muttrc:

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

Setiap kali upaya untuk membuka lampiran dilakukan, itu disalin dalam direktori temp khusus dan salinan dibuka.
Setiap kali Anda mulai mutt, semua salinan yang tersisa dibersihkan.

Anda mungkin atau mungkin tidak memerlukannya &di akhir, tergantung pada perintah yang Anda gunakan. (Beberapa versi xdg-openmemblokir, sementara yang lain tidak.)

Tidak perlu dikatakan, Anda dapat menggunakan ini dengan perintah apa pun. xdg-openhanya penangan satu atap yang nyaman.


sumber
Ini adalah cara umum yang keren untuk mengganti mailcap! Terima kasih!
Profpatsch
Saya membutuhkan &xdg-open. Tidak ada salahnya untuk memilikinya di sana, kan?
Profpatsch
Mungkin Anda bisa membuat pertanyaan: Bagaimana mengganti mailcapdengan xdg-open? dan salin jawaban itu. Saya yakin ada beberapa orang dengan pertanyaan itu.
Profpatsch
2
Bukankah ini akan menjadi masalah jika Anda memiliki beberapa aplikasi yang dibuka oleh mutt yang mengubah folder akan menghapus apa pun di folder / tmp / mutt / Anda. Karena xdg-open mungkin atau mungkin tidak memblokir saya hanya menggunakan aplikasi (firefox) text/html; t=$(mktemp /tmp/XXXXXXXXXX) \; cp %s "$t" \; /bin/sh -c "firefox $t \; rm $t \;" &
Derek Schrock
Saya tahu ini adalah pertanyaan lama, tetapi saya baru menemukannya sekarang karena saya ahli dalam mengatur Mutt. Solusi saya adalah menggunakan Neomutt's shutdown-hooksaja; ini hanya mengosongkan dir tmp ketika mutt dimatikan.
Thriveth
3

Anda bisa menggunakan perintah wrapper yang:

  1. mengganti nama file
  2. menjalankan penampil di latar belakang
  3. membersihkan ketika pemirsa telah kembali bukannya membiarkannya muttmelakukannya.

Sesuatu seperti:

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

Dan letakkan sesuatu seperti:

image/*; muttv eog %s;

Di mana muttvskrip di atas.

Di atas tidak membuat asumsi di mana nama file muncul (s) dalam daftar argumen atau karakter apa yang dikandungnya ... Itulah sebabnya kami pertama kali bertanya muttapa tmpdiritu (jadi kami menggunakannya untuk menentukan apa file untuk lihat ).

Dalam kebanyakan kasus, itu akan berlebihan, dan seperti yang ditunjukkan Gilles mungkin tidak berfungsi jika tmpdir ditentukan sebagai relatif terhadap folder kotak surat Anda.

Yang lebih sederhana adalah:

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

Ganti mvdengan cpjika Anda tidak ingin menyentuh file asli yang disediakan oleh mutt.

Stéphane Chazelas
sumber
Astaga, apakah Anda baru saja menulis itu dari awal? Butuh 15 menit untuk memahami apa yang Anda lakukan dan bahkan sekarang saya tidak yakin tentang bagaimana beberapa bagian bekerja dengan tepat.
Profpatsch
Gagal dengan .muttrckarena saya tmpdir="=tmp". Mengapa tidak mengambil direktori dari nama file?
Gilles 'SO- stop being evil'
@Gilles, poin bagus tentang "+", "=" ... Intinya adalah untuk mendapatkan tmpdir dari mutt jadi kita tahu argumen mana yang merupakan nama file. Namun, semuanya agak berlebihan karena dalam 99% kasus, nama file akan muncul hanya sekali dan menjadi argumen terakhir, dan kita bisa mengganti nama menjadinew-$original
Stéphane Chazelas
Poin lain adalah bahwa skrip entri ini tidak selalu dipanggil atas nama mutt, bisa disebut dalam keadaan di mana file tersebut bukan file sementara dan tidak boleh dihapus. (Saya sering memanggil seebaris perintah, saya tidak berharap untuk menghapus file, bahkan jika itu ada di /tmp!) Solusi: buat tautan keras.
Gilles 'SO- stop being evil'
@Gilles, saya memikirkan hardlink, tetapi untuk mutt, itu tidak berfungsi, karena setelah menjalankan perintah, mutt memotong file sebelum memutuskan tautannya. (buka dengan O_TRUNC dan tutup, saya sudah memverifikasi itu).
Stéphane Chazelas