X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=wl%2Fwl-spam.el;h=ad1febc8b7ab5dc680ab399ec7d8d3655b0bae7f;hb=62345218eb5ad2b29ace6731bbddf1d3fe787c3c;hp=0b47a2db118b49c103073a31b58ded3281f17b0c;hpb=a34d8cf7782b43376470c9cef36d73e7a315312a;p=elisp%2Fwanderlust.git diff --git a/wl/wl-spam.el b/wl/wl-spam.el index 0b47a2d..ad1febc 100644 --- a/wl/wl-spam.el +++ b/wl/wl-spam.el @@ -41,7 +41,7 @@ "Spam configuration for wanderlust." :group 'wl) -(defcustom wl-spam-folder-name "+spam" +(defcustom wl-spam-folder "+spam" "*Spam folder." :type 'string :group 'wl-spam) @@ -59,13 +59,14 @@ :type '(repeat (regexp :tag "Folder Regexp")) :group 'wl-spam) -(defcustom wl-spam-auto-check-folder-regexp-list '("[+.]inbox") +(defcustom wl-spam-auto-check-folder-regexp-list nil "*List of Folder regexp which check spam automatically." :type '(repeat (regexp :tag "Folder Regexp")) :group 'wl-spam) (defcustom wl-spam-auto-check-marks - (list wl-summary-new-mark) + (list wl-summary-new-uncached-mark + wl-summary-new-cached-mark) "Persistent marks to check spam automatically." :type '(choice (const :tag "All marks" all) (repeat (string :tag "Mark"))) @@ -101,8 +102,8 @@ See `wl-summary-mark-action-list' for the detail of element." (string :tag "Document string")) :group 'wl-spam) -(defun wl-spam-folder-guess-domain (folder-name) - (cond ((string= folder-name wl-spam-folder-name) +(defun wl-spam-domain (folder-name) + (cond ((string= folder-name wl-spam-folder) 'spam) ((wl-string-match-member folder-name wl-spam-undecided-folder-regexp-list) @@ -151,8 +152,9 @@ See `wl-summary-mark-action-list' for the detail of element." (defun wl-spam-save-status (&optional force) (interactive "P") - (let ((processor (elmo-spam-processor))) - (when (or force (elmo-spam-modified-p processor)) + (let ((processor (elmo-spam-processor (not force)))) + (when (or force + (and processor (elmo-spam-modified-p processor))) (elmo-spam-save-status processor)))) ;; insinuate into summary mode @@ -196,11 +198,12 @@ See `wl-summary-mark-action-list' for the detail of element." (when (wl-spam-auto-check-message-p wl-summary-buffer-elmo-folder number) (setq numbers (cons number numbers))))) - (if numbers - (wl-spam-map-spam-messages wl-summary-buffer-elmo-folder - numbers - #'wl-summary-spam) - (message "No message to test.")))) + (cond (numbers + (wl-spam-map-spam-messages wl-summary-buffer-elmo-folder + numbers + #'wl-summary-spam)) + ((interactive-p) + (message "No message to test."))))) (defun wl-summary-register-as-spam () (interactive) @@ -257,43 +260,55 @@ See `wl-summary-mark-action-list' for the detail of element." (wl-summary-mark-spam))) (defun wl-summary-exec-action-spam (mark-list) - (let ((folder wl-summary-buffer-elmo-folder) + (let ((domain (wl-spam-domain (elmo-folder-name-internal + wl-summary-buffer-elmo-folder))) (total (length mark-list))) - (when (eq (wl-spam-folder-guess-domain (elmo-folder-name-internal folder)) - 'undecided) + (wl-folder-confirm-existence (elmo-make-folder wl-spam-folder)) + (when (memq domain '(undecided good)) (message "Registering spam...") (elmo-with-progress-display (> total elmo-display-progress-threshold) (elmo-spam-register total "Registering spam...") (elmo-spam-register-spam-messages (elmo-spam-processor) - folder - (mapcar #'car mark-list))) + wl-summary-buffer-elmo-folder + (mapcar #'car mark-list) + (eq domain 'good))) (message "Registering spam...done")) (wl-summary-move-mark-list-messages mark-list - wl-spam-folder-name + wl-spam-folder "Refiling spam..."))) (defun wl-summary-exec-action-refile-with-register (mark-list) - (let ((processor (elmo-spam-processor)) - (folder wl-summary-buffer-elmo-folder) - spam-list good-list total) - (when (eq (wl-spam-folder-guess-domain - (elmo-folder-name-internal folder)) - 'undecided) - (message "Registering spam...") + (let* ((processor (elmo-spam-processor)) + (folder wl-summary-buffer-elmo-folder) + (domain (wl-spam-domain (elmo-folder-name-internal folder))) + spam-list good-list total) + (unless (eq domain 'ignore) (dolist (info mark-list) - (case (wl-spam-folder-guess-domain (nth 2 info)) + (case (wl-spam-domain (nth 2 info)) (spam (setq spam-list (cons (car info) spam-list))) (good (setq good-list (cons (car info) good-list))))) - (setq total (+ (length spam-list) (length good-list))) - (elmo-with-progress-display (> total elmo-display-progress-threshold) - (elmo-spam-register total "Registering spam...") + (case domain + (spam (setq spam-list nil)) + (good (setq good-list nil))) + (when (or spam-list good-list) (when spam-list - (elmo-spam-register-spam-messages processor folder spam-list)) + (setq total (length spam-list)) + (message "Registering spam...") + (elmo-with-progress-display (> total elmo-display-progress-threshold) + (elmo-spam-register total "Registering spam...") + (elmo-spam-register-spam-messages processor folder spam-list + (eq domain 'good))) + (message "Registering spam...done")) (when good-list - (elmo-spam-register-good-messages processor folder good-list))) - (message "Registering spam...done")) + (setq total (length good-list)) + (message "Registering good...") + (elmo-with-progress-display (> total elmo-display-progress-threshold) + (elmo-spam-register total "Registering good...") + (elmo-spam-register-good-messages processor folder good-list + (eq domain 'spam))) + (message "Registering good...done")))) ;; execute refile messages (wl-summary-exec-action-refile mark-list))) @@ -302,20 +317,28 @@ See `wl-summary-mark-action-list' for the detail of element." (number wl-message-buffer-cur-number) spam) (message "Cheking spam...") - (when (elmo-spam-buffer-spam-p (elmo-spam-processor) original) + (when (setq spam (elmo-spam-buffer-spam-p (elmo-spam-processor) original)) (with-current-buffer wl-message-buffer-cur-summary-buffer (wl-summary-spam number))) (message "Cheking spam...done") - (when (interactive-p) - (message "No: %d is %sa spam message." number (if spam "" "not "))))) + (message "No: %d is %sa spam message." number (if spam "" "not ")))) (defun wl-refile-guess-by-spam (entity) (when (elmo-spam-message-spam-p (elmo-spam-processor) wl-summary-buffer-elmo-folder (elmo-message-entity-number entity)) - wl-spam-folder-name)) + wl-spam-folder)) (defun wl-spam-setup () + (add-hook 'wl-summary-prepared-hook #'wl-summary-auto-check-spam) + (let ((actions wl-summary-mark-action-list) + action) + (while actions + (setq action (car actions) + actions (cdr actions)) + (when (eq (wl-summary-action-symbol action) 'refile) + (setcar (nthcdr 4 action) 'wl-summary-exec-action-refile-with-register) + (setq actions nil)))) (when wl-spam-mark-action-list (setq wl-summary-mark-action-list (append wl-summary-mark-action-list @@ -328,8 +351,12 @@ See `wl-summary-mark-action-list' for the detail of element." (cons (wl-summary-action-mark action) wl-summary-skip-mark-list)))) (define-key wl-summary-mode-map "k" wl-summary-spam-map) - (define-key wl-summary-mode-map "ms" 'wl-summary-target-mark-register-as-spam) - (define-key wl-summary-mode-map "mn" 'wl-summary-target-mark-register-as-good)) + (define-key + wl-summary-mode-map "mk" 'wl-summary-target-mark-spam) + (define-key + wl-summary-mode-map "ms" 'wl-summary-target-mark-register-as-spam) + (define-key + wl-summary-mode-map "mn" 'wl-summary-target-mark-register-as-good)) (require 'product) (product-provide (provide 'wl-spam) (require 'wl-version))