Mew でスパム・フィルター bsfilter を走らせるスクリプト mew-absfilter.el にバグがあったので、パッチを公開する。
Mew と bsfilter、mew-absfilter.el の説明、インストール方法、使い方については前記事を参照されたし。
パッチ
前記事では、関数 mew-expand-folder の引数の扱いが変わったことから、新設の関数 mew-expand-file を使うように修正するパッチも併せて公開していた。
けれど、K4Family さんの報告によると、前パッチを適用しても問題が起こるという。以下、該当記事の引用:
mew 5 にして、
(setq mew-use-suffix t)とすると拡張子が邪魔をして、bsfilter の db が更新されない orz
この問題を解決するべく、K4Family さんはパッチも公開しておられる。彼のパッチでは、mew-expand-file の代わりに mew-expand-msg を使う。正確には、mew-expand-msg, mew-expand-file, mew-expand-folder の順に関数の有無をチェックし、存在する関数を使う。
Mew のソースを見た所、mew-expand-msg は mew-expand-file を補う動作をすることが分かった。そこで、mew-expand-msg と mew-expand-folder のみを使うよう新しくパッチを書いた。新パッチでは、同様の問題が起きた時に保守性を上げるため、mew-absfilter-expand-msg という関数を新設した。
新パッチは、mew-absfilter.el 最新版 1.37 用。前記事のパッチを当てておられる方は、パッチ済みのファイルを削除し、もう一度 mew-absfilter.el の最新版をダウンロードした上で下記パッチを当てて下さい。
--- mew-absfilter.el.org 2005-05-17 11:54:00.000000000 +0900 +++ mew-absfilter.el 2006-06-11 15:35:27.112181280 +0900 @@ -224,7 +224,7 @@ (when (mew-sumsyn-match mew-regex-sumsyn-short) (let* ((msg (mew-sumsyn-message-number)) (case:folder (mew-sumsyn-folder-name)) - (file (mew-expand-folder case:folder msg))) + (file (mew-absfilter-expand-msg case:folder msg))) (when (eq (mew-summary-get-mark) mew-absfilter-mark-spam) (mew-summary-undo)) (unless mark-only @@ -239,12 +239,20 @@ (when (mew-sumsyn-match mew-regex-sumsyn-short) (let* ((msg (mew-sumsyn-message-number)) (case:folder (mew-sumsyn-folder-name)) - (file (mew-expand-folder case:folder msg))) + (file (mew-absfilter-expand-msg case:folder msg))) (mew-absfilter-summary-spam-one) (unless mark-only (mew-absfilter-add-spam (list file)) (message "Learned as spam")))))) +(defun mew-absfilter-expand-msg (folder msg) + "Expand message MSG in FOLDER. +Function `mew-expand-msg' is defined after Mew 4.2.53. +Use `mew-expand-folder' iff `mew-expand-msg' is not available." + (if (fboundp 'mew-expand-msg) + (mew-expand-msg folder msg) + (mew-expand-folder folder msg))) + (defun mew-absfilter-mark-learn-clean (&optional mark-only) "Learn all messages marked with '*' as clean (not spam)." (interactive "P")
拡張子をつけている環境(うちは.emlを付加しています)でmew-absfilter-check-spam-regionを呼び出すとbsfilterへ拡張子がわたらず、spamチェックが効きません。また、bsfilterから返されるリストの解釈でも拡張子を考慮していないような...。
ReplyDelete不具合をお知らせ下さり、ありがとうございます。
ReplyDelete確認ですが、最新の Mew で
(setq mew-use-suffix ".eml")
と設定して、問題が起きるということですね。
調べてみますので、少々お待ち下さい。
@aka です。
ReplyDelete拡張子をつける設定を次のようにしてみても、同じ問題が起きますか?
(setq mew-use-suffix t
mew-suffix ".eml")
ありがとうございます。
ReplyDelete.mew.elは↓のようにしています。
(setq mew-use-suffix t)
(setq mew-suffix ".eml")
absfilter.elからbsfilterへわたしている引数を見ると、
拡張子が入っていませんでした(引数をファイルへ書き出すbsfilter.batを作って確認)。
思うに、↓のmsgsリストで拡張子が入っていないままbsfilterへわたっているのではないかなあと。
absfilter.el(142行目): (let ((msgs (mew-absfilter-collect-message-region begin end))
すいません。帰省します。
ReplyDelete調査と返事は、8/20 以降になります。ごめんなさい。
遅くなりましたが、パッチを書きました。お試し下さい。
ReplyDelete- clmemo@aka: mew-absfilter 1.37 へのパッチ その三