X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=wl%2Fwl-summary.el;h=20caf048db0b7c00c9425c088bdc0daf8678cd1a;hb=86b762bc7b357266b40f666df02298452224aa2c;hp=729cb7fef11a6e3d3c2a495b501ab51794993de5;hpb=30a4ba29d00304b95c7697f432b8f2758e49bf0b;p=elisp%2Fwanderlust.git diff --git a/wl/wl-summary.el b/wl/wl-summary.el index 729cb7f..20caf04 100644 --- a/wl/wl-summary.el +++ b/wl/wl-summary.el @@ -1,4 +1,4 @@ -;;; wl-summary.el -- Summary mode for Wanderlust. +;;; wl-summary.el --- Summary mode for Wanderlust. ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 1998,1999,2000 Masahiro MURATA @@ -35,7 +35,7 @@ ;;; Code: ;; -(require 'elmo2) +(require 'elmo) (require 'elmo-multi) (require 'wl-message) (require 'wl-vars) @@ -65,8 +65,16 @@ (defvar wl-summary-mode-map nil) (defvar wl-current-summary-buffer nil) -(defvar wl-summary-buffer-msgdb nil) -(defvar wl-summary-buffer-folder-name nil) +(defvar wl-summary-buffer-elmo-folder nil) + +(defmacro wl-summary-buffer-folder-name () + (` (and wl-summary-buffer-elmo-folder + (elmo-folder-name-internal wl-summary-buffer-elmo-folder)))) + +(defmacro wl-summary-buffer-msgdb () + (` (and wl-summary-buffer-elmo-folder + (elmo-folder-msgdb wl-summary-buffer-elmo-folder)))) + (defvar wl-summary-buffer-folder-indicator nil) (defvar wl-summary-buffer-disp-msg nil) (defvar wl-summary-buffer-disp-folder nil) @@ -80,7 +88,6 @@ (defvar wl-summary-buffer-mime-charset nil) (defvar wl-summary-buffer-weekday-name-lang nil) (defvar wl-summary-buffer-thread-indent-set-alist nil) -(defvar wl-summary-buffer-message-redisplay-func nil) (defvar wl-summary-buffer-view 'thread) (defvar wl-summary-buffer-message-modified nil) (defvar wl-summary-buffer-mark-modified nil) @@ -94,9 +101,14 @@ (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-func nil) -(defvar wl-summary-buffer-next-folder-func nil) -(defvar wl-summary-buffer-exit-func nil) +(defvar wl-summary-buffer-prev-folder-function nil) +(defvar wl-summary-buffer-next-folder-function nil) +(defvar wl-summary-buffer-exit-function nil) +(defvar wl-summary-buffer-next-message-function nil) +(defvar wl-summary-buffer-number-list nil) +(defvar wl-summary-buffer-msgdb nil) +(defvar wl-summary-buffer-folder-name nil) + (defvar wl-thread-indent-level-internal nil) (defvar wl-thread-have-younger-brother-str-internal nil) (defvar wl-thread-youngest-child-str-internal nil) @@ -110,22 +122,25 @@ (defvar wl-summary-alike-hashtb nil) (defvar wl-summary-search-buf-name " *wl-search-subject*") (defvar wl-summary-delayed-update nil) +(defvar wl-summary-search-buf-folder-name nil) + +(defvar wl-summary-get-petname-function 'wl-address-get-petname-1) -(defvar wl-summary-message-regexp "^ *\\([0-9]+\\)") +(defvar wl-summary-message-regexp "^ *\\(-?[0-9]+\\)") (defvar wl-summary-shell-command-last "") (defvar wl-ps-preprint-hook nil) (defvar wl-ps-print-hook nil) -(make-variable-buffer-local 'wl-summary-buffer-msgdb) +(make-variable-buffer-local 'wl-summary-buffer-elmo-folder) +(make-variable-buffer-local 'wl-summary-search-buf-folder-name) (make-variable-buffer-local 'wl-summary-buffer-disp-msg) (make-variable-buffer-local 'wl-summary-buffer-disp-folder) (make-variable-buffer-local 'wl-summary-buffer-refile-list) (make-variable-buffer-local 'wl-summary-buffer-copy-list) (make-variable-buffer-local 'wl-summary-buffer-target-mark-list) (make-variable-buffer-local 'wl-summary-buffer-delete-list) -(make-variable-buffer-local 'wl-summary-buffer-folder-name) (make-variable-buffer-local 'wl-summary-buffer-folder-indicator) (make-variable-buffer-local 'wl-summary-buffer-last-displayed-msg) (make-variable-buffer-local 'wl-summary-buffer-unread-status) @@ -134,7 +149,6 @@ (make-variable-buffer-local 'wl-summary-buffer-mime-charset) (make-variable-buffer-local 'wl-summary-buffer-weekday-name-lang) (make-variable-buffer-local 'wl-summary-buffer-thread-indent-set) -(make-variable-buffer-local 'wl-summary-buffer-message-redisplay-func) (make-variable-buffer-local 'wl-summary-buffer-view) (make-variable-buffer-local 'wl-summary-buffer-message-modified) (make-variable-buffer-local 'wl-summary-buffer-mark-modified) @@ -158,9 +172,13 @@ (make-variable-buffer-local 'wl-thread-vertical-str-internal) (make-variable-buffer-local 'wl-thread-horizontal-str-internal) (make-variable-buffer-local 'wl-thread-space-str-internal) -(make-variable-buffer-local 'wl-summary-buffer-prev-folder-func) -(make-variable-buffer-local 'wl-summary-buffer-next-folder-func) -(make-variable-buffer-local 'wl-summary-buffer-exit-func) +(make-variable-buffer-local 'wl-summary-buffer-prev-folder-function) +(make-variable-buffer-local 'wl-summary-buffer-next-folder-function) +(make-variable-buffer-local 'wl-summary-buffer-exit-function) +(make-variable-buffer-local 'wl-summary-buffer-next-message-function) +(make-variable-buffer-local 'wl-summary-buffer-number-list) +(make-variable-buffer-local 'wl-summary-buffer-msgdb) +(make-variable-buffer-local 'wl-summary-buffer-folder-name) ;; internal functions (dummy) (unless (fboundp 'wl-summary-append-message-func-internal) @@ -177,8 +195,8 @@ (defun wl-summary-subject-filter-func-internal (subject) subject)) -(defmacro wl-summary-sticky-buffer-name (folder) - (` (concat wl-summary-buffer-name ":" (, folder)))) +(defmacro wl-summary-sticky-buffer-name (name) + (` (concat wl-summary-buffer-name ":" (, name)))) (defun wl-summary-default-subject (subject-string) (if (string-match "^[ \t]*\\[[^:]+[,: ][0-9]+\\][ \t]*" subject-string) @@ -192,7 +210,7 @@ (and (eq major-mode 'wl-summary-mode) (stringp wl-summary-showto-folder-regexp) (string-match wl-summary-showto-folder-regexp - wl-summary-buffer-folder-name) + (wl-summary-buffer-folder-name)) (wl-address-user-mail-address-p from) (cond ((and (setq tos (elmo-msgdb-overview-entity-get-to entity)) @@ -205,7 +223,7 @@ (eword-decode-string (if wl-use-petname (or - (wl-address-get-petname-1 to) + (funcall wl-summary-get-petname-function to) (car (std11-extract-address-components to)) to) @@ -216,7 +234,7 @@ entity "newsgroups")) (setq retval (concat "Ng:" ng))))) (if wl-use-petname - (setq retval (or (wl-address-get-petname-1 from) + (setq retval (or (funcall wl-summary-get-petname-function from) (car (std11-extract-address-components from)) from)) (setq retval from))) @@ -224,7 +242,7 @@ (defun wl-summary-simple-from (string) (if wl-use-petname - (or (wl-address-get-petname-1 string) + (or (funcall wl-summary-get-petname-function string) (car (std11-extract-address-components string)) string) string)) @@ -345,14 +363,12 @@ (define-key wl-summary-mode-map [(shift button5)] 'wl-summary-down) (define-key wl-summary-mode-map 'button2 'wl-summary-click)) - (if wl-on-nemacs - (defun wl-summary-setup-mouse ()) - (defun wl-summary-setup-mouse () - (define-key wl-summary-mode-map [mouse-4] 'wl-summary-prev) - (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) - (define-key wl-summary-mode-map [mouse-2] 'wl-summary-click)))) + (defun wl-summary-setup-mouse () + (define-key wl-summary-mode-map [mouse-4] 'wl-summary-prev) + (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) + (define-key wl-summary-mode-map [mouse-2] 'wl-summary-click))) (if wl-summary-mode-map () @@ -362,8 +378,7 @@ (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) - (unless wl-on-nemacs - (define-key wl-summary-mode-map [backspace] '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 "/" 'wl-thread-open-close) @@ -373,7 +388,7 @@ (define-key wl-summary-mode-map "\e\r" 'wl-summary-prev-line-content) (define-key wl-summary-mode-map "g" 'wl-summary-goto-folder) (define-key wl-summary-mode-map "c" 'wl-summary-mark-as-read-all) - (define-key wl-summary-mode-map "D" 'wl-summary-drop-unsync) +; (define-key wl-summary-mode-map "D" 'wl-summary-drop-unsync) (define-key wl-summary-mode-map "a" 'wl-summary-reply) (define-key wl-summary-mode-map "A" 'wl-summary-reply-with-citation) @@ -395,6 +410,7 @@ ;;;(define-key wl-summary-mode-map "e" 'wl-draft-open-file) (define-key wl-summary-mode-map "e" 'wl-summary-save) (define-key wl-summary-mode-map "\C-c\C-o" 'wl-jump-to-draft-buffer) + (define-key wl-summary-mode-map "\C-c\C-a" 'wl-addrmgr) (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 "B" 'wl-summary-burst) @@ -529,19 +545,7 @@ (if wl-summary-buffer-disp-msg (wl-summary-redisplay))) -(defun wl-summary-collect-unread (mark-alist &optional folder) - (let (mark ret-val) - (while mark-alist - (setq mark (cadr (car mark-alist))) - (and mark - (or (string= mark wl-summary-new-mark) - (string= mark wl-summary-unread-uncached-mark) - (string= mark wl-summary-unread-cached-mark)) - (setq ret-val (cons (car (car mark-alist)) ret-val))) - (setq mark-alist (cdr mark-alist))) - ret-val)) - -(defun wl-summary-count-unread (mark-alist &optional folder) +(defun wl-summary-count-unread (mark-alist) (let ((new 0) (unread 0) mark) @@ -558,7 +562,30 @@ (if (eq major-mode 'wl-summary-mode) (setq wl-summary-buffer-new-count new wl-summary-buffer-unread-count unread)) - (+ new unread))) + (cons new unread))) + +(defun wl-summary-message-string (&optional use-cache) + "Return full body string of current message. +If optional USE-CACHE is non-nil, use cache if exists." + (let ((number (wl-summary-message-number)) + (folder wl-summary-buffer-elmo-folder)) + (if (null number) + (message "No message.") + (elmo-set-work-buf + (elmo-message-fetch folder + number + (elmo-make-fetch-strategy + 'entire + use-cache ; use cache + nil ; save cache (should `t'?) + (and + use-cache + (elmo-file-cache-get-path + (elmo-message-field folder number 'message-id)))) + nil + (current-buffer) + 'unread) + (buffer-string))))) (defun wl-summary-reedit (&optional arg) "Re-edit current message. @@ -566,7 +593,7 @@ If ARG is non-nil, Supersedes message" (interactive "P") (if arg (wl-summary-supersedes-message) - (if (string= wl-summary-buffer-folder-name wl-draft-folder) + (if (string= (wl-summary-buffer-folder-name) wl-draft-folder) (if (wl-summary-message-number) (unwind-protect (wl-draft-reedit (wl-summary-message-number)) @@ -574,14 +601,7 @@ If ARG is non-nil, Supersedes message" (mail-position-on-field "Newsgroups") (mail-position-on-field "To")) (delete-other-windows))) - (save-excursion - (let ((mmelmo-force-fetch-entire-message t)) - (if (null (wl-summary-message-number)) - (message "No message.") - (wl-summary-set-message-buffer-or-redisplay) - (set-buffer (wl-message-get-original-buffer)) - (wl-draft-edit-string (buffer-substring (point-min) - (point-max))))))))) + (wl-draft-edit-string (wl-summary-message-string))))) (defun wl-summary-resend-bounced-mail () "Re-mail the current message. @@ -590,36 +610,36 @@ contains some mail you have written but has been bounced back to you." (interactive) (save-excursion - (let ((mmelmo-force-fetch-entire-message t)) - (wl-summary-set-message-buffer-or-redisplay) - (set-buffer (wl-message-get-original-buffer)) - (goto-char (point-min)) - (let ((case-fold-search nil)) - (cond - ((and - (re-search-forward - (concat "^\\($\\|[Cc]ontent-[Tt]ype:[ \t]+multipart/report\\)") nil t) - (not (bolp)) - (re-search-forward "boundary=\"\\([^\"]+\\)\"" nil t)) - (let ((boundary (buffer-substring (match-beginning 1) (match-end 1))) - start) - (cond - ((and (setq start (re-search-forward - (concat "^--" boundary "\n" - "[Cc]ontent-[Tt]ype:[ \t]+" - "\\(message/rfc822\\|text/rfc822-headers\\)\n" - "\\(.+\n\\)*\n") nil t)) - (re-search-forward - (concat "\n\\(--" boundary "\\)--\n") nil t)) - (wl-draft-edit-string (buffer-substring start (match-beginning 1)))) - (t - (message "Seems no message/rfc822 part."))))) - ((let ((case-fold-search t)) - (re-search-forward wl-rejected-letter-start nil t)) - (skip-chars-forward " \t\n") - (wl-draft-edit-string (buffer-substring (point) (point-max)))) - (t - (message "Does not appear to be a rejected letter."))))))) + (wl-summary-set-message-buffer-or-redisplay) + (set-buffer (wl-message-get-original-buffer)) + (goto-char (point-min)) + (let ((case-fold-search nil)) + (cond + ((and + (re-search-forward + (concat "^\\($\\|[Cc]ontent-[Tt]ype:[ \t]+multipart/\\(report\\|mixed\\)\\)") nil t) + (not (bolp)) + (re-search-forward "boundary=\"\\([^\"]+\\)\"" nil t)) + (let ((boundary (buffer-substring (match-beginning 1) (match-end 1))) + start) + (cond + ((and (setq start (re-search-forward + (concat "^--" boundary "\n" + "\\([Cc]ontent-[Dd]escription:.*\n\\)?" + "[Cc]ontent-[Tt]ype:[ \t]+" + "\\(message/rfc822\\|text/rfc822-headers\\)\n" + "\\(.+\n\\)*\n") nil t)) + (re-search-forward + (concat "\n\\(--" boundary "\\)--\n") nil t)) + (wl-draft-edit-string (buffer-substring start (match-beginning 1)))) + (t + (message "Seems no message/rfc822 part."))))) + ((let ((case-fold-search t)) + (re-search-forward wl-rejected-letter-start nil t)) + (skip-chars-forward " \t\n") + (wl-draft-edit-string (buffer-substring (point) (point-max)))) + (t + (message "Does not appear to be a rejected letter.")))))) (defun wl-summary-resend-message (address) "Resend the current message to ADDRESS." @@ -628,8 +648,7 @@ you." (message "No address specified.") (message "Resending message to %s..." address) (save-excursion - (let ((mmelmo-force-fetch-entire-message t)) - (wl-summary-set-message-buffer-or-redisplay) + (let ((original (wl-summary-get-original-buffer))) ;; We first set up a normal mail buffer. (set-buffer (get-buffer-create " *wl-draft-resend*")) (buffer-disable-undo (current-buffer)) @@ -649,7 +668,7 @@ you." (delete-region (point) (point-max)) (let ((beg (point))) ;; Insert the message to be resent. - (insert-buffer-substring (wl-message-get-original-buffer)) + (insert-buffer-substring original) (goto-char (point-min)) (search-forward "\n\n") (forward-char -1) @@ -671,54 +690,36 @@ you." (kill-buffer (current-buffer))) (message "Resending message to %s...done" address)))) -(defun wl-summary-msgdb-load-async (folder) - "Loading msgdb and selecting FOLDER is executed asynchronously in IMAP4." - (if (and (elmo-folder-plugged-p folder) - (eq (elmo-folder-get-type folder) 'imap4)) - (let ((spec (elmo-folder-get-spec folder)) - session mailbox - msgdb response tag) - (unwind-protect - (progn - (setq session (elmo-imap4-get-session spec) - mailbox (elmo-imap4-spec-mailbox spec) - tag (elmo-imap4-send-command session - (list "select " - (elmo-imap4-mailbox - mailbox)))) - (setq msgdb (elmo-msgdb-load (elmo-string folder))) - (setq response (elmo-imap4-read-response session tag))) - (if response - (elmo-imap4-session-set-current-mailbox-internal session mailbox) - (and session - (elmo-imap4-session-set-current-mailbox-internal session nil)) - (message "Select mailbox %s failed" mailbox))) - msgdb) - (elmo-msgdb-load (elmo-string folder)))) - (defun wl-summary-buffer-set-folder (folder) - (setq wl-summary-buffer-folder-name folder) + (if (stringp folder) + (setq folder (wl-folder-get-elmo-folder folder))) + (setq wl-summary-buffer-elmo-folder folder) (setq wl-summary-buffer-folder-indicator (if (memq 'modeline wl-use-folder-petname) - (wl-folder-get-petname folder) - folder)) - (when (wl-summary-sticky-p) - (make-local-variable 'wl-message-buf-name) - (setq wl-message-buf-name (format "%s:%s" wl-message-buf-name folder))) + (wl-folder-get-petname (elmo-folder-name-internal folder)) + (elmo-folder-name-internal folder))) + (make-local-variable 'wl-message-buffer) (setq wl-summary-buffer-mime-charset (or (wl-get-assoc-list-value wl-folder-mime-charset-alist - folder) + (elmo-folder-name-internal folder)) wl-mime-charset)) (setq wl-summary-buffer-weekday-name-lang (or (wl-get-assoc-list-value wl-folder-weekday-name-lang-alist - folder) + (elmo-folder-name-internal folder)) wl-summary-weekday-name-lang)) (setq wl-summary-buffer-thread-indent-set (wl-get-assoc-list-value wl-folder-thread-indent-set-alist - folder)) - (setq wl-summary-buffer-persistent (wl-folder-persistent-p folder)) + (elmo-folder-name-internal folder))) + (setq wl-summary-buffer-persistent + (wl-folder-persistent-p (elmo-folder-name-internal folder))) + (elmo-folder-set-persistent-internal folder wl-summary-buffer-persistent) + ;; process duplicates. + (elmo-folder-set-process-duplicates-internal + folder (cdr (elmo-string-matched-assoc + (elmo-folder-name-internal folder) + wl-folder-process-duplicates-alist))) (setq wl-thread-indent-level-internal (or (nth 0 wl-summary-buffer-thread-indent-set) @@ -749,50 +750,12 @@ you." (defun wl-summary-mode () "Major mode for reading threaded messages. -The keys that are defined for this mode are:\\ - -SPC Read messages. -DEL Back-scroll this message. -. Force to display this message. -RET Make this message scroll up with one line. -M-RET - Make this message scroll down with one line. - -C-n Go to the next line. -C-p Go to the previous line. -n Move to below then display. -N Move to next unread. -p Move to above then display. -P Move to previous unread. -s Sync current folder. -t Same as 's' but force update. -g Go to the folder which you input. -w Write a message. A new draft is prepared. -a Answer to this message. A new draft is prepared in Draft mode. -f Forward this message to a third person. A new draft is prepared in - Draft mode and this message is automatically attached. -v Toggle \"Summary and Folder view\". - You can quickly put the delete marks since the next message is not - displayed. -i Prefetch message if uncached. -o Put the refile mark('o') on this message. -! Mark current message as unread. -$ Toggle mark current message as important. -d Put the delete mark('D') on this message. -c Check all messages as read. -* Put the temporal mark('*') on this message. -u Cancel the mark on this message. -x Process marked messages. - -mo Put the refile mark onto all messages marked with '*'. - This is very convenient to refile all messages picked by '?'. -md Put the delete mark onto all messages marked with '*'. -mi Prefetch all messages marked with '*'. -mu Unmark all target-marked messages. -mt Put the '*' mark onto all messages which belong to th current thread. -ma Put the '*' mark onto all messages. -? Pick messages according to a pick pattern which you input, - then put the '*' mark onto them. -q Goto folder mode." +See Info under Wanderlust for full documentation. + +Special commands: +\\{wl-summary-mode-map} + +Entering Folder mode calls the value of `wl-summary-mode-hook'." (interactive) (unless (interactive-p) (kill-all-local-variables)) (setq major-mode 'wl-summary-mode) @@ -804,15 +767,13 @@ q Goto folder mode." ;;;(make-local-variable 'tab-width) ;;;(setq tab-width 1) (buffer-disable-undo (current-buffer)) - (if wl-use-semi - (setq wl-summary-buffer-message-redisplay-func - 'wl-mmelmo-message-redisplay) - (setq wl-summary-buffer-message-redisplay-func - 'wl-normal-message-redisplay)) (wl-mode-line-buffer-identification '("Wanderlust: " wl-summary-buffer-folder-indicator wl-summary-buffer-unread-status)) (easy-menu-add wl-summary-mode-menu) + (when wl-summary-lazy-highlight + (make-local-variable 'window-scroll-functions) + (add-hook 'window-scroll-functions 'wl-highlight-summary-window)) ;; 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)) @@ -865,7 +826,7 @@ q Goto folder mode." "Rescan current folder without updating." (interactive) (let* ((cur-buf (current-buffer)) - (msgdb wl-summary-buffer-msgdb) + (msgdb (wl-summary-buffer-msgdb)) (overview (elmo-msgdb-get-overview msgdb)) (number-alist (elmo-msgdb-get-number-alist msgdb)) (mark-alist (elmo-msgdb-get-mark-alist msgdb)) @@ -878,6 +839,7 @@ q Goto folder mode." expunged) (fset 'wl-summary-append-message-func-internal (wl-summary-get-append-message-func)) + (wl-summary-buffer-number-column-detect nil) (erase-buffer) (message "Re-scanning...") (setq i 0) @@ -889,13 +851,14 @@ q Goto folder mode." (intern (format "wl-summary-overview-entity-compare-by-%s" sort-by)))) (message "Sorting by %s...done" sort-by) - (elmo-msgdb-set-overview wl-summary-buffer-msgdb + (elmo-msgdb-set-overview (wl-summary-buffer-msgdb) overview)) (setq curp overview) (set-buffer cur-buf) (setq wl-thread-entity-hashtb (elmo-make-hash (* (length overview) 2))) (setq wl-thread-entity-list nil) (setq wl-thread-entities nil) + (setq wl-summary-buffer-number-list nil) (setq wl-summary-buffer-target-mark-list nil) (setq wl-summary-buffer-refile-list nil) (setq wl-summary-buffer-delete-list nil) @@ -925,10 +888,12 @@ q Goto folder mode." (setq wl-summary-delayed-update (cdr wl-summary-delayed-update)))) (message "Constructing summary structure...done") (set-buffer cur-buf) - (when (eq wl-summary-buffer-view 'thread) - (message "Inserting thread...") - (wl-thread-insert-top) - (message "Inserting thread...done")) + (if (eq wl-summary-buffer-view 'thread) + (progn + (message "Inserting thread...") + (wl-thread-insert-top) + (message "Inserting thread...done")) + (wl-summary-make-number-list)) (when wl-use-scoring (setq wl-summary-scored nil) (wl-summary-score-headers nil msgdb @@ -938,7 +903,9 @@ q Goto folder mode." (setq expunged (wl-summary-score-update-all-lines))) (message "%d message(s) are expunged by scoring." (length expunged)))) (wl-summary-set-message-modified) - (wl-summary-count-unread mark-alist) + (wl-summary-count-unread + (elmo-msgdb-get-mark-alist + (elmo-folder-msgdb wl-summary-buffer-elmo-folder))) (wl-summary-update-modeline) (goto-char (point-max)) (forward-line -1) @@ -988,10 +955,14 @@ q Goto folder mode." "folder mode")) (defun wl-summary-set-message-modified () + (elmo-folder-set-message-modified-internal + wl-summary-buffer-elmo-folder t) (setq wl-summary-buffer-message-modified t)) (defun wl-summary-message-modified-p () wl-summary-buffer-message-modified) (defun wl-summary-set-mark-modified () + (elmo-folder-set-mark-modified-internal + wl-summary-buffer-elmo-folder t) (setq wl-summary-buffer-mark-modified t)) (defun wl-summary-mark-modified-p () wl-summary-buffer-mark-modified) @@ -1000,41 +971,6 @@ q Goto folder mode." (defun wl-summary-thread-modified-p () wl-summary-buffer-thread-modified) -(defun wl-summary-msgdb-save () - "Save msgdb if modified." - (when wl-summary-buffer-msgdb - (save-excursion - (let (path) - (when (wl-summary-message-modified-p) - (setq path (elmo-msgdb-expand-path wl-summary-buffer-folder-name)) - (elmo-msgdb-overview-save - path - (elmo-msgdb-get-overview wl-summary-buffer-msgdb)) - (elmo-msgdb-number-save - path - (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb)) - (elmo-folder-set-info-max-by-numdb - (elmo-string wl-summary-buffer-folder-name) - (elmo-msgdb-get-number-alist - wl-summary-buffer-msgdb)) - (setq wl-summary-buffer-message-modified nil) - (run-hooks 'wl-summary-buffer-message-saved-hook)) - (when (wl-summary-mark-modified-p) - (or path - (setq path (elmo-msgdb-expand-path - wl-summary-buffer-folder-name))) - (elmo-msgdb-mark-save - path - (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb)) -;;; (elmo-folder-set-info-hashtb -;;; (elmo-string wl-summary-buffer-folder-name) -;;; nil nil -;;; 0 -;;; (+ wl-summary-buffer-new-count wl-summary-buffer-unread-count)) -;;; (setq wl-folder-info-alist-modified t) - (setq wl-summary-buffer-mark-modified nil) - (run-hooks 'wl-summary-buffer-mark-saved-hook)))))) - (defsubst wl-summary-cleanup-temp-marks (&optional sticky) (if (or wl-summary-buffer-refile-list wl-summary-buffer-copy-list @@ -1059,7 +995,8 @@ q Goto folder mode." (setq wl-summary-scored nil)) ;; a subroutine for wl-summary-exit/wl-save-status -(defun wl-summary-save-status (&optional sticky) +;; Note that folder is not commited here. +(defun wl-summary-save-view () ;; already in summary buffer. (when wl-summary-buffer-persistent ;; save the current summary buffer view. @@ -1067,9 +1004,7 @@ q Goto folder mode." (or (wl-summary-message-modified-p) (wl-summary-mark-modified-p) (wl-summary-thread-modified-p))) - (wl-summary-save-view-cache)) - ;; save msgdb ... - (wl-summary-msgdb-save))) + (wl-summary-save-view-cache)))) (defun wl-summary-force-exit () "Exit current summary. Buffer is deleted even the buffer is sticky." @@ -1081,34 +1016,48 @@ q Goto folder mode." (interactive "P") (let ((summary-buf (current-buffer)) (sticky (wl-summary-sticky-p)) - (message-buf (get-buffer wl-message-buf-name)) summary-win message-buf message-win folder-buf folder-win) - (if wl-summary-buffer-exit-func - (funcall wl-summary-buffer-exit-func) + (run-hooks 'wl-summary-exit-pre-hook) + (if wl-summary-buffer-exit-function + (funcall wl-summary-buffer-exit-function) (wl-summary-cleanup-temp-marks sticky) (unwind-protect ;; save summary status (progn - (wl-summary-save-status sticky) - (elmo-commit wl-summary-buffer-folder-name) - (if wl-use-scoring - (wl-score-save))) + (wl-summary-save-view) + (if (or force-exit (not sticky)) + (elmo-folder-close wl-summary-buffer-elmo-folder) + (elmo-folder-commit wl-summary-buffer-elmo-folder) + (elmo-folder-check wl-summary-buffer-elmo-folder)) + (if wl-use-scoring (wl-score-save))) ;; for sticky summary (wl-delete-all-overlays) (setq wl-summary-buffer-disp-msg nil) (elmo-kill-buffer wl-summary-search-buf-name) ;; delete message window if displayed. - (if (setq message-buf (get-buffer wl-message-buf-name)) - (if (setq message-win (get-buffer-window message-buf)) - (delete-window message-win))) + (if (and wl-message-buffer (get-buffer-window wl-message-buffer)) + (delete-window (get-buffer-window wl-message-buffer))) + (if (and wl-summary-use-frame + (> (length (visible-frame-list)) 1)) + (delete-frame)) (if (setq folder-buf (get-buffer wl-folder-buffer-name)) - (if (setq folder-win (get-buffer-window folder-buf)) - ;; folder win is already displayed. - (select-window folder-win) - ;; folder win is not displayed. - (switch-to-buffer folder-buf)) + (if wl-summary-use-frame + (let (select-frame) + (save-selected-window + (dolist (frame (visible-frame-list)) + (select-frame frame) + (if (get-buffer-window folder-buf) + (setq select-frame frame)))) + (if select-frame + (select-frame select-frame) + (switch-to-buffer folder-buf))) + (if (setq folder-win (get-buffer-window folder-buf)) + ;; folder win is already displayed. + (select-window folder-win) + ;; folder win is not displayed. + (switch-to-buffer folder-buf))) ;; currently no folder buffer (wl-folder)) (and wl-folder-move-cur-folder @@ -1126,83 +1075,39 @@ q Goto folder mode." (not sticky)) (progn (set-buffer summary-buf) - (and (get-buffer wl-message-buf-name) - (kill-buffer wl-message-buf-name)) - ;; kill buffers of mime-view-caesar - (wl-kill-buffers - (format "^%s-([0-9 ]+)$" (regexp-quote wl-message-buf-name))) (kill-buffer summary-buf))) (run-hooks 'wl-summary-exit-hook))))) -(defun wl-summary-sync-force-update (&optional unset-cursor) +(defun wl-summary-sync-force-update (&optional unset-cursor no-check) (interactive) - (let ((msgdb-dir (elmo-msgdb-expand-path wl-summary-buffer-folder-name)) - (type (elmo-folder-get-type wl-summary-buffer-folder-name)) - ret-val seen-list) - (unwind-protect - (progn - (if wl-summary-buffer-persistent - (setq seen-list (elmo-msgdb-seen-load msgdb-dir))) - (setq ret-val (wl-summary-sync-update3 seen-list unset-cursor)) - (if wl-summary-buffer-persistent - (progn - (if (and (eq type 'imap4) - (not (elmo-folder-plugged-p - wl-summary-buffer-folder-name))) - (let* ((msgdb wl-summary-buffer-msgdb) - (number-alist (elmo-msgdb-get-number-alist msgdb))) - (elmo-mark-as-read wl-summary-buffer-folder-name - (mapcar - (lambda (msgid) - (car (rassoc msgid number-alist))) - seen-list) msgdb))) - (elmo-msgdb-seen-save msgdb-dir nil)))) - (set-buffer (current-buffer))) - (if (interactive-p) - (message "%s" ret-val)) - ret-val)) + (wl-summary-sync-update unset-cursor nil no-check)) + +(defsubst wl-summary-sync-all-init () + (wl-summary-cleanup-temp-marks) + (erase-buffer) + (wl-summary-set-message-modified) + (wl-summary-set-mark-modified) + (setq wl-thread-entity-hashtb (elmo-make-hash + (* (length (elmo-msgdb-get-number-alist + (wl-summary-buffer-msgdb))) 2))) + (setq wl-thread-entity-list nil) + (setq wl-thread-entities nil) + (setq wl-summary-buffer-number-list nil) + (setq wl-summary-buffer-target-mark-list nil) + (setq wl-summary-buffer-refile-list nil) + (setq wl-summary-buffer-copy-list nil) + (setq wl-summary-buffer-delete-list nil) + (wl-summary-buffer-number-column-detect nil)) (defun wl-summary-sync (&optional unset-cursor force-range) (interactive) - (let* ((folder wl-summary-buffer-folder-name) + (let* ((folder wl-summary-buffer-elmo-folder) (inhibit-read-only t) (buffer-read-only nil) - (msgdb-dir (elmo-msgdb-expand-path - folder)) - (range (or force-range (wl-summary-input-range folder))) - mes seen-list) - (cond ((string= range "all") - ;; initialize buffer local databases. - (unless (elmo-folder-plugged-p folder) ; forbidden - (error "Unplugged")) - (wl-summary-cleanup-temp-marks) - (setq seen-list - (nconc - (elmo-msgdb-mark-alist-to-seen-list - (elmo-msgdb-get-number-alist - wl-summary-buffer-msgdb) - (elmo-msgdb-get-mark-alist - wl-summary-buffer-msgdb) - (concat wl-summary-important-mark - wl-summary-read-uncached-mark)) - (elmo-msgdb-seen-load msgdb-dir))) - (setq wl-thread-entity-hashtb (elmo-make-hash - (* (length (elmo-msgdb-get-number-alist - wl-summary-buffer-msgdb)) 2))) - (setq wl-summary-buffer-msgdb (elmo-msgdb-clear)) ;;'(nil nil nil nil)) - (setq wl-thread-entity-list nil) - (setq wl-thread-entities nil) - (setq wl-summary-buffer-target-mark-list nil) - (setq wl-summary-buffer-refile-list nil) - (setq wl-summary-buffer-copy-list nil) - (setq wl-summary-buffer-delete-list nil) - (wl-summary-buffer-number-column-detect nil) - (elmo-clear-killed folder) - (setq mes (wl-summary-sync-update3 seen-list unset-cursor)) - (elmo-msgdb-seen-save msgdb-dir nil) ; delete all seen. - (if mes (message "%s" mes))) -;;; (wl-summary-sync-all folder t)) - ((string= range "rescan") + (msgdb-dir (elmo-folder-msgdb-path folder)) + (range (or force-range (wl-summary-input-range + (elmo-folder-name-internal folder))))) + (cond ((string= range "rescan") (let ((msg (wl-summary-message-number))) (wl-summary-rescan) (and msg (wl-summary-jump-to-msg msg)))) @@ -1211,18 +1116,23 @@ q Goto folder mode." wl-use-scoring) (wl-summary-rescan) (and msg (wl-summary-jump-to-msg msg)))) + ((string= range "cache-status") + (let ((msg (wl-summary-message-number)) + wl-use-scoring) + (wl-summary-resume-cache-status) + (and msg (wl-summary-jump-to-msg msg)))) ((or (string-match "last:" range) (string-match "first:" range)) - (wl-summary-goto-folder-subr (concat "/" range "/" folder) - 'force-update nil nil t)) - ((string= range "no-sync") - ;; do nothing. - ) + (wl-summary-goto-folder-subr + (wl-folder-get-elmo-folder (concat "/" range "/" + (elmo-folder-name-internal + folder))) + 'force-update nil nil t)) (t - (setq seen-list (elmo-msgdb-seen-load msgdb-dir)) - (setq mes (wl-summary-sync-update3 seen-list unset-cursor)) - (elmo-msgdb-seen-save msgdb-dir nil) ; delete all seen. - (if mes (message "%s" mes)))))) + (wl-summary-sync-update unset-cursor + (cond ((string= range "all") 'all) + ((string= range "all-visible") + 'visible-only))))))) (defvar wl-summary-edit-addresses-candidate-fields ;; First element becomes default. @@ -1256,8 +1166,8 @@ q Goto folder mode." ;; returns nil if there's no change. (if (elmo-get-hash-val (downcase the-email) wl-address-petname-hash) (let (char) - (message (format "'%s' already exists. (e)dit/(d)elete/(c)ancel?" - the-email)) + (message "'%s' already exists. (e)dit/(d)elete/(c)ancel?" + the-email) (while (not (or (eq (setq char (read-char)) ?\r) (eq char ?\n) (eq char ? ) @@ -1272,27 +1182,29 @@ q Goto folder mode." (eq char ?\r) (eq char ? )) ;; Change Addresses - (wl-address-petname-add-or-change + (wl-address-add-or-change the-email - (elmo-get-hash-val the-email wl-address-petname-hash) (wl-address-header-extract-realname - (cdr (assoc (downcase the-email) - wl-address-completion-list))) t) + (cdr (assoc + (let ((completion-ignore-case t) comp) + (setq comp + (try-completion the-email wl-address-completion-list)) + (if (equal comp t) the-email comp)) + wl-address-completion-list)))) "edited") ((eq char ?d) ;; Delete Addresses (if (y-or-n-p (format "Delete '%s'? " the-email)) (progn - (wl-address-petname-delete the-email) + (wl-address-delete the-email) "deleted") (message "") nil)) (t (message "") nil))) ;; Add Petname - (wl-address-petname-add-or-change - the-email name-in-addr name-in-addr) + (wl-address-add-or-change the-email name-in-addr) "added")) (defun wl-summary-edit-addresses (&optional addr-str) @@ -1303,41 +1215,40 @@ Optional argument ADDR-STR is used as a target address if specified." (if (null (wl-summary-message-number)) (message "No message.") (save-excursion - (wl-summary-set-message-buffer-or-redisplay)) - (let* ((charset wl-summary-buffer-mime-charset) - (candidates - (with-current-buffer (wl-message-get-original-buffer) - (wl-summary-edit-addresses-collect-candidate-fields - charset))) - address pair result) - (if addr-str - (setq address addr-str) - (when candidates - (setq address (car (car candidates))) - (setq address - (completing-read - (format "Target address (%s): " address) - (mapcar - (function (lambda (x) (cons (car x) (car x)))) - candidates) - nil nil nil nil address)))) - (when address - (setq pair (assoc address candidates)) - (unless pair - (setq pair (cons address nil))) - (when (setq result (wl-summary-edit-addresses-subr (car pair) (cdr pair))) - ;; update alias - (wl-status-update) - (setq address (assoc (car pair) wl-address-list)) - (if address - (message "%s, %s, <%s> is %s." - (nth 2 address) - (nth 1 address) - (nth 0 address) - result))) + (let* ((charset wl-summary-buffer-mime-charset) + (candidates + (with-current-buffer (wl-summary-get-original-buffer) + (wl-summary-edit-addresses-collect-candidate-fields + charset))) + address pair result) + (if addr-str + (setq address addr-str) + (when candidates + (setq address (car (car candidates))) + (setq address + (completing-read + (format "Target address (%s): " address) + (mapcar + (function (lambda (x) (cons (car x) (car x)))) + candidates) + nil nil nil nil address)))) + (when address + (setq pair (assoc address candidates)) + (unless pair + (setq pair (cons address nil))) + (when (setq result (wl-summary-edit-addresses-subr (car pair) (cdr pair))) + ;; update alias + (wl-status-update) + (setq address (assoc (car pair) wl-address-list)) + (if address + (message "%s, %s, <%s> is %s." + (nth 2 address) + (nth 1 address) + (nth 0 address) + result))) ;;; i'd like to update summary-buffer, but... ;;; (wl-summary-rescan) - (run-hooks 'wl-summary-edit-addresses-hook))))) + (run-hooks 'wl-summary-edit-addresses-hook)))))) (defun wl-summary-incorporate (&optional arg) "Check and prefetch all uncached messages. @@ -1353,102 +1264,78 @@ If ARG is non-nil, checking is omitted." "Returns status-mark. if skipped, returns nil." ;; prefetching procedure. (save-excursion - (let* ((msgdb wl-summary-buffer-msgdb) + (let* ((msgdb (wl-summary-buffer-msgdb)) (mark-alist (elmo-msgdb-get-mark-alist msgdb)) (number-alist (elmo-msgdb-get-number-alist msgdb)) (message-id (cdr (assq number number-alist))) - (ov (assoc message-id - (elmo-msgdb-get-overview msgdb))) + (ov (elmo-msgdb-overview-get-entity message-id msgdb)) (entity ov) (size (elmo-msgdb-overview-entity-get-size ov)) (inhibit-read-only t) (buffer-read-only nil) + (file-cached (elmo-file-cache-exists-p message-id)) (force-read (and size (or (null wl-prefetch-threshold) (< size wl-prefetch-threshold)))) mark new-mark) - (if (or arg - (null (elmo-cache-exists-p message-id))) - (unwind-protect - (progn - (when (and size (not force-read) wl-prefetch-confirm) - (setq force-read - (save-restriction - (widen) - (y-or-n-p - (format - "Message from %s has %d bytes. Prefetch it? " - (concat - "[ " - (save-match-data - (wl-set-string-width - wl-from-width - (wl-summary-from-func-internal - (eword-decode-string - (elmo-delete-char - ?\" - (or - (elmo-msgdb-overview-entity-get-from ov) - "??")))))) " ]") - size)))) - (message "")) ; flush. - (setq mark (cadr (assq number mark-alist))) - (if force-read - (save-excursion - (save-match-data - (if (and (null (elmo-folder-plugged-p - wl-summary-buffer-folder-name)) - elmo-enable-disconnected-operation) - (progn;; append-queue for offline - (elmo-dop-prefetch-msgs - wl-summary-buffer-folder-name (list number)) - (setq new-mark - (cond - ((string= mark - wl-summary-unread-uncached-mark) - wl-summary-unread-cached-mark) - ((string= mark wl-summary-new-mark) - (setq wl-summary-buffer-new-count - (- wl-summary-buffer-new-count 1)) - (setq wl-summary-buffer-unread-count - (+ wl-summary-buffer-unread-count 1)) - wl-summary-unread-cached-mark) - ((or (null mark) - (string= mark wl-summary-read-uncached-mark)) - (setq wl-summary-buffer-unread-count - (+ wl-summary-buffer-unread-count 1)) - wl-summary-unread-cached-mark) - (t mark)))) - ;; online - (elmo-prefetch-msg wl-summary-buffer-folder-name - number - (wl-message-get-original-buffer) - msgdb) - (setq new-mark - (cond - ((string= mark - wl-summary-unread-uncached-mark) - wl-summary-unread-cached-mark) - ((string= mark wl-summary-new-mark) - (setq wl-summary-buffer-new-count - (- wl-summary-buffer-new-count 1)) - (setq wl-summary-buffer-unread-count - (+ wl-summary-buffer-unread-count 1)) - wl-summary-unread-cached-mark) - ((string= mark wl-summary-read-uncached-mark) - nil) - (t mark)))) - (setq mark-alist (elmo-msgdb-mark-set - mark-alist number new-mark)) - (or new-mark (setq new-mark " ")) - (elmo-msgdb-set-mark-alist msgdb mark-alist) - (wl-summary-set-mark-modified) - (wl-summary-update-modeline) - (wl-folder-update-unread - wl-summary-buffer-folder-name - (+ wl-summary-buffer-unread-count - wl-summary-buffer-new-count))) - new-mark)))))))) + (unwind-protect + (progn + (when (and (or arg (not file-cached)) + size (not force-read) wl-prefetch-confirm) + (setq force-read + (save-restriction + (widen) + (y-or-n-p + (format + "Message from %s has %d bytes. Prefetch it? " + (concat + "[ " + (save-match-data + (wl-set-string-width + wl-summary-from-width + (wl-summary-from-func-internal + (eword-decode-string + (elmo-delete-char + ?\" + (or + (elmo-msgdb-overview-entity-get-from ov) + "??")))))) " ]") + size)))) + (message "")) ; flush. + (setq mark (cadr (assq number mark-alist))) + (if force-read + (save-excursion + (save-match-data + ;; online + (if (or arg (not file-cached)) + (elmo-message-encache + wl-summary-buffer-elmo-folder + number)) + (setq new-mark + (cond + ((string= mark + wl-summary-unread-uncached-mark) + wl-summary-unread-cached-mark) + ((string= mark wl-summary-new-mark) + (setq wl-summary-buffer-new-count + (- wl-summary-buffer-new-count 1)) + (setq wl-summary-buffer-unread-count + (+ wl-summary-buffer-unread-count 1)) + wl-summary-unread-cached-mark) + ((string= mark wl-summary-read-uncached-mark) + nil) + (t mark))) + (setq mark-alist (elmo-msgdb-mark-set + mark-alist number new-mark)) + (or new-mark (setq new-mark " ")) + (elmo-msgdb-set-mark-alist msgdb mark-alist) + (wl-summary-set-mark-modified) + (wl-summary-update-modeline) + (wl-folder-update-unread + (wl-summary-buffer-folder-name) + (+ wl-summary-buffer-unread-count + wl-summary-buffer-new-count))) + new-mark))))))) ;;(defvar wl-summary-message-uncached-marks ;; (list wl-summary-new-mark @@ -1471,15 +1358,15 @@ If ARG is non-nil, checking is omitted." (goto-char (point-min)) (while (not (eobp)) (beginning-of-line) - (when (looking-at "^ *\\([0-9]+\\)[^0-9]\\([^0-9]\\)") + (when (looking-at "^ *\\(-?[0-9]+\\)[^0-9]\\([^0-9]\\)") (setq mark (wl-match-buffer 2)) (setq msg (string-to-int (wl-match-buffer 1))) (if (or (and (null prefetch-marks) msg - (null (elmo-cache-exists-p + (null (elmo-file-cache-exists-p (cdr (assq msg (elmo-msgdb-get-number-alist - wl-summary-buffer-msgdb)))))) + (wl-summary-buffer-msgdb))))))) (member mark prefetch-marks)) (setq targets (nconc targets (list msg)))) (setq entity (wl-thread-get-entity msg)) @@ -1525,16 +1412,17 @@ If ARG is non-nil, checking is omitted." (save-excursion (save-match-data (beginning-of-line) - (when (looking-at "^ *\\([0-9]+\\)[^0-9]\\([^0-9]\\)") + (when (looking-at "^ *\\(-?[0-9]+\\)[^0-9]\\([^0-9]\\)") (goto-char (match-beginning 2)) (let ((inhibit-read-only t) (buffer-read-only nil) + (beg (match-beginning 2)) + (end (match-end 2)) mark) (setq mark (wl-summary-prefetch-msg (string-to-int (wl-match-buffer 1)) arg)) (when mark - (delete-region (match-beginning 2) - (match-end 2)) + (delete-region beg end) (insert mark) (if wl-summary-highlight (wl-highlight-summary-current-line))) @@ -1634,7 +1522,7 @@ If ARG is non-nil, checking is omitted." (while (not (eobp)) (wl-summary-mark-as-read t) (forward-line 1))))) - (wl-summary-count-unread (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb)) + (wl-summary-count-unread (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb))) (wl-summary-update-modeline)) (defun wl-summary-mark-as-unread-region (beg end) @@ -1667,7 +1555,7 @@ If ARG is non-nil, checking is omitted." (while (not (eobp)) (wl-summary-mark-as-unread) (forward-line 1))))) - (wl-summary-count-unread (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb)) + (wl-summary-count-unread (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb))) (wl-summary-update-modeline)) (defun wl-summary-mark-as-important-region (beg end) @@ -1698,16 +1586,16 @@ If ARG is non-nil, checking is omitted." (while (not (eobp)) (wl-summary-mark-as-important) (forward-line 1))))) - (wl-summary-count-unread (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb)) + (wl-summary-count-unread (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb))) (wl-summary-update-modeline)) (defun wl-summary-mark-as-read-all () (interactive) (if (or (not (interactive-p)) (y-or-n-p "Mark all messages as read? ")) - (let* ((folder wl-summary-buffer-folder-name) + (let* ((folder wl-summary-buffer-elmo-folder) (cur-buf (current-buffer)) - (msgdb wl-summary-buffer-msgdb) + (msgdb (wl-summary-buffer-msgdb)) ;;; (number-alist (elmo-msgdb-get-number-alist msgdb)) (mark-alist (elmo-msgdb-get-mark-alist msgdb)) (malist mark-alist) @@ -1716,17 +1604,21 @@ If ARG is non-nil, checking is omitted." (case-fold-search nil) msg mark) (message "Setting all msgs as read...") - (elmo-mark-as-read folder (wl-summary-collect-unread mark-alist) - msgdb) + (elmo-folder-mark-as-read folder + (elmo-folder-list-unreads + folder + (list wl-summary-unread-cached-mark + wl-summary-unread-uncached-mark + wl-summary-new-mark))) (save-excursion (goto-char (point-min)) - (while (re-search-forward "^ *\\([0-9]+\\)[^0-9]\\([^0-9 ]\\)" nil t) + (while (re-search-forward "^ *\\(-?[0-9]+\\)[^0-9]\\([^0-9 ]\\)" nil t) (setq msg (string-to-int (wl-match-buffer 1))) (setq mark (wl-match-buffer 2)) (when (and (not (string= mark wl-summary-important-mark)) (not (string= mark wl-summary-read-uncached-mark))) (delete-region (match-beginning 2) (match-end 2)) - (if (or (not (elmo-use-cache-p folder msg)) + (if (or (not (elmo-message-use-cache-p folder msg)) (string= mark wl-summary-unread-cached-mark)) (progn (insert " ") @@ -1750,7 +1642,7 @@ If ARG is non-nil, checking is omitted." (wl-summary-set-mark-modified) (set-buffer cur-buf); why is this needed??? (elmo-msgdb-set-mark-alist msgdb mark-alist) - (wl-folder-update-unread wl-summary-buffer-folder-name 0) + (wl-folder-update-unread (wl-summary-buffer-folder-name) 0) (setq wl-summary-buffer-unread-count 0) (setq wl-summary-buffer-new-count 0) (wl-summary-update-modeline) @@ -1763,15 +1655,15 @@ If ARG is non-nil, checking is omitted." (save-excursion (let* ((inhibit-read-only t) (buffer-read-only nil) - (folder wl-summary-buffer-folder-name) - (msgdb wl-summary-buffer-msgdb) + (folder wl-summary-buffer-elmo-folder) + (msgdb (wl-summary-buffer-msgdb)) (mark-alist (elmo-msgdb-get-mark-alist msgdb)) (number-alist (elmo-msgdb-get-number-alist msgdb)) (case-fold-search nil) mark number unread new-mark) ;;; (re-search-backward "^ *[0-9]+..[0-9]+/[0-9]+" nil t) ; set cursor line (beginning-of-line) - (when (looking-at "^ *\\([0-9]+\\)[^0-9]\\([^0-9]\\)") + (when (looking-at "^ *\\(-?[0-9]+\\)[^0-9]\\([^0-9]\\)") (progn (setq mark (wl-match-buffer 2)) (cond @@ -1789,9 +1681,11 @@ If ARG is non-nil, checking is omitted." (delete-region (match-beginning 2) (match-end 2)) (goto-char (match-beginning 2)) (insert new-mark) - (elmo-cache-delete (cdr (assq number number-alist)) - wl-summary-buffer-folder-name - number) + (elmo-file-cache-delete + (elmo-file-cache-get-path + (elmo-message-field wl-summary-buffer-elmo-folder + number + 'message-id))) (setq mark-alist (elmo-msgdb-mark-set mark-alist number new-mark)) (elmo-msgdb-set-mark-alist msgdb mark-alist) @@ -1803,9 +1697,9 @@ If ARG is non-nil, checking is omitted." (defun wl-summary-resume-cache-status () "Resume the cache status of all messages in the current folder." (interactive) - (let* ((folder wl-summary-buffer-folder-name) + (let* ((folder wl-summary-buffer-elmo-folder) (cur-buf (current-buffer)) - (msgdb wl-summary-buffer-msgdb) + (msgdb (wl-summary-buffer-msgdb)) (number-alist (elmo-msgdb-get-number-alist msgdb)) (mark-alist (elmo-msgdb-get-mark-alist msgdb)) (inhibit-read-only t) @@ -1815,16 +1709,16 @@ If ARG is non-nil, checking is omitted." (message "Resuming cache status...") (save-excursion (goto-char (point-min)) - (while (re-search-forward "^ *\\([0-9]+\\)[^0-9]\\([^0-9]\\)" nil t) + (while (re-search-forward "^ *\\(-?[0-9]+\\)[^0-9]\\([^0-9]\\)" nil t) (setq msg (string-to-int (wl-match-buffer 1))) (setq mark (wl-match-buffer 2)) (setq msgid (cdr (assq msg number-alist))) (setq set-mark nil) - (if (elmo-cache-exists-p msgid folder msg) + (if (elmo-file-cache-exists-p msgid) (if (or (string= mark wl-summary-unread-uncached-mark) ; U -> ! - (string= mark wl-summary-new-mark) ; N -> ! + (string= mark wl-summary-new-mark) ; N -> ! ) (setq set-mark wl-summary-unread-cached-mark) (if (string= mark wl-summary-read-uncached-mark) ; u -> ' ' @@ -1852,7 +1746,7 @@ If ARG is non-nil, checking is omitted." (set-buffer-modified-p nil)))) (defun wl-summary-resume-marks-and-highlight () - (let* ((msgdb wl-summary-buffer-msgdb) + (let* ((msgdb (wl-summary-buffer-msgdb)) (mark-alist (elmo-msgdb-get-mark-alist msgdb)) ;;; (number-alist (elmo-msgdb-get-number-alist msgdb)) (count (count-lines (point-min)(point-max))) @@ -1880,7 +1774,7 @@ If ARG is non-nil, checking is omitted." (message "Resuming all marks...done"))) (defun wl-summary-resume-marks () - (let* ((msgdb wl-summary-buffer-msgdb) + (let* ((msgdb (wl-summary-buffer-msgdb)) (mark-alist (elmo-msgdb-get-mark-alist msgdb)) (number-alist (elmo-msgdb-get-number-alist msgdb)) (count (length mark-alist)) @@ -1891,7 +1785,7 @@ If ARG is non-nil, checking is omitted." (while mark-alist (setq entity (car mark-alist)) (if (setq msg-num (car (rassoc (car entity) number-alist))) - (progn + (progn ;;; (goto-char (point-min)) (if (re-search-forward (format "^ *%s \\( \\)" msg-num) nil t) (progn @@ -1937,7 +1831,8 @@ If ARG is non-nil, checking is omitted." (progn (delete-region (match-beginning 0) (match-end 0)) (delete-char 1) ; delete '\n' - ))) + (setq wl-summary-buffer-number-list + (delq (car msgs) wl-summary-buffer-number-list))))) (when (and deleting-info (> len elmo-display-progress-threshold)) (setq i (1+ i)) @@ -1951,10 +1846,10 @@ If ARG is non-nil, checking is omitted." (unless deleting-info 'no-msg)) (wl-thread-cleanup-symbols msgs2)) (wl-summary-count-unread - (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb)) + (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb))) (wl-summary-update-modeline) (wl-folder-update-unread - wl-summary-buffer-folder-name + (wl-summary-buffer-folder-name) (+ wl-summary-buffer-unread-count wl-summary-buffer-new-count))))) (defun wl-summary-set-as-read-mark-alist (mark-alist) @@ -1969,11 +1864,11 @@ If ARG is non-nil, checking is omitted." (while mark-alist (setq entity (car mark-alist)) (when (setq pair (assoc (cadr entity) marks)) - (if (elmo-use-cache-p wl-summary-buffer-folder-name - (caar mark-alist)) + (if (elmo-message-use-cache-p wl-summary-buffer-elmo-folder + (caar mark-alist)) (if (cdr pair) (setcar (cdr entity) (cdr pair)) - (setq ret-val (delete entity ret-val))) + (setq ret-val (delete entity ret-val))) (setq ret-val (delete entity ret-val)))) (setq mark-alist (cdr mark-alist))) ret-val)) @@ -2063,29 +1958,26 @@ If ARG is non-nil, checking is omitted." (defun wl-summary-sync-marks () "Update marks in summary." (interactive) - (let ((plugged (elmo-folder-plugged-p wl-summary-buffer-folder-name)) - (last-progress 0) + (let ((last-progress 0) (i 0) - mark-alist unread-marks msgs mark importants unreads - importants-in-db unreads-in-db has-imap4 diff diffs + mark-alist unread-marks importants unreads + importants-in-db unreads-in-db diff diffs mes num-ma progress) ;; synchronize marks. - (when (not (eq (elmo-folder-get-type - wl-summary-buffer-folder-name) + (when (not (eq (elmo-folder-type-internal + wl-summary-buffer-elmo-folder) 'internal)) (message "Updating marks...") (setq unread-marks (list wl-summary-unread-cached-mark wl-summary-unread-uncached-mark wl-summary-new-mark) - mark-alist (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb) - num-ma (length mark-alist) - importants (elmo-list-folder-important - wl-summary-buffer-folder-name - (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb)) - unreads (elmo-list-folder-unread - wl-summary-buffer-folder-name - (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb) - (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb) + mark-alist (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb)) + num-ma (length mark-alist) + importants (elmo-folder-list-importants + wl-summary-buffer-elmo-folder + wl-summary-important-mark) + unreads (elmo-folder-list-unreads + wl-summary-buffer-elmo-folder unread-marks)) (while mark-alist (if (string= (cadr (car mark-alist)) @@ -2130,256 +2022,185 @@ If ARG is non-nil, checking is omitted." (setq diffs (cdr diffs))) (if (interactive-p) (message mes))))) -(defun wl-summary-confirm-appends (appends) - (condition-case nil - (let ((len (length appends)) - in) - (if (> len wl-summary-update-confirm-threshold) - (if (y-or-n-p (format "Too many messages(%d). Continue? " len)) - appends - (setq in wl-summary-update-confirm-threshold) - (catch 'end - (while t - (setq in (read-from-minibuffer "Update number: " - (int-to-string in)) - in (string-to-int in)) - (if (< len in) - (throw 'end len)) - (if (y-or-n-p (format "%d messages are disappeared. OK? " - (max (- len in) 0))) - (throw 'end in)))) - (nthcdr (max (- len in) 0) appends)) - appends)) - (quit nil) - (error nil))) ; - -(defun wl-summary-sync-update3 (&optional seen-list unset-cursor) - "Update the summary view." +(defun wl-summary-sync-update (&optional unset-cursor sync-all no-check) + "Update the summary view to the newest folder status." (interactive) - (let* ((folder wl-summary-buffer-folder-name) - (cur-buf (current-buffer)) - (msgdb wl-summary-buffer-msgdb) - (number-alist (elmo-msgdb-get-number-alist msgdb)) - (mark-alist (elmo-msgdb-get-mark-alist msgdb)) - (overview (elmo-msgdb-get-overview msgdb)) -;;; (location (elmo-msgdb-get-location msgdb)) + (let* ((folder wl-summary-buffer-elmo-folder) (case-fold-search nil) (elmo-mime-charset wl-summary-buffer-mime-charset) (inhibit-read-only t) (buffer-read-only nil) - diff initial-append-list append-list delete-list has-nntp - i num result gc-message - in-folder - in-db curp - overview-append - entity ret-val crossed crossed2 sync-all - update-thread update-top-list mark - expunged msgs unreads importants) -;;; (setq seen-list nil) ;for debug. - (fset 'wl-summary-append-message-func-internal - (wl-summary-get-append-message-func)) - ;; Flush pending append operations (disconnected operation). - (setq seen-list - (wl-summary-flush-pending-append-operations seen-list)) - (goto-char (point-max)) - (wl-folder-confirm-existence folder 'force) - (message "Checking folder diff...") - (elmo-commit folder) - (setq in-folder (elmo-list-folder folder)) - (setq in-db (sort (mapcar 'car number-alist) '<)) - (when (or (eq msgdb nil) ; trick for unplugged... - (and (null overview) - (null number-alist) - (null mark-alist))) - (setq sync-all t) - (wl-summary-set-message-modified) - (wl-summary-set-mark-modified) - (erase-buffer)) - (if (not elmo-use-killed-list) - (setq diff (if (eq (elmo-folder-get-type folder) 'multi) - (elmo-multi-list-bigger-diff in-folder in-db) - (elmo-list-bigger-diff in-folder in-db))) - (setq diff (elmo-list-diff in-folder in-db))) - (setq initial-append-list (car diff)) - (setq delete-list (cadr diff)) - (message "Checking folder diff...done") - ;; Don't delete important-marked msgs other than 'internal. - (unless (eq (elmo-folder-get-type folder) 'internal) - (setq delete-list - (wl-summary-delete-important-msgs-from-list delete-list - mark-alist))) - (if (and has-nntp - (elmo-nntp-max-number-precedes-list-active-p)) - ;; XXX this does not work correctly in rare case. - (setq delete-list - (wl-summary-delete-canceled-msgs-from-list delete-list msgdb))) - (if (or (equal diff '(nil nil)) - (equal diff '(nil)) - (and (eq (length delete-list) 0) - (eq (length initial-append-list) 0))) + overview number-alist mark-alist + curp num i new-msgdb + append-list delete-list crossed + update-thread update-top-list + expunged mes sync-result) + (unwind-protect (progn - ;; For max-number update... - (if (and (elmo-folder-contains-type folder 'nntp) - (elmo-nntp-max-number-precedes-list-active-p) - (elmo-update-number folder msgdb)) - (wl-summary-set-message-modified) - (setq ret-val (format "No update is needed for \"%s\"" folder)))) - (when delete-list - (message "Deleting...") - (elmo-msgdb-delete-msgs folder delete-list msgdb t) ; reserve cache. -;;; (set-buffer cur-buf) - (wl-summary-delete-messages-on-buffer delete-list "Deleting...") - (message "Deleting...done")) -;;; (set-buffer cur-buf) - ;; Change "New" marks to "Uncached Unread" marks. - (wl-summary-set-status-marks mark-alist - wl-summary-new-mark - wl-summary-unread-uncached-mark) - (wl-summary-set-status-marks-on-buffer - wl-summary-new-mark - wl-summary-unread-uncached-mark) - ;; Confirm appended message number. - (setq append-list (wl-summary-confirm-appends initial-append-list)) - (when (and elmo-use-killed-list - (not (eq (length initial-append-list) - (length append-list))) - (setq diff (elmo-list-diff initial-append-list append-list))) - (elmo-msgdb-append-to-killed-list folder (car diff))) - (setq num (length append-list)) - (if append-list - (progn - (setq i 0) - (setq result (elmo-msgdb-create - folder - append-list - wl-summary-new-mark - wl-summary-unread-cached-mark ; ! - wl-summary-read-uncached-mark ; u ;; XXXX - wl-summary-important-mark - seen-list)) - ;; delete duplicated messages. - (when (elmo-folder-contains-multi folder) - (setq crossed (elmo-multi-delete-crossposts - msgdb result)) - (setq result (cdr crossed)) - (setq crossed (car crossed))) - (setq overview-append (car result)) - (setq msgdb (elmo-msgdb-append msgdb result t)) - ;; set these value for append-message-func - (setq overview (elmo-msgdb-get-overview msgdb)) - (setq number-alist (elmo-msgdb-get-number-alist msgdb)) - (setq mark-alist (elmo-msgdb-get-mark-alist msgdb)) -;;; (setq location (elmo-msgdb-get-location msgdb)) - (setq curp overview-append) - (setq num (length curp)) - (setq wl-summary-delayed-update nil) - (elmo-kill-buffer wl-summary-search-buf-name) - (while curp - (setq entity (car curp)) - (when (setq update-thread - (wl-summary-append-message-func-internal - entity overview mark-alist - (not sync-all))) - (wl-append update-top-list update-thread)) - (if elmo-use-database - (elmo-database-msgid-put - (car entity) folder - (elmo-msgdb-overview-entity-get-number entity))) - (setq curp (cdr curp)) - (when (> num elmo-display-progress-threshold) - (setq i (+ i 1)) - (if (or (zerop (% i 5)) (= i num)) - (elmo-display-progress - 'wl-summary-sync-update3 "Updating thread..." - (/ (* i 100) num))))) - (when wl-summary-delayed-update - (while wl-summary-delayed-update - (message "Parent (%d) of message %d is no entity" - (caar wl-summary-delayed-update) - (elmo-msgdb-overview-entity-get-number - (cdar wl-summary-delayed-update))) - (when (setq update-thread - (wl-summary-append-message-func-internal - (cdar wl-summary-delayed-update) - overview mark-alist (not sync-all) t)) - (wl-append update-top-list update-thread)) - (setq wl-summary-delayed-update - (cdr wl-summary-delayed-update)))) - (when (and (eq wl-summary-buffer-view 'thread) - update-top-list) - (wl-thread-update-indent-string-thread - (elmo-uniq-list update-top-list))) - (message "Updating thread...done") -;;; (set-buffer cur-buf) - )) - (wl-summary-set-message-modified) - (wl-summary-set-mark-modified) - (setq wl-summary-buffer-msgdb msgdb) - (when (and sync-all (eq wl-summary-buffer-view 'thread)) - (elmo-kill-buffer wl-summary-search-buf-name) - (message "Inserting thread...") - (setq wl-thread-entity-cur 0) - (wl-thread-insert-top) - (message "Inserting thread...done")) - (if elmo-use-database - (elmo-database-close)) - (run-hooks 'wl-summary-sync-updated-hook) - (setq ret-val (format "Updated (-%d/+%d) message(s)" - (length delete-list) num))) - ;; synchronize marks. - (if wl-summary-auto-sync-marks - (wl-summary-sync-marks)) - ;; scoring - (when wl-use-scoring - (setq wl-summary-scored nil) - (wl-summary-score-headers nil msgdb - (and sync-all - (wl-summary-rescore-msgs number-alist)) - sync-all) - (when (and wl-summary-scored - (setq expunged (wl-summary-score-update-all-lines))) - (setq ret-val (concat ret-val - (format " (%d expunged)" - (length expunged)))))) - ;; crosspost - (setq crossed2 (wl-summary-update-crosspost)) - (if (or crossed crossed2) - (let ((crosses (+ (or crossed 0) - (or crossed2 0)))) - (setq ret-val - (if ret-val - (concat ret-val - (format " (%d crosspost)" crosses)) - (format "%d crosspost message(s)" crosses)))) - (and ret-val - (setq ret-val (concat ret-val ".")))) - ;; Update Folder mode - (wl-folder-set-folder-updated folder (list 0 - (wl-summary-count-unread - (elmo-msgdb-get-mark-alist - msgdb)) - (length in-folder))) - (wl-summary-update-modeline) - (wl-summary-buffer-number-column-detect t) - ;; - (unless unset-cursor - (goto-char (point-min)) - (if (not (wl-summary-cursor-down t)) - (progn - (goto-char (point-max)) - (forward-line -1)) - (if (and wl-summary-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) - (set-buffer-modified-p nil) - ret-val)) + (unless wl-summary-buffer-elmo-folder + (error "(Internal error) Folder is not set:%s" (buffer-name + (current-buffer)))) + (fset 'wl-summary-append-message-func-internal + (wl-summary-get-append-message-func)) + ;; Flush pending append operations (disconnected operation). + ;;(setq seen-list + ;;(wl-summary-flush-pending-append-operations seen-list)) + (goto-char (point-max)) + (wl-folder-confirm-existence folder 'force) + (setq sync-result (elmo-folder-synchronize + folder + wl-summary-new-mark + wl-summary-unread-uncached-mark + wl-summary-unread-cached-mark + wl-summary-read-uncached-mark + wl-summary-important-mark + sync-all no-check)) + (setq new-msgdb (nth 0 sync-result)) + (setq delete-list (nth 1 sync-result)) + (setq crossed (nth 2 sync-result)) + (if sync-result + (progn + ;; Setup sync-all + (if sync-all (wl-summary-sync-all-init)) +; (if (and has-nntp +; (elmo-nntp-max-number-precedes-list-active-p)) + ;; XXX this does not work correctly in rare case. +; (setq delete-list +; (wl-summary-delete-canceled-msgs-from-list +; delete-list +; (wl-summary-buffer-msgdb)))) + (when delete-list + (wl-summary-delete-messages-on-buffer delete-list "Deleting...") + (message "Deleting...done")) + (when new-msgdb + (wl-summary-set-status-marks-on-buffer + wl-summary-new-mark + wl-summary-unread-uncached-mark)) + (setq append-list (elmo-msgdb-get-overview new-msgdb)) + (setq curp append-list) + (setq num (length curp)) + (when append-list + (setq i 0) + ;; set these value for append-message-func + (setq overview (elmo-msgdb-get-overview + (elmo-folder-msgdb folder))) + (setq number-alist (elmo-msgdb-get-number-alist + (elmo-folder-msgdb folder))) + (setq mark-alist (elmo-msgdb-get-mark-alist + (elmo-folder-msgdb folder))) + (setq wl-summary-delayed-update nil) + (elmo-kill-buffer wl-summary-search-buf-name) + (while curp + (setq entity (car curp)) + (when (setq update-thread + (wl-summary-append-message-func-internal + entity overview mark-alist + (not sync-all))) + (wl-append update-top-list update-thread)) + (if elmo-use-database + (elmo-database-msgid-put + (car entity) (elmo-folder-name-internal folder) + (elmo-msgdb-overview-entity-get-number entity))) + (setq curp (cdr curp)) + (when (> num elmo-display-progress-threshold) + (setq i (+ i 1)) + (if (or (zerop (% i 5)) (= i num)) + (elmo-display-progress + 'wl-summary-sync-update "Updating thread..." + (/ (* i 100) num))))) + (when wl-summary-delayed-update + (while wl-summary-delayed-update + (message "Parent (%d) of message %d is no entity" + (caar wl-summary-delayed-update) + (elmo-msgdb-overview-entity-get-number + (cdar wl-summary-delayed-update))) + (when (setq update-thread + (wl-summary-append-message-func-internal + (cdar wl-summary-delayed-update) + overview mark-alist (not sync-all) t)) + (wl-append update-top-list update-thread)) + (setq wl-summary-delayed-update + (cdr wl-summary-delayed-update)))) + (when (and (eq wl-summary-buffer-view 'thread) + update-top-list) + (wl-thread-update-indent-string-thread + (elmo-uniq-list update-top-list))) + (message "Updating thread...done")) + (unless (eq wl-summary-buffer-view 'thread) + (wl-summary-make-number-list)) + (wl-summary-set-message-modified) + (wl-summary-set-mark-modified) + (when (and sync-all (eq wl-summary-buffer-view 'thread)) + (elmo-kill-buffer wl-summary-search-buf-name) + (message "Inserting thread...") + (setq wl-thread-entity-cur 0) + (wl-thread-insert-top) + (message "Inserting thread...done")) + (if elmo-use-database + (elmo-database-close)) + (run-hooks 'wl-summary-sync-updated-hook) + (setq mes + (if (and (eq (length delete-list) 0) + (eq num 0)) + (format + "No updates for \"%s\"" (elmo-folder-name-internal + folder)) + (format "Updated (-%d/+%d) message(s)" + (length delete-list) num)))) + (setq mes "Quit updating."))) + ;; synchronize marks. + (if (and wl-summary-auto-sync-marks sync-result) + (wl-summary-sync-marks)) + ;; scoring + (when wl-use-scoring + (setq wl-summary-scored nil) + (wl-summary-score-headers nil (wl-summary-buffer-msgdb) + (and sync-all + (wl-summary-rescore-msgs number-alist)) + sync-all) + (when (and wl-summary-scored + (setq expunged (wl-summary-score-update-all-lines))) + (setq mes (concat mes + (format " (%d expunged)" + (length expunged)))))) + (if (and crossed (> crossed 0)) + (setq mes + (if mes + (concat mes + (format " (%d crosspost)" crossed)) + (format "%d crosspost message(s)" crossed))) + (and mes (setq mes (concat mes ".")))) + ;; Update Folder mode + (wl-folder-set-folder-updated + (elmo-folder-name-internal folder) + (list 0 + (let ((pair (wl-summary-count-unread + (elmo-msgdb-get-mark-alist + (elmo-folder-msgdb folder))))) + (+ (car pair) (cdr pair))) + (elmo-folder-messages folder))) + (wl-summary-update-modeline) + (wl-summary-buffer-number-column-detect t) + ;; + (unless unset-cursor + (goto-char (point-min)) + (if (not (wl-summary-cursor-down t)) + (progn + (goto-char (point-max)) + (forward-line -1)) + (if (and wl-summary-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)))))) + (setq wl-summary-buffer-msgdb (elmo-folder-msgdb folder)) + (wl-delete-all-overlays) + (set-buffer-modified-p nil) + (if mes (message "%s" mes))))) (defun wl-summary-set-score-mark (mark) (save-excursion @@ -2388,7 +2209,7 @@ If ARG is non-nil, checking is omitted." (buffer-read-only nil) msg-num cur-mark) - (when (looking-at "^ *\\([0-9]+\\)\\([^0-9]\\)") + (when (looking-at "^ *\\(-?[0-9]+\\)\\([^0-9]\\)") (setq msg-num (string-to-int (wl-match-buffer 1))) (setq cur-mark (wl-match-buffer 2)) (when (member cur-mark (list " " @@ -2424,15 +2245,11 @@ If ARG is non-nil, checking is omitted." (string-to-int (read-from-minibuffer "Jump to Message(No.): "))))) (setq num (int-to-string num)) - (if (re-search-forward (concat "^[ \t]*" num "[^0-9]") nil t) - (progn - (beginning-of-line) - t) - (if (re-search-backward (concat "^[ \t]*" num "[^0-9]") nil t) - (progn - (beginning-of-line) - t) - nil)))) + (beginning-of-line) + (if (or (re-search-forward (concat "^[ \t]*" num "[^0-9]") nil t) + (re-search-backward (concat "^[ \t]*" num "[^0-9]") nil t)) + (progn (beginning-of-line) t) + nil))) (defun wl-summary-highlight-msgs (msgs) (save-excursion @@ -2455,75 +2272,39 @@ If ARG is non-nil, checking is omitted." (defun wl-summary-message-number () (save-excursion (beginning-of-line) - (if (looking-at "^ *\\([0-9]+\\)") + (if (looking-at "^ *\\(-?[0-9]+\\)") (string-to-int (wl-match-buffer 1)) nil))) (defun wl-summary-move (src dsts-msgs) (let* ((dsts (car dsts-msgs)) ; (+foo +bar) ;;; (msgs (cdr dsts-msgs)) ; (1 2 3) -;;; (msgdb wl-summary-buffer-msgdb) +;;; (msgdb (wl-summary-buffer-msgdb)) ;;; result) ) (while dsts (setq dsts (cdr dsts))))) -(defun wl-summary-flush-pending-append-operations (&optional seen-list) - "Execute append operations that are done while offline status." - (when (and (elmo-folder-plugged-p wl-summary-buffer-folder-name) - elmo-enable-disconnected-operation) - (let* ((resumed-list (elmo-dop-append-list-load - wl-summary-buffer-folder-name t)) - (append-list (elmo-dop-append-list-load - wl-summary-buffer-folder-name)) - (appends (append resumed-list append-list)) - (number-alist (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb)) - dels pair) - (when appends - (while appends - (if (setq pair (rassoc (car appends) number-alist)) - (setq dels (append dels (list (car pair))))) - (setq appends (cdr appends))) - (when dels - (setq seen-list - (elmo-msgdb-add-msgs-to-seen-list-subr - dels - wl-summary-buffer-msgdb - (concat wl-summary-important-mark - wl-summary-read-uncached-mark) - seen-list)) - (message "Resuming summary status...") - (elmo-msgdb-delete-msgs wl-summary-buffer-folder-name - dels wl-summary-buffer-msgdb t) - (wl-summary-delete-messages-on-buffer dels) - (message "Resuming summary status...done")) - ;; delete resume-file - (elmo-dop-append-list-save wl-summary-buffer-folder-name nil t) - (when append-list - (elmo-dop-flush-pending-append-operations - wl-summary-buffer-folder-name append-list))))) - seen-list) - (defun wl-summary-delete-all-msgs () (interactive) (let ((cur-buf (current-buffer)) - (dels (elmo-list-folder wl-summary-buffer-folder-name))) + (dels (elmo-folder-list-messages wl-summary-buffer-elmo-folder))) (set-buffer cur-buf) (if (null dels) (message "No message to delete.") (if (y-or-n-p (format "%s has %d message(s). Delete all? " - wl-summary-buffer-folder-name + (wl-summary-buffer-folder-name) (length dels))) (progn (message "Deleting...") - (elmo-delete-msgs wl-summary-buffer-folder-name dels - wl-summary-buffer-msgdb) - (elmo-msgdb-delete-msgs wl-summary-buffer-folder-name - dels wl-summary-buffer-msgdb) -;;; (elmo-msgdb-save wl-summary-buffer-folder-name nil) + (elmo-folder-delete-messages + wl-summary-buffer-elmo-folder dels) + (elmo-msgdb-delete-msgs (wl-summary-buffer-msgdb) + dels) +;;; (elmo-msgdb-save (wl-summary-buffer-folder-name) nil) (wl-summary-set-message-modified) (wl-summary-set-mark-modified) - (wl-folder-set-folder-updated wl-summary-buffer-folder-name + (wl-folder-set-folder-updated (wl-summary-buffer-folder-name) (list 0 0 0)) ;;; for thread. ;;; (setq wl-thread-top-entity '(nil t nil nil)) @@ -2540,7 +2321,7 @@ If ARG is non-nil, checking is omitted." nil)))) (defun wl-summary-toggle-thread (&optional arg) - "Toggle thread status (T)hread and (S)equencial. + "Toggle thread status (T)hread and (S)equential. If ARG, without confirm." (interactive "P") (when (or arg @@ -2586,14 +2367,17 @@ If ARG, without confirm." (wl-folder-get-entity-id entity)))) (wl-summary-goto-folder-subr wl-summary-last-visited-folder nil nil nil t)) -(defun wl-summary-sticky-p (&optional fld) - (if fld - (get-buffer (wl-summary-sticky-buffer-name fld)) +(defun wl-summary-sticky-p (&optional folder) + (if folder + (get-buffer (wl-summary-sticky-buffer-name + (elmo-folder-name-internal folder))) (not (string= wl-summary-buffer-name (buffer-name))))) -(defun wl-summary-always-sticky-folder-p (fld) +(defun wl-summary-always-sticky-folder-p (folder) (or (eq t wl-summary-always-sticky-folder-list) - (wl-string-match-member fld wl-summary-always-sticky-folder-list))) + (wl-string-match-member + (elmo-folder-name-internal folder) + wl-summary-always-sticky-folder-list))) (defun wl-summary-stick (&optional force) "Make current summary buffer sticky." @@ -2604,29 +2388,32 @@ If ARG, without confirm." (wl-summary-toggle-disp-msg 'off) (wl-summary-switch-to-clone-buffer (wl-summary-sticky-buffer-name - wl-summary-buffer-folder-name)) + (wl-summary-buffer-folder-name))) ;;; ???hang up ;;; (rename-buffer (wl-summary-sticky-buffer-name -;;; wl-summary-buffer-folder-name))) - (message "Folder `%s' is now sticky." wl-summary-buffer-folder-name)))) +;;; (wl-summary-buffer-folder-name)))) + (message "Folder `%s' is now sticky." (wl-summary-buffer-folder-name))))) (defun wl-summary-switch-to-clone-buffer (buffer-name) (let ((cur-buf (current-buffer)) (msg (wl-summary-message-number)) (buf (get-buffer-create buffer-name)) - (folder wl-summary-buffer-folder-name) + (folder wl-summary-buffer-elmo-folder) (copy-variables (append '(wl-summary-buffer-view wl-summary-buffer-refile-list wl-summary-buffer-delete-list wl-summary-buffer-copy-list wl-summary-buffer-target-mark-list - wl-summary-buffer-msgdb + wl-summary-buffer-elmo-folder wl-summary-buffer-number-column wl-summary-buffer-number-regexp wl-summary-buffer-message-modified wl-summary-buffer-mark-modified - wl-summary-buffer-thread-modified) + wl-summary-buffer-thread-modified + wl-summary-buffer-number-list + wl-summary-buffer-msgdb + wl-summary-buffer-folder-name) (and (eq wl-summary-buffer-view 'thread) '(wl-thread-entity-hashtb wl-thread-entities @@ -2635,7 +2422,7 @@ If ARG, without confirm." '(wl-summary-scored wl-summary-default-score wl-summary-important-above - wl-summary-temp-above + wl-summary-target-above wl-summary-mark-below wl-summary-expunge-below)) (and (featurep 'wl-score) @@ -2656,7 +2443,7 @@ If ARG, without confirm." (switch-to-buffer buf) (kill-buffer cur-buf) (wl-summary-count-unread - (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb)) + (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb))) (wl-summary-update-modeline) (if msg (if (eq wl-summary-buffer-view 'thread) @@ -2670,60 +2457,66 @@ If ARG, without confirm." (get-buffer (wl-summary-sticky-buffer-name folder))) (get-buffer wl-summary-buffer-name))) -(defun wl-summary-get-buffer-create (folder &optional force-sticky) +(defun wl-summary-get-buffer-create (name &optional force-sticky) (if force-sticky (get-buffer-create - (wl-summary-sticky-buffer-name folder)) - (or (get-buffer (wl-summary-sticky-buffer-name folder)) + (wl-summary-sticky-buffer-name name)) + (or (get-buffer (wl-summary-sticky-buffer-name name)) (get-buffer-create wl-summary-buffer-name)))) -(defun wl-summary-disp-msg (folder disp-msg) - (let (disp mes-win) - (if (and disp-msg - wl-summary-buffer-disp-msg) - (let ((view-message-buffer (get-buffer wl-message-buf-name)) - (number (wl-summary-message-number)) - cur-folder cur-number sel-win) - (when view-message-buffer - (save-excursion - (set-buffer view-message-buffer) - (setq cur-folder wl-message-buffer-cur-folder - cur-number wl-message-buffer-cur-number)) - (when (and (string= folder cur-folder) - (eq number cur-number)) - (setq sel-win (selected-window)) - (wl-select-buffer view-message-buffer) - (select-window sel-win) - (setq disp t))))) - (if (not disp) - (setq wl-summary-buffer-disp-msg nil)) - (when (and (not disp) - (setq mes-win (wl-message-buffer-window))) - (delete-window mes-win) - (run-hooks 'wl-summary-toggle-disp-off-hook)))) - -(defun wl-summary-goto-folder-subr (&optional folder scan-type other-window +(defun wl-summary-make-number-list () + (setq wl-summary-buffer-number-list + (mapcar + (lambda (x) (elmo-msgdb-overview-entity-get-number x)) + (elmo-msgdb-get-overview (wl-summary-buffer-msgdb))))) + +(defun wl-summary-auto-select-msg-p (unread-msg) + (and unread-msg + (not (string= + (cadr (assoc unread-msg + (elmo-msgdb-get-mark-alist + (wl-summary-buffer-msgdb)))) + wl-summary-important-mark)))) + +(defsubst wl-summary-open-folder (folder) + ;; Select folder + (let ((elmo-mime-charset wl-summary-buffer-mime-charset)) + (unwind-protect + (elmo-folder-open folder 'load-msgdb) + ;; For compatibility + (setq wl-summary-buffer-msgdb (elmo-folder-msgdb folder)) + (setq wl-summary-buffer-folder-name (elmo-folder-name-internal + folder))))) + +(defun wl-summary-goto-folder-subr (&optional name scan-type other-window sticky interactive scoring) "Display target folder on summary." (interactive) (let* ((keep-cursor (memq this-command wl-summary-keep-cursor-command)) - (fld (or folder (wl-summary-read-folder wl-default-folder))) - (cur-fld wl-summary-buffer-folder-name) - buf mes hilit reuse-buf + (name (or name (wl-summary-read-folder wl-default-folder))) + (cur-fld wl-summary-buffer-elmo-folder) + folder buf mes hilit reuse-buf retval entity) - (if (string= fld "") - (setq fld wl-default-folder)) - (when (and (not (string= cur-fld fld)) ; folder is moved. + (if (string= name "") + (setq name wl-default-folder)) + (setq folder (wl-folder-get-elmo-folder name)) + (when (and (not (string= + (and cur-fld (elmo-folder-name-internal cur-fld)) + (elmo-folder-name-internal folder))) ; folder is moved. (eq major-mode 'wl-summary-mode)) ; called in summary. - (setq wl-summary-last-visited-folder wl-summary-buffer-folder-name) + (setq wl-summary-last-visited-folder (wl-summary-buffer-folder-name)) + (run-hooks 'wl-summary-exit-pre-hook) (wl-summary-cleanup-temp-marks (wl-summary-sticky-p)) - (wl-summary-save-status 'keep)) ;; keep current buffer, anyway. - (setq buf (wl-summary-get-buffer-create fld sticky)) + (wl-summary-save-view) + (elmo-folder-commit wl-summary-buffer-elmo-folder)) + (setq buf (wl-summary-get-buffer-create (elmo-folder-name-internal folder) + sticky)) (setq reuse-buf (save-excursion (set-buffer buf) - (string= fld wl-summary-buffer-folder-name))) + (string= (elmo-folder-name-internal folder) + (wl-summary-buffer-folder-name)))) (unwind-protect (if reuse-buf (if interactive @@ -2734,7 +2527,7 @@ If ARG, without confirm." (set-buffer buf) (unless (eq major-mode 'wl-summary-mode) (wl-summary-mode)) - (wl-summary-buffer-set-folder fld) + (wl-summary-buffer-set-folder folder) (setq wl-summary-buffer-disp-msg nil) (setq wl-summary-buffer-last-displayed-msg nil) (setq wl-summary-buffer-current-msg nil) @@ -2742,14 +2535,13 @@ If ARG, without confirm." (inhibit-read-only t) (buffer-read-only nil)) (erase-buffer) - ;; resume summary cache + ;; Resume summary view (if wl-summary-cache-use - (let* ((dir (elmo-msgdb-expand-path fld)) + (let* ((dir (elmo-folder-msgdb-path folder)) (cache (expand-file-name wl-summary-cache-file dir)) (view (expand-file-name wl-summary-view-file dir))) (when (file-exists-p cache) - (as-binary-input-file - (insert-file-contents cache)) + (insert-file-contents-as-binary cache) (elmo-set-buffer-multibyte default-enable-multibyte-characters) (decode-mime-charset-region @@ -2758,22 +2550,23 @@ If ARG, without confirm." (when (file-exists-p view) (setq wl-summary-buffer-view (wl-summary-load-file-object view))) - (if (eq wl-summary-buffer-view 'thread) - (wl-thread-resume-entity fld)))) - ;; Load msgdb - (setq wl-summary-buffer-msgdb nil) ; new msgdb - (setq wl-summary-buffer-msgdb - (wl-summary-msgdb-load-async fld)) - (if (null wl-summary-buffer-msgdb) - (setq wl-summary-buffer-msgdb - (elmo-msgdb-load (elmo-string fld)))) + (wl-thread-resume-entity folder) + (wl-summary-open-folder folder)) + (setq wl-summary-buffer-view + (wl-summary-load-file-object + (expand-file-name wl-summary-view-file + (elmo-folder-msgdb-path folder)))) + (wl-summary-open-folder folder) + (wl-summary-rescan)) (wl-summary-count-unread - (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb)) + (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb))) (wl-summary-update-modeline))) + (unless (eq wl-summary-buffer-view 'thread) + (wl-summary-make-number-list)) (wl-summary-buffer-number-column-detect t) - (wl-summary-disp-msg fld (and reuse-buf keep-cursor)) + (wl-summary-toggle-disp-msg (if wl-summary-buffer-disp-msg 'on 'off)) (unless (and reuse-buf keep-cursor) - (setq hilit wl-summary-highlight) + ;(setq hilit wl-summary-highlight) (unwind-protect (let ((wl-summary-highlight (if reuse-buf wl-summary-highlight)) (wl-use-scoring @@ -2781,7 +2574,7 @@ If ARG, without confirm." (if (and (not scan-type) interactive (not wl-ask-range)) - (setq scan-type (wl-summary-get-sync-range fld))) + (setq scan-type (wl-summary-get-sync-range folder))) (cond ((eq scan-type nil) (wl-summary-sync 'unset-cursor)) @@ -2790,32 +2583,37 @@ If ARG, without confirm." ((eq scan-type 'no-sync)) ((or (eq scan-type 'force-update) (eq scan-type 'update)) - (setq mes (wl-summary-sync-force-update 'unset-cursor))))) + (setq mes (wl-summary-sync-force-update + 'unset-cursor 'no-check))))) (if interactive (switch-to-buffer buf) (set-buffer buf)) ;; stick always-sticky-folder - (when (wl-summary-always-sticky-folder-p fld) + (when (wl-summary-always-sticky-folder-p folder) (or (wl-summary-sticky-p) (wl-summary-stick t))) (run-hooks 'wl-summary-prepared-pre-hook) (set-buffer-modified-p nil) (goto-char (point-min)) (if (wl-summary-cursor-down t) - (let ((unreadp (wl-thread-next-mark-p - (wl-thread-entity-get-mark - (wl-summary-message-number)) - wl-summary-move-order))) - (cond ((and wl-auto-select-first unreadp) + (let ((unreadp (wl-summary-next-message + (wl-summary-message-number) + 'down t))) + (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 (setq retval 'disp-msg)) - ((not unreadp) + ((not (wl-summary-auto-select-msg-p unreadp)) + ;; unreadp is nil or important (setq retval 'more-next)))) (goto-char (point-max)) (if (elmo-folder-plugged-p folder) (forward-line -1) (wl-summary-prev)) (setq retval 'more-next)) - (setq wl-summary-highlight hilit) + ;(setq wl-summary-highlight hilit) (if (and wl-summary-highlight + (not wl-summary-lazy-highlight) (not reuse-buf)) (if (and wl-summary-highlight-partial-threshold (> (count-lines (point-min) (point-max)) @@ -2828,9 +2626,6 @@ If ARG, without confirm." wl-summary-highlight-partial-threshold))) (wl-highlight-summary (point) (point-max))) (wl-highlight-summary (point-min) (point-max)))) - (if (null wl-summary-buffer-msgdb) ;; one more try. - (setq wl-summary-buffer-msgdb - (elmo-msgdb-load (elmo-string fld)))) (if (eq retval 'disp-msg) (wl-summary-redisplay)) (if mes (message "%s" mes)) @@ -2839,7 +2634,8 @@ If ARG, without confirm." ;; set current entity-id (if (and (not folder) (setq entity - (wl-folder-search-entity-by-name fld + (wl-folder-search-entity-by-name (elmo-folder-name-internal + folder) wl-folder-entity 'folder))) ;; entity-id is unknown. @@ -2908,7 +2704,7 @@ If ARG, without confirm." (error (ding) (message "Error in wl-summary-line-inserted-hook")))) -(defun wl-summary-insert-summary (entity database mark-alist dummy &optional dummy) +(defun wl-summary-insert-summary (entity database mark-alist dummy &optional dumm) (let ((overview-entity entity) summary-line msg) (setq msg (elmo-msgdb-overview-entity-get-number entity)) @@ -2922,7 +2718,7 @@ If ARG, without confirm." (defun wl-summary-default-subject-filter (subject) (let ((case-fold-search t)) - (setq subject (elmo-replace-in-string subject "[ \t]*\\(re\\|was\\):" "")) + (setq subject (elmo-replace-in-string subject "[ \t]*\\(re\\|was\\)[:>]" "")) (setq subject (elmo-replace-in-string subject "[ \t]" "")) (elmo-replace-in-string subject "^\\[.*\\]" ""))) @@ -2967,15 +2763,15 @@ If ARG, without confirm." (run-hooks 'wl-summary-insert-headers-hook))) (defun wl-summary-search-by-subject (entity overview) - (let ((buf (get-buffer-create wl-summary-search-buf-name)) - (folder-name wl-summary-buffer-folder-name) + (let ((summary-buf (current-buffer)) + (buf (get-buffer-create wl-summary-search-buf-name)) + (folder-name (wl-summary-buffer-folder-name)) match founds found-entity) - (save-excursion - (set-buffer buf) + (with-current-buffer buf (let ((case-fold-search t)) - (when (or (not (string= wl-summary-buffer-folder-name folder-name)) + (when (or (not (string= wl-summary-search-buf-folder-name folder-name)) (zerop (buffer-size))) - (setq wl-summary-buffer-folder-name folder-name) + (setq wl-summary-search-buf-folder-name folder-name) (wl-summary-insert-headers overview (function @@ -2987,23 +2783,26 @@ If ARG, without confirm." (elmo-msgdb-overview-entity-get-subject entity))) (if (string= match "") (setq match "\n")) - (goto-char (point-max)) + (goto-char (point-min)) (while (and (not founds) - (not (= (point) (point-min))) - (search-backward match nil t)) + (not (= (point) (point-max))) + (search-forward match nil t)) ;; check exactly match - (when (and (bolp) - (= (point-at-eol) - (match-end 0))) + (when (and (eolp) + (= (point-at-bol) + (match-beginning 0))) (setq found-entity (wl-summary-get-alike)) (if (and found-entity ;; Is founded entity myself or children? (not (string= (elmo-msgdb-overview-entity-get-id entity) - (elmo-msgdb-overview-entity-get-id (car found-entity)))) - (not (wl-thread-descendant-p - (elmo-msgdb-overview-entity-get-number entity) - (elmo-msgdb-overview-entity-get-number (car found-entity))))) + (elmo-msgdb-overview-entity-get-id + (car found-entity)))) + (with-current-buffer summary-buf + (not (wl-thread-descendant-p + (elmo-msgdb-overview-entity-get-number entity) + (elmo-msgdb-overview-entity-get-number + (car found-entity)))))) ;; return matching entity (setq founds found-entity)))) (if founds @@ -3032,8 +2831,9 @@ If ARG, without confirm." ;; Search parent by subject. (when (and (null parent-number) wl-summary-search-parent-by-subject-regexp - (string-match wl-summary-search-parent-by-subject-regexp - (elmo-msgdb-overview-entity-get-subject entity))) + (string-match + wl-summary-search-parent-by-subject-regexp + (elmo-msgdb-overview-entity-get-subject entity))) (let ((found (wl-summary-search-by-subject entity overview))) (when (and found (not (member found wl-summary-delayed-update))) @@ -3106,8 +2906,8 @@ If ARG, without confirm." (let* (eol (inhibit-read-only t) (buffer-read-only nil) - (folder wl-summary-buffer-folder-name) - (msgdb wl-summary-buffer-msgdb) + (folder wl-summary-buffer-elmo-folder) + (msgdb (wl-summary-buffer-msgdb)) (mark-alist (elmo-msgdb-get-mark-alist msgdb)) ;;; (number-alist (elmo-msgdb-get-number-alist msgdb)) new-mark visible mark) @@ -3132,7 +2932,7 @@ If ARG, without confirm." (re-search-forward (format (concat "^ *\\(" (if number (int-to-string number) - "[0-9]+") + "-?[0-9]+") "\\)[^0-9]\\(%s\\|%s\\)") wl-summary-read-uncached-mark " ") eol t)) @@ -3143,14 +2943,14 @@ If ARG, without confirm." (setq new-mark (if (string= mark wl-summary-read-uncached-mark) wl-summary-unread-uncached-mark - (if (elmo-use-cache-p folder number) + (if (elmo-message-use-cache-p folder number) wl-summary-unread-mark wl-summary-unread-uncached-mark)))) ;; server side mark (unless no-server-update - (unless (elmo-mark-as-unread folder (list number) - msgdb) - (error "Setting mark failed"))) + (save-match-data + (unless (elmo-folder-unmark-read folder (list number)) + (error "Setting mark failed")))) (when visible (delete-region (match-beginning 2) (match-end 2)) (insert new-mark)) @@ -3164,7 +2964,7 @@ If ARG, without confirm." (+ 1 wl-summary-buffer-unread-count)) (wl-summary-update-modeline) (wl-folder-update-unread - folder + (wl-summary-buffer-folder-name) (+ wl-summary-buffer-unread-count wl-summary-buffer-new-count))) (wl-summary-set-mark-modified) @@ -3205,8 +3005,8 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (save-excursion (let ((inhibit-read-only t) (buffer-read-only nil) - (buf (current-buffer)) - sol eol rs re) + (buf (current-buffer)) + sol eol rs re) (beginning-of-line) (setq sol (point)) (end-of-line) @@ -3289,15 +3089,13 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (message "No marks") (save-excursion (let ((del-fld (wl-summary-get-delete-folder - wl-summary-buffer-folder-name)) + (wl-summary-buffer-folder-name))) (start (point)) (unread-marks (list wl-summary-unread-cached-mark wl-summary-unread-uncached-mark wl-summary-new-mark)) (refiles (append moves dels)) - (refile-executed 0) (refile-failures 0) - (copy-executed 0) (copy-failures 0) (copy-len (length copies)) refile-len @@ -3317,25 +3115,25 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (wl-inverse-alist refiles wl-summary-buffer-refile-list)) (goto-char start) ; avoid moving cursor to ; the bottom line. + (when (> refile-len elmo-display-progress-threshold) + (elmo-progress-set 'elmo-folder-move-messages + refile-len "Moving messages...")) (while dst-msgs -;;; (elmo-msgdb-add-msgs-to-seen-list -;;; (car (car dst-msgs)) ;dst-folder -;;; (cdr (car dst-msgs)) ;msgs -;;; wl-summary-buffer-msgdb -;;; (concat wl-summary-important-mark -;;; wl-summary-read-uncached-mark)) (setq result nil) (condition-case nil - (setq result (elmo-move-msgs wl-summary-buffer-folder-name - (cdr (car dst-msgs)) - (car (car dst-msgs)) - wl-summary-buffer-msgdb - refile-len - refile-executed - (not (null (cdr dst-msgs))) - nil ; no-delete - nil ; same-number - unread-marks)) + (setq result (elmo-folder-move-messages + wl-summary-buffer-elmo-folder + (cdr (car dst-msgs)) + (if (eq 'null (car (car dst-msgs))) + 'null + (wl-folder-get-elmo-folder + (car (car dst-msgs)))) + (wl-summary-buffer-msgdb) + (not (null (cdr dst-msgs))) + nil ; no-delete + nil ; same-number + unread-marks + t)) (error nil)) (if result ; succeeded. (progn @@ -3344,33 +3142,31 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." ;; update refile-alist. (setq wl-summary-buffer-refile-list (wl-delete-associations (cdr (car dst-msgs)) - wl-summary-buffer-refile-list))) + wl-summary-buffer-refile-list))) (setq refile-failures (+ refile-failures (length (cdr (car dst-msgs)))))) - (setq refile-executed (+ refile-executed (length (cdr (car dst-msgs))))) (setq dst-msgs (cdr dst-msgs))) + (elmo-progress-clear 'elmo-folder-move-messages) ;; end refile ;; begin cOpy... (setq dst-msgs (wl-inverse-alist copies wl-summary-buffer-copy-list)) + (when (> copy-len elmo-display-progress-threshold) + (elmo-progress-set 'elmo-folder-move-messages + copy-len "Copying messages...")) (while dst-msgs -;;; (elmo-msgdb-add-msgs-to-seen-list -;;; (car (car dst-msgs)) ;dst-folder -;;; (cdr (car dst-msgs)) ;msgs -;;; wl-summary-buffer-msgdb -;;; (concat wl-summary-important-mark -;;; wl-summary-read-uncached-mark)) (setq result nil) (condition-case nil - (setq result (elmo-move-msgs wl-summary-buffer-folder-name - (cdr (car dst-msgs)) - (car (car dst-msgs)) - wl-summary-buffer-msgdb - copy-len - copy-executed - (not (null (cdr dst-msgs))) - t ; t is no-delete (copy) - nil ; same number - unread-marks)) + (setq result (elmo-folder-move-messages + wl-summary-buffer-elmo-folder + (cdr (car dst-msgs)) + (wl-folder-get-elmo-folder + (car (car dst-msgs))) + (wl-summary-buffer-msgdb) + (not (null (cdr dst-msgs))) + t ; t is no-delete (copy) + nil ; same number + unread-marks + t)) (error nil)) (if result ; succeeded. (progn @@ -3382,13 +3178,19 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." wl-summary-buffer-copy-list))) (setq copy-failures (+ copy-failures (length (cdr (car dst-msgs)))))) - (setq copy-executed (+ copy-executed (length (cdr (car dst-msgs))))) (setq dst-msgs (cdr dst-msgs))) + ;; Hide progress bar. + (elmo-progress-clear 'elmo-folder-move-messages) ;; end cOpy (wl-summary-folder-info-update) (wl-summary-set-message-modified) (wl-summary-set-mark-modified) (run-hooks 'wl-summary-exec-hook) + (unless (and wl-message-buffer + (eq (wl-summary-message-number) + (with-current-buffer wl-message-buffer + wl-message-buffer-cur-number))) + (wl-summary-toggle-disp-msg 'off)) (set-buffer-modified-p nil) (message (concat "Executing ... done" (if (> refile-failures 0) @@ -3404,7 +3206,7 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (let ((fld (completing-read (format "Folder name %s(%s): " (or purpose "") default) - (or wl-folder-completion-func + (or wl-folder-completion-function (if (memq 'read-folder wl-use-folder-petname) (wl-folder-get-entity-with-petname) wl-folder-entity-hashtb)) @@ -3415,11 +3217,16 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (setq fld default)) (setq fld (elmo-string (wl-folder-get-realname fld))) (if (string-match "\n" fld) - (error "Not supported folder name: %s" fld)) + (error "Not supported folder name: %s" fld)) (unless no-create (if ignore-error - (ignore-errors (wl-folder-confirm-existence fld)) - (wl-folder-confirm-existence fld))) + (condition-case nil + (wl-folder-confirm-existence + (wl-folder-get-elmo-folder + fld)) + (error)) + (wl-folder-confirm-existence (wl-folder-get-elmo-folder + fld)))) fld)) (defun wl-summary-print-destination (msg-num folder) @@ -3446,11 +3253,6 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (insert folder) (set-buffer-modified-p nil)))) -;; override. -(when wl-on-nemacs - (defun wl-summary-print-destination (msg-num &optional folder)) - (defun wl-summary-remove-destination ())) - (defsubst wl-summary-get-mark (number) "Return a temporal mark of message specified by NUMBER." (or (and (memq number wl-summary-buffer-delete-list) "D") @@ -3472,7 +3274,7 @@ If folder is read-only, message should be copied. See `wl-refile-policy-alist' for more details." (interactive) (let ((policy (wl-get-assoc-list-value wl-refile-policy-alist - wl-summary-buffer-folder-name))) + (wl-summary-buffer-folder-name)))) (cond ((eq policy 'copy) (if (interactive-p) (call-interactively 'wl-summary-copy) @@ -3489,16 +3291,14 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (wl-summary-refile-subr 'copy (interactive-p) dst number)) (defun wl-summary-refile-subr (copy-or-refile interactive &optional dst number) - (interactive) (let* ((buffer-num (wl-summary-message-number)) (msg-num (or number buffer-num)) (msgid (and msg-num - (cdr (assq msg-num - (elmo-msgdb-get-number-alist - wl-summary-buffer-msgdb))))) + (elmo-message-field wl-summary-buffer-elmo-folder + msg-num 'message-id))) (entity (and msg-num (elmo-msgdb-overview-get-entity - msg-num wl-summary-buffer-msgdb))) + msg-num (wl-summary-buffer-msgdb)))) (variable (intern (format "wl-summary-buffer-%s-list" copy-or-refile))) folder mark already tmp-folder) @@ -3522,7 +3322,9 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (or (wl-refile-guess entity) wl-trash-folder) (format "for %s" copy-or-refile))))) ;; Cache folder hack by okada@opaopa.org - (if (and (eq (car (elmo-folder-get-spec folder)) 'cache) + (if (and (eq (elmo-folder-type-internal + (wl-folder-get-elmo-folder + (wl-folder-get-realname folder))) 'cache) (not (string= folder (setq tmp-folder (concat "'cache/" @@ -3531,14 +3333,8 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (progn (setq folder tmp-folder) (message "Force refile to %s." folder))) - (if (string= folder wl-summary-buffer-folder-name) + (if (string= folder (wl-summary-buffer-folder-name)) (error "Same folder")) - (unless (or (elmo-folder-plugged-p wl-summary-buffer-folder-name) - (and (eq (elmo-folder-get-type wl-summary-buffer-folder-name) 'pipe) - (elmo-folder-plugged-p - (elmo-pipe-spec-dst (elmo-folder-get-spec wl-summary-buffer-folder-name)))) - (elmo-cache-exists-p msgid)) - (error "Unplugged (no cache or msgid)")) (if (or (string= folder wl-queue-folder) (string= folder wl-draft-folder)) (error "Don't %s messages to %s" copy-or-refile folder)) @@ -3592,11 +3388,11 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (if (and (eq wl-summary-buffer-view 'thread) open-all) (wl-thread-open-all)) - (let* ((spec wl-summary-buffer-folder-name) + (let* ((spec (wl-summary-buffer-folder-name)) (overview (elmo-msgdb-get-overview - wl-summary-buffer-msgdb)) + (wl-summary-buffer-msgdb))) (mark-alist (elmo-msgdb-get-mark-alist - wl-summary-buffer-msgdb)) + (wl-summary-buffer-msgdb))) checked-dsts (count 0) number dst thr-entity) @@ -3609,10 +3405,10 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (wl-folder-get-realname (wl-refile-guess-by-rule (elmo-msgdb-overview-get-entity - number wl-summary-buffer-msgdb)))) + number (wl-summary-buffer-msgdb))))) (not (equal dst spec))) (when (not (member dst checked-dsts)) - (wl-folder-confirm-existence dst) + (wl-folder-confirm-existence (wl-folder-get-elmo-folder dst)) (setq checked-dsts (cons dst checked-dsts))) (if (wl-summary-refile dst number) (incf count)) @@ -3632,7 +3428,7 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (when (and (setq dst (wl-refile-guess-by-rule (elmo-msgdb-overview-get-entity - (car messages) wl-summary-buffer-msgdb))) + (car messages) (wl-summary-buffer-msgdb)))) (not (equal dst spec))) (if (wl-summary-refile dst (car messages)) (incf count)) @@ -3660,7 +3456,7 @@ If optional argument NUMBER is specified, unmark message specified by NUMBER." (setq visible t)) ;; Delete mark on buffer. (when (and visible - (looking-at "^ *\\([0-9]+\\)\\([^0-9]\\)")) + (looking-at "^ *\\(-?[0-9]+\\)\\([^0-9]\\)")) (goto-char (match-end 2)) (or number (setq number (string-to-int (wl-match-buffer 1)))) @@ -3742,10 +3538,10 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." ;; guess by first msg (let* ((msgid (cdr (assq (wl-summary-message-number) (elmo-msgdb-get-number-alist - wl-summary-buffer-msgdb)))) + (wl-summary-buffer-msgdb))))) (function (intern (format "wl-summary-%s" copy-or-refile))) (entity (assoc msgid (elmo-msgdb-get-overview - wl-summary-buffer-msgdb))) + (wl-summary-buffer-msgdb)))) folder) (if entity (setq folder (wl-summary-read-folder (wl-refile-guess entity) @@ -3829,12 +3625,12 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (wl-summary-target-mark-region (point-min) (point-max)) (setq wl-summary-buffer-target-mark-list (mapcar 'car - (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb)))) + (elmo-msgdb-get-number-alist (wl-summary-buffer-msgdb))))) (defun wl-summary-delete-all-mark (mark) (goto-char (point-min)) (let ((case-fold-search nil)) - (while (re-search-forward (format "^ *[0-9]+%s" + (while (re-search-forward (format "^ *-?[0-9]+%s" (regexp-quote mark)) nil t) (wl-summary-unmark)) (cond ((string= mark "*") @@ -3881,10 +3677,12 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (defun wl-summary-pick (&optional from-list delete-marks) (interactive) - (let ((result (elmo-msgdb-search - wl-summary-buffer-folder-name - (elmo-read-search-condition wl-summary-pick-field-default) - wl-summary-buffer-msgdb))) + (let* ((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))) (if delete-marks (let ((mlist wl-summary-buffer-target-mark-list)) (while mlist @@ -3892,21 +3690,22 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (wl-summary-unmark)) (setq mlist (cdr mlist))) (setq wl-summary-buffer-target-mark-list nil))) - (if from-list - (setq result (elmo-list-filter from-list result))) - (message "%d message(s) are picked." (length result)) - (if (null result) - (message "No message was picked.") - (wl-summary-target-mark-msgs result)))) + (if result + (progn + (wl-summary-target-mark-msgs result) + (message "%d message(s) are picked." (length result))) + (message "No message was picked.")))) (defun wl-summary-unvirtual () "Exit from current virtual folder." (interactive) (if (eq 'filter - (elmo-folder-get-type wl-summary-buffer-folder-name)) - (wl-summary-goto-folder-subr (nth 2 (elmo-folder-get-spec - wl-summary-buffer-folder-name)) - 'update nil nil t) + (elmo-folder-type-internal wl-summary-buffer-elmo-folder)) + (wl-summary-goto-folder-subr + (elmo-folder-name-internal + (elmo-filter-folder-target-internal + wl-summary-buffer-elmo-folder)) + 'update nil nil t) (error "This folder is not filtered"))) (defun wl-summary-virtual (&optional arg) @@ -3919,7 +3718,7 @@ If ARG, exit virtual folder." (elmo-read-search-condition wl-summary-pick-field-default) "/" - wl-summary-buffer-folder-name) + (wl-summary-buffer-folder-name)) 'update nil nil t))) (defun wl-summary-delete-all-temp-marks () @@ -3963,7 +3762,7 @@ If ARG, exit virtual folder." (buffer-read-only nil) msg-num cur-mark) - (when (looking-at "^ *\\([0-9]+\\)\\([^0-9]\\)") + (when (looking-at "^ *\\(-?[0-9]+\\)\\([^0-9]\\)") (setq msg-num (string-to-int (wl-match-buffer 1))) (setq cur-mark (wl-match-buffer 2)) (goto-char (match-end 1)) @@ -3994,8 +3793,8 @@ If ARG, exit virtual folder." (delq (car mlist) wl-summary-buffer-target-mark-list)) (setq mlist (cdr mlist)))))) -(defun wl-summary-target-mark-prefetch () - (interactive) +(defun wl-summary-target-mark-prefetch (&optional ignore-cache) + (interactive "P") (save-excursion (let* ((mlist (nreverse wl-summary-buffer-target-mark-list)) (inhibit-read-only t) @@ -4006,7 +3805,7 @@ If ARG, exit virtual folder." skipped new-mark) (while mlist - (setq new-mark (wl-summary-prefetch-msg (car mlist))) + (setq new-mark (wl-summary-prefetch-msg (car mlist) ignore-cache)) (if new-mark (progn (message "Prefetching... %d/%d message(s)" @@ -4014,7 +3813,7 @@ If ARG, exit virtual folder." (when (wl-summary-jump-to-msg (car mlist)) (wl-summary-unmark) (when new-mark - (when (looking-at "^ *[0-9]+[^0-9]\\([^0-9]\\)") + (when (looking-at "^ *-?[0-9]+[^0-9]\\([^0-9]\\)") (delete-region (match-beginning 1) (match-end 1))) (goto-char (match-beginning 1)) (insert new-mark) @@ -4042,10 +3841,10 @@ If ARG, exit virtual folder." (when (re-search-forward regexp nil t) (setq msgid (cdr (assq (setq number (wl-summary-message-number)) (elmo-msgdb-get-number-alist - wl-summary-buffer-msgdb))) + (wl-summary-buffer-msgdb)))) entity (assoc msgid (elmo-msgdb-get-overview - wl-summary-buffer-msgdb))) + (wl-summary-buffer-msgdb)))) (if (null entity) (error "Cannot %s" copy-or-refile)) (funcall function @@ -4106,7 +3905,7 @@ If ARG, exit virtual folder." (delq (car mlist) wl-summary-buffer-target-mark-list)) (setq mlist (cdr mlist))) (wl-summary-count-unread - (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb)) + (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb))) (wl-summary-update-modeline)))) (defun wl-summary-target-mark-mark-as-unread () @@ -4136,7 +3935,7 @@ If ARG, exit virtual folder." (delq (car mlist) wl-summary-buffer-target-mark-list)) (setq mlist (cdr mlist))) (wl-summary-count-unread - (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb)) + (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb))) (wl-summary-update-modeline)))) (defun wl-summary-target-mark-mark-as-important () @@ -4166,7 +3965,7 @@ If ARG, exit virtual folder." (delq (car mlist) wl-summary-buffer-target-mark-list)) (setq mlist (cdr mlist))) (wl-summary-count-unread - (elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb)) + (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb))) (wl-summary-update-modeline)))) (defun wl-summary-target-mark-save () @@ -4174,7 +3973,8 @@ If ARG, exit virtual folder." (save-excursion (goto-char (point-min)) (let ((wl-save-dir - (wl-read-directory-name "Save to directory: " wl-tmp-dir)) + (wl-read-directory-name "Save to directory: " + wl-temporary-file-directory)) (regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)")) number mlist) (if (null (file-exists-p wl-save-dir)) @@ -4201,8 +4001,8 @@ If ARG, exit virtual folder." (let* (eol (inhibit-read-only t) (buffer-read-only nil) - (folder wl-summary-buffer-folder-name) - (msgdb wl-summary-buffer-msgdb) + (folder wl-summary-buffer-elmo-folder) + (msgdb (wl-summary-buffer-msgdb)) (mark-alist (elmo-msgdb-get-mark-alist msgdb)) ;;; (number-alist (elmo-msgdb-get-number-alist msgdb)) (case-fold-search nil) @@ -4211,11 +4011,12 @@ If ARG, exit virtual folder." (progn (setq visible (wl-summary-jump-to-msg number)) (setq mark (cadr (assq number mark-alist)))) + ;; interactive (setq visible t)) (beginning-of-line) (if (or (not visible) (looking-at - (format "^ *\\([0-9]+\\)[^0-9]\\(%s\\|%s\\|%s\\|%s\\).*$" + (format "^ *\\(-?[0-9]+\\)[^0-9]\\(%s\\|%s\\|%s\\|%s\\).*$" (regexp-quote wl-summary-read-uncached-mark) (regexp-quote wl-summary-unread-uncached-mark) (regexp-quote wl-summary-unread-cached-mark) @@ -4238,14 +4039,16 @@ If ARG, exit virtual folder." (setq number (or number (string-to-int (wl-match-buffer 1)))) ;; set server side mark... (setq new-mark (if (and uncached - (if (elmo-use-cache-p folder number) + (if (elmo-message-use-cache-p folder number) (not (elmo-folder-local-p folder))) (not cached)) wl-summary-read-uncached-mark nil)) (if (not leave-server-side-mark-untouched) - (setq marked (elmo-mark-as-read folder - (list number) msgdb))) + (save-match-data + (setq marked (elmo-folder-mark-as-read + folder + (list number))))) (if (or leave-server-side-mark-untouched marked) (progn @@ -4257,7 +4060,7 @@ If ARG, exit virtual folder." (1- wl-summary-buffer-new-count)))) (wl-summary-update-modeline) (wl-folder-update-unread - folder + (wl-summary-buffer-folder-name) (+ wl-summary-buffer-unread-count wl-summary-buffer-new-count)) (when (or stat cached) @@ -4270,11 +4073,7 @@ If ARG, exit virtual folder." (elmo-msgdb-set-mark-alist msgdb mark-alist) (wl-summary-set-mark-modified)) (if (and visible wl-summary-highlight) - (wl-highlight-summary-current-line nil nil t)) - (if (not notcrosses) - (wl-summary-set-crosspost nil - (and wl-summary-buffer-disp-msg - (interactive-p))))) + (wl-highlight-summary-current-line nil nil t))) (if mark (message "Warning: Changing mark failed."))))) (set-buffer-modified-p nil) (if stat @@ -4286,15 +4085,15 @@ If ARG, exit virtual folder." mark no-server-update) (interactive) - (if (eq (elmo-folder-get-type wl-summary-buffer-folder-name) + (if (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder) 'internal) (error "Cannot process mark in this folder")) (save-excursion (let* (eol (inhibit-read-only t) (buffer-read-only nil) - (folder wl-summary-buffer-folder-name) - (msgdb wl-summary-buffer-msgdb) + (folder wl-summary-buffer-elmo-folder) + (msgdb (wl-summary-buffer-msgdb)) (mark-alist (elmo-msgdb-get-mark-alist msgdb)) (number-alist (elmo-msgdb-get-number-alist msgdb)) message-id visible) @@ -4304,7 +4103,7 @@ If ARG, exit virtual folder." (setq mark (or mark (cadr (assq number mark-alist))))) (setq visible t)) (when visible - (if (null (wl-summary-message-number)) + (if (null (setq number (wl-summary-message-number))) (progn (message "No message.") (setq visible nil)) @@ -4312,19 +4111,30 @@ If ARG, exit virtual folder." (setq eol (point)) (re-search-backward (concat "^" wl-summary-buffer-number-regexp "..../..") nil t)) ; set cursor line - ) - (beginning-of-line) - (if (re-search-forward "^ *\\([0-9]+\\)[^0-9]\\([^0-9]\\)" eol t) + (beginning-of-line)) + (if (or (and (not visible) + (assq number (elmo-msgdb-get-number-alist msgdb))) + (re-search-forward "^ *\\(-?[0-9]+\\)[^0-9]\\([^0-9]\\)" eol t)) (progn (setq number (or number (string-to-int (wl-match-buffer 1)))) (setq mark (or mark (wl-match-buffer 2))) - (setq message-id (cdr (assq number number-alist))) + (setq message-id (elmo-message-field + wl-summary-buffer-elmo-folder + number + 'message-id)) (if (string= mark wl-summary-important-mark) (progn ;; server side mark - (unless no-server-update - (elmo-unmark-important folder (list number) msgdb) - (elmo-msgdb-global-mark-delete message-id)) + (save-match-data + (unless no-server-update + (elmo-folder-unmark-important folder (list number)) + (elmo-msgdb-global-mark-delete message-id)) + ;; 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)))) (when visible (delete-region (match-beginning 2) (match-end 2)) (insert " ")) @@ -4333,20 +4143,20 @@ If ARG, exit virtual folder." number nil))) ;; server side mark - (unless no-server-update - (elmo-mark-as-important folder (list number) msgdb)) + (save-match-data + (unless no-server-update + (elmo-folder-mark-as-important folder (list number)))) (when visible (delete-region (match-beginning 2) (match-end 2)) (insert wl-summary-important-mark)) (setq mark-alist (elmo-msgdb-mark-set mark-alist - (string-to-int (wl-match-buffer 1)) + number wl-summary-important-mark)) - ;; Force cache message!! - (save-match-data - (unless (elmo-cache-exists-p message-id) - (elmo-force-cache-msg folder number message-id - (elmo-msgdb-get-location msgdb)))) + (if (elmo-file-cache-exists-p message-id) + (elmo-folder-mark-as-read folder (list number)) + ;; Force cache message. + (elmo-message-encache folder number 'read)) (unless no-server-update (elmo-msgdb-global-mark-set message-id wl-summary-important-mark))) @@ -4394,8 +4204,7 @@ If ARG, exit virtual folder." (setq linked (wl-thread-entity-get-linked thr-entity))) (if (string= thr-str "") (setq no-parent t)) ; no parent - (if (and wl-summary-width - wl-summary-indent-length-limit + (if (and wl-summary-indent-length-limit (< wl-summary-indent-length-limit (string-width thr-str))) (setq thr-str (wl-set-string-width @@ -4404,8 +4213,8 @@ If ARG, exit virtual folder." (setq from (wl-set-string-width (if children-num - (- wl-from-width (length children-num) 2) - wl-from-width) + (- wl-summary-from-width (length children-num) 2) + wl-summary-from-width) (elmo-delete-char ?\n (wl-summary-from-func-internal (elmo-msgdb-overview-entity-get-from entity))))) @@ -4447,8 +4256,8 @@ If ARG, exit virtual folder." subject parent-subject))) (wl-summary-subject-func-internal subject) "")) (if (and (not wl-summary-width) - wl-subject-length-limit) - (truncate-string subject wl-subject-length-limit) + wl-summary-subject-length-limit) + (truncate-string subject wl-summary-subject-length-limit) subject))))) (if wl-summary-width (setq line (wl-set-string-width @@ -4467,11 +4276,12 @@ If ARG, exit virtual folder." (setq wl-summary-buffer-number-column (or (if (and update - (setq end (if (re-search-forward "^ *[0-9]+[^0-9]" nil t) + (setq end (if (re-search-forward + "^ *-?[0-9]+[^0-9]" nil t) (point)))) (- end (progn (beginning-of-line) (point)) 1)) (wl-get-assoc-list-value wl-summary-number-column-alist - wl-summary-buffer-folder-name) + (wl-summary-buffer-folder-name)) wl-summary-default-number-column)) (setq wl-summary-buffer-number-regexp (wl-repeat-string "." wl-summary-buffer-number-column))))) @@ -4482,115 +4292,92 @@ If ARG, exit virtual folder." (wl-match-string 1 wday-str) (elmo-date-get-week year month mday)))) -(defmacro wl-summary-cursor-move-regex () - (` (let ((mark-alist - (if (elmo-folder-plugged-p wl-summary-buffer-folder-name) - (cond ((eq wl-summary-move-order 'new) - (list - (list - wl-summary-new-mark) - (list - wl-summary-unread-uncached-mark - wl-summary-unread-cached-mark - wl-summary-important-mark))) - ((eq wl-summary-move-order 'unread) - (list - (list - wl-summary-unread-uncached-mark - wl-summary-unread-cached-mark - wl-summary-new-mark) - (list - wl-summary-important-mark))) - (t - (list - (list - wl-summary-unread-uncached-mark - wl-summary-unread-cached-mark - wl-summary-new-mark - wl-summary-important-mark)))) - (cond ((eq wl-summary-move-order 'unread) - (list - (list - wl-summary-unread-cached-mark) - (list - wl-summary-important-mark))) - (t - (list - (list - wl-summary-unread-cached-mark - wl-summary-important-mark))))))) - (mapcar - (function - (lambda (mark-list) - (concat wl-summary-message-regexp - ".\\(" - (mapconcat 'regexp-quote - mark-list - "\\|") - "\\)\\|" - wl-summary-message-regexp "\\*"))) - mark-alist)))) - -;; -;; Goto unread or important -;; -(defun wl-summary-cursor-up (&optional hereto) - (interactive "P") - (if (and (not wl-summary-buffer-target-mark-list) - (eq wl-summary-buffer-view 'thread)) - (progn - (if (eobp) - (forward-line -1)) - (wl-thread-jump-to-prev-unread hereto)) - (if hereto - (end-of-line) - (beginning-of-line)) - (let ((case-fold-search nil) - regex-list) - (setq regex-list (wl-summary-cursor-move-regex)) - (catch 'done - (while regex-list - (when (re-search-backward - (car regex-list) - nil t nil) - (beginning-of-line) - (throw 'done t)) - (setq regex-list (cdr regex-list))) - (beginning-of-line) - (throw 'done nil))))) - +(defvar wl-summary-move-spec-plugged-alist + (` ((new . ((t . nil) + (p . (, wl-summary-new-mark)) + (p . (, (wl-regexp-opt + (list wl-summary-unread-uncached-mark + wl-summary-unread-cached-mark)))) + (p . (, (regexp-quote wl-summary-important-mark))))) + (unread . ((t . nil) + (p . (, (wl-regexp-opt + (list wl-summary-new-mark + wl-summary-unread-uncached-mark + wl-summary-unread-cached-mark)))) + (p . (, (regexp-quote wl-summary-important-mark)))))))) + +(defvar wl-summary-move-spec-unplugged-alist + (` ((new . ((t . nil) + (p . (, wl-summary-unread-cached-mark)) + (p . (, (regexp-quote wl-summary-important-mark))))) + (unread . ((t . nil) + (p . (, wl-summary-unread-cached-mark)) + (p . (, (regexp-quote wl-summary-important-mark)))))))) + +(defsubst wl-summary-next-message (num direction hereto) + (if wl-summary-buffer-next-message-function + (funcall wl-summary-buffer-next-message-function num direction hereto) + (let ((cur-spec (cdr (assq wl-summary-move-order + (if (elmo-folder-plugged-p + wl-summary-buffer-elmo-folder) + wl-summary-move-spec-plugged-alist + wl-summary-move-spec-unplugged-alist)))) + (nums (memq num (if (eq direction 'up) + (reverse wl-summary-buffer-number-list) + wl-summary-buffer-number-list))) + marked-list nums2) + (unless hereto (setq nums (cdr nums))) + (setq nums2 nums) + (if cur-spec + (catch 'done + (while cur-spec + (setq nums nums2) + (cond ((eq (car (car cur-spec)) 'p) + (if (setq marked-list + (elmo-folder-list-messages-mark-match + wl-summary-buffer-elmo-folder + (cdr (car cur-spec)))) + (while nums + (if (memq (car nums) marked-list) + (throw 'done (car nums))) + (setq nums (cdr nums))))) + ((eq (car (car cur-spec)) 't) + (if wl-summary-buffer-target-mark-list + (while nums + (if (memq (car nums) + wl-summary-buffer-target-mark-list) + (throw 'done (car nums))) + (setq nums (cdr nums)))))) + (setq cur-spec (cdr cur-spec)))) + (car nums))))) + +(defsubst wl-summary-cursor-move (direction hereto) + (when (and (eq direction 'up) + (eobp)) + (forward-line -1) + (setq hereto t)) + (let (num) + (when (setq num (wl-summary-next-message (wl-summary-message-number) + direction hereto)) + (if (numberp num) + (wl-thread-jump-to-msg num)) + t))) ;; ;; Goto unread or important ;; returns t if next message exists in this folder. (defun wl-summary-cursor-down (&optional hereto) (interactive "P") - (if (and (null wl-summary-buffer-target-mark-list) - (eq wl-summary-buffer-view 'thread)) - (wl-thread-jump-to-next-unread hereto) - (if hereto - (beginning-of-line) - (end-of-line)) - (let ((case-fold-search nil) - regex-list) - (setq regex-list (wl-summary-cursor-move-regex)) - (catch 'done - (while regex-list - (when (re-search-forward - (car regex-list) - nil t nil) - (beginning-of-line) - (throw 'done t)) - (setq regex-list (cdr regex-list))) - (beginning-of-line) - (throw 'done nil))))) + (wl-summary-cursor-move 'down hereto)) + +(defun wl-summary-cursor-up (&optional hereto) + (interactive "P") + (wl-summary-cursor-move 'up hereto)) (defun wl-summary-save-view-cache () (save-excursion - (let* ((dir (elmo-msgdb-expand-path wl-summary-buffer-folder-name)) + (let* ((dir (elmo-folder-msgdb-path wl-summary-buffer-elmo-folder)) (cache (expand-file-name wl-summary-cache-file dir)) (view (expand-file-name wl-summary-view-file dir)) -;;; (coding-system-for-write wl-cs-cache) -;;; (output-coding-system wl-cs-cache) (save-view wl-summary-buffer-view) (tmp-buffer (get-buffer-create " *wl-summary-save-view-cache*")) (charset wl-summary-buffer-mime-charset)) @@ -4609,11 +4396,8 @@ If ARG, exit virtual folder." (widen) (encode-mime-charset-region (point-min) (point-max) charset) - (as-binary-output-file - (write-region (point-min) - (point-max) cache nil 'no-msg)) - (write-region (point-min) (point-max) cache nil - 'no-msg))) + (write-region-as-binary (point-min)(point-max) + cache nil 'no-msg))) (when (file-writable-p view) ; 'thread or 'sequence (save-excursion (set-buffer tmp-buffer) @@ -4629,7 +4413,7 @@ If ARG, exit virtual folder." (elmo-folder-plugged-p folder) (wl-get-assoc-list-value wl-folder-sync-range-alist - folder)) + (elmo-folder-name-internal folder))) wl-default-sync-range))) ;; redefined for wl-summary-sync-update @@ -4637,7 +4421,8 @@ If ARG, exit virtual folder." "returns update or all or rescan." ;; for the case when parts are expanded in the bottom of the folder (let ((input-range-list '("update" "all" "rescan" "first:" "last:" - "no-sync" "rescan-noscore")) + "cache-status" + "no-sync" "rescan-noscore" "all-visible")) (default (or (wl-get-assoc-list-value wl-folder-sync-range-alist folder) @@ -4654,10 +4439,9 @@ If ARG, exit virtual folder." (defun wl-summary-toggle-disp-folder (&optional arg) (interactive) - (let (fld-buf fld-win - (view-message-buffer (wl-message-get-buffer-create)) - (cur-buf (current-buffer)) - (summary-win (get-buffer-window (current-buffer)))) + (let ((cur-buf (current-buffer)) + (summary-win (get-buffer-window (current-buffer))) + fld-buf fld-win) (cond ((eq arg 'on) (setq wl-summary-buffer-disp-folder t) @@ -4668,8 +4452,9 @@ If ARG, exit virtual folder." ((eq arg 'off) (setq wl-summary-buffer-disp-folder nil) ;; hide your wl-message window! - (wl-select-buffer view-message-buffer) - (delete-window) + (when (buffer-live-p wl-message-buffer) + (wl-message-select-buffer wl-message-buffer) + (delete-window)) (select-window (get-buffer-window cur-buf)) ;; display wl-folder window!! (if (setq fld-buf (get-buffer wl-folder-buffer-name)) @@ -4693,7 +4478,8 @@ If ARG, exit virtual folder." (setq wl-summary-buffer-disp-folder t))) (if (not wl-summary-buffer-disp-folder) ;; hide message window - (let ((mes-win (get-buffer-window view-message-buffer)) + (let ((mes-win (and wl-message-buffer + (get-buffer-window wl-message-buffer))) (wl-stay-folder-window t)) (if mes-win (delete-window mes-win)) ;; hide your folder window @@ -4706,62 +4492,63 @@ If ARG, exit virtual folder." (run-hooks 'wl-summary-toggle-disp-folder-off-hook) ;; resume message window. (when mes-win - (wl-select-buffer view-message-buffer) - (run-hooks 'wl-summary-toggle-disp-folder-message-resumed-hook) - (select-window (get-buffer-window cur-buf))) - ) - (save-excursion - ;; hide message window - (let ((mes-win (get-buffer-window view-message-buffer)) - (wl-stay-folder-window t)) - (if mes-win (delete-window mes-win)) - (select-window (get-buffer-window cur-buf)) - ;; display wl-folder window!! - (if (setq fld-buf (get-buffer wl-folder-buffer-name)) - (if (setq fld-win (get-buffer-window fld-buf)) - ;; folder win is already displayed. - (select-window fld-win) - ;; folder win is not displayed...occupy all. - (switch-to-buffer fld-buf)) - ;; no folder buf - (wl-folder)) - (split-window-horizontally wl-folder-window-width) - (other-window 1) - (switch-to-buffer cur-buf) - ;; resume message window. - (run-hooks 'wl-summary-toggle-disp-folder-on-hook) - (when mes-win - (wl-select-buffer view-message-buffer) + (wl-message-select-buffer wl-message-buffer) (run-hooks 'wl-summary-toggle-disp-folder-message-resumed-hook) (select-window (get-buffer-window cur-buf)))) - ))))) + ;; hide message window + (let ((wl-stay-folder-window t) + (mes-win (and wl-message-buffer + (get-buffer-window wl-message-buffer)))) + (if mes-win (delete-window mes-win)) + (select-window (get-buffer-window cur-buf)) + ;; display wl-folder window!! + (if (setq fld-buf (get-buffer wl-folder-buffer-name)) + (if (setq fld-win (get-buffer-window fld-buf)) + ;; folder win is already displayed. + (select-window fld-win) + ;; folder win is not displayed...occupy all. + (switch-to-buffer fld-buf)) + ;; no folder buf + (wl-folder)) + (split-window-horizontally wl-folder-window-width) + (other-window 1) + (switch-to-buffer cur-buf) + ;; resume message window. + (run-hooks 'wl-summary-toggle-disp-folder-on-hook) + (when mes-win + (wl-message-select-buffer wl-message-buffer) + (run-hooks 'wl-summary-toggle-disp-folder-message-resumed-hook) + (select-window (get-buffer-window cur-buf)))))))) (run-hooks 'wl-summary-toggle-disp-folder-hook)) (defun wl-summary-toggle-disp-msg (&optional arg) (interactive) - (let (fld-buf fld-win - (view-message-buffer (wl-message-get-buffer-create)) - (cur-buf (current-buffer)) + (let ((cur-buf (current-buffer)) + fld-buf fld-win summary-win) (cond ((eq arg 'on) (setq wl-summary-buffer-disp-msg t) - ;; hide your folder window - (if (and (not wl-stay-folder-window) - (setq fld-buf (get-buffer wl-folder-buffer-name))) - (if (setq fld-win (get-buffer-window fld-buf)) - (delete-window fld-win)))) + (save-excursion + ;; hide your folder window + (if (and (not wl-stay-folder-window) + (setq fld-buf (get-buffer wl-folder-buffer-name))) + (if (setq fld-win (get-buffer-window fld-buf)) + (unless (one-window-p fld-win) + (delete-window fld-win)))))) ((eq arg 'off) (wl-delete-all-overlays) (setq wl-summary-buffer-disp-msg nil) (save-excursion - (wl-select-buffer view-message-buffer) - (delete-window) - (and (get-buffer-window cur-buf) - (select-window (get-buffer-window cur-buf))) - (run-hooks 'wl-summary-toggle-disp-off-hook))) + (when (buffer-live-p wl-message-buffer) + (wl-message-select-buffer wl-message-buffer) + (delete-window) + (and (get-buffer-window cur-buf) + (select-window (get-buffer-window cur-buf)))) + (run-hooks 'wl-summary-toggle-disp-off-hook))) (t - (if (get-buffer-window view-message-buffer) ; already displayed + (if (and wl-message-buffer + (get-buffer-window wl-message-buffer)) ; already displayed (setq wl-summary-buffer-disp-msg nil) (setq wl-summary-buffer-disp-msg t)) (if wl-summary-buffer-disp-msg @@ -4774,7 +4561,7 @@ If ARG, exit virtual folder." (run-hooks 'wl-summary-toggle-disp-on-hook)) (wl-delete-all-overlays) (save-excursion - (wl-select-buffer view-message-buffer) + (wl-message-select-buffer wl-message-buffer) (delete-window) (select-window (get-buffer-window cur-buf)) (run-hooks 'wl-summary-toggle-disp-off-hook)) @@ -4782,6 +4569,7 @@ If ARG, exit virtual folder." ))))) (defun wl-summary-next-line-content () + "Show next line of the message." (interactive) (let ((cur-buf (current-buffer))) (wl-summary-toggle-disp-msg 'on) @@ -4806,37 +4594,32 @@ If ARG, exit virtual folder." (wl-message-prev-page)) (defsubst wl-summary-no-mime-p (folder) - (wl-string-match-member folder wl-summary-no-mime-folder-list)) - -(defun wl-summary-set-message-buffer-or-redisplay (&optional ignore-original) - ;; if current message is not displayed, display it. - ;; return t if exists. - (let ((folder wl-summary-buffer-folder-name) + (wl-string-match-member (elmo-folder-name-internal folder) + wl-summary-no-mime-folder-list)) + +(defun wl-summary-set-message-buffer-or-redisplay (&rest args) + "Set message buffer. +If message is not displayed yet, display it. +Return t if message exists." + (let ((folder wl-summary-buffer-elmo-folder) (number (wl-summary-message-number)) - cur-folder cur-number message-last-pos - (view-message-buffer (wl-message-get-buffer-create))) - (save-excursion - (set-buffer view-message-buffer) - (setq cur-folder wl-message-buffer-cur-folder) - (setq cur-number wl-message-buffer-cur-number)) - (if (and (not ignore-original) - (not - (and (eq number (wl-message-original-buffer-number)) - (string= folder (wl-message-original-buffer-folder))))) + cur-folder cur-number message-last-pos) + (when (buffer-live-p wl-message-buffer) + (save-window-excursion + (wl-message-select-buffer wl-message-buffer) + (setq cur-folder wl-message-buffer-cur-folder) + (setq cur-number wl-message-buffer-cur-number))) + (if (and (string= (elmo-folder-name-internal folder) (or cur-folder "")) + (eq number (or cur-number 0))) (progn - (if (wl-summary-no-mime-p folder) - (wl-summary-redisplay-no-mime folder number) - (wl-summary-redisplay-internal folder number)) - nil) - (if (and (string= folder (or cur-folder "")) - (eq number (or cur-number 0))) - (progn - (set-buffer view-message-buffer) - t) - (if (wl-summary-no-mime-p folder) - (wl-summary-redisplay-no-mime folder number) - (wl-summary-redisplay-internal folder number)) - nil)))) + (set-buffer wl-message-buffer) + t) + (if (wl-summary-no-mime-p folder) + (wl-summary-redisplay-no-mime 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") @@ -4878,11 +4661,12 @@ If ARG, exit virtual folder." (wl-summary-jump-to-msg (car mlist)) (wl-summary-reply arg t) (goto-char (point-max)) - (setq start-point (point)) + (setq start-point (point-marker)) (setq draft-buf (current-buffer)) (save-window-excursion (while mlist (set-buffer summary-buf) + (delete-other-windows) (wl-summary-jump-to-msg (car mlist)) (wl-summary-redisplay) (set-buffer draft-buf) @@ -4906,13 +4690,13 @@ If ARG, exit virtual folder." (interactive) (let* ((original (wl-summary-message-number)) (msgid (elmo-string (or id (read-from-minibuffer "Message-ID: ")))) - (number-alist (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb)) + (number-alist (elmo-msgdb-get-number-alist (wl-summary-buffer-msgdb))) msg otherfld schar (errmsg (format "No message with id \"%s\" in the folder." msgid))) (if (setq msg (car (rassoc msgid number-alist))) ;;; (wl-summary-jump-to-msg-internal -;;; wl-summary-buffer-folder-name msg 'no-sync) +;;; (wl-summary-buffer-folder-name) msg 'no-sync) (progn (wl-thread-jump-to-msg msg) t) @@ -4927,10 +4711,11 @@ If ARG, exit virtual folder." t ; succeed. ;; Back to original. (wl-summary-jump-to-msg-internal - wl-summary-buffer-folder-name original 'no-sync)) + (wl-summary-buffer-folder-name) original 'no-sync)) (cond ((eq wl-summary-search-via-nntp 'confirm) + (require 'elmo-nntp) (message "Search message in nntp server \"%s\" ?" - elmo-default-nntp-server) + elmo-nntp-default-server) (setq schar (read-char)) (cond ((eq schar ?y) (wl-summary-jump-to-msg-by-message-id-via-nntp msgid)) @@ -4954,19 +4739,19 @@ If ARG, exit virtual folder." user server port type spec) (if server-spec (if (string-match "^-" server-spec) - (setq spec (elmo-nntp-get-spec server-spec) - user (nth 2 spec) - server (nth 3 spec) - port (nth 4 spec) - type (nth 5 spec)) + (setq spec (wl-folder-get-elmo-folder server-spec) + user (elmo-net-folder-user-internal spec) + server (elmo-net-folder-server-internal spec) + port (elmo-net-folder-port-internal spec) + type (elmo-net-folder-stream-type-internal spec)) (setq server server-spec))) (when (setq ret (elmo-nntp-get-newsgroup-by-msgid msgid - (or server elmo-default-nntp-server) - (or user elmo-default-nntp-user) - (or port elmo-default-nntp-port) - (or type elmo-default-nntp-stream-type))) - (setq newsgroups (wl-parse-newsgroups ret)) + (or server elmo-nntp-default-server) + (or user elmo-nntp-default-user) + (or port elmo-nntp-default-port) + (or type elmo-nntp-default-stream-type))) + (setq newsgroups (elmo-nntp-parse-newsgroups ret)) (setq folder (concat "-" (car newsgroups) (elmo-nntp-folder-postfix user server port type))) (catch 'found @@ -4981,12 +4766,12 @@ If ARG, exit virtual folder." (if ret (wl-summary-jump-to-msg-internal folder nil 'update msgid) (message "No message id \"%s\" in nntp server \"%s\"." - msgid (or server elmo-default-nntp-server)) + msgid (or server elmo-nntp-default-server)) nil))) (defun wl-summary-jump-to-msg-internal (folder msg scan-type &optional msgid) (let (wl-auto-select-first entity) - (if (or (string= folder wl-summary-buffer-folder-name) + (if (or (string= folder (wl-summary-buffer-folder-name)) (y-or-n-p (format "Message was found in the folder \"%s\". Jump to it? " @@ -4999,7 +4784,7 @@ If ARG, exit virtual folder." (setq msg (car (rassoc msgid (elmo-msgdb-get-number-alist - wl-summary-buffer-msgdb))))) + (wl-summary-buffer-msgdb)))))) (setq entity (wl-folder-search-entity-by-name folder wl-folder-entity 'folder)) @@ -5088,98 +4873,103 @@ If ARG, exit virtual folder." "Reply to current message. Default is \"wide\" reply. Reply to author if invoked with ARG." (interactive "P") - (let ((folder wl-summary-buffer-folder-name) + (let ((folder wl-summary-buffer-elmo-folder) (number (wl-summary-message-number)) (summary-buf (current-buffer)) mes-buf) - (if number - (unwind-protect - (progn - (wl-summary-redisplay-internal folder number) - (wl-select-buffer - (get-buffer (setq mes-buf (wl-current-message-buffer)))) - (set-buffer mes-buf) - (goto-char (point-min)) - (or wl-draft-use-frame - (split-window-vertically)) - (other-window 1) - (when (setq mes-buf (wl-message-get-original-buffer)) - (wl-draft-reply mes-buf (not arg) summary-buf) - (unless without-setup-hook - (run-hooks 'wl-mail-setup-hook))) - t))))) + (when number + (save-excursion + (wl-summary-redisplay-internal folder number)) + (setq mes-buf wl-message-buffer) + (wl-message-select-buffer wl-message-buffer) + (set-buffer mes-buf) + (goto-char (point-min)) + (unless wl-draft-use-frame + (split-window-vertically) + (other-window 1)) + (when (setq mes-buf (wl-message-get-original-buffer)) + (wl-draft-reply mes-buf arg summary-buf) + (unless without-setup-hook + (run-hooks 'wl-mail-setup-hook))) + t))) (defun wl-summary-write () "Write a new draft from Summary." (interactive) (wl-draft nil nil nil nil nil - nil nil nil nil nil nil (current-buffer)) + nil nil nil nil nil nil (current-buffer) + nil (wl-summary-buffer-folder-name)) (run-hooks 'wl-mail-setup-hook) (mail-position-on-field "To")) (defvar wl-summary-write-current-folder-functions '(wl-folder-get-newsgroups -;;; wl-folder-guess-mailing-list-by-refile-rule - ) + wl-folder-guess-mailing-list-by-refile-rule + wl-folder-guess-mailing-list-by-folder-name) "Newsgroups or Mailing List address guess functions list. -Call from `wl-summary-write-current-folder'") +Call from `wl-summary-write-current-folder'. +When guess function return nil, challenge next guess-function.") (defun wl-summary-write-current-folder (&optional folder) "Write message to current FOLDER's newsgroup or mailing-list. Use function list is `wl-summary-write-current-folder-functions'." (interactive) - (let (newsgroups to cc) - ;; default FOLDER is current buffer folder - (setq folder (or folder wl-summary-buffer-folder-name)) - (let ((flist wl-summary-write-current-folder-functions) - guess-list) - (while flist - (setq guess-list (funcall (car flist) folder)) - (if (or (nth 0 guess-list) ; To: -;;; (nth 1 guess-list) ; Cc: - (nth 2 guess-list)) ; Newsgroups: - (setq flist nil) - (setq flist (cdr flist)))) - (if guess-list - (progn - (wl-draft (nth 0 guess-list) ; To: - nil nil - (nth 1 guess-list) ; Cc: - nil - (nth 2 guess-list)) ; Newsgroups: - (run-hooks 'wl-mail-setup-hook)) -;;; (error "%s is not newsgroup" folder) - (error "Can't guess by folder %s" folder))))) + ;; default FOLDER is current buffer folder + (setq folder (or folder (wl-summary-buffer-folder-name))) + (let ((func-list wl-summary-write-current-folder-functions) + guess-list guess-func) + (while func-list + (setq guess-list (funcall (car func-list) folder)) + (if (null guess-list) + (setq func-list (cdr func-list)) + (setq guess-func (car func-list)) + (setq func-list nil))) + (when (null guess-func) + (error "Can't guess by folder %s" folder)) + (unless (or (stringp (nth 0 guess-list)) + (stringp (nth 1 guess-list)) + (stringp (nth 2 guess-list))) + (error "Invalid value return guess function `%s'" + (symbol-name guess-func))) + (wl-draft (nth 0 guess-list) nil nil ; To: + (nth 1 guess-list) nil ; Cc: + (nth 2 guess-list) ; Newsgroups: + nil nil nil nil nil nil nil + folder) + (run-hooks 'wl-mail-setup-hook) + (mail-position-on-field "Subject"))) (defun wl-summary-forward (&optional without-setup-hook) "" (interactive) - (let ((folder wl-summary-buffer-folder-name) + (let ((folder wl-summary-buffer-elmo-folder) (number (wl-summary-message-number)) (summary-buf (current-buffer)) (wl-draft-forward t) + mes-buf entity subject num) (if (null number) (message "No message.") - (wl-summary-redisplay-internal folder number) - (wl-select-buffer (get-buffer wl-message-buf-name)) - (or wl-draft-use-frame - (split-window-vertically)) - (other-window 1) + (if (and (elmo-message-use-cache-p folder number) + (eq (elmo-file-cache-status + (elmo-file-cache-get + (elmo-message-field folder number 'message-id))) + 'section)) + ;; Reload. + (wl-summary-redisplay-internal nil nil 'force-reload) + (wl-summary-redisplay-internal folder number)) + (setq mes-buf wl-message-buffer) + (wl-message-select-buffer mes-buf) + (unless wl-draft-use-frame + (split-window-vertically) + (other-window 1)) ;; get original subject. (if summary-buf (save-excursion (set-buffer summary-buf) - (setq num (wl-summary-message-number)) - (setq entity (assoc (cdr (assq num - (elmo-msgdb-get-number-alist - wl-summary-buffer-msgdb))) - (elmo-msgdb-get-overview - wl-summary-buffer-msgdb))) - (and entity - (setq subject - (or (elmo-msgdb-overview-entity-get-subject entity) - ""))))) + (setq subject + (or (elmo-message-field folder number 'subject) "")))) + (set-buffer mes-buf) (wl-draft-forward subject summary-buf) (unless without-setup-hook (run-hooks 'wl-mail-setup-hook))))) @@ -5190,48 +4980,26 @@ Use function list is `wl-summary-write-current-folder-functions'." (wl-summary-read)) (defun wl-summary-read () - "" + "Proceed reading message in the summary buffer." (interactive) - (let ((folder wl-summary-buffer-folder-name) - (number (wl-summary-message-number)) - cur-folder cur-number message-last-pos - (view-message-buffer (get-buffer-create wl-message-buf-name)) - (sticky-buf-name (and (wl-summary-sticky-p) wl-message-buf-name)) - (summary-buf-name (buffer-name))) - (save-excursion - (set-buffer view-message-buffer) - (when (and sticky-buf-name - (not (wl-local-variable-p 'wl-message-buf-name - (current-buffer)))) - (make-local-variable 'wl-message-buf-name) - (setq wl-message-buf-name sticky-buf-name) - (make-local-variable 'wl-message-buffer-cur-summary-buffer) - (setq wl-message-buffer-cur-summary-buffer summary-buf-name)) - (setq cur-folder wl-message-buffer-cur-folder) - (setq cur-number wl-message-buffer-cur-number)) + (let ((cur-buf (current-buffer))) (wl-summary-toggle-disp-msg 'on) - (if (and (string= folder cur-folder) - (eq number cur-number)) - (progn - (if (wl-summary-next-page) - (wl-summary-down t))) -;;; (wl-summary-scroll-up-content))) - (if (wl-summary-no-mime-p folder) - (wl-summary-redisplay-no-mime folder number) - (wl-summary-redisplay-internal folder number))))) + (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original) + (set-buffer cur-buf) + (if (wl-message-next-page) + (wl-summary-down t))))) (defun wl-summary-prev (&optional interactive) "" (interactive) (if wl-summary-move-direction-toggle (setq wl-summary-move-direction-downward nil)) - (let ((type (elmo-folder-get-type wl-summary-buffer-folder-name)) - (skip-mark-regexp (mapconcat + (let ((skip-mark-regexp (mapconcat 'regexp-quote wl-summary-skip-mark-list "")) goto-next regex-list regex next-entity finfo) (beginning-of-line) - (if (elmo-folder-plugged-p wl-summary-buffer-folder-name) + (if (elmo-folder-plugged-p wl-summary-buffer-elmo-folder) (setq regex (format "^%s[^%s]" wl-summary-buffer-number-regexp skip-mark-regexp)) @@ -5248,8 +5016,8 @@ Use function list is `wl-summary-write-current-folder-functions'." (if wl-summary-buffer-disp-msg (wl-summary-redisplay))) (if (or interactive (interactive-p)) - (if wl-summary-buffer-prev-folder-func - (funcall wl-summary-buffer-prev-folder-func) + (if wl-summary-buffer-prev-folder-function + (funcall wl-summary-buffer-prev-folder-function) (when wl-auto-select-next (setq next-entity (wl-summary-get-prev-folder)) (if next-entity @@ -5265,13 +5033,12 @@ Use function list is `wl-summary-write-current-folder-functions'." (interactive) (if wl-summary-move-direction-toggle (setq wl-summary-move-direction-downward t)) - (let ((type (elmo-folder-get-type wl-summary-buffer-folder-name)) - (skip-mark-regexp (mapconcat + (let ((skip-mark-regexp (mapconcat 'regexp-quote wl-summary-skip-mark-list "")) goto-next regex regex-list next-entity finfo) (end-of-line) - (if (elmo-folder-plugged-p wl-summary-buffer-folder-name) + (if (elmo-folder-plugged-p wl-summary-buffer-elmo-folder) (setq regex (format "^%s[^%s]" wl-summary-buffer-number-regexp skip-mark-regexp)) @@ -5288,8 +5055,8 @@ Use function list is `wl-summary-write-current-folder-functions'." (if wl-summary-buffer-disp-msg (wl-summary-redisplay)) (if (or interactive (interactive-p)) - (if wl-summary-buffer-next-folder-func - (funcall wl-summary-buffer-next-folder-func) + (if wl-summary-buffer-next-folder-function + (funcall wl-summary-buffer-next-folder-function) (when wl-auto-select-next (setq next-entity (wl-summary-get-next-folder)) (if next-entity @@ -5310,8 +5077,8 @@ Use function list is `wl-summary-write-current-folder-functions'." (wl-summary-redisplay)) (if (or interactive (interactive-p)) - (if wl-summary-buffer-prev-folder-func - (funcall wl-summary-buffer-prev-folder-func) + (if wl-summary-buffer-prev-folder-function + (funcall wl-summary-buffer-prev-folder-function) (let (next-entity finfo) (when wl-auto-select-next (progn @@ -5368,8 +5135,8 @@ Use function list is `wl-summary-write-current-folder-functions'." (wl-summary-redisplay)) (if (or interactive (interactive-p)) - (if wl-summary-buffer-next-folder-func - (funcall wl-summary-buffer-next-folder-func) + (if wl-summary-buffer-next-folder-function + (funcall wl-summary-buffer-next-folder-function) (let (next-entity finfo) (when wl-auto-select-next (setq next-entity (wl-summary-get-next-unread-folder))) @@ -5399,19 +5166,17 @@ Use function list is `wl-summary-write-current-folder-functions'." (defun wl-summary-redisplay (&optional arg) (interactive "P") (if (and (not arg) - (wl-summary-no-mime-p wl-summary-buffer-folder-name)) + (wl-summary-no-mime-p wl-summary-buffer-elmo-folder)) (wl-summary-redisplay-no-mime) (wl-summary-redisplay-internal nil nil arg))) (defsubst wl-summary-redisplay-internal (&optional folder number force-reload) (interactive) - (let* ((msgdb wl-summary-buffer-msgdb) - (fld (or folder wl-summary-buffer-folder-name)) + (let* ((msgdb (wl-summary-buffer-msgdb)) + (folder (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) - (wl-message-redisplay-func - wl-summary-buffer-message-redisplay-func) fld-buf fld-win thr-entity) (if (and wl-thread-open-reading-thread (eq wl-summary-buffer-view 'thread) @@ -5430,42 +5195,51 @@ Use function list is `wl-summary-write-current-folder-functions'." (setq fld-buf (get-buffer wl-folder-buffer-name))) (if (setq fld-win (get-buffer-window fld-buf)) (delete-window fld-win))) - (setq wl-current-summary-buffer (current-buffer)) - (if (wl-message-redisplay fld num 'mime msgdb force-reload) - (wl-summary-mark-as-read nil - ;; cached, then change server-mark. - (if wl-message-cache-used - nil - ;; plugged, then leave server-mark. - (if (and - (not - (elmo-folder-local-p - wl-summary-buffer-folder-name)) - (elmo-folder-plugged-p - wl-summary-buffer-folder-name)) - 'leave)) - t ; displayed - nil - 'cached ; cached by reading. - ) - ) + (setq wl-current-summary-buffer (current-buffer)) + (wl-summary-mark-as-read + nil + ;; not fetched, then change server-mark. + (if (wl-message-redisplay folder num 'mime + (or force-reload + (string= (elmo-folder-name-internal + folder) + wl-draft-folder))) + nil + ;; plugged, then leave server-mark. + (if (and + (not + (elmo-folder-local-p + wl-summary-buffer-elmo-folder)) + (elmo-folder-plugged-p + wl-summary-buffer-elmo-folder)) + 'leave)) + t ; displayed + nil + 'cached ; cached by reading. + ) (setq wl-summary-buffer-current-msg num) (when wl-summary-recenter (recenter (/ (- (window-height) 2) 2)) - (if (not wl-summary-width) + (if (not wl-summary-indent-length-limit) (wl-horizontal-recenter))) (wl-highlight-summary-displaying) - (wl-cache-prefetch-next fld num (current-buffer)) + (when wl-message-buffer-prefetch-depth + (if (not (< wl-message-buffer-prefetch-depth + wl-message-buffer-cache-size)) + (error (concat + "`wl-message-buffer-prefetch-depth' must be smaller than " + "`wl-message-buffer-cache-size' - 1."))) + (wl-message-buffer-prefetch-next folder num + wl-message-buffer-prefetch-depth + (current-buffer) + wl-summary-buffer-mime-charset)) (run-hooks 'wl-summary-redisplay-hook)) (message "No message to display.")))) (defun wl-summary-redisplay-no-mime (&optional folder number) (interactive) - (let* ((msgdb wl-summary-buffer-msgdb) - (fld (or folder wl-summary-buffer-folder-name)) + (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) wl-break-pages) (if num (progn @@ -5473,12 +5247,14 @@ Use function list is `wl-summary-write-current-folder-functions'." (setq wl-summary-buffer-last-displayed-msg wl-summary-buffer-current-msg) (setq wl-current-summary-buffer (current-buffer)) - (wl-normal-message-redisplay fld num 'no-mime msgdb) + (wl-message-redisplay fld num 'as-is + (string= (elmo-folder-name-internal fld) + wl-draft-folder)) (wl-summary-mark-as-read nil nil t) (setq wl-summary-buffer-current-msg num) (when wl-summary-recenter (recenter (/ (- (window-height) 2) 2)) - (if (not wl-summary-width) + (if (not wl-summary-indent-length-limit) (wl-horizontal-recenter))) (wl-highlight-summary-displaying) (run-hooks 'wl-summary-redisplay-hook)) @@ -5488,24 +5264,24 @@ Use function list is `wl-summary-write-current-folder-functions'." (defun wl-summary-redisplay-all-header (&optional folder number) (interactive) - (let* ((msgdb wl-summary-buffer-msgdb) - (fld (or folder wl-summary-buffer-folder-name)) + (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) - (wl-message-redisplay-func wl-summary-buffer-message-redisplay-func)) + (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 msgdb); t if displayed. + (if (wl-message-redisplay fld num 'all-header + (string= (elmo-folder-name-internal fld) + wl-draft-folder)) (wl-summary-mark-as-read nil nil t)) (setq wl-summary-buffer-current-msg num) (when wl-summary-recenter (recenter (/ (- (window-height) 2) 2)) - (if (not wl-summary-width) + (if (not wl-summary-indent-length-limit) (wl-horizontal-recenter))) (wl-highlight-summary-displaying) (run-hooks 'wl-summary-redisplay-hook)) @@ -5514,13 +5290,12 @@ Use function list is `wl-summary-write-current-folder-functions'." (defun wl-summary-jump-to-current-message () (interactive) (let (message-buf message-win) - (if (setq message-buf (get-buffer wl-message-buf-name)) + (if (setq message-buf wl-message-buffer) (if (setq message-win (get-buffer-window message-buf)) (select-window message-win) - (wl-select-buffer (get-buffer wl-message-buf-name))) + (wl-message-select-buffer wl-message-buffer)) (wl-summary-redisplay) - (wl-select-buffer (get-buffer wl-message-buf-name))) - (goto-char (point-min)))) + (wl-message-select-buffer wl-message-buffer)))) (defun wl-summary-cancel-message () "Cancel an article on news." @@ -5534,7 +5309,7 @@ Use function list is `wl-summary-write-current-folder-functions'." (set-buffer message-buf)) (unless (wl-message-news-p) (set-buffer summary-buf) - (if (and (eq (elmo-folder-get-type wl-summary-buffer-folder-name) + (if (and (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder) 'nntp) (y-or-n-p "Cannot get Newsgroups. Fetch again? ")) (progn @@ -5576,14 +5351,13 @@ Use function list is `wl-summary-write-current-folder-functions'." "Supersede current message." (interactive) (let ((summary-buf (current-buffer)) - (mmelmo-force-fetch-entire-message t) message-buf from) (wl-summary-set-message-buffer-or-redisplay) (if (setq message-buf (wl-message-get-original-buffer)) (set-buffer message-buf)) (unless (wl-message-news-p) (set-buffer summary-buf) - (if (and (eq (elmo-folder-get-type wl-summary-buffer-folder-name) + (if (and (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder) 'nntp) (y-or-n-p "Cannot get Newsgroups. Fetch again? ")) (progn @@ -5604,16 +5378,15 @@ Use function list is `wl-summary-write-current-folder-functions'." "Supersedes: " message-id "\n" (and followup-to (concat "Followup-To: " followup-to "\n"))))) - (set-buffer (wl-message-get-original-buffer)) + (if message-buf (set-buffer message-buf)) (wl-draft-edit-string (buffer-substring (point-min) (point-max))))))) (defun wl-summary-save (&optional arg wl-save-dir) (interactive) (let ((filename) - (num (wl-summary-message-number)) - (mmelmo-force-fetch-entire-message t)) + (num (wl-summary-message-number))) (if (null wl-save-dir) - (setq wl-save-dir wl-tmp-dir)) + (setq wl-save-dir wl-temporary-file-directory)) (if num (save-excursion (setq filename (expand-file-name @@ -5640,7 +5413,8 @@ Use function list is `wl-summary-write-current-folder-functions'." (narrow-to-region beg end) (goto-char (point-min)) (let ((wl-save-dir - (wl-read-directory-name "Save to directory: " wl-tmp-dir))) + (wl-read-directory-name "Save to directory: " + wl-temporary-file-directory))) (if (null (file-exists-p wl-save-dir)) (make-directory wl-save-dir)) (if (eq wl-summary-buffer-view 'thread) @@ -5686,13 +5460,10 @@ Use function list is `wl-summary-write-current-folder-functions'." (if (or (not (interactive-p)) (y-or-n-p "Print ok? ")) (progn - (let* ((message-buffer (get-buffer wl-message-buf-name)) -;;; (summary-buffer (get-buffer wl-summary-buffer-name)) - (buffer (generate-new-buffer " *print*"))) - (set-buffer message-buffer) + (let ((buffer (generate-new-buffer " *print*"))) (copy-to-buffer buffer (point-min) (point-max)) (set-buffer buffer) - (funcall wl-print-buffer-func) + (funcall wl-print-buffer-function) (kill-buffer buffer))) (message ""))))) @@ -5706,18 +5477,17 @@ Use function list is `wl-summary-write-current-folder-functions'." (let ((summary-buffer (current-buffer)) wl-break-pages) (save-excursion -;;; (wl-summary-set-message-buffer-or-redisplay) - (wl-summary-redisplay-internal) - (let* ((message-buffer (get-buffer wl-message-buf-name)) - (buffer (generate-new-buffer " *print*")) + (wl-summary-set-message-buffer-or-redisplay) + ;; (wl-summary-redisplay-internal) + (let* ((buffer (generate-new-buffer " *print*")) (entity (progn (set-buffer summary-buffer) (assoc (cdr (assq (wl-summary-message-number) (elmo-msgdb-get-number-alist - wl-summary-buffer-msgdb))) + (wl-summary-buffer-msgdb)))) (elmo-msgdb-get-overview - wl-summary-buffer-msgdb)))) + (wl-summary-buffer-msgdb))))) (wl-ps-subject (and entity (or (elmo-msgdb-overview-entity-get-subject entity) @@ -5729,7 +5499,7 @@ Use function list is `wl-summary-write-current-folder-functions'." (and entity (or (elmo-msgdb-overview-entity-get-date entity) "")))) (run-hooks 'wl-ps-preprint-hook) - (set-buffer message-buffer) + (set-buffer wl-message-buffer) (copy-to-buffer buffer (point-min) (point-max)) (set-buffer buffer) (unwind-protect @@ -5740,7 +5510,7 @@ Use function list is `wl-summary-write-current-folder-functions'." (list "/pagenumberstring load" (concat "(" wl-ps-date ")")))) (run-hooks 'wl-ps-print-hook) - (funcall wl-ps-print-buffer-func filename)) + (funcall wl-ps-print-buffer-function filename)) (kill-buffer buffer))))) (message "")))) @@ -5748,119 +5518,24 @@ Use function list is `wl-summary-write-current-folder-functions'." (fset 'wl-summary-print-message 'wl-summary-print-message-with-ps-print)) (defun wl-summary-folder-info-update () - (let ((folder (elmo-string wl-summary-buffer-folder-name)) + (let ((folder (elmo-string (wl-summary-buffer-folder-name))) (num-db (elmo-msgdb-get-number-alist - wl-summary-buffer-msgdb))) + (wl-summary-buffer-msgdb)))) (wl-folder-set-folder-updated folder (list 0 (+ wl-summary-buffer-unread-count wl-summary-buffer-new-count) (length num-db))))) -(defun wl-summary-get-newsgroups () - (let ((spec-list (elmo-folder-get-primitive-spec-list - (elmo-string wl-summary-buffer-folder-name))) - ng-list) - (while spec-list - (when (eq (caar spec-list) 'nntp) - (wl-append ng-list (list (nth 1 (car spec-list))))) - (setq spec-list (cdr spec-list))) - ng-list)) - -(defun wl-summary-set-crosspost (&optional type redisplay) - (let* ((number (wl-summary-message-number)) - (spec (elmo-folder-number-get-spec wl-summary-buffer-folder-name - number)) - (folder (nth 1 spec)) - message-buf newsgroups) - (when (eq (car spec) 'nntp) - (if redisplay - (wl-summary-redisplay)) - (save-excursion - (if (setq message-buf (wl-message-get-original-buffer)) - (set-buffer message-buf)) - (setq newsgroups (std11-field-body "newsgroups"))) - (when newsgroups - (let* ((msgdb wl-summary-buffer-msgdb) - (num-db (elmo-msgdb-get-number-alist msgdb)) - (ng-list (wl-summary-get-newsgroups)) ;; for multi folder - crosspost-folders) - (when (setq crosspost-folders - (elmo-list-delete ng-list - (wl-parse-newsgroups newsgroups t))) - (elmo-crosspost-message-set (cdr (assq number num-db)) ;;message-id - crosspost-folders - type) ;;not used - (setq wl-crosspost-alist-modified t))))))) - -(defun wl-summary-is-crosspost-folder (spec-list fld-list) - (let (fld flds) - (while spec-list - (if (and (eq (caar spec-list) 'nntp) - (member (setq fld (nth 1 (car spec-list))) fld-list)) - (wl-append flds (list fld))) - (setq spec-list (cdr spec-list))) - flds)) - -(defun wl-summary-update-crosspost () - (let* ((msgdb wl-summary-buffer-msgdb) - (number-alist (elmo-msgdb-get-number-alist msgdb)) - (mark-alist (elmo-msgdb-get-mark-alist msgdb)) - (spec-list (elmo-folder-get-primitive-spec-list - (elmo-string wl-summary-buffer-folder-name))) - (alist elmo-crosspost-message-alist) - (crossed 0) - mark ngs num) - (when (assq 'nntp spec-list) - (while alist - (when (setq ngs - (wl-summary-is-crosspost-folder - spec-list - (nth 1 (car alist)))) - (when (setq num (car (rassoc (caar alist) number-alist))) - (if (and (setq mark (cadr (assq num mark-alist))) - (member mark (list wl-summary-new-mark - wl-summary-unread-uncached-mark - wl-summary-unread-cached-mark))) - (setq crossed (1+ crossed))) - (if (wl-summary-jump-to-msg num) - (wl-summary-mark-as-read t);; opened - (wl-summary-mark-as-read t nil nil num)));; closed - ;; delete if message does't exists. - (elmo-crosspost-message-delete (caar alist) ngs) - (setq wl-crosspost-alist-modified t)) - (setq alist (cdr alist)))) - (if (> crossed 0) - crossed))) - -(defun wl-crosspost-alist-load () - (setq elmo-crosspost-message-alist (elmo-crosspost-alist-load)) - (setq wl-crosspost-alist-modified nil)) - -(defun wl-crosspost-alist-save () - (when wl-crosspost-alist-modified - ;; delete non-exists newsgroups - (let ((alist elmo-crosspost-message-alist) - newsgroups) - (while alist - (setq newsgroups - (elmo-delete-if - '(lambda (x) - (not (intern-soft x wl-folder-newsgroups-hashtb))) - (nth 1 (car alist)))) - (if newsgroups - (setcar (cdar alist) newsgroups) - (setq elmo-crosspost-message-alist - (delete (car alist) elmo-crosspost-message-alist))) - (setq alist (cdr alist))) - (elmo-crosspost-alist-save elmo-crosspost-message-alist) - (setq wl-crosspost-alist-modified nil)))) +(defun wl-summary-get-original-buffer () + "Get original buffer for the current summary." + (save-excursion + (wl-summary-set-message-buffer-or-redisplay) + (wl-message-get-original-buffer))) (defun wl-summary-pack-number (&optional arg) (interactive "P") - (setq wl-summary-buffer-msgdb - (elmo-pack-number - wl-summary-buffer-folder-name wl-summary-buffer-msgdb arg)) + (elmo-folder-pack-numbers wl-summary-buffer-elmo-folder) (let (wl-use-scoring) (wl-summary-rescan))) @@ -5879,7 +5554,7 @@ Use function list is `wl-summary-write-current-folder-functions'." (set-buffer summary-buf) (wl-summary-jump-to-msg (car mlist)) (wl-summary-redisplay) - (set-buffer (setq orig-buf (wl-message-get-original-buffer))) + (set-buffer (setq orig-buf (wl-summary-get-original-buffer))) (goto-char (point-min)) (cond ((= i 1) ; first (if (setq filename (wl-message-uu-substring @@ -5896,15 +5571,15 @@ Use function list is `wl-summary-write-current-folder-functions'." (set-buffer tmp-buf) (message "Exec %s..." wl-prog-uudecode) (unwind-protect - (let ((decode-dir wl-tmp-dir)) + (let ((decode-dir wl-temporary-file-directory)) (if (not wl-prog-uudecode-no-stdout-option) (setq filename (read-file-name "Save to file: " (expand-file-name (elmo-safe-filename filename) - wl-tmp-dir))) + wl-temporary-file-directory))) (setq decode-dir (wl-read-directory-name "Save to directory: " - wl-tmp-dir)) + wl-temporary-file-directory)) (setq filename (expand-file-name filename decode-dir))) (if (file-exists-p filename) (or (yes-or-no-p (format "File %s exists. Save anyway? " @@ -5932,123 +5607,50 @@ Use function list is `wl-summary-write-current-folder-functions'." (message "Saved as %s" filename))) (kill-buffer tmp-buf))))) -(defun wl-summary-drop-unsync () - "Drop all unsync messages." - (interactive) - (if (elmo-folder-pipe-p wl-summary-buffer-folder-name) - (error "You cannot drop unsync messages in this folder")) - (if (or (not (interactive-p)) - (y-or-n-p "Drop all unsync messages? ")) - (let* ((folder-list (elmo-folder-get-primitive-folder-list - wl-summary-buffer-folder-name)) - (is-multi (elmo-multi-p wl-summary-buffer-folder-name)) - (sum 0) - (multi-num 0) - pair) - (message "Dropping...") - (while folder-list - (setq pair (elmo-max-of-folder (car folder-list))) - (when is-multi ;; dirty hack... - (incf multi-num) - (setcar pair (+ (* multi-num elmo-multi-divide-number) - (car pair)))) - (elmo-msgdb-set-number-alist - wl-summary-buffer-msgdb - (nconc - (elmo-msgdb-get-number-alist wl-summary-buffer-msgdb) - (list (cons (car pair) nil)))) - (setq sum (+ sum (cdr pair))) - (setq folder-list (cdr folder-list))) - (wl-summary-set-message-modified) - (wl-folder-set-folder-updated wl-summary-buffer-folder-name - (list 0 - (+ wl-summary-buffer-unread-count - wl-summary-buffer-new-count) - sum)) - (message "Dropping...done")))) +;; Someday +;; (defun wl-summary-drop-unsync () +;; "Drop all unsync messages." +;; (interactive) +;; (if (elmo-folder-pipe-p (wl-summary-buffer-folder-name)) +;; (error "You cannot drop unsync messages in this folder")) +;; (if (or (not (interactive-p)) +;; (y-or-n-p "Drop all unsync messages? ")) +;; (let* ((folder-list (elmo-folder-get-primitive-folder-list +;; (wl-summary-buffer-folder-name))) +;; (is-multi (elmo-multi-p (wl-summary-buffer-folder-name))) +;; (sum 0) +;; (multi-num 0) +;; pair) +;; (message "Dropping...") +;; (while folder-list +;; (setq pair (elmo-folder-message-numbers (car folder-list))) +;; (when is-multi ;; dirty hack... +;; (incf multi-num) +;; (setcar pair (+ (* multi-num elmo-multi-divide-number) +;; (car pair)))) +;; (elmo-msgdb-set-number-alist +;; (wl-summary-buffer-msgdb) +;; (nconc +;; (elmo-msgdb-get-number-alist (wl-summary-buffer-msgdb)) +;; (list (cons (car pair) nil)))) +;; (setq sum (+ sum (cdr pair))) +;; (setq folder-list (cdr folder-list))) +;; (wl-summary-set-message-modified) +;; (wl-folder-set-folder-updated (wl-summary-buffer-folder-name) +;; (list 0 +;; (+ wl-summary-buffer-unread-count +;; wl-summary-buffer-new-count) +;; sum)) +;; (message "Dropping...done")))) (defun wl-summary-default-get-next-msg (msg) - (let (next) - (if (and (not wl-summary-buffer-target-mark-list) - (eq wl-summary-buffer-view 'thread) - (if (eq wl-summary-move-direction-downward nil) - (setq next (wl-thread-get-prev-unread msg)) - (setq next (wl-thread-get-next-unread msg)))) - next - (save-excursion - (wl-summary-jump-to-msg msg) - (let (wl-summary-buffer-disp-msg) - (if (eq wl-summary-move-direction-downward nil) - (unless (wl-summary-cursor-up) - (wl-summary-prev)) - (unless (wl-summary-cursor-down) - (wl-summary-next))) - (wl-summary-message-number)))))) - -(defsubst wl-cache-prefetch-p (fld &optional num) - (cond ((and num wl-cache-prefetch-folder-type-list) - (memq - (elmo-folder-number-get-type fld num) - wl-cache-prefetch-folder-type-list)) - (wl-cache-prefetch-folder-type-list - (let ((list wl-cache-prefetch-folder-type-list) - type) - (catch 'done - (while (setq type (pop list)) - (if (elmo-folder-contains-type fld type) - (throw 'done t)))))) - ((consp wl-cache-prefetch-folder-list) - (wl-string-match-member fld wl-cache-prefetch-folder-list)) - (t - wl-cache-prefetch-folder-list))) - -(defconst wl-cache-prefetch-idle-time - (if (featurep 'lisp-float-type) (/ (float 1) (float 10)) 1)) - -(defun wl-cache-prefetch-next (fld msg &optional summary) - (if (wl-cache-prefetch-p fld) - (if (not elmo-use-buffer-cache) -;;; (message "`elmo-use-buffer-cache' is nil, cache prefetch is disable.") - (save-excursion - (set-buffer (or summary (get-buffer wl-summary-buffer-name))) - (let ((next (funcall wl-cache-prefetch-get-next-func msg))) - (when (and next - (wl-cache-prefetch-p fld next)) - (if (not (fboundp 'run-with-idle-timer)) - (when (sit-for wl-cache-prefetch-idle-time) - (wl-cache-prefetch-message fld next summary)) - (run-with-idle-timer - wl-cache-prefetch-idle-time - nil - 'wl-cache-prefetch-message fld next summary) - (sit-for 0)))))))) - -(defvar wl-cache-prefetch-debug nil) -(defun wl-cache-prefetch-message (folder msg summary &optional next) - (when (buffer-live-p summary) - (save-excursion - (set-buffer summary) - (when (string= folder wl-summary-buffer-folder-name) - (unless next - (setq next msg)) - (let* ((msgdb wl-summary-buffer-msgdb) - (message-id (cdr (assq next - (elmo-msgdb-get-number-alist msgdb))))) - (if (not (elmo-buffer-cache-hit (list folder next message-id))) - (let* ((size (elmo-msgdb-overview-entity-get-size - (assoc message-id - (elmo-msgdb-get-overview msgdb))))) - (when (or (elmo-local-file-p folder next) - (not (and (integerp size) - wl-cache-prefetch-threshold - (>= size wl-cache-prefetch-threshold) - (not (elmo-cache-exists-p message-id - folder next))))) - (if wl-cache-prefetch-debug - (message "Reading %d..." msg)) - (elmo-buffer-cache-message folder next msgdb) - (if wl-cache-prefetch-debug - (message "Reading %d... done" msg)))))))))) + (or (wl-summary-next-message msg + (if wl-summary-move-direction-downward 'down + 'up) + nil) + (cadr (memq msg (if wl-summary-move-direction-downward + wl-summary-buffer-number-list + (reverse wl-summary-buffer-number-list)))))) (defun wl-summary-save-current-message () "Save current message for `wl-summary-yank-saved-message'."