我想复制 GMail 的“过滤此类邮件”功能。基本上,我希望在 mutt 中绑定一个键,例如 *,并且可以“限制”显示由同一发件人(或前缀为 ; 的发件人)发送的消息。
macro index * "<enter-command>set sender=display-address<enter><limit>$sender<enter>" "Filter Messages Like"
我正在尝试上面的宏方法,但很难将发件人地址读入 mutt 中的变量中。宏观是正确的发展方向吗?将消息头读入变量的正确方法是什么?
答案1
不幸的是,不可能从函数填充变量。即使你能够调用 function <display-address>
:push @
,:exec display-address
或者在 neomutt 中使用 lua - 它会显示在底部栏中,但变量保持为空。
今天在 #neomutt IRC 上咨询此问题后,目前最好的选择是使用临时文件。
- 该宏将消息通过管道传输到 formail,后者返回
from header
,将其传递给 awk 以仅获取电子邮件地址并将输出重定向到 /tmp/sender - 使用 /tmp/sender 的内容设置变量 $my_sender
- 使用 $my_sender 限制索引
macro index,pager * \
"<pipe-message>formail -X from:|awk -F'[<>]' '{print $2}'>/tmp/sender<enter>\
:set my_sender=\"`cat /tmp/sender`\"\n\
l~f \"$my_sender\"\n" \
"Filter Messages Like"
要求: 邮件
或者您可以使用任何其他命令来解析消息中的电子邮件地址。
编辑:每个 neomutt 会话仅工作一次。宏内部的变量扩展可能存在问题,因为它用双引号引起来,并且必须如此。所以这仍然可能是不可能的,至少是不可能的。
答案2
这个答案是基于雅库布·金德拉的回答。不幸的是,我没有足够的声誉将其作为对他的正确答案的评论发布,但我认为这可能会帮助遇到相同问题的其他人。
这是他的宏的一种解决方法,可以解决一次性扩展的问题:
macro index,pager k "<pipe-message>formail -X from:|awk -F'[<>]' '{print \"set my_tmp_pipe_decode=\\\"\"$2\"\\\"\" }'>/tmp/sender<enter>:source /tmp/sender<enter>l~f $my_tmp_pipe_decode<enter>" "Filter Messages Like"
主要区别是cat
我没有尝试读取文件,而是尝试了source
它。这样,您就不会遇到变量扩展问题,并且它在一个会话中可以根据您的需要多次运行。显然,source
与它相比,它不是一次性扩展,cat
因为它是一个内部 mutt 命令,但是,cat
它是一个应该扩展的外部 bash 命令。
同样,功劳应该归于 Jakub Jindra。