X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=wl%2Fwl-summary.el;h=167debfd89acd7001e1573c18d80a5cddfaab1bc;hb=ed35820cac6679c9e1b94da35d18cc9e0dc55c29;hp=b818b8af02fb68a6c744c823ad9d20b2e71865b1;hpb=c00a3ca7411d4b3fd64195ee7e501b2926215a87;p=elisp%2Fwanderlust.git diff --git a/wl/wl-summary.el b/wl/wl-summary.el index b818b8a..167debf 100644 --- a/wl/wl-summary.el +++ b/wl/wl-summary.el @@ -60,6 +60,7 @@ (defvar dragdrop-drop-functions) (defvar scrollbar-height) (defvar mail-reply-buffer) +(defvar elmo-global-flags) (defvar wl-summary-buffer-name "Summary") (defvar wl-summary-mode-map nil) @@ -96,7 +97,6 @@ (defvar wl-summary-buffer-thread-nodes nil) (defvar wl-summary-buffer-target-mark-list nil) (defvar wl-summary-buffer-prev-refile-destination nil) -(defvar wl-summary-buffer-prev-copy-destination nil) (defvar wl-summary-buffer-saved-message nil) (defvar wl-summary-buffer-prev-folder-function nil) (defvar wl-summary-buffer-next-folder-function nil) @@ -109,6 +109,9 @@ (defvar wl-summary-buffer-line-format nil) (defvar wl-summary-buffer-mode-line-formatter nil) (defvar wl-summary-buffer-mode-line nil) +(defvar wl-summary-buffer-display-mime-mode 'mime) +(defvar wl-summary-buffer-display-all-header nil) +(defvar wl-summary-buffer-event-handler nil) (defvar wl-thread-indent-level-internal nil) (defvar wl-thread-have-younger-brother-str-internal nil) @@ -182,6 +185,9 @@ (make-variable-buffer-local 'wl-summary-buffer-line-format) (make-variable-buffer-local 'wl-summary-buffer-mode-line-formatter) (make-variable-buffer-local 'wl-summary-buffer-mode-line) +(make-variable-buffer-local 'wl-summary-buffer-display-mime-mode) +(make-variable-buffer-local 'wl-summary-buffer-display-all-header) +(make-variable-buffer-local 'wl-summary-buffer-event-handler) (defvar wl-datevec) (defvar wl-thr-indent-string) @@ -251,7 +257,7 @@ See also variable `wl-use-petname'." string) string)) -(defvar wl-summary-sort-specs '(number date subject from list-info)) +(defvar wl-summary-sort-specs '(number date subject from list-info size)) (defvar wl-summary-default-sort-spec 'date) (defvar wl-summary-mode-menu-spec @@ -279,6 +285,7 @@ See also variable `wl-use-petname'." ["Stick" wl-summary-stick t] ("Sort" ["By Number" wl-summary-sort-by-number t] + ["By Size" wl-summary-sort-by-size t] ["By Date" wl-summary-sort-by-date t] ["By From" wl-summary-sort-by-from t] ["By Subject" wl-summary-sort-by-subject t] @@ -286,15 +293,16 @@ See also variable `wl-use-petname'." "----" ("Message Operation" ["Mark as read" wl-summary-mark-as-read t] - ["Mark as important" wl-summary-mark-as-important t] + ["Set flags" wl-summary-set-flags t] ["Mark as unread" wl-summary-mark-as-unread t] + ["Mark as answered" wl-summary-mark-as-answered t] ["Set dispose mark" wl-summary-dispose t] ["Set refile mark" wl-summary-refile t] ["Set copy mark" wl-summary-copy t] ["Set resend mark" wl-summary-resend t] - ["Prefetch" wl-summary-prefetch t] + ["Prefetch" wl-summary-prefetch t] ["Set target mark" wl-summary-target-mark t] - ["Unmark" wl-summary-unmark t] + ["Unmark" wl-summary-unmark t] ["Save" wl-summary-save t] ["Cancel posted news" wl-summary-cancel-message t] ["Supersedes message" wl-summary-supersedes-message t] @@ -307,8 +315,9 @@ See also variable `wl-use-petname'." ["Open all" wl-thread-open-all (eq wl-summary-buffer-view 'thread)] ["Close all" wl-thread-close-all (eq wl-summary-buffer-view 'thread)] ["Mark as read" wl-thread-mark-as-read (eq wl-summary-buffer-view 'thread)] - ["Mark as important" wl-thread-mark-as-important (eq wl-summary-buffer-view 'thread)] + ["Set flags" wl-thread-set-flags (eq wl-summary-buffer-view 'thread)] ["Mark as unread" wl-thread-mark-as-unread (eq wl-summary-buffer-view 'thread)] + ["Mark as answered" wl-thread-mark-as-answered (eq wl-summary-buffer-view 'thread)] ["Set delete mark" wl-thread-delete (eq wl-summary-buffer-view 'thread)] ["Set refile mark" wl-thread-refile (eq wl-summary-buffer-view 'thread)] ["Set copy mark" wl-thread-copy (eq wl-summary-buffer-view 'thread)] @@ -319,8 +328,9 @@ See also variable `wl-use-petname'." ["Execute" wl-thread-exec (eq wl-summary-buffer-view 'thread)]) ("Region Operation" ["Mark as read" wl-summary-mark-as-read-region t] - ["Mark as important" wl-summary-mark-as-important-region t] + ["Set flags" wl-summary-set-flags-region t] ["Mark as unread" wl-summary-mark-as-unread-region t] + ["Mark as answered" wl-summary-mark-as-answered-region t] ["Set dispose mark" wl-summary-dispose-region t] ["Set refile mark" wl-summary-refile-region t] ["Set copy mark" wl-summary-copy-region t] @@ -331,7 +341,7 @@ See also variable `wl-use-petname'." ["Execute" wl-summary-exec-region t]) ("Mark Operation" ["Mark as read" wl-summary-target-mark-mark-as-read t] - ["Mark as important" wl-summary-target-mark-mark-as-important t] + ["Set flags" wl-summary-target-mark-set-flags t] ["Mark as unread" wl-summary-target-mark-mark-as-unread t] ["Set delete mark" wl-summary-target-mark-delete t] ["Set refile mark" wl-summary-target-mark-refile t] @@ -377,19 +387,30 @@ See also variable `wl-use-petname'." (define-key wl-summary-mode-map [mouse-5] 'wl-summary-next) (define-key wl-summary-mode-map [S-mouse-4] 'wl-summary-up) (define-key wl-summary-mode-map [S-mouse-5] 'wl-summary-down) + ;; For Meadow2 + (define-key wl-summary-mode-map [mouse-wheel1] + 'wl-summary-wheel-dispatcher) + (define-key wl-summary-mode-map [S-mouse-wheel1] + 'wl-summary-wheel-dispatcher) (define-key wl-summary-mode-map [mouse-2] 'wl-summary-click))) (if wl-summary-mode-map () - (setq wl-summary-mode-map (make-sparse-keymap)) + (setq wl-summary-mode-map (make-keymap)) + (suppress-keymap wl-summary-mode-map) + (substitute-key-definition 'kill-buffer + 'wl-summary-mimic-kill-buffer + wl-summary-mode-map + global-map) + ;; basic commands (define-key wl-summary-mode-map " " 'wl-summary-read) (define-key wl-summary-mode-map "." 'wl-summary-redisplay) (define-key wl-summary-mode-map "<" 'wl-summary-display-top) (define-key wl-summary-mode-map ">" 'wl-summary-display-bottom) (define-key wl-summary-mode-map "\177" 'wl-summary-prev-page) (define-key wl-summary-mode-map [backspace] 'wl-summary-prev-page) - (define-key wl-summary-mode-map "\r" 'wl-summary-next-line-content) - (define-key wl-summary-mode-map "\C-m" 'wl-summary-next-line-content) + (define-key wl-summary-mode-map "\r" 'wl-summary-enter-handler) + (define-key wl-summary-mode-map "\C-m" 'wl-summary-enter-handler) (define-key wl-summary-mode-map "/" 'wl-thread-open-close) (define-key wl-summary-mode-map "[" 'wl-thread-open-all) (define-key wl-summary-mode-map "]" 'wl-thread-close-all) @@ -406,6 +427,8 @@ See also variable `wl-use-petname'." (define-key wl-summary-mode-map "\eE" 'wl-summary-resend-bounced-mail) (define-key wl-summary-mode-map "f" 'wl-summary-forward) (define-key wl-summary-mode-map "$" 'wl-summary-mark-as-important) + (define-key wl-summary-mode-map "F" 'wl-summary-set-flags) + (define-key wl-summary-mode-map "\M-k" 'wl-summary-toggle-persistent-mark) (define-key wl-summary-mode-map "&" 'wl-summary-mark-as-answered) (define-key wl-summary-mode-map "@" 'wl-summary-edit-addresses) @@ -421,8 +444,8 @@ See also variable `wl-use-petname'." (define-key wl-summary-mode-map "\C-c\C-a" 'wl-addrmgr) (define-key wl-summary-mode-map "\C-c\C-p" 'wl-summary-previous-buffer) (define-key wl-summary-mode-map "\C-c\C-n" 'wl-summary-next-buffer) - (define-key wl-summary-mode-map "H" 'wl-summary-redisplay-all-header) - (define-key wl-summary-mode-map "M" 'wl-summary-redisplay-no-mime) + (define-key wl-summary-mode-map "H" 'wl-summary-toggle-all-header) + (define-key wl-summary-mode-map "M" 'wl-summary-toggle-mime) (define-key wl-summary-mode-map "B" 'wl-summary-burst) (define-key wl-summary-mode-map "Z" 'wl-status-update) (define-key wl-summary-mode-map "#" 'wl-summary-print-message) @@ -478,12 +501,15 @@ See also variable `wl-use-petname'." (define-key wl-summary-mode-map "t*" 'wl-thread-target-mark) (define-key wl-summary-mode-map "to" 'wl-thread-refile) (define-key wl-summary-mode-map "tO" 'wl-thread-copy) + (define-key wl-summary-mode-map "t\M-o" 'wl-thread-refile-prev-destination) (define-key wl-summary-mode-map "td" 'wl-thread-dispose) (define-key wl-summary-mode-map "tD" 'wl-thread-delete) (define-key wl-summary-mode-map "t~" 'wl-thread-resend) (define-key wl-summary-mode-map "tu" 'wl-thread-unmark) (define-key wl-summary-mode-map "t!" 'wl-thread-mark-as-unread) (define-key wl-summary-mode-map "t$" 'wl-thread-mark-as-important) + (define-key wl-summary-mode-map "tF" 'wl-thread-set-flags) + (define-key wl-summary-mode-map "t&" 'wl-thread-mark-as-answered) (define-key wl-summary-mode-map "ty" 'wl-thread-save) (define-key wl-summary-mode-map "ts" 'wl-thread-set-parent) @@ -492,6 +518,7 @@ See also variable `wl-use-petname'." (define-key wl-summary-mode-map "mi" 'wl-summary-target-mark-prefetch) (define-key wl-summary-mode-map "mo" 'wl-summary-target-mark-refile) (define-key wl-summary-mode-map "mO" 'wl-summary-target-mark-copy) + (define-key wl-summary-mode-map "m\M-o" 'wl-summary-target-mark-refile-prev-destination) (define-key wl-summary-mode-map "md" 'wl-summary-target-mark-dispose) (define-key wl-summary-mode-map "mD" 'wl-summary-target-mark-delete) (define-key wl-summary-mode-map "m~" 'wl-summary-target-mark-resend) @@ -501,7 +528,9 @@ See also variable `wl-use-petname'." (define-key wl-summary-mode-map "my" 'wl-summary-target-mark-save) (define-key wl-summary-mode-map "mR" 'wl-summary-target-mark-mark-as-read) (define-key wl-summary-mode-map "m!" 'wl-summary-target-mark-mark-as-unread) + (define-key wl-summary-mode-map "m&" 'wl-summary-target-mark-mark-as-answered) (define-key wl-summary-mode-map "m$" 'wl-summary-target-mark-mark-as-important) + (define-key wl-summary-mode-map "mF" 'wl-summary-target-mark-set-flags) (define-key wl-summary-mode-map "mU" 'wl-summary-target-mark-uudecode) (define-key wl-summary-mode-map "ma" 'wl-summary-target-mark-all) (define-key wl-summary-mode-map "mt" 'wl-summary-target-mark-thread) @@ -520,12 +549,15 @@ See also variable `wl-use-petname'." (define-key wl-summary-mode-map "r*" 'wl-summary-target-mark-region) (define-key wl-summary-mode-map "ro" 'wl-summary-refile-region) (define-key wl-summary-mode-map "rO" 'wl-summary-copy-region) + (define-key wl-summary-mode-map "r\M-o" 'wl-summary-refile-prev-destination-region) (define-key wl-summary-mode-map "rd" 'wl-summary-dispose-region) (define-key wl-summary-mode-map "rD" 'wl-summary-delete-region) (define-key wl-summary-mode-map "r~" 'wl-summary-resend-region) (define-key wl-summary-mode-map "ru" 'wl-summary-unmark-region) (define-key wl-summary-mode-map "r!" 'wl-summary-mark-as-unread-region) (define-key wl-summary-mode-map "r$" 'wl-summary-mark-as-important-region) + (define-key wl-summary-mode-map "rF" 'wl-summary-set-flags-region) + (define-key wl-summary-mode-map "r&" 'wl-summary-mark-as-answered-region) (define-key wl-summary-mode-map "ry" 'wl-summary-save-region) ;; score commands @@ -553,6 +585,15 @@ See also variable `wl-use-petname'." "Menu used in Summary mode." wl-summary-mode-menu-spec)) +(defun wl-summary-mimic-kill-buffer (buffer) + "Kill the current (Summary) buffer with query." + (interactive "bKill buffer: ") + (if (or (not buffer) + (string-equal buffer "") + (string-equal buffer (buffer-name))) + (wl-summary-exit 'force-exit) + (kill-buffer buffer))) + (defsubst wl-summary-message-visible-p (number) "Return non-nil if the message with NUMBER is visible." (or (eq wl-summary-buffer-view 'sequence) @@ -567,31 +608,68 @@ See also variable `wl-use-petname'." (end (condition-case nil (window-end win t) ; old emacsen doesn't support 2nd arg. (error (window-end win)))) - number flags - wl-summary-highlight) + number flags) (save-excursion (goto-char beg) (while (and (< (point) end) (not (eobp))) (when (null (get-text-property (point) 'face)) - (setq number (wl-summary-message-number) - flags (elmo-message-flags wl-summary-buffer-elmo-folder - number)) - (setq wl-summary-highlight nil) - (wl-summary-update-persistent-mark number flags) - (setq wl-summary-highlight t) + (setq number (wl-summary-message-number)) + (when number + (setq flags (elmo-message-flags wl-summary-buffer-elmo-folder + number))) + (let (wl-summary-highlight) + (wl-summary-update-persistent-mark number flags)) (wl-highlight-summary-current-line number flags)) (forward-line 1))))) (set-buffer-modified-p nil))) (defun wl-summary-window-scroll-functions () - (cond ((and wl-summary-lazy-highlight + (cond ((and wl-summary-highlight + wl-summary-lazy-highlight wl-summary-lazy-update-mark) (list 'wl-summary-update-mark-and-highlight-window)) - (wl-summary-lazy-highlight + ((and wl-summary-highlight + wl-summary-lazy-highlight) (list 'wl-highlight-summary-window)) (wl-summary-lazy-update-mark (list 'wl-summary-update-mark-window)))) +(defun wl-summary-after-resize-function (frame) + "Called from `window-size-change-functions'." + (save-excursion + (save-selected-window + (select-frame frame) + (walk-windows + (lambda (window) + (set-buffer (window-buffer window)) + (when (eq major-mode 'wl-summary-mode) + (run-hook-with-args 'wl-summary-buffer-window-scroll-functions + window))) + 'nomini frame)))) + +;; Handler of event from elmo-folder +(eval-and-compile + (luna-define-class wl-summary-event-handler (elmo-event-handler) + (buffer)) + (luna-define-internal-accessors 'wl-summary-event-handler)) + +(luna-define-method elmo-event-handler-flag-changed ((handler + wl-summary-event-handler) + numbers) + (save-excursion + (set-buffer (wl-summary-event-handler-buffer-internal handler)) + (dolist (number numbers) + (when (and (wl-summary-message-visible-p number) + (wl-summary-jump-to-msg number)) + (wl-summary-update-persistent-mark number))))) + +(defun wl-summary-buffer-detach () + (when (and (eq major-mode 'wl-summary-mode) + wl-summary-buffer-elmo-folder + wl-summary-buffer-event-handler) + (elmo-folder-remove-handler wl-summary-buffer-elmo-folder + wl-summary-buffer-event-handler))) + (defun wl-status-update () (interactive) (wl-address-init)) @@ -612,12 +690,14 @@ See also variable `wl-use-petname'." (wl-summary-redisplay))) (defun wl-summary-count-unread () - (let ((lst (elmo-folder-count-flags wl-summary-buffer-elmo-folder))) - (if (eq major-mode 'wl-summary-mode) - (setq wl-summary-buffer-new-count (car lst) - wl-summary-buffer-unread-count (nth 1 lst) - wl-summary-buffer-answered-count (nth 2 lst))) - lst)) + (let ((flag-count (elmo-folder-count-flags wl-summary-buffer-elmo-folder))) + (setq wl-summary-buffer-new-count + (or (cdr (assq 'new flag-count)) 0) + wl-summary-buffer-unread-count + (or (cdr (assq 'unread flag-count)) 0) + wl-summary-buffer-answered-count + (or (cdr (assq 'answered flag-count)) 0)) + flag-count)) (defun wl-summary-message-string (&optional use-cache) "Return full body string of current message. @@ -703,13 +783,16 @@ you." (let ((column wl-summary-buffer-number-column) (formatter wl-summary-buffer-line-formatter) (dummy-temp (char-to-string 200)) - (wl-summary-new-mark (char-to-string 201)) ; bind only for the check. - (wl-summary-flag-priority-list '(new)) ; ditto. + ;; bind only for the check. + (wl-summary-new-uncached-mark (char-to-string 201)) + (wl-summary-persistent-mark-priority-list '(new)) ; ditto. + (lang wl-summary-buffer-weekday-name-lang) wl-summary-highlight temp persistent) (with-temp-buffer (setq wl-summary-buffer-number-column column - wl-summary-buffer-line-formatter formatter) + wl-summary-buffer-line-formatter formatter + wl-summary-buffer-weekday-name-lang lang) (insert (wl-summary-create-line (elmo-msgdb-make-message-entity @@ -726,13 +809,15 @@ you." (setq temp (save-excursion (when (search-forward dummy-temp nil t) (current-column))) - persistent (save-excursion - (when (search-forward wl-summary-new-mark nil t) - (current-column))))) + persistent + (save-excursion + (when (search-forward wl-summary-new-uncached-mark nil t) + (current-column))))) (setq wl-summary-buffer-temp-mark-column temp wl-summary-buffer-persistent-mark-column persistent))) (defun wl-summary-buffer-set-folder (folder) + (wl-summary-buffer-detach) (if (stringp folder) (setq folder (wl-folder-get-elmo-folder folder))) (setq wl-summary-buffer-elmo-folder folder) @@ -769,6 +854,11 @@ you." (setq wl-summary-buffer-persistent (wl-folder-persistent-p (elmo-folder-name-internal folder))) (elmo-folder-set-persistent-internal folder wl-summary-buffer-persistent) + (elmo-folder-add-handler folder + (setq wl-summary-buffer-event-handler + (luna-make-entity + 'wl-summary-event-handler + :buffer (current-buffer)))) ;; process duplicates. (elmo-folder-set-process-duplicates-internal folder (cdr (elmo-string-matched-assoc @@ -811,6 +901,8 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." ;;;(setq default-directory (or wl-tmp-dir (expand-file-name "~/"))) (setq buffer-read-only t) (setq truncate-lines t) + (when (boundp 'show-trailing-whitespace) + (setq show-trailing-whitespace nil)) ;;;(make-local-variable 'tab-width) ;;;(setq tab-width 1) (buffer-disable-undo (current-buffer)) @@ -824,12 +916,23 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (let ((hook (if wl-on-xemacs 'pre-idle-hook 'window-scroll-functions))) (make-local-hook hook) (dolist (function wl-summary-buffer-window-scroll-functions) - (add-hook hook function nil t)))) + (add-hook hook function nil t))) + (add-hook 'window-size-change-functions + #'wl-summary-after-resize-function)) + (make-local-hook 'change-major-mode-hook) + (add-hook 'change-major-mode-hook #'wl-summary-buffer-detach nil t) + (add-hook 'kill-buffer-hook #'wl-summary-buffer-detach) ;; This hook may contain the function `wl-setup-summary' for reasons ;; of system internal to accord facilities for the Emacs variants. (run-hooks 'wl-summary-mode-hook)) ;;; +(defun wl-summary-overview-entity-compare-by-size (x y) + "Compare entity X and Y by size." + (< (elmo-message-entity-field x 'size) + (elmo-message-entity-field y 'size))) + + (defun wl-summary-overview-entity-compare-by-date (x y) "Compare entity X and Y by date." (condition-case nil @@ -849,12 +952,10 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (defun wl-summary-overview-entity-compare-by-from (x y) "Compare entity X and Y by from." (string< - (wl-address-header-extract-address - (or (elmo-message-entity-field x 'from t) - wl-summary-no-from-message)) - (wl-address-header-extract-address - (or (elmo-message-entity-field y 'from t) - wl-summary-no-from-message)))) + (or (elmo-message-entity-field x 'from t) + wl-summary-no-from-message) + (or (elmo-message-entity-field y 'from t) + wl-summary-no-from-message))) (defun wl-summary-overview-entity-compare-by-subject (x y) "Compare entity X and Y by subject." @@ -908,29 +1009,36 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (string< (or (car list-info-x) "") (or (car list-info-y) ""))))) -(defun wl-summary-sort-by-date () - (interactive) - (wl-summary-rescan "date")) -(defun wl-summary-sort-by-number () - (interactive) - (wl-summary-rescan "number")) -(defun wl-summary-sort-by-subject () - (interactive) - (wl-summary-rescan "subject")) -(defun wl-summary-sort-by-from () - (interactive) - (wl-summary-rescan "from")) -(defun wl-summary-sort-by-list-info () - (interactive) - (wl-summary-rescan "list-info")) +(defun wl-summary-sort-by-date (reverse) + "Sort summary lines into the order by message date; argument means descending order." + (interactive "P") + (wl-summary-rescan "date" reverse)) +(defun wl-summary-sort-by-number (reverse) + "Sort summary lines into the order by message number; argument means descending order." + (interactive "P") + (wl-summary-rescan "number" reverse)) +(defun wl-summary-sort-by-subject (reverse) + "Sort summary lines into the order by subject; argument means descending order." + (interactive "P") + (wl-summary-rescan "subject" reverse)) +(defun wl-summary-sort-by-from (reverse) + "Sort summary lines into the order by from; argument means descending order." + (interactive "P") + (wl-summary-rescan "from" reverse)) +(defun wl-summary-sort-by-list-info (reverse) + "Sort summary lines into the order by mailing list info; argument means descending order." + (interactive "P") + (wl-summary-rescan "list-info" reverse)) +(defun wl-summary-sort-by-size (reverse) + "Sort summary lines into the order by message size; argument means descending order." + (interactive "P") + (wl-summary-rescan "size" reverse)) -(defun wl-summary-rescan (&optional sort-by disable-killed disable-thread) +(defun wl-summary-rescan (&optional sort-by reverse disable-killed disable-thread) "Rescan current folder without updating." (interactive) (let ((elmo-mime-charset wl-summary-buffer-mime-charset) - i percent num - gc-message entity - curp + gc-message ; for XEmacs (inhibit-read-only t) (buffer-read-only nil) (numbers (elmo-folder-list-messages wl-summary-buffer-elmo-folder @@ -941,21 +1049,26 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (and disable-thread wl-summary-search-parent-by-subject-regexp)) (wl-summary-divide-thread-when-subject-changed (and disable-thread wl-summary-divide-thread-when-subject-changed)) + (predicate (and sort-by + (intern (format "wl-summary-overview-entity-compare-by-%s" + sort-by)))) + (sort-label (if reverse "Reverse sorting" "Sorting")) + (i 0) + num expunged) (erase-buffer) (message "Re-scanning...") - (setq i 0) (when sort-by - (message "Sorting by %s..." sort-by) + (message "%s by %s..." sort-label sort-by) (setq numbers (sort numbers (lambda (x y) (funcall - (intern (format "wl-summary-overview-entity-compare-by-%s" - sort-by)) + predicate (elmo-message-entity wl-summary-buffer-elmo-folder x) (elmo-message-entity wl-summary-buffer-elmo-folder y))))) - (message "Sorting by %s...done" sort-by)) + (if reverse (setq numbers (nreverse numbers))) + (message "%s by %s...done" sort-label sort-by)) (setq num (length numbers)) (setq wl-thread-entity-hashtb (elmo-make-hash (* num 2)) wl-thread-entity-list nil @@ -968,9 +1081,9 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." wl-summary-delayed-update nil) (elmo-kill-buffer wl-summary-search-buf-name) (while numbers - (setq entity (elmo-message-entity wl-summary-buffer-elmo-folder - (car numbers))) - (wl-summary-insert-message entity + (wl-summary-insert-message (elmo-message-entity + wl-summary-buffer-elmo-folder + (car numbers)) wl-summary-buffer-elmo-folder nil) (setq numbers (cdr numbers)) @@ -1060,18 +1173,25 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (defun wl-summary-thread-modified-p () wl-summary-buffer-thread-modified) -(defsubst wl-summary-cleanup-temp-marks (&optional sticky) +(defun wl-summary-exec-with-confirmation (&optional message) (when wl-summary-buffer-temp-mark-list - (if (y-or-n-p (format "Execute remaining marks in %s? " - (wl-summary-buffer-folder-name))) + (if (y-or-n-p (or message + (format "Execute marks in %s? " + (wl-summary-buffer-folder-name)))) (progn (wl-summary-exec) (if wl-summary-buffer-temp-mark-list (error "Some execution was failed"))) ;; temp-mark-list is remained. - (message ""))) - (wl-summary-delete-all-temp-marks 'no-msg) - (setq wl-summary-scored nil)) + (message "")))) + +(defun wl-summary-cleanup-temp-marks () + (when wl-summary-buffer-temp-mark-list + (wl-summary-exec-with-confirmation + (format "Execute marks in %s? (answer \"n\" to discard them) " + (wl-summary-buffer-folder-name))) + (wl-summary-delete-all-temp-marks 'no-msg) + (setq wl-summary-scored nil))) ;; a subroutine for wl-summary-exit/wl-save-status ;; Note that folder is not commited here. @@ -1111,7 +1231,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (if wl-summary-buffer-exit-function (funcall wl-summary-buffer-exit-function) (if (or force-exit (not sticky)) - (wl-summary-cleanup-temp-marks sticky)) + (wl-summary-cleanup-temp-marks)) (unwind-protect ;; save summary status (progn @@ -1153,6 +1273,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." wl-folder-buffer-cur-point (goto-char wl-folder-buffer-cur-point)) (setq wl-folder-buffer-cur-path nil) + (setq wl-folder-buffer-last-visited-entity-id wl-folder-buffer-cur-entity-id) (setq wl-folder-buffer-cur-entity-id nil) (wl-delete-all-overlays) (if wl-summary-exit-next-move @@ -1204,6 +1325,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." nil wl-use-scoring))) (wl-summary-rescan nil + nil (string-match "noscore" range) (string-match "thread" range)) (and msg (wl-summary-jump-to-msg msg)))) @@ -1243,7 +1365,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (setq fields (cdr fields))) (setq candidates (elmo-uniq-list candidates)) (elmo-set-work-buf - (elmo-set-buffer-multibyte default-enable-multibyte-characters) + (set-buffer-multibyte default-enable-multibyte-characters) (mapcar (function (lambda (x) (setq components (std11-extract-address-components x)) @@ -1353,6 +1475,31 @@ If ARG is non-nil, checking is omitted." (wl-summary-prefetch-region-no-mark (point-min) (point-max) wl-summary-incorporate-marks)) +(defun wl-summary-force-prefetch () + "All uncached messages are cached." + (interactive) + (unless (elmo-folder-local-p wl-summary-buffer-elmo-folder) + (let ((targets (elmo-folder-list-flagged wl-summary-buffer-elmo-folder + 'uncached 'in-msgdb)) + (count 0) + wl-prefetch-confirm + wl-prefetch-threshold + (elmo-inhibit-display-retrieval-progress t) + length msg) + (save-excursion + (goto-char (point-min)) + (setq length (length targets)) + (dolist (target targets) + (when (if (not (wl-thread-entity-parent-invisible-p + (wl-thread-get-entity target))) + (progn + (wl-summary-jump-to-msg target) + (wl-summary-prefetch-msg + (wl-summary-message-number))) + (wl-summary-prefetch-msg target)) + (message "Retrieving... %d/%d" (incf count) length))) + (message "Retrieved %d/%d message(s)" count length))))) + (defun wl-summary-prefetch-msg (number &optional arg) "Prefetch message and return non-nil value. If skipped, return nil." ;; prefetching procedure. @@ -1414,8 +1561,7 @@ If ARG is non-nil, checking is omitted." (wl-summary-update-modeline) (wl-folder-update-unread (wl-summary-buffer-folder-name) - (+ wl-summary-buffer-unread-count - wl-summary-buffer-new-count)))) + wl-summary-buffer-unread-count))) t) nil))))) @@ -1492,85 +1638,83 @@ If ARG is non-nil, checking is omitted." (defun wl-summary-delete-all-target-marks () (wl-summary-delete-marks-on-buffer wl-summary-buffer-target-mark-list)) -(defun wl-summary-mark-as-read-region (beg end) - (interactive "r") +(defun wl-summary-number-list-from-region (beg end) (save-excursion (save-restriction (wl-summary-narrow-to-region beg end) (goto-char (point-min)) - (if (eq wl-summary-buffer-view 'thread) - (let (number-list) + (let (number-list) + (if (eq wl-summary-buffer-view 'thread) (while (not (eobp)) (let* ((number (wl-summary-message-number)) (entity (wl-thread-get-entity number))) - (if (wl-thread-entity-get-opened entity) - (setq number-list (append number-list (list number))) - (setq number-list - (append number-list - (wl-thread-get-children-msgs number)))) + (setq number-list + (nconc number-list + (if (wl-thread-entity-get-opened entity) + (list number) + (wl-thread-get-children-msgs number)))) (forward-line 1))) - (wl-summary-mark-as-read number-list)) - (let (number-list) (while (not (eobp)) (setq number-list - (append number-list (list (wl-summary-message-number)))) - (forward-line 1)) - (wl-summary-mark-as-read number-list)))))) + (nconc number-list (list (wl-summary-message-number)))) + (forward-line 1))) + number-list)))) -(defun wl-summary-mark-as-unread-region (beg end) +(defun wl-summary-mark-as-read-region (beg end) (interactive "r") - (save-excursion - (save-restriction - (wl-summary-narrow-to-region beg end) - (goto-char (point-min)) - (if (eq wl-summary-buffer-view 'thread) - (let (number-list) - (while (not (eobp)) - (let* ((number (wl-summary-message-number)) - (entity (wl-thread-get-entity number))) - (if (wl-thread-entity-get-opened entity) - (setq number-list (append number-list (list number))) - (setq number-list - (append number-list - (wl-thread-get-children-msgs number)))) - (forward-line 1))) - (wl-summary-mark-as-unread number-list)) - (let (number-list) - (while (not (eobp)) - (setq number-list - (append number-list (list (wl-summary-message-number)))) - (forward-line 1)) - (wl-summary-mark-as-unread number-list)))))) + (let ((number-list (wl-summary-number-list-from-region beg end))) + (if (null number-list) + (message "No message.") + (wl-summary-mark-as-read number-list)))) -(defun wl-summary-mark-as-important-region (beg end) +(defun wl-summary-mark-as-unread-region (beg end) (interactive "r") - (save-excursion - (save-restriction - (wl-summary-narrow-to-region beg end) - (goto-char (point-min)) - (if (eq wl-summary-buffer-view 'thread) - (progn - (while (not (eobp)) - (let* ((number (wl-summary-message-number)) - (entity (wl-thread-get-entity number)) - children) - (if (wl-thread-entity-get-opened entity) - ;; opened...mark line. - ;; Crossposts are not processed - (wl-summary-mark-as-important) - ;; closed - (wl-summary-mark-as-important) ; mark itself. - (setq children - (delq number (wl-thread-get-children-msgs number))) - (while children - (wl-summary-mark-as-important (car children)) - (setq children (cdr children)))) - (forward-line 1)))) - (while (not (eobp)) - (wl-summary-mark-as-important) - (forward-line 1))))) - (wl-summary-count-unread) - (wl-summary-update-modeline)) + (let ((number-list (wl-summary-number-list-from-region beg end))) + (if (null number-list) + (message "No message.") + (wl-summary-mark-as-unread number-list)))) + +(defun wl-summary-set-flags-region (beg end &optional remove) + (interactive "r\nP") + (let ((number-list (wl-summary-number-list-from-region beg end))) + (if (null number-list) + (message "No message.") + (wl-summary-set-flags-internal number-list nil nil remove) + (wl-summary-count-unread) + (wl-summary-update-modeline)))) + +(defun wl-summary-mark-as-answered-region (beg end &optional remove) + (interactive "r\nP") + (let ((number-list (wl-summary-number-list-from-region beg end)) + (remove (or remove + (elmo-message-flagged-p wl-summary-buffer-elmo-folder + (save-excursion + (goto-char beg) + (wl-summary-message-number)) + 'answered)))) + (if (null number-list) + (message "No message.") + (wl-summary-set-persistent-mark-internal remove 'answered + number-list + nil nil (interactive-p)) + (wl-summary-count-unread) + (wl-summary-update-modeline)))) + +(defun wl-summary-mark-as-important-region (beg end &optional remove) + (interactive "r\nP") + (let ((number-list (wl-summary-number-list-from-region beg end)) + (remove (or remove + (elmo-message-flagged-p wl-summary-buffer-elmo-folder + (save-excursion + (goto-char beg) + (wl-summary-message-number)) + 'important)))) + (if (null number-list) + (message "No message.") + (wl-summary-set-persistent-mark-internal remove 'important number-list + nil nil (interactive-p)) + (wl-summary-count-unread) + (wl-summary-update-modeline)))) (defun wl-summary-mark-as-read-all () (interactive) @@ -1579,14 +1723,10 @@ If ARG is non-nil, checking is omitted." (let ((folder wl-summary-buffer-elmo-folder) (cur-buf (current-buffer))) (message "Setting all msgs as read...") - (elmo-folder-flag-as-read folder - (elmo-folder-list-unreads - folder)) - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (wl-summary-update-persistent-mark) - (forward-line 1))) + (elmo-folder-unset-flag + folder + (elmo-folder-list-flagged folder 'unread 'in-msgdb) + 'unread) (wl-folder-update-unread (wl-summary-buffer-folder-name) 0) (setq wl-summary-buffer-unread-count 0) (setq wl-summary-buffer-new-count 0) @@ -1700,89 +1840,51 @@ This function is defined for `window-scroll-functions'" (apply 'wl-summary-insert-thread args) (apply 'wl-summary-insert-sequential args))) -(defun wl-summary-sort () - (interactive) +(defun wl-summary-sort (reverse) + "Sort summary lines into the selected order; argument means descending order." + (interactive "P") (wl-summary-rescan (completing-read - (format "Sort by (%s): " (symbol-name wl-summary-default-sort-spec)) + (format "%s by (%s): " + (if reverse "Reverse sort" "Sort") + (symbol-name wl-summary-default-sort-spec)) (mapcar (lambda (spec) (list (symbol-name spec))) wl-summary-sort-specs) - nil t nil nil (symbol-name wl-summary-default-sort-spec)))) + nil t nil nil (symbol-name wl-summary-default-sort-spec)) + reverse)) + +(defun wl-summary-get-available-flags (&optional include-specials) + (let ((flags (elmo-uniq-list + (append elmo-global-flags + (copy-sequence elmo-preserved-flags)) + #'delq))) + (if include-specials + flags + (delq 'new (delq 'cached flags))))) (defun wl-summary-sync-marks () "Update persistent marks in summary." (interactive) - (let ((last-progress 0) - (folder wl-summary-buffer-elmo-folder) - (i 0) - answereds importants unreads diff diffs - mes progress) - ;; synchronize marks. - (when (not (eq (elmo-folder-type-internal - wl-summary-buffer-elmo-folder) - 'internal)) - (message "Updating marks...") - (setq importants (elmo-uniq-list - (nconc (elmo-folder-list-importants - wl-summary-buffer-elmo-folder) - ;; XXX Temporal implementation. - ;; It should be merged to the - ;; elmo-folder-list-flagged. - (elmo-folder-list-global-flag-messages - wl-summary-buffer-elmo-folder - 'important))) - unreads (elmo-folder-list-unreads - wl-summary-buffer-elmo-folder) - answereds (elmo-folder-list-answereds - wl-summary-buffer-elmo-folder)) - (setq diff (elmo-list-diff importants - (elmo-folder-list-flagged + (let ((mes "Updated ") + diff diffs) + (message "Updating marks...") + (dolist (flag (wl-summary-get-available-flags)) + (setq diff (elmo-list-diff (elmo-folder-list-flagged wl-summary-buffer-elmo-folder - 'important 'in-msgdb))) - (setq diffs (cadr diff)) ; important-deletes - (setq mes (format "Updated (-%d" (length diffs))) - (while diffs - (wl-summary-mark-as-important (car diffs) - wl-summary-important-mark - 'no-server) - (setq diffs (cdr diffs))) - (setq diffs (car diff)) ; important-appends - (setq mes (concat mes (format "/+%d) important," (length diffs)))) - (while diffs - (wl-summary-mark-as-important (car diffs) " " 'no-server) - (setq diffs (cdr diffs))) - - (setq diff (elmo-list-diff answereds + flag) (elmo-folder-list-flagged wl-summary-buffer-elmo-folder - 'answered 'in-msgdb))) + flag 'in-msgdb))) (setq diffs (cadr diff)) - (setq mes (concat mes (format "(-%d" (length diffs)))) - (while diffs - (wl-summary-mark-as-unanswered (car diffs) 'no-modeline) - (setq diffs (cdr diffs))) - (setq diffs (car diff)) ; unread-appends - (setq mes (concat mes (format "/+%d) answered mark(s)," (length diffs)))) - (while diffs - (wl-summary-mark-as-answered (car diffs) 'no-modeline) - (setq diffs (cdr diffs))) - - (setq diff (elmo-list-diff unreads - (elmo-folder-list-flagged - wl-summary-buffer-elmo-folder - 'unread 'in-msgdb))) - (setq diffs (cadr diff)) - (setq mes (concat mes (format "(-%d" (length diffs)))) - (while diffs - (wl-summary-mark-as-read (car diffs) 'no-folder 'no-modeline) - (setq diffs (cdr diffs))) - (setq diffs (car diff)) ; unread-appends - (setq mes (concat mes (format "/+%d) unread mark(s)." (length diffs)))) - (while diffs - (wl-summary-mark-as-unread (car diffs) 'no-folder 'no-modeline) - (setq diffs (cdr diffs))) - (if (interactive-p) (message "%s" mes))))) + (setq mes (concat mes (format "-%d" (length diffs)))) + (when diffs + (wl-summary-unset-persistent-mark flag diffs 'no-modeline 'no-server)) + (setq diffs (car diff) + mes (concat mes (format "/+%d %s " (length diffs) flag))) + (when diffs + (wl-summary-set-persistent-mark flag diffs 'no-modeline 'no-server))) + (if (interactive-p) (message "%s" mes)))) (defun wl-summary-sync-update (&optional unset-cursor disable-killed @@ -1794,12 +1896,8 @@ This function is defined for `window-scroll-functions'" (elmo-mime-charset wl-summary-buffer-mime-charset) (inhibit-read-only t) (buffer-read-only nil) - gc-message - overview - curp num i diff - append-list delete-list crossed - update-thread update-top-list - expunged mes entity) + gc-message ; for XEmacs + crossed expunged mes) (unwind-protect (progn (unless wl-summary-buffer-elmo-folder @@ -1815,7 +1913,13 @@ This function is defined for `window-scroll-functions'" sync-all no-check)) (if crossed - (progn + (let ((wl-summary-highlight + (and wl-summary-highlight + (not wl-summary-lazy-highlight))) + append-list delete-list + update-thread update-top-list + num diff entity + (i 0)) ;; Setup sync-all (if sync-all (wl-summary-sync-all-init)) (setq diff (elmo-list-diff (elmo-folder-list-messages @@ -1833,10 +1937,8 @@ This function is defined for `window-scroll-functions'" (when (and wl-summary-lazy-highlight wl-summary-lazy-update-mark) (let (buffer-read-only) - (put-text-property (point-min) (point-max) 'face nil)) - (run-hooks 'wl-summary-buffer-window-scroll-functions)) + (put-text-property (point-min) (point-max) 'face nil))) (setq num (length append-list)) - (setq i 0) (setq wl-summary-delayed-update nil) (elmo-kill-buffer wl-summary-search-buf-name) (dolist (number append-list) @@ -1898,7 +2000,7 @@ This function is defined for `window-scroll-functions'" folder)) (format "Updated (-%d/+%d) message(s)" (length delete-list) num)))) - (setq mes "Quit updating."))) + (setq mes "Quit updating"))) ;; synchronize marks. (if (and crossed wl-summary-auto-sync-marks) (wl-summary-sync-marks)) @@ -1925,8 +2027,7 @@ This function is defined for `window-scroll-functions'" (wl-folder-set-folder-updated (elmo-folder-name-internal folder) (list 0 - (let ((lst (wl-summary-count-unread))) - (+ (car lst) (nth 1 lst))) + (or (cdr (assq 'unread (wl-summary-count-unread))) 0) (elmo-folder-length folder))) (wl-summary-update-modeline) ;; @@ -1936,16 +2037,17 @@ This function is defined for `window-scroll-functions'" (progn (goto-char (point-max)) (forward-line -1)) - (if (and wl-summary-highlight - (not wl-summary-lazy-highlight) - (not (get-text-property (point) 'face))) - (save-excursion - (forward-line (- 0 - (or - wl-summary-partial-highlight-above-lines - wl-summary-highlight-partial-threshold))) - (wl-highlight-summary (point) (point-max)))))) + (when (and wl-summary-highlight + (not wl-summary-lazy-highlight) + (not (get-text-property (point) 'face))) + (save-excursion + (forward-line (- 0 + (or + wl-summary-partial-highlight-above-lines + wl-summary-highlight-partial-threshold))) + (wl-highlight-summary (point) (point-max)))))) (wl-delete-all-overlays) + (run-hooks 'wl-summary-buffer-window-scroll-functions) (set-buffer-modified-p nil) (if mes (message "%s" mes))))) @@ -1974,7 +2076,7 @@ This function is defined for `window-scroll-functions'" (funcall wl-summary-buffer-mode-line-formatter))) (defun wl-summary-jump-to-msg (&optional number) - (interactive) + (interactive "NJump to Number:") (let ((num (or number (string-to-int (read-from-minibuffer "Jump to Message(No.): "))))) @@ -2056,7 +2158,7 @@ If ARG, without confirm." (setq wl-summary-buffer-view 'thread)) (wl-summary-update-modeline) (force-mode-line-update) - (wl-summary-rescan))) + (wl-summary-rescan nil nil nil t))) (defun wl-summary-load-file-object (filename) "Load lisp object from dir." @@ -2203,9 +2305,8 @@ If ARG, without confirm." (defun wl-summary-auto-select-msg-p (unread-msg) (and unread-msg - (not (elmo-message-flagged-p wl-summary-buffer-elmo-folder - unread-msg - 'important)))) + (not (elmo-message-has-global-flag-p + wl-summary-buffer-elmo-folder unread-msg)))) (defsubst wl-summary-open-folder (folder) ;; Select folder @@ -2237,7 +2338,7 @@ If ARG, without confirm." (setq wl-summary-last-visited-folder (wl-summary-buffer-folder-name)) (run-hooks 'wl-summary-exit-pre-hook) (if (or force-exit (not (wl-summary-sticky-p))) - (wl-summary-cleanup-temp-marks (wl-summary-sticky-p))) + (wl-summary-cleanup-temp-marks)) (wl-summary-save-view) (elmo-folder-commit wl-summary-buffer-elmo-folder) (if (and (wl-summary-sticky-p) force-exit) @@ -2260,6 +2361,10 @@ If ARG, without confirm." (unless (eq major-mode 'wl-summary-mode) (wl-summary-mode)) (wl-summary-buffer-set-folder folder) + (setq wl-summary-buffer-display-mime-mode + (if (wl-summary-no-mime-p wl-summary-buffer-elmo-folder) + 'as-is + 'mime)) (setq wl-summary-buffer-disp-msg nil) (setq wl-summary-buffer-last-displayed-msg nil) (setq wl-summary-buffer-current-msg nil) @@ -2273,7 +2378,7 @@ If ARG, without confirm." (view (expand-file-name wl-summary-view-file dir))) (when (file-exists-p cache) (insert-file-contents-as-binary cache) - (elmo-set-buffer-multibyte + (set-buffer-multibyte default-enable-multibyte-characters) (decode-mime-charset-region (point-min)(point-max) @@ -2327,7 +2432,7 @@ If ARG, without confirm." ((or (eq scan-type 'force-update) (eq scan-type 'update)) (setq mes (wl-summary-sync-force-update - 'unset-cursor 'no-check))))) + 'unset-cursor))))) (if interactive (switch-to-buffer buf) (set-buffer buf)) @@ -2344,15 +2449,15 @@ If ARG, without confirm." (cond ((and wl-auto-select-first (wl-summary-auto-select-msg-p unreadp)) ;; wl-auto-select-first is non-nil and - ;; unreadp is non-nil but not important + ;; unreadp is non-nil but not flagged (setq retval 'disp-msg)) ((and wl-auto-prefetch-first (wl-summary-auto-select-msg-p unreadp)) ;; wl-auto-select-first is non-nil and - ;; unreadp is non-nil but not important + ;; unreadp is non-nil but not flagged (setq retval 'prefetch-msg)) ((not (wl-summary-auto-select-msg-p unreadp)) - ;; unreadp is nil or important + ;; unreadp is nil or flagged (setq retval 'more-next)))) (goto-char (point-max)) (if (elmo-folder-plugged-p folder) @@ -2398,6 +2503,11 @@ If ARG, without confirm." (when (and wl-summary-buffer-window-scroll-functions wl-on-xemacs) (sit-for 0)) + (when (or (eq t wl-summary-force-prefetch-folder-list) + (wl-string-match-member + (elmo-folder-name-internal wl-summary-buffer-elmo-folder) + wl-summary-force-prefetch-folder-list)) + (wl-summary-force-prefetch)) (unwind-protect (run-hooks 'wl-summary-prepared-hook) (set-buffer-modified-p nil)) @@ -2487,7 +2597,7 @@ If ARG, without confirm." (make-local-variable 'wl-summary-alike-hashtb) (setq wl-summary-alike-hashtb (elmo-make-hash (* (length numbers) 2))) (when mime-decode - (elmo-set-buffer-multibyte default-enable-multibyte-characters)) + (set-buffer-multibyte default-enable-multibyte-characters)) (while (setq ov (elmo-message-entity folder (pop numbers))) (setq this (funcall func ov)) (and this (setq this (std11-unfold-string this))) @@ -2563,8 +2673,8 @@ If ARG, without confirm." (defun wl-summary-insert-thread (entity folder update &optional force-insert) (let ((depth 0) - this-id parent-entity parent-number relatives anumber - cur number cur-entity linked retval delayed-entity + this-id parent-entity parent-number + number cur-entity linked retval delayed-entity update-list entity-stack thread-entity) (while entity (setq this-id (elmo-message-entity-field entity 'message-id) @@ -2583,16 +2693,17 @@ If ARG, without confirm." linked nil)) (setq parent-number (and parent-entity (elmo-message-entity-number parent-entity))) - (setq cur entity) ;; If thread loop detected, set parent as nil. - (while cur - (when (setq anumber - (elmo-message-entity-number - (setq cur (elmo-message-entity-parent folder cur)))) - (if (memq anumber relatives) - (setq parent-number nil - cur nil)) - (setq relatives (cons anumber relatives)))) + (let ((cur entity) + anumber relatives) + (while cur + (when (setq anumber + (elmo-message-entity-number + (setq cur (elmo-message-entity-parent folder cur)))) + (if (memq anumber relatives) + (setq parent-number nil + cur nil)) + (setq relatives (cons anumber relatives))))) (if (and parent-number (not (wl-thread-get-entity parent-number)) (not force-insert)) @@ -2680,14 +2791,20 @@ If ARG, without confirm." i)) (defun wl-summary-pick (&optional from-list delete-marks) - (interactive) + (interactive "i\nP") (save-excursion - (let* ((condition (car (elmo-parse-search-condition + (let* ((messages (or from-list + (elmo-folder-list-messages + wl-summary-buffer-elmo-folder + 'visible + 'in-msgdb) + (error "No messages"))) + (condition (car (elmo-parse-search-condition (elmo-read-search-condition wl-summary-pick-field-default)))) (result (elmo-folder-search wl-summary-buffer-elmo-folder condition - from-list)) + messages)) num) (if delete-marks (let ((mlist wl-summary-buffer-target-mark-list)) @@ -2763,29 +2880,42 @@ If ARG, exit virtual folder." (defsubst wl-summary-persistent-mark-string (folder flags cached) "Return the persistent mark string. The mark is decided according to the FOLDER, FLAGS and CACHED." - (let ((priorities wl-summary-flag-priority-list) + (let ((priorities wl-summary-persistent-mark-priority-list) mark) (while (and (null mark) priorities) - (when (memq (car priorities) flags) - (setq mark - (case (car priorities) - (new - wl-summary-new-mark) - (important - wl-summary-important-mark) - (answered - (if cached - wl-summary-answered-cached-mark - wl-summary-answered-uncached-mark)) - (unread - (if cached - wl-summary-unread-cached-mark - wl-summary-unread-uncached-mark))))) + (if (and (eq (car priorities) 'flag) + (elmo-get-global-flags flags 'ignore-preserved)) + (let ((specs wl-summary-flag-alist) + spec) + (while (setq spec (car specs)) + (if (memq (car spec) flags) + (setq mark (or (nth 2 spec) wl-summary-flag-mark) + specs nil) + (setq specs (cdr specs)))) + (unless mark + (setq mark wl-summary-flag-mark))) + (when (memq (car priorities) flags) + (setq mark + (let ((var + (intern + (if cached + (format + "wl-summary-%s-cached-mark" (car priorities)) + (format + "wl-summary-%s-uncached-mark" (car priorities)))))) + (if (and (boundp var) + (symbol-value var)) + (symbol-value var) + (if cached + (downcase (substring (symbol-name (car priorities)) + 0 1)) + (upcase (substring (symbol-name (car priorities)) + 0 1)))))))) (setq priorities (cdr priorities))) (or mark (if (or cached (elmo-folder-local-p folder)) nil - wl-summary-read-uncached-mark)))) + wl-summary-uncached-mark)))) (defsubst wl-summary-message-mark (folder number &optional flags) "Return mark of the message." @@ -2836,8 +2966,13 @@ The mark is decided according to the FOLDER, FLAGS and CACHED." (or (cadr (memq (current-buffer) buffers)) (car buffers))))) +(defun wl-summary-check-target-mark () + (when (null wl-summary-buffer-target-mark-list) + (error "No marked message"))) + (defun wl-summary-target-mark-mark-as-read () (interactive) + (wl-summary-check-target-mark) (save-excursion (goto-char (point-min)) (let ((inhibit-read-only t) @@ -2849,6 +2984,7 @@ The mark is decided according to the FOLDER, FLAGS and CACHED." (defun wl-summary-target-mark-mark-as-unread () (interactive) + (wl-summary-check-target-mark) (save-excursion (goto-char (point-min)) (let ((inhibit-read-only t) @@ -2858,21 +2994,42 @@ The mark is decided according to the FOLDER, FLAGS and CACHED." (dolist (number wl-summary-buffer-target-mark-list) (wl-summary-unset-mark number))))) -(defun wl-summary-target-mark-mark-as-important () - (interactive) +(defun wl-summary-target-mark-operation (flag &optional inverse) + (wl-summary-check-target-mark) (save-excursion - (goto-char (point-min)) (let ((inhibit-read-only t) (buffer-read-only nil) wl-summary-buffer-disp-msg) - (dolist (number wl-summary-buffer-target-mark-list) - (wl-summary-unset-mark number) - (wl-summary-mark-as-important number)) + (funcall + (intern (format "wl-summary-mark-as-%s-internal" flag)) + inverse + wl-summary-buffer-target-mark-list) + (wl-summary-delete-all-target-marks)))) + +(defun wl-summary-target-mark-mark-as-important (&optional remove) + (interactive "P") + (wl-summary-target-mark-operation 'important remove)) + +(defun wl-summary-target-mark-mark-as-answered (&optional remove) + (interactive "P") + (wl-summary-target-mark-operation 'answered remove)) + +(defun wl-summary-target-mark-set-flags (&optional remove) + (interactive "P") + (wl-summary-check-target-mark) + (save-excursion + (let ((inhibit-read-only t) + (buffer-read-only nil) + wl-summary-buffer-disp-msg) + (wl-summary-set-flags-internal wl-summary-buffer-target-mark-list + nil nil remove) + (wl-summary-delete-all-target-marks) (wl-summary-count-unread) (wl-summary-update-modeline)))) (defun wl-summary-target-mark-save () (interactive) + (wl-summary-check-target-mark) (let ((wl-save-dir (wl-read-directory-name "Save to directory: " wl-temporary-file-directory)) @@ -2886,11 +3043,13 @@ The mark is decided according to the FOLDER, FLAGS and CACHED." (defun wl-summary-target-mark-pick () (interactive) + (wl-summary-check-target-mark) (wl-summary-pick wl-summary-buffer-target-mark-list 'delete)) (defun wl-summary-update-persistent-mark (&optional number flags) "Synch up persistent mark of current line with msgdb's. Return non-nil if the mark is updated" + (interactive) (prog1 (when wl-summary-buffer-persistent-mark-column (save-excursion @@ -2915,7 +3074,7 @@ Return non-nil if the mark is updated" (save-excursion (let ((folder wl-summary-buffer-elmo-folder) unread-message number - number-list visible) + number-list) (setq number-list (cond ((numberp number-or-numbers) (setq unread-message (elmo-message-flagged-p @@ -2937,25 +3096,20 @@ Return non-nil if the mark is updated" (if (null number-list) (message "No message.") (if inverse - (elmo-folder-unflag-read folder number-list no-folder-mark) - (elmo-folder-flag-as-read folder number-list no-folder-mark)) - (dolist (number number-list) - (setq visible (wl-summary-jump-to-msg number)) - (unless inverse - (when unread-message - (run-hooks 'wl-summary-unread-message-hook))) - ;; set mark on buffer - (when visible - (wl-summary-update-persistent-mark))) + (elmo-folder-set-flag folder number-list 'unread no-folder-mark) + (elmo-folder-unset-flag folder number-list 'unread no-folder-mark)) + (when (and unread-message + (not inverse)) + (dolist (number number-list) + (wl-summary-jump-to-msg number) + (run-hooks 'wl-summary-unread-message-hook))) (unless no-modeline-update ;; Update unread numbers. - ;; should elmo-folder-flag-as-read return unread numbers? (wl-summary-count-unread) (wl-summary-update-modeline) (wl-folder-update-unread (wl-summary-buffer-folder-name) - (+ wl-summary-buffer-unread-count - wl-summary-buffer-new-count))))))) + wl-summary-buffer-unread-count)))))) (defun wl-summary-mark-as-read (&optional number-or-numbers no-folder-mark @@ -2975,12 +3129,16 @@ Return non-nil if the mark is updated" no-folder-mark no-modeline-update)) -(defsubst wl-summary-mark-as-answered-internal (inverse - number-or-numbers - no-modeline-update) +(defsubst wl-summary-set-persistent-mark-internal (inverse + flag + &optional number-or-numbers + no-modeline-update + no-server + interactive) + "Set persistent mark." (save-excursion (let ((folder wl-summary-buffer-elmo-folder) - number number-list visible) + number number-list) (setq number-list (cond ((numberp number-or-numbers) (list number-or-numbers)) ((and (not (null number-or-numbers)) @@ -2991,88 +3149,184 @@ Return non-nil if the mark is updated" (list number)))) (if (null number-list) (message "No message.") - (if inverse - (elmo-folder-unflag-answered folder number-list) - (elmo-folder-flag-as-answered folder number-list)) - (dolist (number number-list) - (setq visible (wl-summary-jump-to-msg number)) - ;; set mark on buffer - (when visible - (wl-summary-update-persistent-mark))) - (unless no-modeline-update - ;; Update unread numbers. - ;; should elmo-flag-mark-as-read return unread numbers? - (wl-summary-count-unread) - (wl-summary-update-modeline) - (wl-folder-update-unread - (wl-summary-buffer-folder-name) - (+ wl-summary-buffer-unread-count - wl-summary-buffer-new-count))))))) + ;; XXX Only the first element of the list is checked. + (if (elmo-message-flag-available-p folder (car number-list) flag) + (progn + (if inverse + (elmo-folder-unset-flag folder number-list flag no-server) + (elmo-folder-set-flag folder number-list flag no-server)) + (unless no-modeline-update + ;; Update unread numbers. + ;; should elmo-flag-mark-as-read return unread numbers? + (wl-summary-count-unread) + (wl-summary-update-modeline) + (wl-folder-update-unread + (wl-summary-buffer-folder-name) + wl-summary-buffer-unread-count))) + (if interactive + (error "Flag `%s' is not available in this folder" flag))))))) + +(defun wl-summary-unset-persistent-mark (&optional flag + number-or-numbers + no-modeline-update + no-server) + "Unset persistent mark." + (interactive) + (when (interactive-p) + (let ((completion-ignore-case t)) + (setq flag (intern (downcase + (completing-read + "Mark name: " + (mapcar (lambda (flag) + (list (capitalize (symbol-name flag)))) + (wl-summary-get-available-flags)) + nil + 'require-match)))))) + (wl-summary-set-persistent-mark-internal 'inverse + flag + number-or-numbers + no-modeline-update + no-server + (interactive-p))) + +(defun wl-summary-set-persistent-mark (&optional flag + number-or-numbers + no-modeline-update + no-server) + "Set persistent mark." + (interactive) + (when (interactive-p) + (let ((completion-ignore-case t)) + (setq flag (intern (downcase + (completing-read + "Mark name: " + (mapcar (lambda (flag) + (list (capitalize (symbol-name flag)))) + (wl-summary-get-available-flags)) + nil + 'require-match)))))) + (wl-summary-set-persistent-mark-internal nil + flag + number-or-numbers + no-modeline-update + no-server + (interactive-p))) + +(defun wl-summary-toggle-persistent-mark (&optional force) + "Toggle persistent mark." + (interactive "P") + (let ((completion-ignore-case t) + flag) + (setq flag (intern (downcase + (completing-read + "Mark name: " + (mapcar (lambda (flag) + (list (capitalize (symbol-name flag)))) + (wl-summary-get-available-flags)) + nil + 'require-match)))) + (if (and (elmo-message-flagged-p wl-summary-buffer-elmo-folder + (wl-summary-message-number) + flag) + (not force)) + (wl-summary-unset-persistent-mark flag) + (wl-summary-set-persistent-mark flag)))) (defun wl-summary-mark-as-answered (&optional number-or-numbers no-modeline-update) (interactive) - (wl-summary-mark-as-answered-internal + (wl-summary-set-persistent-mark-internal (and (interactive-p) (elmo-message-flagged-p wl-summary-buffer-elmo-folder (wl-summary-message-number) 'answered)) + 'answered number-or-numbers - no-modeline-update)) + no-modeline-update + nil + (interactive-p))) (defun wl-summary-mark-as-unanswered (&optional number-or-numbers - no-modeline-update) - (wl-summary-mark-as-answered-internal 'inverse - number-or-numbers - no-modeline-update)) + no-modeline-update) + (wl-summary-set-persistent-mark-internal + 'inverse + 'answered + number-or-numbers + no-modeline-update)) -(defun wl-summary-mark-as-important (&optional number - mark - no-server-update) - (interactive) - (if (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder) - 'flag) - (error "Cannot process mark in this folder")) +(defun wl-summary-decide-flag (folder number) + (let ((flags (elmo-get-global-flags (elmo-message-flags + folder number))) + (completion-ignore-case t) + new-flags) + (setq new-flags + (delq nil + (mapcar + (lambda (flag) + (and (> (length flag) 0) + (intern (downcase flag)))) + (wl-completing-read-multiple + "Flags: " + (mapcar (lambda (flag) + (list (capitalize (symbol-name flag)))) + elmo-global-flags) + nil nil (mapconcat (lambda (flag) + (capitalize (symbol-name flag))) + flags + ","))))) + (dolist (flag new-flags) + (unless (memq flag elmo-global-flags) + (when (elmo-local-flag-p flag) + (error "Cannot treat `%s'." flag)) + (if (y-or-n-p (format "Flag `%s' is not registered yet. Register?" + (capitalize (symbol-name flag)))) + (setq elmo-global-flags (append + elmo-global-flags + (list flag))) + (error "Stopped")))) + new-flags)) + +(defsubst wl-summary-set-flags-internal (&optional + number-or-numbers + flags + local + remove-all) (save-excursion - (let* ((folder wl-summary-buffer-elmo-folder) - message-id visible cur-mark) - (cond (number - (setq visible (wl-summary-jump-to-msg number)) - (setq cur-mark (or mark - (wl-summary-message-mark - wl-summary-buffer-elmo-folder number) - " "))) - ((setq number (wl-summary-message-number)) - (setq visible t) - (setq cur-mark (or mark (wl-summary-persistent-mark)))) - (t - (error "No message"))) - (when (or visible - ;; already exists in msgdb. - (elmo-message-entity wl-summary-buffer-elmo-folder - number)) - (setq message-id (elmo-message-field - wl-summary-buffer-elmo-folder - number - 'message-id)) - (if (string= cur-mark wl-summary-important-mark) - (progn - ;; server side mark - (save-match-data - (elmo-folder-unflag-important folder (list number) - no-server-update) - ;; Remove cache if local folder. - (if (and (elmo-folder-local-p folder) - (not (eq 'mark - (elmo-folder-type-internal folder)))) - (elmo-file-cache-delete - (elmo-file-cache-get-path message-id))))) - ;; server side mark - (elmo-folder-flag-as-important folder (list number) - no-server-update))) - (when visible - (wl-summary-update-persistent-mark)))) - number) + (let ((folder wl-summary-buffer-elmo-folder) + number number-list) + (setq number-list (cond ((numberp number-or-numbers) + (list number-or-numbers)) + ((and (not (null number-or-numbers)) + (listp number-or-numbers)) + number-or-numbers) + ((setq number (wl-summary-message-number)) + ;; interactive + (list number)))) + (if remove-all + (setq flags nil) + (unless flags + (setq flags (wl-summary-decide-flag folder (car number-list))))) + (if (null number-list) + (message "No message.") + (dolist (number number-list) + (elmo-message-set-global-flags folder number flags local))) + flags))) + +(defun wl-summary-set-flags (&optional remove) + (interactive "P") + (wl-summary-set-flags-internal nil nil nil remove)) + +(defun wl-summary-mark-as-important (&optional prompt) + (interactive "P") + (if prompt + (wl-summary-set-flags-internal) + (wl-summary-set-persistent-mark-internal + (and (interactive-p) + (elmo-message-flagged-p wl-summary-buffer-elmo-folder + (wl-summary-message-number) + 'important)) + 'important + nil nil nil (interactive-p)))) ;;; Summary line. (defvar wl-summary-line-formatter nil) @@ -3259,10 +3513,10 @@ Return non-nil if the mark is updated" '((new . ((t . nil) (p . new) (p . unread) - (p . important))) + (p . digest))) (unread . ((t . nil) (p . unread) - (p . important))))) + (p . digest))))) (defsubst wl-summary-next-message (num direction hereto) (if wl-summary-buffer-next-message-function @@ -3283,7 +3537,7 @@ Return non-nil if the mark is updated" (if (setq flagged-list (elmo-folder-list-flagged wl-summary-buffer-elmo-folder - (cdr (car cur-spec)))) + (cdr (car cur-spec)) t)) (while nums (if (and (memq (car nums) flagged-list) (elmo-message-accessible-p @@ -3313,7 +3567,7 @@ Return non-nil if the mark is updated" (wl-thread-jump-to-msg num)) t))) ;; -;; Goto unread or important +;; Goto unread or global flag message ;; returns t if next message exists in this folder. (defun wl-summary-cursor-down (&optional hereto) (interactive "P") @@ -3548,6 +3802,21 @@ Return non-nil if the mark is updated" ))) (run-hooks 'wl-summary-buffer-window-scroll-functions))) +(defun wl-summary-enter-handler (&optional arg) + "A command for `enter' key in the summary. +Basically, it shows next line of the message. +If optional argument ARG is specified, behave as followed. +If ARG is number, jump to the message. +Otherwise it shows previous line of the message." + (interactive "P") + (cond ((numberp arg) + (unless (wl-thread-jump-to-msg arg) + (message "Message (#%d) was not found." arg))) + (arg + (wl-summary-prev-line-content)) + (t + (wl-summary-next-line-content)))) + (defun wl-summary-next-line-content () "Show next line of the message." (interactive) @@ -3594,6 +3863,7 @@ Return t if message exists." cur-folder cur-number message-last-pos) (when (buffer-live-p wl-message-buffer) (save-window-excursion + (setq wl-current-summary-buffer (current-buffer)) (wl-message-select-buffer wl-message-buffer) (setq cur-folder wl-message-buffer-cur-folder) (setq cur-number wl-message-buffer-cur-number))) @@ -3602,16 +3872,15 @@ Return t if message exists." (progn (set-buffer wl-message-buffer) t) - (if (wl-summary-no-mime-p folder) - (wl-summary-redisplay-no-mime-internal folder number) - (wl-summary-redisplay-internal folder number)) + (wl-summary-redisplay-internal folder number) (when (buffer-live-p wl-message-buffer) (set-buffer wl-message-buffer)) nil))) (defun wl-summary-target-mark-forward (&optional arg) (interactive "P") - (let ((mlist (nreverse wl-summary-buffer-target-mark-list)) + (wl-summary-check-target-mark) + (let ((mlist (nreverse (copy-sequence wl-summary-buffer-target-mark-list))) (summary-buf (current-buffer)) (wl-draft-forward t) start-point @@ -3636,12 +3905,13 @@ Return t if message exists." (goto-char start-point) (save-excursion (set-buffer summary-buf) - (wl-summary-delete-all-temp-marks))) + (wl-summary-delete-all-target-marks))) (run-hooks 'wl-mail-setup-hook))) (defun wl-summary-target-mark-reply-with-citation (&optional arg) (interactive "P") - (let ((mlist (nreverse wl-summary-buffer-target-mark-list)) + (wl-summary-check-target-mark) + (let ((mlist (nreverse (copy-sequence wl-summary-buffer-target-mark-list))) (summary-buf (current-buffer)) change-major-mode-hook start-point @@ -3664,7 +3934,7 @@ Return t if message exists." (goto-char start-point) (save-excursion (set-buffer summary-buf) - (wl-summary-delete-all-temp-marks))) + (wl-summary-delete-all-target-marks))) (wl-draft-reply-position wl-draft-reply-default-position) (run-hooks 'wl-mail-setup-hook)))) @@ -3874,11 +4144,10 @@ Reply to author if invoked with ARG." mes-buf) (when number (save-excursion - (wl-summary-redisplay-internal folder number)) + (wl-summary-set-message-buffer-or-redisplay)) (setq mes-buf wl-message-buffer) (wl-message-select-buffer wl-message-buffer) (set-buffer mes-buf) - (goto-char (point-min)) (condition-case err (when (setq mes-buf (wl-message-get-original-buffer)) (wl-draft-reply mes-buf arg summary-buf number) @@ -3887,9 +4156,7 @@ Reply to author if invoked with ARG." (run-hooks 'wl-mail-setup-hook))) (error (set-window-configuration winconf) (signal (car err)(cdr err)))) - (with-current-buffer summary-buf - (elmo-folder-flag-as-answered folder (list number)) - (wl-summary-update-persistent-mark)) + (with-current-buffer summary-buf (run-hooks 'wl-summary-reply-hook)) t))) (defun wl-summary-write () @@ -3966,7 +4233,8 @@ Use function list is `wl-summary-write-current-folder-functions'." (elmo-message-entity folder number) 'subject 'decode) "")))) (set-buffer mes-buf) - (wl-draft-forward subject summary-buf) + (wl-draft-forward subject summary-buf number) + (with-current-buffer summary-buf (run-hooks 'wl-summary-forward-hook)) (unless without-setup-hook (run-hooks 'wl-mail-setup-hook))))) @@ -4001,9 +4269,10 @@ Use function list is `wl-summary-write-current-folder-functions'." (forward-line -1)) (setq skip (or (string-match skip-tmark-regexp (wl-summary-temp-mark)) - (not (elmo-message-accessible-p - wl-summary-buffer-elmo-folder - (wl-summary-message-number)))))) + (not (and (wl-summary-message-number) + (elmo-message-accessible-p + wl-summary-buffer-elmo-folder + (wl-summary-message-number))))))) (if (if downward (eobp) (and (bobp) skip)) (setq goto-next t)) (if (or (eobp) (and (bobp) skip)) (goto-char start)) @@ -4136,20 +4405,76 @@ Use function list is `wl-summary-write-current-folder-functions'." (wl-summary-redisplay))) (message "No last message."))) +(defun wl-summary-toggle-mime (&optional arg) + "Toggle MIME decoding. +If ARG is non-nil, ask coding-system to display the message in the current +MIME analysis mode. + +If ARG is numeric number, decode message as following: +1: Enable MIME analysis. +2: Enable MIME analysis only for headers. +3: Disable MIME analysis." + (interactive "P") + (let ((rest (memq wl-summary-buffer-display-mime-mode + wl-summary-display-mime-mode-list)) + (elmo-mime-display-as-is-coding-system + elmo-mime-display-as-is-coding-system)) + (if (numberp arg) + (setq wl-summary-buffer-display-mime-mode + (case arg + (1 'mime) + (2 'header-only) + (3 'as-is))) + (if arg + ;; Specify coding-system (doesn't change the MIME mode). + (setq elmo-mime-display-as-is-coding-system + (if (and arg (not (eq wl-summary-buffer-display-mime-mode + 'mime))) + (or (read-coding-system "Coding system: ") + elmo-mime-display-as-is-coding-system) + elmo-mime-display-as-is-coding-system)) + ;; Change the MIME mode. + (if (cadr rest) + (setq wl-summary-buffer-display-mime-mode (cadr rest)) + (setq wl-summary-buffer-display-mime-mode + (car wl-summary-display-mime-mode-list))))) + (wl-summary-redisplay arg) + (wl-summary-update-modeline) + (message "MIME decoding: %s%s" + (upcase (symbol-name wl-summary-buffer-display-mime-mode)) + (if (and arg + (not (numberp arg)) + (not (eq wl-summary-buffer-display-mime-mode + 'mime))) + (concat " (" + (symbol-name elmo-mime-display-as-is-coding-system) + ")") + "")))) + (defun wl-summary-redisplay (&optional arg) + "Redisplay message." (interactive "P") - (if (and (not arg) - (wl-summary-no-mime-p wl-summary-buffer-elmo-folder)) - (wl-summary-redisplay-no-mime) - (wl-summary-redisplay-internal nil nil arg))) + (wl-summary-redisplay-internal nil nil arg)) -(defsubst wl-summary-redisplay-internal (&optional folder number force-reload) - (interactive) +(defun wl-summary-toggle-all-header (&optional arg) + "Toggle displaying message with all header." + (interactive "P") + (setq wl-summary-buffer-display-all-header + (not wl-summary-buffer-display-all-header)) + (wl-summary-redisplay-internal nil nil arg)) + +(defun wl-summary-redisplay-internal (&optional folder number force-reload + mode all-header) (let* ((folder (or folder wl-summary-buffer-elmo-folder)) + (mode (or mode wl-summary-buffer-display-mime-mode)) + (all-header (or all-header wl-summary-buffer-display-all-header)) (num (or number (wl-summary-message-number))) (wl-mime-charset wl-summary-buffer-mime-charset) (default-mime-charset wl-summary-buffer-mime-charset) - no-folder-mark fld-buf fld-win thr-entity) + no-folder-mark fld-buf fld-win thr-entity + (elmo-message-fetch-confirm (or elmo-message-fetch-confirm + (and force-reload + elmo-message-fetch-threshold)))) (if (and wl-thread-open-reading-thread (eq wl-summary-buffer-view 'thread) (not (wl-thread-entity-get-opened @@ -4171,7 +4496,7 @@ Use function list is `wl-summary-write-current-folder-functions'." (setq no-folder-mark ;; If cache is used, change folder-mark. (if (wl-message-redisplay folder num - 'mime + mode all-header (or force-reload (string= (elmo-folder-name-internal @@ -4205,70 +4530,6 @@ Use function list is `wl-summary-write-current-folder-functions'." (run-hooks 'wl-summary-redisplay-hook)) (message "No message to display.")))) -(defun wl-summary-redisplay-no-mime (&optional ask-coding) - "Display message without MIME decoding. -If ASK-CODING is non-nil, coding-system for the message is asked." - (interactive "P") - (let ((elmo-mime-display-as-is-coding-system - (if ask-coding - (or (read-coding-system "Coding system: ") - elmo-mime-display-as-is-coding-system) - elmo-mime-display-as-is-coding-system))) - (wl-summary-redisplay-no-mime-internal))) - -(defun wl-summary-redisplay-no-mime-internal (&optional folder number) - (let* ((fld (or folder wl-summary-buffer-elmo-folder)) - (num (or number (wl-summary-message-number))) - wl-break-pages) - (if num - (progn - (setq wl-summary-buffer-disp-msg t) - (setq wl-summary-buffer-last-displayed-msg - wl-summary-buffer-current-msg) - (setq wl-current-summary-buffer (current-buffer)) - (wl-message-redisplay fld num 'as-is - (string= (elmo-folder-name-internal fld) - wl-draft-folder)) - (ignore-errors - (if (elmo-message-flagged-p fld num 'unread) - (wl-summary-mark-as-read num); no-folder-mark) - (wl-summary-update-persistent-mark))) - (setq wl-summary-buffer-current-msg num) - (when wl-summary-recenter - (recenter (/ (- (window-height) 2) 2)) - (if (not wl-summary-indent-length-limit) - (wl-horizontal-recenter))) - (wl-highlight-summary-displaying) - (run-hooks 'wl-summary-redisplay-hook)) - (message "No message to display.") - (wl-ask-folder 'wl-summary-exit - "No more messages. Type SPC to go to folder mode.")))) - -(defun wl-summary-redisplay-all-header (&optional folder number) - (interactive) - (let* ((fld (or folder wl-summary-buffer-elmo-folder)) - (num (or number (wl-summary-message-number))) - (wl-mime-charset wl-summary-buffer-mime-charset) - (default-mime-charset wl-summary-buffer-mime-charset)) - (if num - (progn - (setq wl-summary-buffer-disp-msg t) - (setq wl-summary-buffer-last-displayed-msg - wl-summary-buffer-current-msg) - (setq wl-current-summary-buffer (current-buffer)) - (if (wl-message-redisplay fld num 'all-header - (string= (elmo-folder-name-internal fld) - wl-draft-folder)) - (wl-summary-mark-as-read num)) - (setq wl-summary-buffer-current-msg num) - (when wl-summary-recenter - (recenter (/ (- (window-height) 2) 2)) - (if (not wl-summary-indent-length-limit) - (wl-horizontal-recenter))) - (wl-highlight-summary-displaying) - (run-hooks 'wl-summary-redisplay-hook)) - (message "No message to display.")))) - (defun wl-summary-jump-to-current-message () "Jump into Message buffer." (interactive) @@ -4375,7 +4636,8 @@ If ASK-CODING is non-nil, coding-system for the message is asked." (if num (save-excursion (setq filename (expand-file-name - (int-to-string num) + (concat (int-to-string num) + wl-summary-save-file-suffix) wl-save-dir)) (if (null (and arg (null (file-exists-p filename)))) @@ -4481,7 +4743,6 @@ If ASK-CODING is non-nil, coding-system for the message is asked." wl-break-pages) (save-excursion (wl-summary-set-message-buffer-or-redisplay) - ;; (wl-summary-redisplay-internal) (let* ((buffer (generate-new-buffer " *print*")) (entity (progn (set-buffer summary-buffer) @@ -4519,21 +4780,19 @@ If ASK-CODING is non-nil, coding-system for the message is asked." (defun wl-summary-target-mark-print () (interactive) - (if (null wl-summary-buffer-target-mark-list) - (message "No marked message.") - (when (y-or-n-p "Print all marked messages. OK? ") - (while (car wl-summary-buffer-target-mark-list) - (let ((num (car wl-summary-buffer-target-mark-list))) - (wl-thread-jump-to-msg num) - (wl-summary-print-message) - (wl-summary-unmark)))))) + (wl-summary-check-target-mark) + (when (y-or-n-p "Print all marked messages. OK? ") + (while (car wl-summary-buffer-target-mark-list) + (let ((num (car wl-summary-buffer-target-mark-list))) + (wl-thread-jump-to-msg num) + (wl-summary-print-message) + (wl-summary-unmark))))) (defun wl-summary-folder-info-update () (wl-folder-set-folder-updated (elmo-string (wl-summary-buffer-folder-name)) (list 0 - (+ wl-summary-buffer-unread-count - wl-summary-buffer-new-count) + wl-summary-buffer-unread-count (elmo-folder-length wl-summary-buffer-elmo-folder)))) @@ -4547,10 +4806,11 @@ If ASK-CODING is non-nil, coding-system for the message is asked." (interactive "P") (elmo-folder-pack-numbers wl-summary-buffer-elmo-folder) (let (wl-use-scoring) - (wl-summary-rescan))) + (wl-summary-rescan nil nil nil t))) (defun wl-summary-target-mark-uudecode () (interactive) + (wl-summary-check-target-mark) (let ((mlist (reverse wl-summary-buffer-target-mark-list)) (summary-buf (current-buffer)) (tmp-buf (get-buffer-create "*WL UUENCODE*")) @@ -4612,7 +4872,7 @@ If ASK-CODING is non-nil, coding-system for the message is asked." filename nil 'no-msg)))) (save-excursion (set-buffer summary-buf) - (wl-summary-delete-all-temp-marks)) + (wl-summary-delete-all-target-marks)) (if (file-exists-p filename) (message "Saved as %s" filename))) (kill-buffer tmp-buf))))) @@ -4696,8 +4956,6 @@ If ASK-CODING is non-nil, coding-system for the message is asked." (wl-message-header-narrowing-toggle) (and wpos (set-window-start mwin wpos))))))) -(autoload 'elmo-folder-list-global-flag-messages "elmo-flag") - (require 'product) (product-provide (provide 'wl-summary) (require 'wl-version))