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から返されるリストの解釈でも拡張子を考慮していないような...。
返信削除不具合をお知らせ下さり、ありがとうございます。
返信削除確認ですが、最新の Mew で
(setq mew-use-suffix ".eml")
と設定して、問題が起きるということですね。
調べてみますので、少々お待ち下さい。
@aka です。
返信削除拡張子をつける設定を次のようにしてみても、同じ問題が起きますか?
(setq mew-use-suffix t
mew-suffix ".eml")
ありがとうございます。
返信削除.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))
すいません。帰省します。
返信削除調査と返事は、8/20 以降になります。ごめんなさい。
遅くなりましたが、パッチを書きました。お試し下さい。
返信削除- clmemo@aka: mew-absfilter 1.37 へのパッチ その三