
我想複製 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。