* wl-demo.el (wl-demo-insert-image): Make Emacs 21 use BITMAP-MULE for xbm if
[elisp/wanderlust.git] / wl / wl-score.el
index 5f02548..1826640 100644 (file)
@@ -1,7 +1,7 @@
-;;; wl-score.el -- Scoring in Wanderlust.
+;;; wl-score.el --- Scoring in Wanderlust.
 
-;; Copyright 1998,1999,2000 Masahiro MURATA <muse@ba2.so-net.ne.jp>
-;;                          Yuuichi Teranishi <teranisi@gohome.org>
+;; Copyright (C) 1998,1999,2000 Masahiro MURATA <muse@ba2.so-net.ne.jp>
+;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
 
 ;; Author: Masahiro MURATA <muse@ba2.so-net.ne.jp>
 ;; Keywords: mail, net news
 ;; Original codes are gnus-score.el and score-mode.el
 
 ;;; Code:
-;; 
+;;
 
 
 (require 'wl-vars)
 (require 'wl-util)
 (eval-when-compile
-  (provide 'elmo-msgdb))
+  (require 'elmo-msgdb))               ; for inline functions
 
 (defvar wl-score-edit-header-char
   '((?a "from" nil string)
 (defvar wl-score-header-buffer-list nil)
 (defvar wl-score-alike-hashtb nil)
 
-(defvar wl-score-edit-exit-func nil
+(defvar wl-score-edit-exit-function nil
   "Function run on exit from the score buffer.")
 
-(mapcar 
- (function make-variable-buffer-local)
- (list 'wl-current-score-file
-       'wl-score-alist))
+(make-variable-buffer-local 'wl-current-score-file)
+(make-variable-buffer-local 'wl-score-alist)
 
-;; Utility functions 
+;; Utility functions
 
 (defun wl-score-simplify-buffer-fuzzy ()
   "Simplify string in the buffer fuzzily.
@@ -117,19 +115,18 @@ The string in the accessible portion of the current buffer is simplified.
 It is assumed to be a single-line subject.
 Whitespace is generally cleaned up, and miscellaneous leading/trailing
 matter is removed.  Additional things can be deleted by setting
-wl-score-simplify-fuzzy-regexp."
-  (let ((case-fold-search t)
-       (modified-tick))
+`wl-score-simplify-fuzzy-regexp'."
+  (let ((regexp
+        (if (listp wl-score-simplify-fuzzy-regexp)
+            (mapconcat (function identity) wl-score-simplify-fuzzy-regexp
+                       "\\|")
+          wl-score-simplify-fuzzy-regexp))
+       (case-fold-search t)
+       modified-tick)
     (elmo-buffer-replace "\t" " ")
     (while (not (eq modified-tick (buffer-modified-tick)))
       (setq modified-tick (buffer-modified-tick))
-      (cond
-       ((listp wl-score-simplify-fuzzy-regexp)
-       (mapcar 'elmo-buffer-replace
-               wl-score-simplify-fuzzy-regexp))
-       (wl-score-simplify-fuzzy-regexp
-       (elmo-buffer-replace
-        wl-score-simplify-fuzzy-regexp)))
+      (elmo-buffer-replace regexp)
       (elmo-buffer-replace "^ *\\[[-+?*!][-+?*!]\\] *")
       (elmo-buffer-replace
        "^ *\\(re\\|fw\\|fwd\\|forward\\)[[{(^0-9]*[])}]?[:;] *")
@@ -140,7 +137,7 @@ wl-score-simplify-fuzzy-regexp."
     (elmo-buffer-replace "^ +")))
 
 (defun wl-score-simplify-string-fuzzy (string)
-  "Simplify a string fuzzily.
+  "Simplify a STRING fuzzily.
 See `wl-score-simplify-buffer-fuzzy' for details."
   (elmo-set-work-buf
    (let ((case-fold-search t))
@@ -149,16 +146,17 @@ See `wl-score-simplify-buffer-fuzzy' for details."
      (buffer-string))))
 
 (defun wl-score-simplify-subject (subject)
+  "Simplify a SUBJECT fuzzily.
+Remove Re, Was, Fwd etc."
   (elmo-set-work-buf
-   (let ((case-fold-search t))
+   (let ((regexp
+         (if (listp wl-score-simplify-fuzzy-regexp)
+             (mapconcat (function identity) wl-score-simplify-fuzzy-regexp
+                        "\\|")
+           wl-score-simplify-fuzzy-regexp))
+        (case-fold-search t))
      (insert subject)
-     (cond
-      ((listp wl-score-simplify-fuzzy-regexp)
-       (mapcar 'elmo-buffer-replace
-              wl-score-simplify-fuzzy-regexp))
-      (wl-score-simplify-fuzzy-regexp
-       (elmo-buffer-replace
-       wl-score-simplify-fuzzy-regexp)))
+     (elmo-buffer-replace regexp)
      (elmo-buffer-replace
       "^[ \t]*\\(re\\|was\\|fw\\|fwd\\|forward\\)[:;][ \t]*")
      (buffer-string))))
@@ -216,12 +214,14 @@ See `wl-score-simplify-buffer-fuzzy' for details."
     (sort messages func)))
 
 (defsubst wl-score-get (symbol &optional alist)
+  "Get SYMBOL's definition in ALIST."
   ;; Get SYMBOL's definition in ALIST.
   (cdr (assoc symbol
              (or alist
                  wl-score-alist))))
 
 (defun wl-score-set (symbol value &optional alist warn)
+  "Set SYMBOL to VALUE in ALIST."
   ;; Set SYMBOL to VALUE in ALIST.
   (let* ((alist (or alist wl-score-alist))
         (entry (assoc symbol alist)))
@@ -238,6 +238,8 @@ See `wl-score-simplify-buffer-fuzzy' for details."
                   (cons (cons symbol value) (cdr alist)))))))
 
 (defun wl-score-cache-clean ()
+  "Cleaning score cache.
+Set `wl-score-cache' nil."
   (interactive)
   (setq wl-score-cache nil))
 
@@ -264,6 +266,7 @@ See `wl-score-simplify-buffer-fuzzy' for details."
          (setq wl-score-alist alist)))))))
 
 (defun wl-score-save ()
+  "Save all score information."
   ;; Save all score information.
   (let ((cache wl-score-cache)
        entry score file dir)
@@ -307,12 +310,12 @@ See `wl-score-simplify-buffer-fuzzy' for details."
                (or (and (string-match
                          (concat "^" (regexp-quote
                                       (expand-file-name
-                                       wl-score-files-dir)))
+                                       wl-score-files-directory)))
                          (expand-file-name file))
                         file)
                    (expand-file-name
                     file
-                    (file-name-as-directory wl-score-files-dir)))))
+                    (file-name-as-directory wl-score-files-directory)))))
         (cached (assoc file wl-score-cache))
         alist)
     (if cached
@@ -334,21 +337,6 @@ See `wl-score-simplify-buffer-fuzzy' for details."
     (setq wl-current-score-file file)
     (setq wl-score-alist alist)))
 
-(defun wl-score-guess-like-gnus (folder)
-  (let* (score-list
-         (spec (elmo-folder-get-spec folder))
-         (method (symbol-name (car spec)))
-         (fld-name (car (cdr spec))))
-    (when (stringp fld-name)
-      (while (string-match "[\\/:,;*?\"<>|]" fld-name)
-        (setq fld-name (replace-match "." t nil fld-name)))
-      (setq score-list (list (concat method "@" fld-name ".SCORE")))
-      (while (string-match "[\\/.][^\\/.]*$" fld-name)
-        (setq fld-name (substring fld-name 0 (match-beginning 0)))
-        (wl-append score-list (list (concat method "@" fld-name
-                                            ".all.SCORE"))))
-      score-list)))
-
 (defun wl-score-get-score-files (score-alist folder)
   (let ((files (wl-get-assoc-list-value
                score-alist folder
@@ -359,15 +347,13 @@ See `wl-score-simplify-buffer-fuzzy' for details."
        fl
        (cond ((functionp f)
              (funcall f  folder))
-            ((and (symbolp f) (eq f 'guess))
-              (wl-score-guess-like-gnus folder))
             (t
              (list f)))))
     fl))
 
 (defun wl-score-get-score-alist (&optional folder)
   (interactive)
-  (let* ((fld (or folder wl-summary-buffer-folder-name))
+  (let* ((fld (or folder (wl-summary-buffer-folder-name)))
         (score-alist (reverse
                       (wl-score-get-score-files wl-score-folder-alist fld)))
         alist scores)
@@ -388,12 +374,13 @@ See `wl-score-simplify-buffer-fuzzy' for details."
       (let ((mark (car (wl-score-get 'mark alist)))
            (expunge (car (wl-score-get 'expunge alist)))
            (mark-and-expunge (car (wl-score-get 'mark-and-expunge alist)))
-           (temp (car (wl-score-get 'temp alist)))
+           (temp (car (wl-score-get 'temp alist))) ; obsolate
+           (target (car (wl-score-get 'target alist)))
            (important (car (wl-score-get 'important alist))))
        (setq wl-summary-important-above
              (or important wl-summary-important-above))
-       (setq wl-summary-temp-above
-             (or temp wl-summary-temp-above))
+       (setq wl-summary-target-above
+             (or target temp wl-summary-target-above))
        (setq wl-summary-mark-below
              (or mark mark-and-expunge wl-summary-mark-below))
        (setq wl-summary-expunge-below
@@ -408,9 +395,9 @@ See `wl-score-simplify-buffer-fuzzy' for details."
         (expire (and wl-score-expiry-days
                      (- now wl-score-expiry-days)))
         (overview (elmo-msgdb-get-overview
-                   (or msgdb wl-summary-buffer-msgdb)))
+                   (or msgdb (wl-summary-buffer-msgdb))))
         (mark-alist (elmo-msgdb-get-mark-alist
-                     (or msgdb wl-summary-buffer-msgdb)))
+                     (or msgdb (wl-summary-buffer-msgdb))))
         (wl-score-stop-add-entry not-add)
         entries
         news new num entry ov header)
@@ -465,9 +452,8 @@ See `wl-score-simplify-buffer-fuzzy' for details."
        (setq wl-scores-messages (cdr wl-scores-messages))))
     (message "Scoring...done")
     ;; Remove buffers.
-    (mapcar '(lambda (x) (elmo-kill-buffer x))
-           wl-score-header-buffer-list)
-    (setq wl-score-header-buffer-list nil)))
+    (while wl-score-header-buffer-list
+      (elmo-kill-buffer (pop wl-score-header-buffer-list)))))
 
 (defun wl-score-integer (scores header now expire)
   (let ((wl-score-index (nth 2 (assoc header wl-score-header-index)))
@@ -561,11 +547,6 @@ See `wl-score-simplify-buffer-fuzzy' for details."
          (setq entries rest)))))
   nil)
 
