在 mutt 中使用替代文件选择器

在 mutt 中使用替代文件选择器

杂种狗,是否可以使用文件浏览器,例如维夫姆或者护林员(可能在一个多路复用器split)而不是默认文件浏览器来选择要附加到电子邮件的文件?

答案1

您可以在 tmux split 中打开 ranger(您建议的可能性),选择要附加的文件,使用复制文件名及其路径yp,然后返回到 mutt 附加窗口,按并将a附件路径和文件名粘贴到在附加窗口底部打开的行,然后按Enter

关于文件名中空格的问题(回应@Rastapopolous的评论),我意识到我有不使用它们的强烈习惯,但是重新测试上面从ranger粘贴路径的方法,我发现当文件名有空格,由于某种原因,粘贴到 mutt 中的附件名称有部分名称重复!人们可以退格以删除“附件”,即使空格未转义,附件也可以轻松发送。我在 vim 中测试了 ranger 的路径副本,它粘贴正确,但在 mutt 中则不然。

由于我习惯使用tmux,所以我发现这是一个相对简单的方法。

或者独立于 tmux,我的 .bashrc 中还有以下脚本:

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

export -f mail_attach

当您知道要在撰写电子邮件之前添加附件时,这非常有用。因此,在 ranger 中,只需选择一个文件,键入s即可打开 shell 命令行,并用 指示所选文件%f,即:

:shell mail_attach %f

Enter将打开 mutt 编辑器,用于撰写已附加所选文件的电子邮件。但是,随后必须将收件人电子邮件地址更改为所需的地址。也许有一种方法可以更改功能以打开带有空白“收件人”字段的电子邮件编辑器,但我还不够了解。不过,我觉得这没什么大不了的。

对于多个文件,如果它们位于同一文件夹中,我将全部选择它们,然后按@Ranger 快捷方式打开 shell 命令行,如下所示,其中%s是对所选文件的引用:

:shell %s

然后只需mail_attach在前面插入%s并按 Enter 键即可打开 mutt 来撰写已附加所有选定文件的电子邮件。如果您想附加来自不同文件夹的文件,除了将它们收集到同一文件夹中之外,我不知道该怎么做。

我想感谢创建该函数的人,但我不再知道它来自哪里。我知道那不是我。

答案2

@John Flood 的回答启发我对此进行了更多思考,我想出了以下解决方法,这似乎效果很好。

将以下脚本保存为mutt_attach中的某处$PATH,并使用文字Return字符代替^M(在 中vim,这是通过<c-v><Return>在插入模式下按来实现的)。

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

在 中.muttrc,定义

macro compose \CA "!mutt_attach\n"

现在,如果您在名为的会话中mutt的窗口的第一个窗格中打开(例如,使用命令创建。指定会话、窗口和窗格主要用于调试目的)并按撰写菜单中的 ,将以模式打开,并且将自动附加所选文件。Emailtmuxemailtmux new -s emailControl+Avifmchoose-files

更好的是,这可以让您在vifmusing t(或可视模式)和rangerusing中标记多个文件,Space并同时附加它们!

编辑:我注意到该代码不适用于包含空格的文件名,因为在我的 mutt 版本中似乎不可能在附件撰写菜单中键入空格...这是一个(有点难看)的解决方法:

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

相关内容