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


9

我将此行用于我的图像mailcap

image/*; eog %s &;

但是mutt立即删除了临时文件,而eog无法加载它。
当我删除&mutt时,它会等待eog关闭,直到它从命令行中退出。

Answers:


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/*`

每次尝试打开附件时,都会将其复制到专用的temp目录中,并打开该副本。
每次启动时mutt,所有残留的副本都会被清除。

最后,您可能需要也可能不需要&,这取决于您使用的命令。(某些版本的软件xdg-open被阻止,而其他版本则没有。)

不用说,您可以在任何命令中使用它。xdg-open只是方便的一站式处理程序。


这是替换mailcap的一种很酷的通用方法!谢谢!
Profpatsch 2014年

我需要&xdg-open之后。在任何情况下都可以忍受,对吗?
Profpatsch 2014年

也许您会提出一个问题:如何替换mailcapxdg-open?并复制该答案。我敢肯定有人问这个问题。
Profpatsch 2014年

2
如果通过mutt更改文件夹打开了多个应用程序,这会成问题,这会抹掉/ tmp / mutt /文件夹中的所有内容。由于xdg-open可能会或可能不会阻止,我只是在使用应用程序(firefox) text/html; t=$(mktemp /tmp/XXXXXXXXXX) \; cp %s "$t" \; /bin/sh -c "firefox $t \; rm $t \;" &
Derek Schrock

我知道这是一个古老的问题,但是我现在才找到它,因为我正在设置Mutt。我的解决方案是改用Neomutt shutdown-hook。mutt关闭时,这只会清空tmp目录。
Thriveth

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(因此我们用它来确定要存储的文件是什么)查看)。

不过,在大多数情况下,这是过大的,并且如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"
) &

更换mvcp,如果你不想碰所提供的原始文件mutt


天哪,您是从头开始写的吗?我花了15分钟的时间了解您的操作,即使现在我也不确定某些部分的工作方式。
Profpatsch

因我.muttrc而失败tmpdir="=tmp"。为什么不从文件名中获取目录?
吉尔斯(Gilles)'所以

@Gilles,关于“ +”,“ =” ...的要点是要从mutt中获取tmpdir,所以我们知道哪个参数是文件名。整个事情是有点大材小用但无论如何在的文件名会只发生一次,并成为最后一个参数99%的情况,我们可以只是其重命名为new-$original
斯特凡Chazelas

另一点是,此输入脚本并不总是代表mutt调用,它可以在文件不是临时文件且不能删除的情况下调用。(我经常see在命令行上调用,即使它在/tmp!中,我也不希望它删除文件。)解决方案:进行硬链接。
吉尔斯(Gilles)'所以

@Gilles,我想到了硬链接,但是对于mutt来说,它不起作用,因为在运行命令后,mutt会在取消链接之前将文件截断。(用O_TRUNC打开,然后关闭,我确实进行了验证)。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.