-;;; wl-summary.el -- Summary mode for Wanderlust.
+;;; wl-summary.el --- Summary mode for Wanderlust.
;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
;; Copyright (C) 1998,1999,2000 Masahiro MURATA <muse@ba2.so-net.ne.jp>
(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.
(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.
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."
(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))
;; 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.
(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)
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
;; 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 ? )
(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
(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
(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 -> ' '
(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
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)
(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)
(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
expunged mes sync-result)
- (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
+ (unwind-protect
(progn
- ;; Setup sync-all
- (if sync-all (wl-summary-sync-all-init))
+ (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.
; (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
- (wl-summary-count-unread
- (elmo-msgdb-get-mark-alist
- (elmo-folder-msgdb folder)))
- (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))))
-
+ (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
(beginning-of-line)
(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
(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)
(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.
+ (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))
(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
;; 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))))
(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))))))
(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))
;; 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
(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)
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
(wl-folder-get-elmo-folder
(car (car dst-msgs))))
(wl-summary-buffer-msgdb)
- refile-len
- refile-executed
(not (null (cdr dst-msgs)))
nil ; no-delete
nil ; same-number
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
(wl-folder-get-elmo-folder
(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
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)
(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
(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
(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))))
+ (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
(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."
(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)
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)"
(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))
(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
(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)))))
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
(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
(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))
"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
(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
(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)
(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
"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"))
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:
- (run-hooks 'wl-mail-setup-hook)
- (mail-position-on-field "Subject"))))
+ ;; 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)
""
(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)
(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.
(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-summary-buffer-mime-charset)
+ (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."))))
(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))
(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))
"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))
(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
(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)
(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? "