-(defsubst wl-score-lines ()
-  (save-excursion
-    (beginning-of-line)
-    (count-lines 1 (point))))
-
 (defun wl-score-extra (scores header now expire)
   (let ((score-list scores)
        entries alist extra extras)
@@ -583,17 +564,13 @@ See `wl-score-simplify-buffer-fuzzy' for details."
     nil))
 
 (defmacro wl-score-put-alike ()
-  (` (elmo-set-hash-val (format "#%d" (wl-score-lines))
+  (` (elmo-set-hash-val (format "#%d" (wl-count-lines))
                        alike
                        wl-score-alike-hashtb)))
-;;(push (cons (wl-score-lines) alike) wl-score-alike-alist)
-;;(put-text-property (1- (point)) (point) 'messages alike)
 
 (defmacro wl-score-get-alike ()
-  (` (elmo-get-hash-val (format "#%d" (wl-score-lines))
+  (` (elmo-get-hash-val (format "#%d" (wl-count-lines))
                        wl-score-alike-hashtb)))
-;;(cdr (assq (wl-score-lines) wl-score-alike-alist))
-;;(get-text-property (point) 'messages)))
 
 (defun wl-score-insert-header (header messages &optional extra-header)
   (let ((mime-decode (nth 3 (assoc header wl-score-header-index)))
@@ -637,6 +614,7 @@ See `wl-score-simplify-buffer-fuzzy' for details."
            (eword-decode-region (point-min) (point-max))))))))
 
 (defun wl-score-string (scores header now expire &optional extra-header)
+  "Insert the unique message headers in the buffer."
   ;; Insert the unique message headers in the buffer.
   (let ((wl-score-index (nth 2 (assoc header wl-score-header-index)))
        entries alist messages
@@ -691,7 +669,7 @@ See `wl-score-simplify-buffer-fuzzy' for details."
                          (and (eolp)
                               (= (save-excursion (forward-line 0) (point))
                                  (match-beginning 0))))
-                 ;;(end-of-line)
+;;;              (end-of-line)
                  (setq found (setq arts (wl-score-get-alike)))
                  ;; Found a match, update scores.
                  (while (setq art (pop arts))
@@ -756,6 +734,7 @@ See `wl-score-simplify-buffer-fuzzy' for details."
   (wl-score-followup scores header now expire t))
 
 (defun wl-score-followup (scores header now expire &optional thread)
+  "Insert the unique message headers in the buffer."
   ;; Insert the unique message headers in the buffer.
   (let ((wl-score-index (nth 2 (assoc header wl-score-header-index)))
        (all-scores scores)
@@ -795,7 +774,7 @@ See `wl-score-simplify-buffer-fuzzy' for details."
                      (and (eolp)
                           (= (progn (beginning-of-line) (point))
                              (match-beginning 0))))
-             ;;(end-of-line)
+;;;          (end-of-line)
              (setq found (setq arts (wl-score-get-alike)))
              ;; Found a match, update scores.
              (while (setq art (pop arts))
@@ -880,7 +859,7 @@ See `wl-score-simplify-buffer-fuzzy' for details."
 (defun wl-score-change-score-file (file)
   "Change current score alist."
   (interactive
-   (list (read-file-name "Change to score file: " wl-score-files-dir)))
+   (list (read-file-name "Change to score file: " wl-score-files-directory)))
   (wl-score-load-file file))
 
 (defun wl-score-default (level)
@@ -947,11 +926,11 @@ See `wl-score-simplify-buffer-fuzzy' for details."
         (expire (and wl-score-expiry-days
                      (- now wl-score-expiry-days)))
         (roverview (reverse (elmo-msgdb-get-overview
-                             wl-summary-buffer-msgdb)))
+                             (wl-summary-buffer-msgdb))))
         msgs)
     (if (not expire)
        (mapcar 'car (elmo-msgdb-get-number-alist
-                     wl-summary-buffer-msgdb)) ;; all messages
+                     (wl-summary-buffer-msgdb))) ;; all messages
       (catch 'break
        (while roverview
          (if (< (wl-day-number
@@ -967,8 +946,8 @@ See `wl-score-simplify-buffer-fuzzy' for details."
   (let ((num (wl-summary-message-number)))
     (if num
        (assoc (cdr (assq num (elmo-msgdb-get-number-alist
-                              wl-summary-buffer-msgdb)))
-              (elmo-msgdb-get-overview wl-summary-buffer-msgdb)))))
+                              (wl-summary-buffer-msgdb))))
+              (elmo-msgdb-get-overview (wl-summary-buffer-msgdb))))))
 
 (defun wl-score-get-header (header &optional extra)
   (let ((index (nth 2 (assoc header wl-score-header-index)))
@@ -1015,19 +994,20 @@ See `wl-score-simplify-buffer-fuzzy' for details."
          (setq format (concat "%c: %-" (int-to-string pad) "s"))
          (insert (format format (caar alist) (nth idx (car alist))))
          (setq alist (cdr alist))
-         (setq i (1+ i))
-         (set-buffer-modified-p nil)))
-      (when (and (get-buffer wl-message-buf-name)
-                (setq mes-win (get-buffer-window
-                               (get-buffer wl-message-buf-name))))
-       (select-window mes-win)
-       (unless (eq (next-window) cur-win)
-         (delete-window (next-window))))
-      (split-window)
-      (pop-to-buffer "*Score Help*")
-      (let ((window-min-height 1))
-       (shrink-window-if-larger-than-buffer))
-      (select-window cur-win))))
+         (setq i (1+ i)))
+       (set-buffer-modified-p nil)))
+    (when (and wl-message-buffer
+              (get-buffer wl-message-buffer)
+              (setq mes-win (get-buffer-window
+                             (get-buffer wl-message-buffer))))
+      (select-window mes-win)
+      (unless (eq (next-window) cur-win)
+       (delete-window (next-window))))
+    (split-window)
+    (pop-to-buffer "*Score Help*")
+    (let ((window-min-height 1))
+      (shrink-window-if-larger-than-buffer))
+    (select-window cur-win)))
 
 (defun wl-score-get-header-entry (&optional match-func increase)
   (let (hchar tchar pchar
@@ -1110,8 +1090,9 @@ See `wl-score-simplify-buffer-fuzzy' for details."
 
          ;; read the score.
          (unless (or score increase)
-           (setq score (string-to-int (read-string "Set score: "))))
-         (message "")))
+           (setq score (string-to-int (read-string "Set score: ")))))
+      (message "")
+      (wl-score-kill-help-buffer))
 
     (let* ((match-header (or (nth 2 hentry) header))
           (match (if match-func
@@ -1190,7 +1171,7 @@ See `wl-score-simplify-buffer-fuzzy' for details."
 (defun wl-summary-rescore-msgs (number-alist)
   (mapcar
    'car
-   (nthcdr 
+   (nthcdr
     (max (- (length number-alist)
            wl-summary-rescore-partial-threshold)
         0)
@@ -1203,12 +1184,12 @@ See `wl-score-simplify-buffer-fuzzy' for details."
     (wl-score-save)
     (setq wl-score-cache nil)
     (setq wl-summary-scored nil)
-    (setq number-alist (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb))
-    (wl-summary-score-headers nil wl-summary-buffer-msgdb
+    (setq number-alist (elmo-msgdb-get-number-alist (wl-summary-buffer-msgdb)))
+    (wl-summary-score-headers nil (wl-summary-buffer-msgdb)
                              (unless arg
                                (wl-summary-rescore-msgs number-alist)))
     (setq expunged (wl-summary-score-update-all-lines t))
-    (if expunged 
+    (if expunged
        (message "%d message(s) are expunged by scoring." (length expunged)))
     (set-buffer-modified-p nil)))
 
@@ -1216,14 +1197,13 @@ See `wl-score-simplify-buffer-fuzzy' for details."
 (defun wl-summary-score-headers (&optional folder msgdb force-msgs not-add)
   "Do scoring if scoring is required."
   (let ((scores (wl-score-get-score-alist
-                (or folder wl-summary-buffer-folder-name))))
+                (or folder (wl-summary-buffer-folder-name)))))
     (when scores
       (wl-score-headers scores msgdb force-msgs not-add))))
 
 (defun wl-summary-score-update-all-lines (&optional update)
   (let* ((alist wl-summary-scored)
         (count (length alist))
-        (folder wl-summary-buffer-folder-name)
         (i 0)
         (update-unread nil)
         num score dels visible score-mark mark-alist)
@@ -1234,7 +1214,7 @@ See `wl-score-simplify-buffer-fuzzy' for details."
              score (cdar alist))
        (when wl-score-debug
          (message "Scored %d with %d" score num)
-         (wl-push (list (elmo-string wl-summary-buffer-folder-name) num score)
+         (wl-push (list (elmo-string (wl-summary-buffer-folder-name)) num score)
                wl-score-trace))
        (setq score-mark (wl-summary-get-score-mark num))
        (and (setq visible (wl-summary-jump-to-msg num))
@@ -1244,50 +1224,49 @@ See `wl-score-simplify-buffer-fuzzy' for details."
               (wl-push num dels))
              ((< score wl-summary-mark-below)
               (if visible
-                  (wl-summary-mark-as-read
-                   t nil nil nil (elmo-use-cache-p folder num));; opened
+                  (wl-summary-mark-as-read t); opened
                 (setq update-unread t)
-                (wl-thread-msg-mark-as-read num)));; closed
+                (wl-summary-mark-as-read t nil nil num))) ; closed
              ((and wl-summary-important-above
                    (> score wl-summary-important-above))
               (if (wl-thread-jump-to-msg num);; force open
                   (wl-summary-mark-as-important num " ")))
-             ((and wl-summary-temp-above
-                   (> score wl-summary-temp-above))
+             ((and wl-summary-target-above
+                   (> score wl-summary-target-above))
               (if visible
                   (wl-summary-mark-line "*"))
               (setq wl-summary-buffer-target-mark-list
                     (cons num wl-summary-buffer-target-mark-list))))
-       (setq i (1+ i))
-       (and (zerop (% i 10))
-            (message "Updating score...%d%%" (/ (* i 100) count)))
-       (setq alist (cdr alist)))
+       (setq alist (cdr alist))
+       (when (> count elmo-display-progress-threshold)
+         (setq i (1+ i))
+         (elmo-display-progress
+          'wl-summary-score-update-all-lines "Updating score..."
+          (/ (* i 100) count))))
       (when dels
-;      (elmo-msgdb-delete-msgs wl-summary-buffer-folder-name
-;                              dels wl-summary-buffer-msgdb t)
-       ;; mark as read.
-       (setq mark-alist (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb))
-       (mapcar (function (lambda (x)
-                           (setq mark-alist 
-                                 (elmo-msgdb-mark-set mark-alist x nil))))
-               dels)
-       (elmo-mark-as-read wl-summary-buffer-folder-name
-                          dels wl-summary-buffer-msgdb)
-       (elmo-msgdb-set-mark-alist wl-summary-buffer-msgdb mark-alist)
+       (setq mark-alist
+             (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb)))
+       (let ((marks dels))
+         (while marks
+           (setq mark-alist
+                 (elmo-msgdb-mark-set mark-alist (pop marks) nil))))
+       (elmo-folder-mark-as-read wl-summary-buffer-elmo-folder
+                                 dels)
+       (elmo-msgdb-set-mark-alist (wl-summary-buffer-msgdb) mark-alist)
        (wl-summary-delete-messages-on-buffer dels))
       (when (and update update-unread)
        (let ((num-db (elmo-msgdb-get-number-alist
-                      wl-summary-buffer-msgdb))
+                      (wl-summary-buffer-msgdb)))
              (mark-alist (elmo-msgdb-get-mark-alist
-                          wl-summary-buffer-msgdb)))
+                          (wl-summary-buffer-msgdb))))
          ;; Update Folder mode
-         (wl-folder-set-folder-updated wl-summary-buffer-folder-name
+         (wl-folder-set-folder-updated (wl-summary-buffer-folder-name)
                                        (list 0
-                                             (wl-summary-count-unread 
+                                             (wl-summary-count-unread
                                               mark-alist)
                                              (length num-db)))
          (wl-summary-update-modeline)))
-      (message "Updating score...done.")
+      (message "Updating score...done")
       dels)))
 
 (defun wl-score-edit-done ()
@@ -1306,9 +1285,9 @@ See `wl-score-simplify-buffer-fuzzy' for details."
     (call-interactively 'wl-score-edit-file)))
 
 (defun wl-score-edit-file (file)
-  "Edit a score file."
+  "Edit a score FILE."
   (interactive
-   (list (read-file-name "Edit score file: " wl-score-files-dir)))
+   (list (read-file-name "Edit score file: " wl-score-files-directory)))
   (when (wl-collect-summary)
     (wl-score-save))
   (let ((winconf (current-window-configuration))
@@ -1316,16 +1295,15 @@ See `wl-score-simplify-buffer-fuzzy' for details."
                       (find-file-noselect file)))
        (sum-buf (current-buffer)))
     (if (string-match (concat "^" wl-summary-buffer-name) (buffer-name))
-       (let ((cur-buf (current-buffer))
-             (view-message-buffer (get-buffer wl-message-buf-name)))
-         (when view-message-buffer
-           (wl-select-buffer view-message-buffer)
+       (let ((cur-buf (current-buffer)))
+         (when wl-message-buffer
+           (wl-message-select-buffer wl-message-buffer)
            (delete-window)
            (select-window (get-buffer-window cur-buf)))
-         (wl-select-buffer edit-buffer))
+         (wl-message-select-buffer edit-buffer))
       (switch-to-buffer edit-buffer))
     (wl-score-mode)
-    (setq wl-score-edit-exit-func 'wl-score-edit-done)
+    (setq wl-score-edit-exit-function 'wl-score-edit-done)
     (setq wl-score-edit-summary-buffer sum-buf)
     (make-local-variable 'wl-prev-winconf)
     (setq wl-prev-winconf winconf))
@@ -1378,7 +1356,7 @@ Entering Score mode calls the value of `wl-score-mode-hook'."
   (setq major-mode 'wl-score-mode)
   (setq mode-name "Score")
   (lisp-mode-variables nil)
-  (make-local-variable 'wl-score-edit-exit-func)
+  (make-local-variable 'wl-score-edit-exit-function)
   (make-local-variable 'wl-score-edit-summary-buffer)
   (run-hooks 'emacs-lisp-mode-hook 'wl-score-mode-hook))
 
@@ -1410,8 +1388,8 @@ Entering Score mode calls the value of `wl-score-mode-hook'."
     (wl-as-mime-charset wl-score-mode-mime-charset
       (save-buffer)))
   (let ((buf (current-buffer)))
-    (when wl-score-edit-exit-func
-      (funcall wl-score-edit-exit-func))
+    (when wl-score-edit-exit-function
+      (funcall wl-score-edit-exit-function))
     (kill-buffer buf)))
 
 (defun wl-score-edit-kill ()
@@ -1419,8 +1397,8 @@ Entering Score mode calls the value of `wl-score-mode-hook'."
   (interactive)
   (let ((buf (current-buffer)))
     (set-buffer-modified-p nil)
-    (when wl-score-edit-exit-func
-      (funcall wl-score-edit-exit-func))
+    (when wl-score-edit-exit-function
+      (funcall wl-score-edit-exit-function))
     (kill-buffer buf)))
 
 (defun wl-score-edit-get-summary-buf ()
@@ -1471,6 +1449,7 @@ Entering Score mode calls the value of `wl-score-mode-hook'."
                                    wl-score-edit-header-char))
            (error "Invalid match type")))
       (message "")
+      (wl-score-kill-help-buffer)
       (let* ((header (nth 1 entry))
             (value (wl-score-edit-get-header header)))
        (and value (prin1 value (current-buffer)))))))
@@ -1493,6 +1472,7 @@ Entering Score mode calls the value of `wl-score-mode-hook'."
        (pp form (current-buffer)))
       (goto-char (point-min)))))
 
-(provide 'wl-score)
+(require 'product)
+(product-provide (provide 'wl-score) (require 'wl-version))
 
 ;;; wl-score.el ends here