如何告诉 mutt 不要等待附件程序返回?

如何告诉 mutt 不要等待附件程序返回?

我将这一行用于我的图像mailcap

image/*; eog %s &;

但 mutt 立即删除临时文件并且 eog 无法加载它。
当我删除&mutt 时,它会等待 eog 关闭,直到它从命令行逃脱。

答案1

这是我使用的:

.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只是一个方便的一站式处理程序。

答案2

您可以使用包装器命令:

  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上面那个脚本在哪里。

上面没有假设文件名在参数列表中出现的位置或它们包含什么字符...这就是为什么我们首先询问mutttmpdir是什么(所以我们用它来确定文件是什么看法)。

在大多数情况下,这可能有点过头了,正如 Gilles 指出的那样,如果 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为。cpmutt

相关内容