X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=wl%2Fwl-summary.el;h=227a820408c4c3f10acfeb3d0955efe31c41e29e;hb=167053919d525e30162c34e574b6452bb858211b;hp=0ec72844d6f5431bad192bc33162363a9a873dfc;hpb=9fe0df07710c297f935c5e796f33944457d4abec;p=elisp%2Fwanderlust.git diff --git a/wl/wl-summary.el b/wl/wl-summary.el index 0ec7284..227a820 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 @@ -345,6 +345,7 @@ "----" ("Writing Messages" ["Write a message" wl-summary-write t] + ["Write for current folder" wl-summary-write-current-folder t] ["Reply" wl-summary-reply t] ["Reply with citation" wl-summary-reply-with-citation t] ["Forward" wl-summary-forward t]) @@ -387,6 +388,7 @@ (define-key wl-summary-mode-map "-" 'wl-summary-prev-line-content) (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 "G" 'wl-summary-goto-folder-sticky) (define-key wl-summary-mode-map "c" 'wl-summary-mark-as-read-all) ; (define-key wl-summary-mode-map "D" 'wl-summary-drop-unsync) @@ -411,6 +413,8 @@ (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 "\C-c\C-p" 'wl-summary-previous-buffer) + (define-key wl-summary-mode-map "\C-c\C-n" 'wl-summary-next-buffer) (define-key wl-summary-mode-map "H" 'wl-summary-redisplay-all-header) (define-key wl-summary-mode-map "M" 'wl-summary-redisplay-no-mime) (define-key wl-summary-mode-map "B" 'wl-summary-burst) @@ -521,6 +525,7 @@ (define-key wl-summary-mode-map "\M-t" 'wl-toggle-plugged) (define-key wl-summary-mode-map "\C-t" 'wl-plugged-change) ;; + (define-key wl-summary-mode-map "\C-x\C-s" 'wl-summary-save-status) (wl-summary-setup-mouse) (easy-menu-define wl-summary-mode-menu @@ -562,7 +567,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. @@ -572,19 +600,13 @@ If ARG is non-nil, Supersedes message" (wl-summary-supersedes-message) (if (string= (wl-summary-buffer-folder-name) wl-draft-folder) (if (wl-summary-message-number) - (unwind-protect - (wl-draft-reedit (wl-summary-message-number)) + (progn + (wl-draft-reedit (wl-summary-message-number)) (if (wl-message-news-p) (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.") - (set-buffer (wl-summary-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. @@ -593,37 +615,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\\|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."))))))) + (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." @@ -757,7 +778,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (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)) + (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)) @@ -980,7 +1001,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." ;; a subroutine for wl-summary-exit/wl-save-status ;; Note that folder is not commited here. -(defun wl-summary-save-view (&optional sticky) +(defun wl-summary-save-view () ;; already in summary buffer. (when wl-summary-buffer-persistent ;; save the current summary buffer view. @@ -990,6 +1011,16 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (wl-summary-thread-modified-p))) (wl-summary-save-view-cache)))) +(defun wl-summary-save-status () + "Save summary view and msgdb." + (interactive) + (if (interactive-p) (message "Saving summary status...")) + (wl-summary-save-view) + (elmo-folder-commit wl-summary-buffer-elmo-folder) + (elmo-folder-check wl-summary-buffer-elmo-folder) + (if wl-use-scoring (wl-score-save)) + (if (interactive-p) (message "Saving summary status...done."))) + (defun wl-summary-force-exit () "Exit current summary. Buffer is deleted even the buffer is sticky." (interactive) @@ -1006,16 +1037,16 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (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) + (if (or force-exit (not sticky)) + (wl-summary-cleanup-temp-marks sticky)) (unwind-protect ;; save summary status (progn - (if (or force-exit - (not sticky)) + (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)) - (wl-summary-save-view sticky) (if wl-use-scoring (wl-score-save))) ;; for sticky summary (wl-delete-all-overlays) @@ -1101,12 +1132,15 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." 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-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 - (wl-folder-get-elmo-folder (concat "/" range "/" - (elmo-folder-name-internal - folder))) + (wl-summary-goto-folder-subr (concat "/" range "/" + (elmo-folder-name-internal + folder)) 'force-update nil nil t)) (t (wl-summary-sync-update unset-cursor @@ -1146,8 +1180,8 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." ;; 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 ? ) @@ -1253,68 +1287,69 @@ If ARG is non-nil, checking is omitted." (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-file-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 - ;; online + (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)))))))) + 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 @@ -1660,7 +1695,7 @@ 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-file-cache-delete + (elmo-file-cache-delete (elmo-file-cache-get-path (elmo-message-field wl-summary-buffer-elmo-folder number @@ -1697,7 +1732,7 @@ If ARG is non-nil, checking is omitted." (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 -> ' ' @@ -1764,7 +1799,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 @@ -1951,7 +1986,7 @@ If ARG is non-nil, checking is omitted." 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) + num-ma (length mark-alist) importants (elmo-folder-list-importants wl-summary-buffer-elmo-folder wl-summary-important-mark) @@ -2001,26 +2036,6 @@ If ARG is non-nil, checking is omitted." (setq diffs (cdr diffs))) (if (interactive-p) (message mes))))) -(defun wl-summary-confirm-appends (appends) - (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))) - (defun wl-summary-sync-update (&optional unset-cursor sync-all no-check) "Update the summary view to the newest folder status." (interactive) @@ -2029,9 +2044,8 @@ If ARG is non-nil, checking is omitted." (elmo-mime-charset wl-summary-buffer-mime-charset) (inhibit-read-only t) (buffer-read-only nil) - (elmo-folder-update-threshold wl-summary-update-confirm-threshold) gc-message - overview number-alist mark-alist + overview number-alist mark-alist curp num i new-msgdb append-list delete-list crossed update-thread update-top-list @@ -2140,7 +2154,7 @@ If ARG is non-nil, checking is omitted." (if elmo-use-database (elmo-database-close)) (run-hooks 'wl-summary-sync-updated-hook) - (setq mes + (setq mes (if (and (eq (length delete-list) 0) (eq num 0)) (format @@ -2175,9 +2189,10 @@ If ARG is non-nil, checking is omitted." (wl-folder-set-folder-updated (elmo-folder-name-internal folder) (list 0 - (wl-summary-count-unread - (elmo-msgdb-get-mark-alist - (elmo-folder-msgdb folder))) + (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) @@ -2200,7 +2215,7 @@ If ARG is non-nil, checking is omitted." (wl-delete-all-overlays) (set-buffer-modified-p nil) (if mes (message "%s" mes))))) - + (defun wl-summary-set-score-mark (mark) (save-excursion (beginning-of-line) @@ -2354,7 +2369,11 @@ If ARG, without confirm." (defun wl-summary-goto-folder (&optional arg) (interactive "P") - (wl-summary-goto-folder-subr nil nil nil arg t)) + (wl-summary-goto-folder-subr nil nil nil nil t nil arg)) + +(defun wl-summary-goto-folder-sticky () + (interactive) + (wl-summary-goto-folder-subr nil nil nil t t)) (defun wl-summary-goto-last-visited-folder () (interactive) @@ -2479,14 +2498,17 @@ If ARG, without confirm." (defsubst wl-summary-open-folder (folder) ;; Select folder - (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)))) + (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) + sticky interactive scoring + force-exit) "Display target folder on summary." (interactive) (let* ((keep-cursor (memq this-command @@ -2499,15 +2521,17 @@ If ARG, without confirm." (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)) + (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)) (run-hooks 'wl-summary-exit-pre-hook) - (wl-summary-cleanup-temp-marks (wl-summary-sticky-p)) - (wl-summary-save-view 'keep) ; keep current buffer, anyway. - (elmo-folder-commit wl-summary-buffer-elmo-folder)) + (if (or force-exit (not (wl-summary-sticky-p))) + (wl-summary-cleanup-temp-marks (wl-summary-sticky-p))) + (wl-summary-save-view) + (elmo-folder-commit wl-summary-buffer-elmo-folder) + (if (and (wl-summary-sticky-p) force-exit) + (kill-buffer (current-buffer)))) (setq buf (wl-summary-get-buffer-create (elmo-folder-name-internal folder) sticky)) (setq reuse-buf @@ -2593,7 +2617,7 @@ If ARG, without confirm." (set-buffer-modified-p nil) (goto-char (point-min)) (if (wl-summary-cursor-down t) - (let ((unreadp (wl-summary-next-message + (let ((unreadp (wl-summary-next-message (wl-summary-message-number) 'down t))) (cond ((and wl-auto-select-first @@ -2601,6 +2625,11 @@ If ARG, without confirm." ;; wl-auto-select-first is non-nil and ;; unreadp is non-nil but not important (setq retval 'disp-msg)) + ((and wl-auto-prefetch-first + (wl-summary-auto-select-msg-p unreadp)) + ;; wl-auto-select-first is non-nil and + ;; unreadp is non-nil but not important + (setq retval 'prefetch-msg)) ((not (wl-summary-auto-select-msg-p unreadp)) ;; unreadp is nil or important (setq retval 'more-next)))) @@ -2626,6 +2655,13 @@ If ARG, without confirm." (wl-highlight-summary (point-min) (point-max)))) (if (eq retval 'disp-msg) (wl-summary-redisplay)) + (if (eq retval 'prefetch-msg) + (wl-message-buffer-prefetch + folder + (wl-summary-message-number) + wl-message-buffer-prefetch-depth + (current-buffer) + wl-summary-buffer-mime-charset)) (if mes (message "%s" mes)) (if (and interactive wl-summary-recenter) (recenter (/ (- (window-height) 2) 2)))))) @@ -2794,7 +2830,7 @@ If ARG, without confirm." ;; Is founded entity myself or children? (not (string= (elmo-msgdb-overview-entity-get-id entity) - (elmo-msgdb-overview-entity-get-id + (elmo-msgdb-overview-entity-get-id (car found-entity)))) (with-current-buffer summary-buf (not (wl-thread-descendant-p @@ -3003,8 +3039,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) @@ -3215,7 +3251,7 @@ 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 (condition-case nil @@ -3289,7 +3325,6 @@ 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 @@ -3667,32 +3702,44 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (wl-summary-target-mark-region beg end))) (defun wl-summary-target-mark-msgs (msgs) - (while msgs - (if (eq wl-summary-buffer-view 'thread) - (wl-thread-jump-to-msg (car msgs)) - (wl-summary-jump-to-msg (car msgs))) - (wl-summary-target-mark (wl-summary-message-number)) - (setq msgs (cdr msgs)))) + "Return the number of marked messages." + (let ((i 0) num) + (while msgs + (if (eq wl-summary-buffer-view 'thread) + (wl-thread-jump-to-msg (car msgs)) + (wl-summary-jump-to-msg (car msgs))) + (setq num (wl-summary-message-number)) + (when (eq num (car msgs)) + (wl-summary-target-mark num) + (setq i (1+ i))) + (setq msgs (cdr msgs))) + i)) (defun wl-summary-pick (&optional from-list delete-marks) (interactive) - (let ((result (elmo-msgdb-search - wl-summary-buffer-elmo-folder - (elmo-read-search-condition wl-summary-pick-field-default) - (wl-summary-buffer-msgdb)))) - (if delete-marks - (let ((mlist wl-summary-buffer-target-mark-list)) - (while mlist - (when (wl-summary-jump-to-msg (car mlist)) - (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)))) + (save-excursion + (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)) + num) + (if delete-marks + (let ((mlist wl-summary-buffer-target-mark-list)) + (while mlist + (when (wl-summary-jump-to-msg (car mlist)) + (wl-summary-unmark)) + (setq mlist (cdr mlist))) + (setq wl-summary-buffer-target-mark-list nil))) + (if (and result + (setq num (wl-summary-target-mark-msgs result)) + (> num 0)) + (if (= num (length result)) + (message "%d message(s) are picked." num) + (message "%d(%d) message(s) are picked." num + (- (length result) num))) + (message "No message was picked."))))) (defun wl-summary-unvirtual () "Exit from current virtual folder." @@ -3719,19 +3766,26 @@ If ARG, exit virtual folder." (wl-summary-buffer-folder-name)) 'update nil nil t))) -(defun wl-summary-delete-all-temp-marks () +(defun wl-summary-delete-all-temp-marks (&optional no-msg) + "Erase all temp marks from buffer." (interactive) - (save-excursion - (goto-char (point-min)) - (message "Unmarking...") - (while (not (eobp)) - (wl-summary-unmark) - (forward-line)) - (message "Unmarking...done") - (setq wl-summary-buffer-target-mark-list nil) - (setq wl-summary-buffer-delete-list nil) - (setq wl-summary-buffer-refile-list nil) - (setq wl-summary-buffer-copy-list nil))) + (when (or wl-summary-buffer-target-mark-list + wl-summary-buffer-delete-list + wl-summary-buffer-refile-list + wl-summary-buffer-copy-list) + (save-excursion + (goto-char (point-min)) + (unless no-msg + (message "Unmarking...")) + (while (not (eobp)) + (wl-summary-unmark) + (forward-line)) + (unless no-msg + (message "Unmarking...done")) + (setq wl-summary-buffer-target-mark-list nil) + (setq wl-summary-buffer-delete-list nil) + (setq wl-summary-buffer-refile-list nil) + (setq wl-summary-buffer-copy-list nil)))) (defun wl-summary-delete-mark (number) "Delete temporary mark of the message specified by NUMBER." @@ -3791,8 +3845,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) @@ -3803,7 +3857,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)" @@ -3869,6 +3923,28 @@ If ARG, exit virtual folder." (delq (car mlist) wl-summary-buffer-target-mark-list)) (setq mlist (cdr mlist))))))) +(defun wl-summary-next-buffer () + "Switch to next summary buffer." + (interactive) + (let ((buffers (sort (wl-collect-summary) + (lambda (buffer1 buffer2) + (string-lessp (buffer-name buffer1) + (buffer-name buffer2)))))) + (switch-to-buffer + (or (cadr (memq (current-buffer) buffers)) + (car buffers))))) + +(defun wl-summary-previous-buffer () + "Switch to previous summary buffer." + (interactive) + (let ((buffers (sort (wl-collect-summary) + (lambda (buffer1 buffer2) + (not (string-lessp (buffer-name buffer1) + (buffer-name buffer2))))))) + (switch-to-buffer + (or (cadr (memq (current-buffer) buffers)) + (car buffers))))) + (defun wl-summary-target-mark-copy () (interactive) (wl-summary-target-mark-refile-subr "copy")) @@ -3971,7 +4047,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)) @@ -4150,7 +4227,7 @@ If ARG, exit virtual folder." (elmo-msgdb-mark-set mark-alist number wl-summary-important-mark)) - (if (elmo-file-cache-exists-p message-id) + (if (eq (elmo-file-cache-exists-p message-id) 'entire) (elmo-folder-mark-as-read folder (list number)) ;; Force cache message. (elmo-message-encache folder number 'read)) @@ -4201,8 +4278,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 @@ -4211,8 +4287,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))))) @@ -4254,8 +4330,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 @@ -4315,7 +4391,7 @@ If ARG, exit virtual folder." (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 + (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 @@ -4348,7 +4424,7 @@ If ARG, exit virtual folder." (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)) @@ -4377,6 +4453,10 @@ If ARG, exit virtual folder." (cache (expand-file-name wl-summary-cache-file dir)) (view (expand-file-name wl-summary-view-file dir)) (save-view wl-summary-buffer-view) + (mark-list (copy-sequence wl-summary-buffer-target-mark-list)) + (refile-list (copy-sequence wl-summary-buffer-refile-list)) + (copy-list (copy-sequence wl-summary-buffer-copy-list)) + (delete-list (copy-sequence wl-summary-buffer-delete-list)) (tmp-buffer (get-buffer-create " *wl-summary-save-view-cache*")) (charset wl-summary-buffer-mime-charset)) (if (file-directory-p dir) @@ -4392,6 +4472,11 @@ If ARG, exit virtual folder." (copy-to-buffer tmp-buffer (point-min) (point-max)) (with-current-buffer tmp-buffer (widen) + (setq wl-summary-buffer-target-mark-list mark-list + wl-summary-buffer-refile-list refile-list + wl-summary-buffer-copy-list copy-list + wl-summary-buffer-delete-list delete-list) + (wl-summary-delete-all-temp-marks 'no-msg) (encode-mime-charset-region (point-min) (point-max) charset) (write-region-as-binary (point-min)(point-max) @@ -4419,6 +4504,7 @@ 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:" + "cache-status" "no-sync" "rescan-noscore" "all-visible")) (default (or (wl-get-assoc-list-value wl-folder-sync-range-alist @@ -4491,8 +4577,7 @@ If ARG, exit virtual folder." (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))) - ) + (select-window (get-buffer-window cur-buf)))) ;; hide message window (let ((wl-stay-folder-window t) (mes-win (and wl-message-buffer @@ -4516,8 +4601,7 @@ If ARG, exit virtual folder." (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)))) - )))) + (select-window (get-buffer-window cur-buf)))))))) (run-hooks 'wl-summary-toggle-disp-folder-hook)) (defun wl-summary-toggle-disp-msg (&optional arg) @@ -4544,7 +4628,7 @@ If ARG, exit virtual folder." (delete-window) (and (get-buffer-window cur-buf) (select-window (get-buffer-window cur-buf)))) - (run-hooks 'wl-summary-toggle-disp-off-hook))) + (run-hooks 'wl-summary-toggle-disp-off-hook))) (t (if (and wl-message-buffer (get-buffer-window wl-message-buffer)) ; already displayed @@ -4586,11 +4670,19 @@ If ARG, exit virtual folder." (defun wl-summary-next-page () (interactive) - (wl-message-next-page)) + (let ((cur-buf (current-buffer))) + (wl-summary-toggle-disp-msg 'on) + (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original) + (set-buffer cur-buf) + (wl-message-next-page)))) (defun wl-summary-prev-page () (interactive) - (wl-message-prev-page)) + (let ((cur-buf (current-buffer))) + (wl-summary-toggle-disp-msg 'on) + (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original) + (set-buffer cur-buf) + (wl-message-prev-page)))) (defsubst wl-summary-no-mime-p (folder) (wl-string-match-member (elmo-folder-name-internal folder) @@ -4614,7 +4706,7 @@ Return t if message exists." (set-buffer wl-message-buffer) t) (if (wl-summary-no-mime-p folder) - (wl-summary-redisplay-no-mime folder number) + (wl-summary-redisplay-no-mime-internal folder number) (wl-summary-redisplay-internal folder number)) (when (buffer-live-p wl-message-buffer) (set-buffer wl-message-buffer)) @@ -4896,7 +4988,7 @@ Reply to author if invoked with ARG." "Write a new draft from Summary." (interactive) (wl-draft nil nil nil nil nil - nil nil nil nil nil nil (current-buffer)) + (wl-summary-buffer-folder-name)) (run-hooks 'wl-mail-setup-hook) (mail-position-on-field "To")) @@ -4905,29 +4997,34 @@ Reply to author if invoked with ARG." 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)))) - (when (null guess-list) - (error "Can't guess by folder %s" folder)) - (wl-draft (nth 0 guess-list) nil nil ; To: - (nth 1 guess-list) nil ; Cc: - (nth 2 guess-list)) ; Newsgroups: + ;; 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))) + (if (null guess-func) + (wl-draft) + (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 (list (cons 'To (nth 0 guess-list)) + (cons 'Cc (nth 1 guess-list)) + (cons 'Newsgroups (nth 2 guess-list))) + nil nil nil nil folder) (run-hooks 'wl-mail-setup-hook) (mail-position-on-field "Subject")))) @@ -4959,7 +5056,7 @@ Use function list is `wl-summary-write-current-folder-functions'." (if summary-buf (save-excursion (set-buffer summary-buf) - (setq subject + (setq subject (or (elmo-message-field folder number 'subject) "")))) (set-buffer mes-buf) (wl-draft-forward subject summary-buf) @@ -5187,7 +5284,7 @@ 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)) + (setq wl-current-summary-buffer (current-buffer)) (wl-summary-mark-as-read nil ;; not fetched, then change server-mark. @@ -5212,16 +5309,28 @@ Use function list is `wl-summary-write-current-folder-functions'." (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-message-buffer-prefetch-next folder num (current-buffer) + (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) +(defun wl-summary-redisplay-no-mime (&optional ask-coding) + "Display message without MIME decoding. +If ASK-CODING is non-nil, coding-system for the message is asked." + (interactive "P") + (let ((elmo-mime-display-as-is-coding-system + (if ask-coding + (or (read-coding-system "Coding system: ") + elmo-mime-display-as-is-coding-system) + elmo-mime-display-as-is-coding-system))) + (wl-summary-redisplay-no-mime-internal))) + +(defun wl-summary-redisplay-no-mime-internal (&optional folder number) (let* ((fld (or folder wl-summary-buffer-elmo-folder)) (num (or number (wl-summary-message-number))) wl-break-pages) @@ -5238,7 +5347,7 @@ Use function list is `wl-summary-write-current-folder-functions'." (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)) @@ -5265,7 +5374,7 @@ Use function list is `wl-summary-write-current-folder-functions'." (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)) @@ -5335,7 +5444,6 @@ 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)) @@ -5363,16 +5471,15 @@ Use function list is `wl-summary-write-current-folder-functions'." "Supersedes: " message-id "\n" (and followup-to (concat "Followup-To: " followup-to "\n"))))) - (if message-buf (set-buffer message-buf)) + (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 @@ -5399,7 +5506,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) @@ -5556,15 +5664,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? "