Як сказати mutt не чекати повернення програми вкладень?


9

Я використовую цей рядок для зображень у своїх mailcap:

image/*; eog %s &;

але mutt негайно видаляє тимчасовий файл і eog не може завантажити його.
Коли я &виймаю шум, він чекає, коли eog закриється, поки він не вийде з командного рядка.

Відповіді:


9

Ось що я використовую:

.mailcap:

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

.mutt / muttrc:

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

Кожен раз, коли робиться спроба відкрити вкладення, він копіюється у виділений тимчасовий каталог і відкривається копія.
Кожен раз, коли ви починаєте mutt, будь-які затяжні копії очищаються.

Ви можете або не знадобиться &в кінці, залежно від використовуваної команди. (Деякі версії xdg-openблокуються, а інші - ні.)

Потрібно говорити, що ви можете використовувати це з будь-якою командою. xdg-open- просто зручний обробник на одній зупинці.


Це крутий загальний спосіб заміни mailcap! Дякую!
Profpatsch

Мені потрібно було &після xdg-open. Ні в якому разі не завадить мати його там, правда?
Profpatsch

Може бути , ви могли б зробити питання: Як замінити mailcapз xdg-open? і скопіюйте цю відповідь. Я впевнений, що з цим питанням є люди.
Profpatsch

2
Чи це не буде проблематично, якщо у вас декілька програм, відкритих зміною папок mutt, видалять що-небудь у папці / tmp / mutt /. Оскільки xdg-open може або не може блокувати, я просто використовую програму (firefox) text/html; t=$(mktemp /tmp/XXXXXXXXXX) \; cp %s "$t" \; /bin/sh -c "firefox $t \; rm $t \;" &
Дерек Шрок

Я знаю, що це давнє питання, але я просто знайшов його зараз, тому що я експериментую з налаштуванням Mutt. Моє рішення полягало в тому, щоб використовувати shutdown-hookзамість нього Neomutt ; це просто спорожнює tmp dir, коли mutt вимикається.
процвітає

3

Ви можете використовувати команду обгортки, яка:

  1. перейменовує файл
  2. запускає глядача у фоновому режимі
  3. очищається, коли глядач повернувся замість того, щоб muttпускати це.

Щось на зразок:

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

І поставте щось на кшталт:

image/*; muttv eog %s;

Де muttvцей сценарій вище.

Вищезгадане не припускає, де в списку аргументів відображаються назви ( файли) файлів чи символи, які вони містять ... Ось чому ми спочатку запитуємо, muttщо це tmpdirтаке (тому ми використовуємо це, щоб визначити, до яких файлів належить вид ).

У більшості випадків це буде надмірно, але, як зазначає Жилл, може не працювати, якщо tmpdir вказаний відносно папки вашої поштової скриньки.

Більш простим буде:

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

Замініть mvна, cpякщо ви не хочете торкатися оригіналу, наданого файлом mutt.


Боже, ти це просто написав з нуля? Мені знадобилося 15 хвилин, щоб зрозуміти, що ти робиш, і навіть зараз я не впевнений у тому, як саме працюють деякі частини.
Profpatsch

Не вдається моєму .muttrcтому, що tmpdir="=tmp". Чому б не схопити каталог з імені файлу?
Жил "ТАК - перестань бути злим"

@Gilles, хороший пункт про "+", "=" ... Вся справа в тому, щоб отримати tmpdir від mutt, щоб ми знали, який з аргументів - це ім'я файлу. Вся справа трохи надмірна, хоча так чи інакше, як і в 99% випадків ім'я файлу трапляється лише один раз і стане останнім аргументом, і ми можемо просто перейменувати його наnew-$original
Stéphane Chazelas

Інший момент полягає в тому, що цей сценарій введення не завжди викликається від імені mutt, його можна викликати в тих випадках, коли файл не є тимчасовим файлом і не повинен бути видалений. (Я часто дзвоню seeв командному рядку. Я не очікую, що він видалить файл, навіть якщо він є /tmp!) Рішення: зробіть міцне посилання.
Жил "ТАК - перестань бути злим"

@Gilles, я подумав про жорстке посилання, але для mutt це не працює, оскільки після запуску команди mutt скорочує файл, перш ніж від’єднати його. (відкрити за допомогою O_TRUNC і закрити, я це підтвердив).
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.