Comment dire à mutt de ne pas attendre le retour d'un programme d'attachement?

9

J'utilise cette ligne pour les images dans mon mailcap:

image/*; eog %s &;

mais mutt supprime immédiatement le fichier temporaire et eog ne peut pas le charger.
Quand &j'enlève le mutt attend que eog soit fermé jusqu'à ce qu'il s'échappe de la ligne de commande.

Profpatsch
la source

Réponses:

9

Voici ce que j'utilise:

.mailcap:

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

.mutt / muttrc:

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

Chaque fois qu'une tentative d'ouverture d'une pièce jointe est effectuée, elle est copiée dans un répertoire temporaire dédié et la copie est ouverte.
Chaque fois que vous démarrez mutt, toutes les copies persistantes sont nettoyées.

Vous pouvez ou non avoir besoin de la &à la fin, selon la commande que vous avez utilisée. (Certaines versions de xdg-openbloquent, tandis que d'autres ne le sont pas.)

Inutile de dire que vous pouvez l'utiliser avec n'importe quelle commande. xdg-openest juste un gestionnaire à guichet unique pratique.


la source
C'est un moyen génial de remplacer mailcap! Merci!
Profpatsch
J'avais besoin de l' &après xdg-open. Ça ne peut pas faire de mal de l'avoir là de toute façon, non?
Profpatsch
Peut-être pourriez-vous poser une question: comment remplacer mailcappar xdg-open? et copiez cette réponse. Je suis sûr que certaines personnes se posent cette question.
Profpatsch
2
Cela ne serait-il pas problématique si plusieurs applications ouvertes par mutt changeaient de dossiers, effaceraient n'importe quoi dans votre dossier / tmp / mutt /. Étant donné que xdg-open peut ou non bloquer, j'utilise simplement l'application (firefox) text/html; t=$(mktemp /tmp/XXXXXXXXXX) \; cp %s "$t" \; /bin/sh -c "firefox $t \; rm $t \;" &
Derek Schrock
Je sais que c'est une vieille question, mais je viens de la trouver maintenant parce que je maîtrise la mise en place de Mutt. Ma solution a été d'utiliser à la shutdown-hookplace Neomutt ; cela vide simplement le répertoire tmp lorsque mutt est arrêté.
Thriveth
3

Vous pouvez utiliser une commande wrapper qui:

  1. renomme le fichier
  2. exécute la visionneuse en arrière-plan
  3. nettoie lorsque le spectateur est revenu au lieu de le laisser muttfaire.

Quelque chose comme:

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

Et mettez quelque chose comme:

image/*; muttv eog %s;

muttvest ce script ci-dessus.

Le fait ci - dessus aucune hypothèse sur l' endroit où le nom du fichier (s) semble (s) dans la liste des arguments ou quel personnage ils contiennent ... Ce qui est pourquoi nous demandons d' abord muttce que son tmpdirest (nous utilisons donc que , pour déterminer quels sont les fichiers à vue ).

Dans la plupart des cas, ce serait exagéré cependant, et comme le souligne Gilles peut ne pas fonctionner si tmpdir est spécifié par rapport à votre dossier de boîtes aux lettres.

Un plus simple serait:

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

Remplacez mvpar cpsi vous ne souhaitez pas toucher le fichier d'origine fourni par mutt.

Stéphane Chazelas
la source
Mon Dieu, tu viens d'écrire ça à partir de zéro? Il m'a fallu 15 minutes pour comprendre ce que vous faites et même maintenant, je ne sais pas exactement comment certaines pièces fonctionnent.
Profpatsch
Échoue avec mon .muttrcparce que tmpdir="=tmp". Pourquoi ne pas récupérer le répertoire du nom de fichier?
Gilles 'SO- arrête d'être méchant'
@Gilles, bon point sur le "+", "=" ... Le but était d'obtenir tmpdir de mutt afin que nous sachions lequel des arguments est le nom du fichier. Le tout est un peu exagéré, de toute façon, car dans 99% des cas, le nom de fichier ne se produira qu'une seule fois et sera le dernier argument, et nous pouvons simplement le renommernew-$original
Stéphane Chazelas
Un autre point est que ce script d'entrée n'est pas toujours appelé au nom de mutt, il pourrait être appelé dans des circonstances où le fichier n'est pas un fichier temporaire et ne doit pas être supprimé. (J'appelle souvent seesur la ligne de commande, je ne m'attends pas à ce qu'il supprime le fichier, même s'il est dedans /tmp!) Solution: faites un lien dur.
Gilles 'SO- arrête d'être méchant'
@Gilles, j'ai pensé au hardlink, mais pour mutt, cela ne fonctionne pas, car après avoir exécuté la commande, mutt tronque le fichier avant de le dissocier. (ouvrir avec O_TRUNC et fermer, je l'ai vérifié).
Stéphane Chazelas