Utiliser un sélecteur de fichiers alternatif dans mutt

13

Dans mutt , est-il possible d'utiliser un navigateur de fichiers tel que vifm ou ranger (éventuellement dans un split tmux ) au lieu du navigateur de fichiers par défaut pour sélectionner un fichier à joindre à un e-mail?

Rastapopoulos
la source
3
Quelques idées: mutt-users.mutt.narkive.com/IG5uScnD/external-file-manager
Arkadiusz Drabczyk
1
Pertinente question pour Mutt.
Matthias Braun

Réponses:

2

Vous pouvez ouvrir ranger dans un split tmux (une possibilité que vous avez suggérée), sélectionner le fichier à joindre, copier le nom du fichier avec son chemin d'accès yppuis revenir à la fenêtre d'attachement mutt, appuyer aet coller le chemin d'accès et le nom du fichier dans le ligne qui s'ouvre au bas de la fenêtre d'attachement et appuyez sur Enter.

En ce qui concerne le problème des espaces dans le nom du fichier (en réponse au commentaire de @Rastapopolous), je me suis rendu compte que j'avais l'habitude de ne pas les utiliser, mais en retestant la méthode ci-dessus pour coller le chemin depuis Ranger, je trouve que lorsque le le nom du fichier a des espaces, pour une raison quelconque, le nom de la pièce jointe collé dans mutt a une répétition d'une partie du nom ajouté! On peut reculer pour supprimer "l'appendice" et la pièce jointe est facilement envoyée même avec les espaces non échappés. J'ai testé la copie du chemin de ranger dans vim et ça colle correctement, mais pas dans mutt.

Comme j'utilise habituellement tmux, je trouve que c'est une méthode relativement simple.

Alternativement et indépendamment de tmux, j'ai également le script suivant dans mon .bashrc:

# email an attachment
function mail_attach ()
{
    mutt -F ~/.muttrc -a "$@" -- [email protected];
}

export -f mail_attach

Ceci est utile lorsque vous savez que vous allez joindre avant de rédiger un e-mail. Donc, depuis ranger, on sélectionne simplement un fichier, tape spour ouvrir une ligne de commande shell et indique le fichier sélectionné avec %f, c'est-à-dire:

:shell mail_attach %f

Appuyez sur Enterpour ouvrir l'éditeur mutt pour composer un e-mail contenant déjà le fichier sélectionné en pièce jointe. Cependant, il faut ensuite changer l'adresse e-mail du destinataire en celle souhaitée. Il y a peut-être un moyen de changer la fonction pour ouvrir l'éditeur d'e-mails avec un champ "À" vide, mais je n'en sais pas assez. Cependant, je ne trouve pas cela important.

Pour plusieurs fichiers, s'ils se trouvent dans le même dossier, je les sélectionne tous, puis j'appuie sur @ce qui est un raccourci Ranger pour ouvrir la ligne de commande du shell comme celle-ci, où se %strouve une référence aux fichiers sélectionnés:

:shell %s

Ensuite, il suffit d'insérer mail_attachavant %set d'appuyer sur Entrée ouvrira mutt pour composer l'e-mail qui contient déjà tous les fichiers sélectionnés. Si vous souhaitez joindre des fichiers de différents dossiers, je ne sais pas comment le faire à part les rassembler dans le même dossier.

Je voudrais rendre hommage à celui qui a créé la fonction, mais je ne sais plus d'où elle vient. Je sais que ce n'était pas moi.

John Flood
la source
Merci pour votre réponse! Je viens de publier une méthode alternative, légèrement plus rationalisée, que vous pourriez trouver intéressante.
Rastapopoulos
Merci beaucoup pour l'alternative, cependant, je pense que je suis trop attaché au ranger et, en même temps, je n'ai pas les compétences nécessaires pour adapter votre script au ranger!
John Flood
J'ai adapté le script que j'ai publié pour ranger. Seul inconvénient, cela ne semble pas fonctionner pour les noms de fichiers avec des espaces. (Est-ce juste ma version de mutt, ou est-il impossible de taper un caractère <Espace> dans le menu de composition 'Joindre un fichier'?
Rastapopoulos
Belle astuce, et vous pouvez également faire :shell mutt -a %fdirectement depuis ranger.
Rastapopoulos du
1
Votre explication de "caractère de retour littéral" a fait l'affaire! Votre script original fonctionne maintenant pour moi. Merci @Rastapopoulos!
John Flood
1

La réponse de @John Flood m'a inspiré à réfléchir un peu plus à ce sujet, et j'ai trouvé la solution de contournement suivante, qui semble fonctionner assez bien.

Enregistrez le script suivant comme mutt_attachquelque part dans $PATH, avec le Returncaractère littéral au lieu de ^M(dans vim, ceci est obtenu en appuyant sur <c-v><Return>en mode insertion).

#!/usr/bin/env bash

tmp=$(mktemp)

vifm "$HOME" -c "set nohlsearch" --choose-files "$tmp"
# ranger "$HOME" --choosefiles="$tmp"

while IFS="" read -r file; do
    tmux send-keys -t email:Email.0 -l "a$file^M";
done < "$tmp"

Dans .muttrc, définir

macro compose \CA "!mutt_attach\n"

Maintenant, si vous ouvrez muttdans le premier volet de la fenêtre Emaildans une tmuxsession nommée email(créée avec, par exemple, la commande tmux new -s email. Spécifier la session, la fenêtre et le volet est pratique principalement à des fins de débogage) et appuyez sur Control+Adans le menu de composition, vifms'ouvrira en choose-filesmode et le fichier sélectionné sera automatiquement joint.

Mieux encore, cela vous permet de baliser plusieurs fichiers en vifmutilisant t(ou en mode visuel), et en les rangerutilisant Space, et les attacher tous en même temps!

EDIT : J'ai remarqué que le code ne fonctionne pas pour les noms de fichiers qui contiennent des espaces, car il semble impossible de taper un espace dans le menu de composition des pièces jointes dans ma version de mutt ... Voici une solution de contournement (quelque peu moche):

#!/usr/bin/env bash

# File in which to store the list of filenames to attach
tmp=$(mktemp)

vifm "$HOME" -c "set nohlsearch" --choose-files "$tmp"
# ranger "$HOME" --choosefiles="$tmp"

while IFS="" read -r file; do

    # Workaround for filenames that contain spaces
    if [[ "$file" = *" "* ]]; then
        file_no_space=/tmp/$(basename "$file" | sed 's/ /_/g')
        ln -s -f "$file" "$file_no_space"
        file="$file_no_space"
    fi

    tmux send-keys -t email:Email.0 -l "a$file^M";
done < "$tmp"
Rastapopoulos
la source