Как сказать Mutt не ждать возврата программы вложения?

9

Я использую эту строку для изображений в моем mailcap:

image/*; eog %s &;

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

Profpatsch
источник

Ответы:

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
Стефан Шазелас
Другой момент заключается в том, что этот сценарий ввода не всегда вызывается от имени mutt, его можно вызывать в случаях, когда файл не является временным файлом и не должен быть удален. (Я часто вызываю seeкомандную строку, я не ожидаю, что она удалит файл, даже если он внутри /tmp!) Решение: создать жесткую ссылку.
Жиль "ТАК - перестань быть злым"
@ Жиль, я подумал о жесткой ссылке, но для Mutt она не работает, потому что после запуска команды Mutt обрезает файл перед тем, как отсоединить его. (открыть с помощью O_TRUNC и закрыть, я проверял это).
Стефан Шазелас