(` (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)
-(defvar wl-summary-buffer-refile-list nil)
-(defvar wl-summary-buffer-delete-list nil)
+(defvar wl-summary-buffer-temp-mark-list nil)
(defvar wl-summary-buffer-last-displayed-msg nil)
(defvar wl-summary-buffer-current-msg nil)
-(defvar wl-summary-buffer-unread-status " (0 new/0 unread)")
(defvar wl-summary-buffer-unread-count 0)
(defvar wl-summary-buffer-new-count 0)
+(defvar wl-summary-buffer-answered-count 0)
(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-view 'thread)
+(defvar wl-summary-buffer-view nil)
(defvar wl-summary-buffer-message-modified nil)
-(defvar wl-summary-buffer-mark-modified nil)
(defvar wl-summary-buffer-thread-modified nil)
+
(defvar wl-summary-buffer-number-column nil)
-(defvar wl-summary-buffer-number-regexp nil)
+(defvar wl-summary-buffer-temp-mark-column nil)
+(defvar wl-summary-buffer-persistent-mark-column nil)
+
(defvar wl-summary-buffer-persistent nil)
(defvar wl-summary-buffer-thread-nodes nil)
(defvar wl-summary-buffer-target-mark-list nil)
-(defvar wl-summary-buffer-copy-list nil)
(defvar wl-summary-buffer-prev-refile-destination nil)
(defvar wl-summary-buffer-prev-copy-destination nil)
(defvar wl-summary-buffer-saved-message nil)
(defvar wl-summary-buffer-number-list nil)
(defvar wl-summary-buffer-msgdb nil)
(defvar wl-summary-buffer-folder-name nil)
+(defvar wl-summary-buffer-line-formatter nil)
+(defvar wl-summary-buffer-line-format nil)
+(defvar wl-summary-buffer-mode-line-formatter nil)
+(defvar wl-summary-buffer-mode-line nil)
(defvar wl-thread-indent-level-internal nil)
(defvar wl-thread-have-younger-brother-str-internal nil)
(defvar wl-summary-get-petname-function 'wl-address-get-petname-1)
-(defvar wl-summary-message-regexp "^ *\\(-?[0-9]+\\)")
-
(defvar wl-summary-shell-command-last "")
(defvar wl-ps-preprint-hook nil)
(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-indicator)
+(make-variable-buffer-local 'wl-summary-buffer-temp-mark-list)
(make-variable-buffer-local 'wl-summary-buffer-last-displayed-msg)
-(make-variable-buffer-local 'wl-summary-buffer-unread-status)
(make-variable-buffer-local 'wl-summary-buffer-unread-count)
(make-variable-buffer-local 'wl-summary-buffer-new-count)
+(make-variable-buffer-local 'wl-summary-buffer-answered-count)
(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-view)
(make-variable-buffer-local 'wl-summary-buffer-message-modified)
-(make-variable-buffer-local 'wl-summary-buffer-mark-modified)
(make-variable-buffer-local 'wl-summary-buffer-thread-modified)
(make-variable-buffer-local 'wl-summary-buffer-number-column)
-(make-variable-buffer-local 'wl-summary-buffer-number-regexp)
+(make-variable-buffer-local 'wl-summary-buffer-temp-mark-column)
+(make-variable-buffer-local 'wl-summary-buffer-persistent-mark-column)
(make-variable-buffer-local 'wl-summary-buffer-persistent)
(make-variable-buffer-local 'wl-summary-buffer-thread-nodes)
(make-variable-buffer-local 'wl-summary-buffer-prev-refile-destination)
(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)
- (defun wl-summary-append-message-func-internal (entity msgdb update
- &optional force-insert)))
-(unless (fboundp 'wl-summary-from-func-internal)
- (defun wl-summary-from-func-internal (from)
- from))
-(unless (fboundp 'wl-summary-subject-func-internal)
- (defun wl-summary-subject-func-internal (subject)
- subject))
-(unless (fboundp 'wl-summary-subject-filter-func-internal)
- (defun wl-summary-subject-filter-func-internal (subject)
- subject))
+(make-variable-buffer-local 'wl-summary-buffer-line-formatter)
+(make-variable-buffer-local 'wl-summary-buffer-line-format)
+(make-variable-buffer-local 'wl-summary-buffer-mode-line-formatter)
+(make-variable-buffer-local 'wl-summary-buffer-mode-line)
+
+(defvar wl-datevec)
+(defvar wl-thr-indent-string)
+(defvar wl-thr-children-number)
+(defvar wl-thr-linked)
+(defvar wl-message-entity)
+(defvar wl-parent-message-entity)
+(defvar wl-temp-mark)
+(defvar wl-persistent-mark)
(defmacro wl-summary-sticky-buffer-name (name)
(` (concat wl-summary-buffer-name ":" (, name))))
(substring subject-string (match-end 0))
subject-string))
-(eval-when-compile (defvar-maybe entity nil)) ; silence byte compiler.
(defun wl-summary-default-from (from)
+ "Instance of `wl-summary-from-function'.
+Ordinarily returns the sender name. Returns recipient names if (1)
+summary's folder name matches with `wl-summary-showto-folder-regexp'
+and (2) sender address is yours.
+
+See also variable `wl-use-petname'."
(let (retval tos ng)
(unless
(and (eq major-mode 'wl-summary-mode)
(wl-summary-buffer-folder-name))
(wl-address-user-mail-address-p from)
(cond
- ((and (setq tos (elmo-msgdb-overview-entity-get-to entity))
+ ((and (setq tos (elmo-message-entity-field
+ wl-message-entity 'to t))
(not (string= "" tos)))
(setq retval
(concat "To:"
(eword-decode-string
(if wl-use-petname
(or
- (funcall wl-summary-get-petname-function to)
+ (funcall
+ wl-summary-get-petname-function to)
(car
(std11-extract-address-components to))
to)
to))))
(wl-parse-addresses tos)
","))))
- ((setq ng (elmo-msgdb-overview-entity-get-extra-field
- entity "newsgroups"))
+ ((setq ng (elmo-message-entity-field
+ wl-message-entity 'newsgroups))
(setq retval (concat "Ng:" ng)))))
(if wl-use-petname
(setq retval (or (funcall wl-summary-get-petname-function from)
string)
string))
+(defvar wl-summary-sort-specs '(number date subject from list-info))
+(defvar wl-summary-default-sort-spec 'date)
+
(defvar wl-summary-mode-menu-spec
'("Summary"
["Read" wl-summary-read t]
["By Number" wl-summary-sort-by-number t]
["By Date" wl-summary-sort-by-date t]
["By From" wl-summary-sort-by-from t]
- ["By Subject" wl-summary-sort-by-subject t])
+ ["By Subject" wl-summary-sort-by-subject t]
+ ["By List Info" wl-summary-sort-by-list-info t])
"----"
("Message Operation"
["Mark as read" wl-summary-mark-as-read t]
["Mark as important" wl-summary-mark-as-important t]
["Mark as unread" wl-summary-mark-as-unread t]
- ["Set delete mark" wl-summary-delete t]
+ ["Set dispose mark" wl-summary-dispose t]
["Set refile mark" wl-summary-refile t]
["Set copy mark" wl-summary-copy t]
+ ["Set resend mark" wl-summary-resend t]
["Prefetch" wl-summary-prefetch t]
["Set target mark" wl-summary-target-mark t]
["Unmark" wl-summary-unmark t]
["Cancel posted news" wl-summary-cancel-message t]
["Supersedes message" wl-summary-supersedes-message t]
["Resend bounced mail" wl-summary-resend-bounced-mail t]
- ["Resend message" wl-summary-resend-message t]
["Enter the message" wl-summary-jump-to-current-message t]
["Pipe message" wl-summary-pipe-message t]
["Print message" wl-summary-print-message t])
["Mark as read" wl-summary-mark-as-read-region t]
["Mark as important" wl-summary-mark-as-important-region t]
["Mark as unread" wl-summary-mark-as-unread-region t]
- ["Set delete mark" wl-summary-delete-region t]
+ ["Set dispose mark" wl-summary-dispose-region t]
["Set refile mark" wl-summary-refile-region t]
["Set copy mark" wl-summary-copy-region t]
["Prefetch" wl-summary-prefetch-region t]
(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)
(define-key wl-summary-mode-map "a" 'wl-summary-reply)
(define-key wl-summary-mode-map "A" 'wl-summary-reply-with-citation)
(define-key wl-summary-mode-map "\eE" 'wl-summary-resend-bounced-mail)
(define-key wl-summary-mode-map "f" 'wl-summary-forward)
(define-key wl-summary-mode-map "$" 'wl-summary-mark-as-important)
+ (define-key wl-summary-mode-map "&" 'wl-summary-mark-as-answered)
(define-key wl-summary-mode-map "@" 'wl-summary-edit-addresses)
(define-key wl-summary-mode-map "y" 'wl-summary-save)
(define-key wl-summary-mode-map "p" 'wl-summary-prev)
(define-key wl-summary-mode-map "N" 'wl-summary-down)
(define-key wl-summary-mode-map "P" 'wl-summary-up)
-;;;(define-key wl-summary-mode-map "w" 'wl-draft)
(define-key wl-summary-mode-map "w" 'wl-summary-write)
(define-key wl-summary-mode-map "W" 'wl-summary-write-current-folder)
-;;;(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 "o" 'wl-summary-refile)
(define-key wl-summary-mode-map "O" 'wl-summary-copy)
(define-key wl-summary-mode-map "\M-o" 'wl-summary-refile-prev-destination)
-; (define-key wl-summary-mode-map "\M-O" 'wl-summary-copy-prev-destination)
(define-key wl-summary-mode-map "\C-o" 'wl-summary-auto-refile)
- (define-key wl-summary-mode-map "d" 'wl-summary-delete)
+ (define-key wl-summary-mode-map "d" 'wl-summary-dispose)
(define-key wl-summary-mode-map "u" 'wl-summary-unmark)
(define-key wl-summary-mode-map "U" 'wl-summary-unmark-all)
+ (define-key wl-summary-mode-map "D" 'wl-summary-delete)
+ (define-key wl-summary-mode-map "~" 'wl-summary-resend)
;; thread commands
(define-key wl-summary-mode-map "t" (make-sparse-keymap))
(define-key wl-summary-mode-map "t*" 'wl-thread-target-mark)
(define-key wl-summary-mode-map "to" 'wl-thread-refile)
(define-key wl-summary-mode-map "tO" 'wl-thread-copy)
- (define-key wl-summary-mode-map "td" 'wl-thread-delete)
+ (define-key wl-summary-mode-map "td" 'wl-thread-dispose)
+ (define-key wl-summary-mode-map "tD" 'wl-thread-delete)
+ (define-key wl-summary-mode-map "t~" 'wl-thread-resend)
(define-key wl-summary-mode-map "tu" 'wl-thread-unmark)
(define-key wl-summary-mode-map "t!" 'wl-thread-mark-as-unread)
(define-key wl-summary-mode-map "t$" 'wl-thread-mark-as-important)
;; target-mark commands
(define-key wl-summary-mode-map "m" (make-sparse-keymap))
(define-key wl-summary-mode-map "mi" 'wl-summary-target-mark-prefetch)
- (define-key wl-summary-mode-map "mR" 'wl-summary-target-mark-mark-as-read)
(define-key wl-summary-mode-map "mo" 'wl-summary-target-mark-refile)
(define-key wl-summary-mode-map "mO" 'wl-summary-target-mark-copy)
- (define-key wl-summary-mode-map "md" 'wl-summary-target-mark-delete)
+ (define-key wl-summary-mode-map "md" 'wl-summary-target-mark-dispose)
+ (define-key wl-summary-mode-map "mD" 'wl-summary-target-mark-delete)
+ (define-key wl-summary-mode-map "m~" 'wl-summary-target-mark-resend)
+
+ (define-key wl-summary-mode-map "mu" 'wl-summary-delete-all-temp-marks)
+
(define-key wl-summary-mode-map "my" 'wl-summary-target-mark-save)
+ (define-key wl-summary-mode-map "mR" 'wl-summary-target-mark-mark-as-read)
(define-key wl-summary-mode-map "m!" 'wl-summary-target-mark-mark-as-unread)
(define-key wl-summary-mode-map "m$" 'wl-summary-target-mark-mark-as-important)
- (define-key wl-summary-mode-map "mu" 'wl-summary-delete-all-temp-marks)
(define-key wl-summary-mode-map "mU" 'wl-summary-target-mark-uudecode)
(define-key wl-summary-mode-map "ma" 'wl-summary-target-mark-all)
(define-key wl-summary-mode-map "mt" 'wl-summary-target-mark-thread)
(define-key wl-summary-mode-map "r*" 'wl-summary-target-mark-region)
(define-key wl-summary-mode-map "ro" 'wl-summary-refile-region)
(define-key wl-summary-mode-map "rO" 'wl-summary-copy-region)
- (define-key wl-summary-mode-map "rd" 'wl-summary-delete-region)
+ (define-key wl-summary-mode-map "rd" 'wl-summary-dispose-region)
+ (define-key wl-summary-mode-map "rD" 'wl-summary-delete-region)
+ (define-key wl-summary-mode-map "r~" 'wl-summary-resend-region)
(define-key wl-summary-mode-map "ru" 'wl-summary-unmark-region)
(define-key wl-summary-mode-map "r!" 'wl-summary-mark-as-unread-region)
(define-key wl-summary-mode-map "r$" 'wl-summary-mark-as-important-region)
(defun wl-summary-display-top ()
(interactive)
(goto-char (point-min))
+ (when wl-summary-lazy-highlight
+ (wl-highlight-summary-window))
(if wl-summary-buffer-disp-msg
(wl-summary-redisplay)))
(interactive)
(goto-char (point-max))
(forward-line -1)
+ (when wl-summary-lazy-highlight
+ (wl-highlight-summary-window))
(if wl-summary-buffer-disp-msg
(wl-summary-redisplay)))
-(defun wl-summary-count-unread (mark-alist)
- (let ((new 0)
- (unread 0)
- mark)
- (while mark-alist
- (setq mark (cadr (car mark-alist)))
- (and mark
- (cond
- ((string= mark wl-summary-new-mark)
- (setq new (+ 1 new)))
- ((or (string= mark wl-summary-unread-uncached-mark)
- (string= mark wl-summary-unread-cached-mark))
- (setq unread (+ 1 unread)))))
- (setq mark-alist (cdr mark-alist)))
+(defun wl-summary-count-unread ()
+ (let ((lst (elmo-folder-count-flags wl-summary-buffer-elmo-folder)))
(if (eq major-mode 'wl-summary-mode)
- (setq wl-summary-buffer-new-count new
- wl-summary-buffer-unread-count unread))
- (cons new unread)))
+ (setq wl-summary-buffer-new-count (car lst)
+ wl-summary-buffer-unread-count (nth 1 lst)
+ wl-summary-buffer-answered-count (nth 2 lst)))
+ lst))
(defun wl-summary-message-string (&optional use-cache)
"Return full body string of current message.
"Re-edit current message.
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 (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)))
- (wl-draft-edit-string (wl-summary-message-string)))))
+ (wl-summary-toggle-disp-msg 'off)
+ (cond
+ ((not (wl-summary-message-number))
+ (message "No message."))
+ (arg
+ (wl-summary-supersedes-message))
+ ((string= (wl-summary-buffer-folder-name) wl-draft-folder)
+ (wl-draft-reedit (wl-summary-message-number))
+ (if (wl-message-news-p)
+ (mail-position-on-field "Newsgroups")
+ (mail-position-on-field "To")))
+ (t
+ (wl-draft-edit-string (wl-summary-message-string)))))
(defun wl-summary-resend-bounced-mail ()
"Re-mail the current message.
contains some mail you have written but has been bounced back to
you."
(interactive)
+ (wl-summary-toggle-disp-msg 'off)
(save-excursion
(wl-summary-set-message-buffer-or-redisplay)
(set-buffer (wl-message-get-original-buffer))
(concat "^--" boundary "\n"
"\\([Cc]ontent-[Dd]escription:.*\n\\)?"
"[Cc]ontent-[Tt]ype:[ \t]+"
- "\\(message/rfc822\\|text/rfc822-headers\\)\n"
+ "\\(message/rfc822\\|text/rfc822-headers\\).*\n"
"\\(.+\n\\)*\n") nil t))
(re-search-forward
(concat "\n\\(--" boundary "\\)--\n") nil t))
(t
(message "Does not appear to be a rejected letter."))))))
-(defun wl-summary-resend-message (address)
- "Resend the current message to ADDRESS."
- (interactive "sResend message to: ")
- (if (or (null address) (string-match "^[ \t]*$" address))
- (message "No address specified.")
- (message "Resending message to %s..." address)
- (save-excursion
- (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))
- (erase-buffer)
- (setq wl-sent-message-via nil)
- ;; Insert our usual headers.
- (wl-draft-insert-from-field)
- (wl-draft-insert-date-field)
- (insert "to: " address "\n")
- (goto-char (point-min))
- ;; Rename them all to "Resent-*".
- (while (re-search-forward "^[A-Za-z]" nil t)
- (forward-char -1)
- (insert "Resent-"))
- (widen)
- (forward-line)
- (delete-region (point) (point-max))
- (let ((beg (point)))
- ;; Insert the message to be resent.
- (insert-buffer-substring original)
- (goto-char (point-min))
- (search-forward "\n\n")
- (forward-char -1)
- (save-restriction
- (narrow-to-region beg (point))
- (wl-draft-delete-fields wl-ignored-resent-headers)
- (goto-char (point-max)))
- (insert mail-header-separator)
- ;; Rename all old ("Previous-")Resent headers.
- (while (re-search-backward "^\\(Previous-\\)*Resent-" beg t)
- (beginning-of-line)
- (insert "Previous-"))
- ;; Quote any "From " lines at the beginning.
- (goto-char beg)
- (when (looking-at "From ")
- (replace-match "X-From-Line: ")))
- ;; Send it.
- (wl-draft-dispatch-message)
- (kill-buffer (current-buffer)))
- (message "Resending message to %s...done" address))))
+(defun wl-summary-detect-mark-position ()
+ (let ((column wl-summary-buffer-number-column)
+ (formatter wl-summary-buffer-line-formatter)
+ (dummy-temp (char-to-string 200))
+ (dummy-persistent (char-to-string 201))
+ temp persistent)
+ (with-temp-buffer
+ (setq wl-summary-buffer-number-column column
+ wl-summary-buffer-line-formatter formatter)
+ (insert
+ (wl-summary-create-line
+ (elmo-msgdb-make-message-entity
+ :number 10000
+ :from "foo"
+ :subject "bar"
+ :size 100)
+ nil
+ dummy-temp
+ dummy-persistent))
+ (goto-char (point-min))
+ (setq temp (save-excursion
+ (search-forward dummy-temp nil t)
+ (current-column))
+ persistent (save-excursion
+ (search-forward dummy-persistent nil t)
+ (current-column))))
+ (setq wl-summary-buffer-temp-mark-column temp
+ wl-summary-buffer-persistent-mark-column persistent)))
(defun wl-summary-buffer-set-folder (folder)
(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 (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
(wl-get-assoc-list-value
wl-folder-thread-indent-set-alist
(elmo-folder-name-internal folder)))
+ (setq wl-summary-buffer-number-column
+ (or (wl-get-assoc-list-value wl-summary-number-column-alist
+ (wl-summary-buffer-folder-name))
+ wl-summary-default-number-column))
+ (wl-line-formatter-setup
+ wl-summary-buffer-line-formatter
+ (setq wl-summary-buffer-line-format
+ (or (wl-get-assoc-list-value
+ wl-folder-summary-line-format-alist
+ (elmo-folder-name-internal folder))
+ wl-summary-line-format))
+ wl-summary-line-format-spec-alist)
+ (wl-line-formatter-setup
+ wl-summary-buffer-mode-line-formatter
+ wl-summary-mode-line-format
+ wl-summary-mode-line-format-spec-alist)
+ (wl-summary-detect-mark-position)
(setq wl-summary-buffer-persistent
(wl-folder-persistent-p (elmo-folder-name-internal folder)))
(elmo-folder-set-persistent-internal folder wl-summary-buffer-persistent)
wl-thread-space-str-internal
(or (nth 5 wl-summary-buffer-thread-indent-set)
wl-thread-space-str))
- (setq wl-thread-indent-regexp
- (concat
- (regexp-quote wl-thread-have-younger-brother-str-internal) "\\|"
- (regexp-quote wl-thread-youngest-child-str-internal) "\\|"
- (regexp-quote wl-thread-vertical-str-internal) "\\|"
- (regexp-quote wl-thread-horizontal-str-internal) "\\|"
- (regexp-quote wl-thread-space-str-internal)))
(run-hooks 'wl-summary-buffer-set-folder-hook))
(defun wl-summary-mode ()
;;;(make-local-variable 'tab-width)
;;;(setq tab-width 1)
(buffer-disable-undo (current-buffer))
- (wl-mode-line-buffer-identification '("Wanderlust: "
- wl-summary-buffer-folder-indicator
- wl-summary-buffer-unread-status))
+ (setq selective-display t
+ selective-display-ellipses nil)
+ (wl-mode-line-buffer-identification '(wl-summary-buffer-mode-line))
(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))
+ (if wl-on-xemacs
+ (progn
+ (make-local-variable 'pre-idle-hook)
+ (add-hook 'pre-idle-hook 'wl-highlight-summary-window))
+ (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))
+;;;
(defun wl-summary-overview-entity-compare-by-date (x y)
"Compare entity X and Y by date."
(condition-case nil
(string<
(timezone-make-date-sortable
- (elmo-msgdb-overview-entity-get-date x))
+ (elmo-message-entity-field x 'date))
(timezone-make-date-sortable
- (elmo-msgdb-overview-entity-get-date y)))
+ (elmo-message-entity-field y 'date)))
(error))) ;; ignore error.
(defun wl-summary-overview-entity-compare-by-number (x y)
"Compare entity X and Y by number."
(<
- (elmo-msgdb-overview-entity-get-number x)
- (elmo-msgdb-overview-entity-get-number y)))
+ (elmo-message-entity-number x)
+ (elmo-message-entity-number y)))
(defun wl-summary-overview-entity-compare-by-from (x y)
"Compare entity X and Y by from."
(string<
(wl-address-header-extract-address
- (or (elmo-msgdb-overview-entity-get-from-no-decode x)
+ (or (elmo-message-entity-field x 'from)
wl-summary-no-from-message))
(wl-address-header-extract-address
- (or (elmo-msgdb-overview-entity-get-from-no-decode y)
+ (or (elmo-message-entity-field y 'from)
wl-summary-no-from-message))))
(defun wl-summary-overview-entity-compare-by-subject (x y)
"Compare entity X and Y by subject."
- (string< (elmo-msgdb-overview-entity-get-subject-no-decode x)
- (elmo-msgdb-overview-entity-get-subject-no-decode y)))
+ (string< (elmo-message-entity-field x 'subject)
+ (elmo-message-entity-field y 'subject)))
+
+(defun wl-summary-get-list-info (entity)
+ "Returns (\"ML-name\" . ML-count) of ENTITY."
+ (let (sequence ml-name ml-count subject return-path delivered-to mailing-list)
+ (setq sequence (elmo-message-entity-field entity 'x-sequence)
+ ml-name (or (elmo-message-entity-field entity 'x-ml-name)
+ (and sequence
+ (car (split-string sequence " "))))
+ ml-count (or (elmo-message-entity-field entity 'x-mail-count)
+ (elmo-message-entity-field entity 'x-ml-count)
+ (and sequence
+ (cadr (split-string sequence " ")))))
+ (and (setq subject (elmo-message-entity-field entity 'subject t))
+ (setq subject (elmo-delete-char ?\n subject))
+ (string-match "^\\s(\\(\\S)+\\)[ :]\\([0-9]+\\)\\s)[ \t]*" subject)
+ (progn
+ (or ml-name (setq ml-name (match-string 1 subject)))
+ (or ml-count (setq ml-count (match-string 2 subject)))))
+ (and (setq return-path
+ (elmo-message-entity-field entity 'return-path))
+ (string-match "^<\\([^@>]+\\)-return-\\([0-9]+\\)-" return-path)
+ (progn
+ (or ml-name (setq ml-name (match-string 1 return-path)))
+ (or ml-count (setq ml-count (match-string 2 return-path)))))
+ (and (setq delivered-to
+ (elmo-message-entity-field entity 'delivered-to))
+ (string-match "^mailing list \\([^@]+\\)@" delivered-to)
+ (or ml-name (setq ml-name (match-string 1 delivered-to))))
+ (and (setq mailing-list
+ (elmo-message-entity-field entity 'mailing-list))
+ (string-match "\\(^\\|; \\)contact \\([^@]+\\)-[^-@]+@" mailing-list) ; *-help@, *-owner@, etc.
+ (or ml-name (setq ml-name (match-string 2 mailing-list))))
+ (cons (and ml-name (car (split-string ml-name " ")))
+ (and ml-count (string-to-int ml-count)))))
+
+(defun wl-summary-overview-entity-compare-by-list-info (x y)
+ "Compare entity X and Y by mailing-list info."
+ (let* ((list-info-x (wl-summary-get-list-info x))
+ (list-info-y (wl-summary-get-list-info y)))
+ (if (equal (car list-info-x) (car list-info-y))
+ (if (equal (cdr list-info-x) (cdr list-info-y))
+ (wl-summary-overview-entity-compare-by-date x y)
+ (< (or (cdr list-info-x) 0)
+ (or (cdr list-info-y) 0)))
+ (string< (or (car list-info-x) "")
+ (or (car list-info-y) "")))))
(defun wl-summary-sort-by-date ()
(interactive)
(defun wl-summary-sort-by-from ()
(interactive)
(wl-summary-rescan "from"))
+(defun wl-summary-sort-by-list-info ()
+ (interactive)
+ (wl-summary-rescan "list-info"))
(defun wl-summary-rescan (&optional sort-by)
"Rescan current folder without updating."
(interactive)
- (let* ((cur-buf (current-buffer))
- (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))
- (elmo-mime-charset wl-summary-buffer-mime-charset)
- i percent num
- gc-message entity
- curp
- (inhibit-read-only t)
- (buffer-read-only nil)
- expunged)
- (fset 'wl-summary-append-message-func-internal
- (wl-summary-get-append-message-func))
- (wl-summary-buffer-number-column-detect nil)
+ (let ((elmo-mime-charset wl-summary-buffer-mime-charset)
+ i percent num
+ gc-message entity
+ curp
+ (inhibit-read-only t)
+ (buffer-read-only nil)
+ (numbers (elmo-folder-list-messages wl-summary-buffer-elmo-folder
+ nil t)) ; in-msgdb
+ expunged)
(erase-buffer)
(message "Re-scanning...")
(setq i 0)
- (setq num (length overview))
(when sort-by
(message "Sorting by %s..." sort-by)
- (setq overview
- (sort overview
- (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)
- 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)
- (setq wl-summary-delayed-update nil)
+ (setq numbers
+ (sort numbers
+ (lambda (x y)
+ (funcall
+ (intern (format "wl-summary-overview-entity-compare-by-%s"
+ sort-by))
+ (elmo-message-entity wl-summary-buffer-elmo-folder x)
+ (elmo-message-entity wl-summary-buffer-elmo-folder y)))))
+ (message "Sorting by %s...done" sort-by))
+ (setq num (length numbers))
+ (setq wl-thread-entity-hashtb (elmo-make-hash (* num 2))
+ wl-thread-entity-list nil
+ wl-thread-entities nil
+ wl-summary-buffer-number-list nil
+ wl-summary-buffer-target-mark-list nil
+ wl-summary-buffer-temp-mark-list nil
+ wl-summary-delayed-update nil)
(elmo-kill-buffer wl-summary-search-buf-name)
- (message "Constructing summary structure...")
- (while curp
- (setq entity (car curp))
- (wl-summary-append-message-func-internal entity msgdb nil)
- (setq curp (cdr curp))
+ (while numbers
+ (setq entity (elmo-message-entity wl-summary-buffer-elmo-folder
+ (car numbers)))
+ (wl-summary-insert-message entity
+ wl-summary-buffer-elmo-folder
+ nil)
+ (setq numbers (cdr numbers))
(when (> num elmo-display-progress-threshold)
(setq i (+ i 1))
(if (or (zerop (% i 5)) (= i num))
(caar wl-summary-delayed-update)
(elmo-msgdb-overview-entity-get-number
(cdar wl-summary-delayed-update)))
- (wl-summary-append-message-func-internal
- (cdar wl-summary-delayed-update) msgdb nil t)
+ (wl-summary-insert-message
+ (cdar wl-summary-delayed-update)
+ wl-summary-buffer-elmo-folder nil t)
(setq wl-summary-delayed-update (cdr wl-summary-delayed-update))))
(message "Constructing summary structure...done")
- (set-buffer cur-buf)
(if (eq wl-summary-buffer-view 'thread)
(progn
(message "Inserting thread...")
(wl-thread-insert-top)
- (message "Inserting thread...done"))
- (wl-summary-make-number-list))
+ (message "Inserting thread...done")))
(when wl-use-scoring
(setq wl-summary-scored nil)
- (wl-summary-score-headers nil msgdb
- (wl-summary-rescore-msgs number-alist)
+ (wl-summary-score-headers (wl-summary-rescore-msgs
+ wl-summary-buffer-number-list)
t)
(when (and wl-summary-scored
(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
- (elmo-msgdb-get-mark-alist
- (elmo-folder-msgdb wl-summary-buffer-elmo-folder)))
+ (wl-summary-count-unread)
(wl-summary-update-modeline)
(goto-char (point-max))
(forward-line -1)
(defun wl-summary-entity-info-msg (entity finfo)
(or (and entity
(concat
- (elmo-replace-in-string
- (if (memq 'ask-folder wl-use-folder-petname)
- (wl-folder-get-petname entity)
- entity)
- "%" "%%")
+ (if (memq 'ask-folder wl-use-folder-petname)
+ (wl-folder-get-petname entity)
+ entity)
(if (null (car finfo))
" (? new/? unread)"
(format
(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))
+ (setq wl-summary-buffer-message-modified t)
+ (wl-summary-set-mark-modified))
(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))
+ wl-summary-buffer-elmo-folder t))
(defun wl-summary-mark-modified-p ()
- wl-summary-buffer-mark-modified)
+ (elmo-folder-mark-modified-internal
+ wl-summary-buffer-elmo-folder))
(defun wl-summary-set-thread-modified ()
(setq wl-summary-buffer-thread-modified t))
(defun wl-summary-thread-modified-p ()
wl-summary-buffer-thread-modified)
(defsubst wl-summary-cleanup-temp-marks (&optional sticky)
- (if (or wl-summary-buffer-refile-list
- wl-summary-buffer-copy-list
- wl-summary-buffer-delete-list)
- (if (y-or-n-p "Marks remain to be executed. Execute them? ")
- (progn
- (wl-summary-exec)
- (if (or wl-summary-buffer-refile-list
- wl-summary-buffer-copy-list
- wl-summary-buffer-delete-list)
- (error "Some execution was failed")))
- ;; delete temp-marks
- (message "")
- (wl-summary-delete-all-refile-marks)
- (wl-summary-delete-all-copy-marks)
- (wl-summary-delete-all-delete-marks)))
- (if wl-summary-buffer-target-mark-list
- (progn
- (wl-summary-delete-all-target-marks)
- (setq wl-summary-buffer-target-mark-list nil)))
- (wl-summary-delete-all-temp-marks-on-buffer sticky)
+ (when wl-summary-buffer-temp-mark-list
+ (if (y-or-n-p (format "Execute remaining marks in %s? "
+ (wl-summary-buffer-folder-name)))
+ (progn
+ (wl-summary-exec)
+ (if wl-summary-buffer-temp-mark-list
+ (error "Some execution was failed")))
+ ;; temp-mark-list is remained.
+ (message "")))
+ (wl-summary-delete-all-temp-marks 'no-msg)
(setq wl-summary-scored nil))
;; a subroutine for wl-summary-exit/wl-save-status
(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.")))
+ (if (interactive-p) (message "Saving summary status...done")))
(defun wl-summary-force-exit ()
"Exit current summary. Buffer is deleted even the buffer is sticky."
(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)))
+ (* (elmo-folder-length
+ wl-summary-buffer-elmo-folder)
+ 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))
+ (setq wl-summary-buffer-temp-mark-list nil))
(defun wl-summary-sync (&optional unset-cursor force-range)
(interactive)
(unless arg
(save-excursion
(wl-summary-sync-force-update)))
- (wl-summary-prefetch-region (point-min) (point-max)
- wl-summary-incorporate-marks))
+ (wl-summary-prefetch-region-no-mark (point-min) (point-max)
+ wl-summary-incorporate-marks))
(defun wl-summary-prefetch-msg (number &optional arg)
"Returns status-mark. if skipped, returns nil."
;; prefetching procedure.
(save-excursion
- (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 (elmo-msgdb-overview-get-entity message-id msgdb))
- (entity ov)
- (size (elmo-msgdb-overview-entity-get-size ov))
+ (let* ((size (elmo-message-field wl-summary-buffer-elmo-folder
+ number 'size))
(inhibit-read-only t)
(buffer-read-only nil)
- (file-cached (elmo-file-cache-exists-p message-id))
+ (file-cached (elmo-file-cache-exists-p
+ (elmo-message-field wl-summary-buffer-elmo-folder
+ number 'message-id)))
(force-read (and size
- (or (null wl-prefetch-threshold)
+ (or file-cached
+ (and (null wl-prefetch-confirm) arg)
+ (null wl-prefetch-threshold)
(< size wl-prefetch-threshold))))
mark new-mark)
(unwind-protect
"[ "
(save-match-data
(wl-set-string-width
- wl-summary-from-width
- (wl-summary-from-func-internal
+ 17
+ (funcall wl-summary-from-function
(eword-decode-string
(elmo-delete-char
?\"
(or
- (elmo-msgdb-overview-entity-get-from ov)
+ (elmo-message-field
+ wl-summary-buffer-elmo-folder
+ number 'from)
"??")))))) " ]")
size))))
(message "")) ; flush.
- (setq mark (cadr (assq number mark-alist)))
+ (setq mark (or (elmo-message-mark wl-summary-buffer-elmo-folder
+ number) " "))
(if force-read
(save-excursion
(save-match-data
(elmo-message-encache
wl-summary-buffer-elmo-folder
number))
+ (elmo-message-set-cached wl-summary-buffer-elmo-folder
+ number t)
(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)))
+ (or (elmo-message-mark wl-summary-buffer-elmo-folder
+ number)
+ " "))
+ (unless (string= new-mark mark)
+ (wl-summary-count-unread)
+ (wl-summary-update-modeline)
+ (wl-folder-update-unread
+ (wl-summary-buffer-folder-name)
+ (+ wl-summary-buffer-unread-count
+ wl-summary-buffer-new-count))))
new-mark)))))))
-;;(defvar wl-summary-message-uncached-marks
-;; (list wl-summary-new-mark
-;; wl-summary-unread-uncached-mark
-;; wl-summary-read-uncached-mark))
-
-(defun wl-summary-prefetch-region (beg end &optional prefetch-marks)
+(defun wl-summary-prefetch-region-no-mark (beg end &optional prefetch-marks)
(interactive "r")
(let ((count 0)
targets
(message "Collecting marks...")
(goto-char (point-min))
(while (not (eobp))
- (beginning-of-line)
- (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-file-cache-exists-p
- (cdr (assq msg
- (elmo-msgdb-get-number-alist
- (wl-summary-buffer-msgdb)))))))
- (member mark prefetch-marks))
- (setq targets (nconc targets (list msg))))
- (setq entity (wl-thread-get-entity msg))
- (if (or (not (eq wl-summary-buffer-view 'thread))
- (wl-thread-entity-get-opened entity))
- (); opened. no hidden children.
- ;; hidden children!!
- (setq targets (nconc
- targets
- (wl-thread-get-children-msgs-uncached
- msg prefetch-marks)))))
+ (setq mark (wl-summary-persistent-mark)
+ msg (wl-summary-message-number))
+ (if (or (and (null prefetch-marks)
+ msg
+ (null (elmo-file-cache-exists-p
+ (elmo-message-field
+ wl-summary-buffer-elmo-folder
+ msg
+ 'message-id))))
+ (member mark prefetch-marks))
+ (setq targets (nconc targets (list msg))))
+ (setq entity (wl-thread-get-entity msg))
+ (if (or (not (eq wl-summary-buffer-view 'thread))
+ (wl-thread-entity-get-opened entity))
+ (); opened. no hidden children.
+ (setq targets (nconc
+ targets
+ (wl-thread-get-children-msgs-uncached
+ msg prefetch-marks))))
(forward-line 1))
(setq length (length targets))
(message "Prefetching...")
(wl-thread-get-entity (car targets))))
(progn
(wl-summary-jump-to-msg (car targets))
- (wl-summary-prefetch))
+ (wl-summary-prefetch-msg
+ (wl-summary-message-number)))
(wl-summary-prefetch-msg (car targets))))
(if (if prefetch-marks
- (string= mark wl-summary-unread-cached-mark)
- (or (string= mark wl-summary-unread-cached-mark)
+ (string= mark elmo-msgdb-unread-cached-mark)
+ (or (string= mark elmo-msgdb-unread-cached-mark)
(string= mark " ")))
(message "Prefetching... %d/%d message(s)"
(setq count (+ 1 count)) length))
;; redisplay!
- (save-excursion
- (setq pos (point))
- (goto-char start-pos)
- (if (pos-visible-in-window-p pos)
- (save-restriction
- (widen)
- (sit-for 0))))
+ (when mark
+ (save-excursion
+ (setq pos (point))
+ (when (wl-summary-jump-to-msg (car targets))
+ (wl-summary-update-mark (car targets)))
+ (goto-char start-pos)
+ (if (pos-visible-in-window-p pos)
+ (save-restriction
+ (widen)
+ (sit-for 0)))))
(setq targets (cdr targets)))
(message "Prefetched %d/%d message(s)" count length)
(cons count length)))))
-(defun wl-summary-prefetch (&optional arg)
- "Prefetch current message."
- (interactive "P")
- (save-excursion
- (save-match-data
- (beginning-of-line)
- (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 beg end)
- (insert mark)
- (if wl-summary-highlight
- (wl-highlight-summary-current-line)))
- (set-buffer-modified-p nil)
- mark)))))
-
-(defun wl-summary-delete-all-status-marks-on-buffer ()
- (interactive)
- (save-excursion
- (goto-char (point-min))
- (let ((inhibit-read-only t)
- (buffer-read-only nil)
- (case-fold-search nil))
- (while (re-search-forward
- (concat "^" wl-summary-buffer-number-regexp ".\\(.\\)") nil t)
- (delete-region (match-beginning 1) (match-end 1))
- (insert " ")))))
-
(defun wl-summary-delete-marks-on-buffer (marks)
(while marks
(wl-summary-unmark (pop marks))))
(defun wl-summary-delete-copy-marks-on-buffer (copies)
(wl-summary-delete-marks-on-buffer copies))
-(defun wl-summary-delete-all-refile-marks ()
- (let ((marks wl-summary-buffer-refile-list))
- (while marks
- (wl-summary-unmark (car (pop marks))))))
-
-(defun wl-summary-delete-all-copy-marks ()
- (let ((marks wl-summary-buffer-copy-list))
- (while marks
- (wl-summary-unmark (car (pop marks))))))
-
-(defun wl-summary-delete-all-delete-marks ()
- (wl-summary-delete-marks-on-buffer wl-summary-buffer-delete-list))
-
+;;;
(defun wl-summary-delete-all-target-marks ()
(wl-summary-delete-marks-on-buffer wl-summary-buffer-target-mark-list))
-(defun wl-summary-delete-all-temp-marks-on-buffer (&optional sticky)
- ;; for summary view cache saving.
- (interactive)
- (save-excursion
- (goto-char (point-min))
- (let ((inhibit-read-only t)
- (buffer-read-only nil)
- (case-fold-search nil)
- (regexp (concat "^" wl-summary-buffer-number-regexp "\\([^ ]\\)" )))
- (while (re-search-forward regexp nil t)
- (delete-region (match-beginning 1) (match-end 1))
- (insert " ")
- (if (and sticky wl-summary-highlight)
- (wl-highlight-summary-current-line))))))
-
-(defun wl-summary-delete-all-marks (mark-alist mark)
- "Delete all MARKs in MARK-ALIST."
- (let ((malist mark-alist)
- (ret-val mark-alist)
- entity)
- (while malist
- (setq entity (car malist))
- (if (string= (cadr entity) mark)
- ;; delete this entity
- (setq ret-val (delete entity ret-val)))
- (setq malist (cdr malist)))
- ret-val))
-
-;; Does not work correctly...
(defun wl-summary-mark-as-read-region (beg end)
(interactive "r")
(save-excursion
(save-restriction
(narrow-to-region beg end)
-;;; use narrowing.
-;;; (save-excursion (goto-char end)
-;;; (end-of-line) (point)))
(goto-char (point-min))
(if (eq wl-summary-buffer-view 'thread)
- (progn
+ (let (number-list)
(while (not (eobp))
(let* ((number (wl-summary-message-number))
- (entity (wl-thread-get-entity number))
- children)
+ (entity (wl-thread-get-entity number)))
(if (wl-thread-entity-get-opened entity)
- ;; opened...mark line.
- ;; Crossposts are not processed
- (wl-summary-mark-as-read t)
- ;; closed
- (wl-summary-mark-as-read t) ; mark itself.
- (setq children (wl-thread-get-children-msgs number))
- (while children
- (wl-summary-mark-as-read t nil nil (car children))
- (setq children (cdr children))))
- (forward-line 1))))
- (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-update-modeline))
+ (setq number-list (append number-list (list number)))
+ (setq number-list
+ (append number-list
+ (wl-thread-get-children-msgs number))))
+ (forward-line 1)))
+ (wl-summary-mark-as-read number-list))
+ (let (number-list)
+ (while (not (eobp))
+ (setq number-list
+ (append number-list (list (wl-summary-message-number))))
+ (forward-line 1))
+ (wl-summary-mark-as-read number-list))))))
(defun wl-summary-mark-as-unread-region (beg end)
(interactive "r")
(save-excursion
(save-restriction
(narrow-to-region beg end)
-;;; use narrowing.
-;;; (save-excursion (goto-char end)
-;;; (end-of-line) (point)))
(goto-char (point-min))
(if (eq wl-summary-buffer-view 'thread)
- (progn
+ (let (number-list)
(while (not (eobp))
(let* ((number (wl-summary-message-number))
- (entity (wl-thread-get-entity number))
- children)
+ (entity (wl-thread-get-entity number)))
(if (wl-thread-entity-get-opened entity)
- ;; opened...mark line.
- ;; Crossposts are not processed
- (wl-summary-mark-as-unread)
- ;; closed
- (wl-summary-mark-as-unread) ; mark itself.
- (setq children
- (delq number (wl-thread-get-children-msgs number)))
- (while children
- (wl-summary-mark-as-unread (car children))
- (setq children (cdr children))))
- (forward-line 1))))
- (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-update-modeline))
+ (setq number-list (append number-list (list number)))
+ (setq number-list
+ (append number-list
+ (wl-thread-get-children-msgs number))))
+ (forward-line 1)))
+ (wl-summary-mark-as-unread number-list))
+ (let (number-list)
+ (while (not (eobp))
+ (setq number-list
+ (append number-list (list (wl-summary-message-number))))
+ (forward-line 1))
+ (wl-summary-mark-as-unread number-list))))))
(defun wl-summary-mark-as-important-region (beg end)
(interactive "r")
(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)
(wl-summary-update-modeline))
(defun wl-summary-mark-as-read-all ()
(y-or-n-p "Mark all messages as read? "))
(let* ((folder wl-summary-buffer-elmo-folder)
(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))
- (malist mark-alist)
(inhibit-read-only t)
(buffer-read-only nil)
(case-fold-search nil)
- msg mark)
+ msg mark new-mark)
(message "Setting all msgs as read...")
(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)))
+ folder))
(save-excursion
(goto-char (point-min))
- (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-message-use-cache-p folder msg))
- (string= mark wl-summary-unread-cached-mark))
- (progn
- (insert " ")
- (setq mark-alist
- (elmo-msgdb-mark-set
- mark-alist
- msg
-;;; Use msg instead of (cdr (assq msg number-alist)).
-;;; (cdr (assq msg number-alist))
- nil)))
- ;; New mark and unread-uncached mark
- (insert wl-summary-read-uncached-mark)
- (setq mark-alist
- (elmo-msgdb-mark-set mark-alist
- msg
-;;; (cdr (assq msg number-alist))
- wl-summary-read-uncached-mark)))
+ (while (not (eobp))
+ (setq msg (wl-summary-message-number)
+ mark (wl-summary-persistent-mark)
+ new-mark (or (elmo-message-mark folder msg) " "))
+ (unless (string= mark new-mark)
+ (delete-backward-char 1)
+ ;; New mark and unread-uncached mark
+ (insert new-mark)
(if wl-summary-highlight
- (wl-highlight-summary-current-line nil nil t)))))
- (setq mark-alist (wl-summary-set-as-read-mark-alist mark-alist))
- (wl-summary-set-mark-modified)
- (set-buffer cur-buf); why is this needed???
- (elmo-msgdb-set-mark-alist msgdb mark-alist)
+ (wl-highlight-summary-current-line)))
+ (forward-line 1)))
(wl-folder-update-unread (wl-summary-buffer-folder-name) 0)
(setq wl-summary-buffer-unread-count 0)
(setq wl-summary-buffer-new-count 0)
(let* ((inhibit-read-only t)
(buffer-read-only nil)
(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]\\)")
- (progn
- (setq mark (wl-match-buffer 2))
- (cond
- ((or (string= mark wl-summary-new-mark)
- (string= mark wl-summary-unread-uncached-mark)
- (string= mark wl-summary-important-mark))
- ;; noop
- )
- ((string= mark wl-summary-unread-cached-mark)
- (setq new-mark wl-summary-unread-uncached-mark))
- (t
- (setq new-mark wl-summary-read-uncached-mark)))
- (when new-mark
- (setq number (string-to-int (wl-match-buffer 1)))
- (delete-region (match-beginning 2) (match-end 2))
- (goto-char (match-beginning 2))
- (insert new-mark)
- (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)
- (wl-summary-set-mark-modified)
- (if wl-summary-highlight
- (wl-highlight-summary-current-line nil nil t))
- (set-buffer-modified-p nil)))))))
+ new-mark mark number unread)
+ (setq number (wl-summary-message-number))
+ (elmo-message-set-cached folder number nil)
+ (setq new-mark (elmo-message-mark folder number)
+ mark (wl-summary-persistent-mark))
+ (unless (string= new-mark mark)
+ (delete-backward-char 1)
+ (insert new-mark)
+ (elmo-file-cache-delete
+ (elmo-file-cache-get-path
+ (elmo-message-field wl-summary-buffer-elmo-folder
+ number
+ 'message-id)))
+ (if wl-summary-highlight
+ (wl-highlight-summary-current-line))
+ (set-buffer-modified-p nil)))))
(defun wl-summary-resume-cache-status ()
"Resume the cache status of all messages in the current folder."
(interactive)
- (let* ((folder wl-summary-buffer-elmo-folder)
- (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))
- (inhibit-read-only t)
- (buffer-read-only nil)
- (case-fold-search nil)
- msg mark msgid set-mark)
+ (let ((folder wl-summary-buffer-elmo-folder)
+ (buffer-read-only nil)
+ (case-fold-search nil)
+ number msgid set-mark mark)
(message "Resuming cache status...")
(save-excursion
(goto-char (point-min))
- (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)))
+ (while (not (eobp))
+ (setq number (wl-summary-message-number))
+ (setq mark (wl-summary-persistent-mark))
+ (setq msgid (elmo-message-field folder number 'message-id))
(setq set-mark nil)
(if (elmo-file-cache-exists-p msgid)
- (if (or
- (string= mark wl-summary-unread-uncached-mark) ; U -> !
- (string= mark wl-summary-new-mark) ; N -> !
- )
- (setq set-mark wl-summary-unread-cached-mark)
- (if (string= mark wl-summary-read-uncached-mark) ; u -> ' '
- (setq set-mark " ")))
- (if (string= mark " ")
- (setq set-mark wl-summary-read-uncached-mark) ;' ' -> u
- (if (string= mark wl-summary-unread-cached-mark)
- (setq set-mark wl-summary-unread-uncached-mark) ; ! -> U
- )))
+ (when (member mark (elmo-msgdb-uncached-marks))
+ (elmo-message-set-cached folder number t)
+ (setq set-mark (elmo-message-mark folder number)))
+ (unless (member mark (elmo-msgdb-uncached-marks))
+ (elmo-message-set-cached folder number nil)
+ (setq set-mark (or (elmo-message-mark folder number) " "))))
(when set-mark
- (delete-region (match-beginning 2) (match-end 2))
+ (delete-backward-char 1)
(insert set-mark)
- (setq mark-alist
- (elmo-msgdb-mark-set
- mark-alist msg ; msgid
- (if (string= set-mark " ") nil set-mark)))
(if wl-summary-highlight
- (wl-highlight-summary-current-line))))
- (wl-summary-set-mark-modified)
- (set-buffer cur-buf); why is this needed???
- (elmo-msgdb-set-mark-alist msgdb mark-alist)
- (wl-summary-count-unread mark-alist)
+ (wl-highlight-summary-current-line)))
+ (forward-line 1))
+ (wl-summary-count-unread)
(wl-summary-update-modeline)
(message "Resuming cache status...done")
(set-buffer-modified-p nil))))
-(defun wl-summary-resume-marks-and-highlight ()
- (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)))
- (i 0)
- msg-num percent smark)
- (save-excursion
- (goto-char (point-min))
- (message "Resuming all marks...")
- (while (not (eobp))
- (setq msg-num (wl-summary-message-number))
- (setq smark (car (cdr (assq msg-num mark-alist))))
- (if (looking-at (format "^ *%s \\( \\)" msg-num))
- (progn
- (goto-char (match-end 1))
- (delete-region (match-beginning 1) (match-end 1))
- (insert (or smark " "))))
- (wl-highlight-summary-current-line smark)
- (when (> count elmo-display-progress-threshold)
- (setq i (+ i 1))
- (setq percent (/ (* i 100) count))
- (elmo-display-progress
- 'wl-summary-resume-marks-and-highlight "Resuming all marks..."
- percent))
- (forward-line 1)))
- (message "Resuming all marks...done")))
-
-(defun wl-summary-resume-marks ()
- (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))
- (i 0)
- entity msg-num percent)
- (save-excursion
- (message "Resuming all marks...")
- (while mark-alist
- (setq entity (car mark-alist))
- (if (setq msg-num (car (rassoc (car entity) number-alist)))
- (progn
-;;; (goto-char (point-min))
- (if (re-search-forward (format "^ *%s \\( \\)" msg-num) nil t)
- (progn
- (delete-region (match-beginning 1) (match-end 1))
- (insert (or (cadr entity)
- " ")))
- (if (re-search-backward (format "^ *%s \\( \\)" msg-num) nil t)
- (progn
- (goto-char (match-end 1))
- (delete-region (match-beginning 1) (match-end 1))
- (insert (or (cadr entity)
- " ")))))))
- (when (> count elmo-display-progress-threshold)
- (setq i (+ i 1))
- (setq percent (/ (* i 100) count))
- (elmo-display-progress
- 'wl-summary-resume-marks "Resuming all marks..."
- percent))
- (setq mark-alist (cdr mark-alist)))
- (message "Resuming all marks...done"))))
-
(defun wl-summary-delete-messages-on-buffer (msgs &optional deleting-info)
(interactive)
(save-excursion
(msgs2 msgs)
(len (length msgs))
(i 0)
+ ;(deleting-info (or deleting-info "Deleting..."))
update-list)
(elmo-kill-buffer wl-summary-search-buf-name)
(while msgs
(wl-thread-delete-message (car msgs))))
(setq update-list (delq (car msgs) update-list)))
(goto-char (point-min))
- (if (re-search-forward (format "^ *%d[^0-9]\\([^0-9]\\).*$"
- (car msgs)) nil t)
+ (if (wl-summary-jump-to-msg (car msgs))
(progn
- (delete-region (match-beginning 0) (match-end 0))
+ (delete-region (point-at-bol) (point-at-eol))
(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))
- (if (or (zerop (% i 5)) (= i len))
- (elmo-display-progress
- 'wl-summary-delete-messages-on-buffer deleting-info
- (/ (* i 100) len))))
+; (when (> len elmo-display-progress-threshold)
+; (setq i (1+ i))
+; (if (or (zerop (% i 5)) (= i len))
+; (elmo-display-progress
+; 'wl-summary-delete-messages-on-buffer deleting-info
+; (/ (* i 100) len))))
(setq msgs (cdr msgs)))
(when (eq wl-summary-buffer-view 'thread)
- (wl-thread-update-line-msgs (elmo-uniq-list update-list)
- (unless deleting-info 'no-msg))
+ (wl-thread-update-line-msgs (elmo-uniq-list update-list))
(wl-thread-cleanup-symbols msgs2))
- (wl-summary-count-unread
- (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb)))
+ ;;(message (concat deleting-info "done"))
+ (wl-summary-count-unread)
(wl-summary-update-modeline)
- (wl-folder-update-unread
- (wl-summary-buffer-folder-name)
- (+ wl-summary-buffer-unread-count wl-summary-buffer-new-count)))))
-
-(defun wl-summary-set-as-read-mark-alist (mark-alist)
- (let ((marks (list (cons wl-summary-unread-cached-mark
- nil)
- (cons wl-summary-unread-uncached-mark
- wl-summary-read-uncached-mark)
- (cons wl-summary-new-mark
- wl-summary-read-uncached-mark)))
- (ret-val mark-alist)
- entity pair)
- (while mark-alist
- (setq entity (car mark-alist))
- (when (setq pair (assoc (cadr entity) marks))
- (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 mark-alist (cdr mark-alist)))
- ret-val))
-
-(defun wl-summary-set-status-marks (mark-alist before after)
- "Set the BEFORE marks to AFTER."
- (let ((ret-val mark-alist)
- entity)
- (while mark-alist
- (setq entity (car mark-alist))
- (when (string= (cadr entity) before)
- (if after
- (setcar (cdr entity) after)
- (setq ret-val (delete entity ret-val))))
- (setq mark-alist (cdr mark-alist)))
- ret-val))
-
-(defun wl-summary-set-status-marks-on-buffer (before after)
- "Set the MARKS marks on buffer."
+ (wl-folder-set-folder-updated
+ (elmo-folder-name-internal wl-summary-buffer-elmo-folder)
+ (list 0
+ (+ wl-summary-buffer-unread-count wl-summary-buffer-new-count)
+ (elmo-folder-length wl-summary-buffer-elmo-folder))))))
+
+(defun wl-summary-replace-status-marks (before after)
+ "Replace the status marks on buffer."
+ (save-excursion
+ (goto-char (point-min))
+ (let ((inhibit-read-only t)
+ (buffer-read-only nil))
+ (while (not (eobp))
+ (when (string= (wl-summary-persistent-mark) before)
+ (delete-backward-char 1)
+ (insert after)
+ (if wl-summary-highlight
+ (wl-highlight-summary-current-line)))
+ (forward-line 1)))))
+
+(defun wl-summary-update-status-marks ()
+ "Synchronize status marks on current buffer to the msgdb."
(interactive)
(save-excursion
(goto-char (point-min))
(let ((inhibit-read-only t)
(buffer-read-only nil)
- (regexp (concat "^" wl-summary-buffer-number-regexp ".\\(\\%s\\)")))
- (while (re-search-forward
- (format regexp (regexp-quote before)) nil t)
- (delete-region (match-beginning 1) (match-end 1))
- (insert after)
- (if wl-summary-highlight
- (wl-highlight-summary-current-line))))))
-
-(defun wl-summary-get-delete-folder (folder)
- (if (string= folder wl-trash-folder)
- 'null
- (let* ((type (or (wl-get-assoc-list-value wl-delete-folder-alist folder)
- 'trash)))
- (cond ((stringp type)
- type)
- ((or (equal type 'remove) (equal type 'null))
- 'null)
- (t;; (equal type 'trash)
- (let ((trash-folder (wl-folder-get-elmo-folder wl-trash-folder)))
- (unless (elmo-folder-exists-p trash-folder)
- (if (y-or-n-p
- (format "Trash Folder %s does not exist, create it? "
- wl-trash-folder))
- (elmo-folder-create trash-folder)
- (error "Trash Folder is not created"))))
- wl-trash-folder)))))
-
-(defun wl-summary-delete-important-msgs-from-list (delete-list
- mark-alist)
- (let ((dlist delete-list))
- (while dlist
- (if (string= wl-summary-important-mark
- (car (cdr (assq (car dlist) mark-alist))))
- (setq delete-list (delete (car dlist) delete-list)))
- (setq dlist (cdr dlist)))
- delete-list))
-
-(defun wl-summary-delete-canceled-msgs-from-list (delete-list msgdb)
- (let ((dlist delete-list))
- (while dlist
- (if (null (cdr (assq (car dlist) (cadr msgdb))))
- (setq delete-list (delete (car dlist) delete-list)))
- (setq dlist (cdr dlist)))
- delete-list))
-
-(defun wl-summary-get-append-message-func ()
+ mark)
+ (while (not (eobp))
+ (unless (string= (wl-summary-persistent-mark)
+ (setq mark (or (elmo-message-mark
+ wl-summary-buffer-elmo-folder
+ (wl-summary-message-number))
+ " ")))
+ (delete-backward-char 1)
+ (insert mark)
+ (if wl-summary-highlight (wl-highlight-summary-current-line)))
+ (forward-line 1)))))
+
+(defun wl-summary-insert-message (&rest args)
(if (eq wl-summary-buffer-view 'thread)
- 'wl-summary-insert-thread-entity
- 'wl-summary-insert-sequential))
+ (apply 'wl-summary-insert-thread args)
+ (apply 'wl-summary-insert-sequential args)))
(defun wl-summary-sort ()
(interactive)
- (let ((sort-by (let ((input-range-list '("number" "date" "subject" "from"))
- (default "date")
- in)
- (setq in
- (completing-read
- (format "Sort by (%s): " default)
- (mapcar
- (function (lambda (x) (cons x x)))
- input-range-list)))
- (if (string= in "")
- default
- in))))
- (if (not (member sort-by '("number" "date" "subject" "from")))
- (error "Sort by %s is not implemented" sort-by))
- (wl-summary-rescan sort-by)))
+ (wl-summary-rescan
+ (completing-read
+ (format "Sort by (%s): " (symbol-name wl-summary-default-sort-spec))
+ (mapcar (lambda (spec)
+ (list (symbol-name spec)))
+ wl-summary-sort-specs)
+ nil t nil nil (symbol-name wl-summary-default-sort-spec))))
(defun wl-summary-sync-marks ()
- "Update marks in summary."
+ "Update persistent marks in summary."
(interactive)
(let ((last-progress 0)
+ (folder wl-summary-buffer-elmo-folder)
(i 0)
- mark-alist unread-marks importants unreads
- importants-in-db unreads-in-db diff diffs
- mes num-ma progress)
+ answereds importants unreads diff diffs
+ mes progress)
;; synchronize marks.
(when (not (eq (elmo-folder-type-internal
wl-summary-buffer-elmo-folder)
'internal))
(message "Updating marks...")
- (setq 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-folder-list-importants
- wl-summary-buffer-elmo-folder
- wl-summary-important-mark)
+ (setq importants (elmo-uniq-list
+ (nconc
+ (elmo-folder-list-importants
+ wl-summary-buffer-elmo-folder)
+ (elmo-folder-list-messages-with-global-mark
+ wl-summary-buffer-elmo-folder
+ elmo-msgdb-important-mark)))
unreads (elmo-folder-list-unreads
- wl-summary-buffer-elmo-folder
- unread-marks))
- (while mark-alist
- (if (string= (cadr (car mark-alist))
- wl-summary-important-mark)
- (setq importants-in-db (cons (car (car mark-alist))
- importants-in-db))
- (if (member (cadr (car mark-alist)) unread-marks)
- (setq unreads-in-db (cons (car (car mark-alist))
- unreads-in-db))))
- (setq mark-alist (cdr mark-alist))
- (when (> num-ma elmo-display-progress-threshold)
- (setq i (1+ i)
- progress (/ (* i 100) num-ma))
- (if (not (eq progress last-progress))
- (elmo-display-progress 'wl-summary-sync-marks
- "Updating marks..."
- progress))
- (setq last-progress progress)))
- (setq diff (elmo-list-diff importants importants-in-db))
+ wl-summary-buffer-elmo-folder)
+ answereds (elmo-folder-list-answereds
+ wl-summary-buffer-elmo-folder))
+ (setq diff (elmo-list-diff importants
+ (elmo-folder-list-flagged
+ wl-summary-buffer-elmo-folder
+ 'important 'in-msgdb)))
(setq diffs (cadr diff)) ; important-deletes
(setq mes (format "Updated (-%d" (length diffs)))
(while diffs
(wl-summary-mark-as-important (car diffs)
- wl-summary-important-mark
+ elmo-msgdb-important-mark
'no-server)
(setq diffs (cdr diffs)))
(setq diffs (car diff)) ; important-appends
(while diffs
(wl-summary-mark-as-important (car diffs) " " 'no-server)
(setq diffs (cdr diffs)))
- (setq diff (elmo-list-diff unreads unreads-in-db))
+
+ (setq diff (elmo-list-diff answereds
+ (elmo-folder-list-flagged
+ wl-summary-buffer-elmo-folder
+ 'answered 'in-msgdb)))
(setq diffs (cadr diff))
(setq mes (concat mes (format "(-%d" (length diffs))))
(while diffs
- (wl-summary-mark-as-read t 'no-server nil (car diffs))
+ (wl-summary-mark-as-unanswered (car diffs) 'no-modeline)
+ (setq diffs (cdr diffs)))
+ (setq diffs (car diff)) ; unread-appends
+ (setq mes (concat mes (format "/+%d) answered mark(s)." (length diffs))))
+ (while diffs
+ (wl-summary-mark-as-answered (car diffs) 'no-modeline)
+ (setq diffs (cdr diffs)))
+
+ (setq diff (elmo-list-diff unreads
+ (elmo-folder-list-flagged
+ wl-summary-buffer-elmo-folder
+ 'unread 'in-msgdb)))
+ (setq diffs (cadr diff))
+ (setq mes (concat mes (format "(-%d" (length diffs))))
+ (while diffs
+ (wl-summary-mark-as-read (car diffs) 'no-folder 'no-modeline)
(setq diffs (cdr diffs)))
(setq diffs (car diff)) ; unread-appends
(setq mes (concat mes (format "/+%d) unread mark(s)." (length diffs))))
(while diffs
- (wl-summary-mark-as-unread (car diffs) 'no-server 'no-modeline)
+ (wl-summary-mark-as-unread (car diffs) 'no-folder 'no-modeline)
(setq diffs (cdr diffs)))
- (if (interactive-p) (message mes)))))
+ (if (interactive-p) (message "%s" mes)))))
(defun wl-summary-sync-update (&optional unset-cursor sync-all no-check)
"Update the summary view to the newest folder status."
(inhibit-read-only t)
(buffer-read-only nil)
gc-message
- overview number-alist mark-alist
- curp num i new-msgdb
+ overview
+ curp num i diff
append-list delete-list crossed
update-thread update-top-list
- expunged mes sync-result)
+ expunged mes entity)
(unwind-protect
(progn
(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 (elmo-folder-plugged-p folder))
- (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
+ (setq crossed (elmo-folder-synchronize folder sync-all no-check))
+ (if crossed
(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))))
+ (setq diff (elmo-list-diff (elmo-folder-list-messages
+ folder
+ 'visible-only
+ 'in-msgdb)
+ wl-summary-buffer-number-list))
+ (setq append-list (car diff))
+ (setq delete-list (cadr diff))
+
(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))
+ (wl-summary-delete-messages-on-buffer delete-list))
+ (wl-summary-update-status-marks)
+ (setq num (length append-list))
+ (setq i 0)
+ (setq wl-summary-delayed-update nil)
+ (elmo-kill-buffer wl-summary-search-buf-name)
+ (dolist (number append-list)
+ (setq entity (elmo-message-entity folder number))
+ (when (setq update-thread
+ (wl-summary-insert-message
+ entity folder
+ (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)))
+ (when (> num elmo-display-progress-threshold)
+ (setq i (+ i 1))
+ (if (or (zerop (% i 5)) (= i num))
+ (elmo-display-progress
+ 'wl-summary-sync-update
+ (if (eq wl-summary-buffer-view 'thread)
+ "Making thread..."
+ "Inserting message...")
+ (/ (* 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
- entity (elmo-folder-msgdb folder)
- (not sync-all)))
+ (wl-summary-insert-message
+ (cdar wl-summary-delayed-update)
+ wl-summary-buffer-elmo-folder
+ (not sync-all) t))
(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)
- (elmo-folder-msgdb folder)
- (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)
+ (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 (if (eq wl-summary-buffer-view 'thread)
+ "Making thread...done"
+ "Inserting message...done"))
+ (when (or delete-list append-list)
+ (wl-summary-set-message-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)
+ (message "Inserting message...")
(wl-thread-insert-top)
- (message "Inserting thread...done"))
+ (message "Inserting message...done"))
(if elmo-use-database
(elmo-database-close))
(run-hooks 'wl-summary-sync-updated-hook)
(length delete-list) num))))
(setq mes "Quit updating.")))
;; synchronize marks.
- (if (and wl-summary-auto-sync-marks sync-result)
+ (if (and crossed wl-summary-auto-sync-marks)
(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))
+ (wl-summary-score-headers (and sync-all
+ (wl-summary-rescore-msgs
+ wl-summary-buffer-number-list))
sync-all)
(when (and wl-summary-scored
(setq expunged (wl-summary-score-update-all-lines)))
(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)))
+ (let ((lst (wl-summary-count-unread)))
+ (+ (car lst) (nth 1 lst)))
+ (elmo-folder-length folder)))
(wl-summary-update-modeline)
- (wl-summary-buffer-number-column-detect t)
;;
(unless unset-cursor
(goto-char (point-min))
(goto-char (point-max))
(forward-line -1))
(if (and wl-summary-highlight
+ (not wl-summary-lazy-highlight)
(not (get-text-property (point) 'face)))
(save-excursion
(forward-line (- 0
(buffer-read-only nil)
msg-num
cur-mark)
- (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 " "
- wl-summary-score-below-mark
- wl-summary-score-over-mark))
- (goto-char (match-end 1))
- (delete-region (match-beginning 2) (match-end 2))
- (insert mark)
- (if wl-summary-highlight
- (wl-highlight-summary-current-line nil nil t))
- (set-buffer-modified-p nil))))))
+ (setq msg-num (wl-summary-message-number))
+ (setq cur-mark (wl-summary-temp-mark))
+ (when (member cur-mark (list " "
+ wl-summary-score-below-mark
+ wl-summary-score-over-mark))
+ (delete-backward-char 1)
+ (insert mark)
+ (if wl-summary-highlight
+ (wl-highlight-summary-current-line))
+ (set-buffer-modified-p nil)))))
(defun wl-summary-get-score-mark (msg-num)
(let ((score (cdr (assq msg-num wl-summary-scored))))
"+")))))
(defun wl-summary-update-modeline ()
- (setq wl-summary-buffer-unread-status
- (format " {%s}(%d new/%d unread)"
- (if (eq wl-summary-buffer-view 'thread)
- "T" "S")
- wl-summary-buffer-new-count
- (+ wl-summary-buffer-new-count
- wl-summary-buffer-unread-count))))
-
-(defsubst wl-summary-jump-to-msg (&optional number)
+ (setq wl-summary-buffer-mode-line
+ (funcall wl-summary-buffer-mode-line-formatter)))
+
+(defun wl-summary-jump-to-msg (&optional number)
(interactive)
(let ((num (or number
(string-to-int
(read-from-minibuffer "Jump to Message(No.): ")))))
(setq num (int-to-string num))
(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))
+ (if (or (and (re-search-forward (concat "\r" num "[^0-9]") nil t)
+ (progn (backward-char 1) t))
+ (re-search-backward (concat "\r" num "[^0-9]") nil t))
(progn (beginning-of-line) t)
nil)))
(defun wl-summary-message-number ()
(save-excursion
(beginning-of-line)
- (if (looking-at "^ *\\(-?[0-9]+\\)")
+ (if (or (re-search-forward "\r\\(-?[0-9]+\\)" (point-at-eol) t)
+ (re-search-forward "^ *\\(-?[0-9]+\\)" (point-at-eol) t))
(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))
-;;; result)
- )
- (while dsts
- (setq dsts (cdr dsts)))))
-
(defun wl-summary-delete-all-msgs ()
(interactive)
(let ((cur-buf (current-buffer))
(message "Deleting...")
(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)
+ (elmo-folder-detach-messages wl-summary-buffer-elmo-folder dels)
(wl-summary-set-message-modified)
- (wl-summary-set-mark-modified)
(wl-folder-set-folder-updated (wl-summary-buffer-folder-name)
(list 0 0 0))
;;; for thread.
(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-temp-mark-list
wl-summary-buffer-target-mark-list
wl-summary-buffer-elmo-folder
wl-summary-buffer-number-column
- wl-summary-buffer-number-regexp
+ wl-summary-buffer-temp-mark-column
+ wl-summary-buffer-persistent-mark-column
wl-summary-buffer-message-modified
- wl-summary-buffer-mark-modified
wl-summary-buffer-thread-modified
wl-summary-buffer-number-list
wl-summary-buffer-msgdb
- wl-summary-buffer-folder-name)
+ wl-summary-buffer-folder-name
+ wl-summary-buffer-line-formatter)
(and (eq wl-summary-buffer-view 'thread)
'(wl-thread-entity-hashtb
wl-thread-entities
(setq copy-variables (cdr copy-variables)))
(switch-to-buffer buf)
(kill-buffer cur-buf)
- (wl-summary-count-unread
- (elmo-msgdb-get-mark-alist (wl-summary-buffer-msgdb)))
+ (wl-summary-count-unread)
(wl-summary-update-modeline)
(if msg
(if (eq wl-summary-buffer-view 'thread)
(get-buffer-create wl-summary-buffer-name))))
(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)))))
+ (save-excursion
+ (goto-char (point-min))
+ (setq wl-summary-buffer-number-list nil)
+ (while (not (eobp))
+ (setq wl-summary-buffer-number-list
+ (cons (wl-summary-message-number)
+ wl-summary-buffer-number-list))
+ (forward-line 1))
+ (setq wl-summary-buffer-number-list
+ (nreverse wl-summary-buffer-number-list))))
(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))))
+ (elmo-message-mark
+ wl-summary-buffer-elmo-folder
+ unread-msg)
+ elmo-msgdb-important-mark))))
(defsubst wl-summary-open-folder (folder)
;; Select folder
default-enable-multibyte-characters)
(decode-mime-charset-region
(point-min)(point-max)
- wl-summary-buffer-mime-charset))
- (when (file-exists-p view)
+ wl-summary-buffer-mime-charset 'LF))
+ (if (file-exists-p view)
+ (setq wl-summary-buffer-view
+ (wl-summary-load-file-object view))
(setq wl-summary-buffer-view
- (wl-summary-load-file-object view)))
+ (or (wl-get-assoc-list-value
+ wl-summary-default-view-alist
+ (elmo-folder-name-internal folder))
+ wl-summary-default-view)))
(wl-thread-resume-entity folder)
(wl-summary-open-folder folder))
(setq wl-summary-buffer-view
(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)))
+ (wl-summary-count-unread)
(wl-summary-update-modeline)))
(unless (eq wl-summary-buffer-view 'thread)
(wl-summary-make-number-list))
- (wl-summary-buffer-number-column-detect t)
+ (when (and wl-summary-cache-use
+ (or (and wl-summary-check-line-format
+ (wl-summary-line-format-changed-p))
+ (wl-summary-view-old-p)))
+ (wl-summary-rescan))
(wl-summary-toggle-disp-msg (if wl-summary-buffer-disp-msg 'on 'off))
(unless (and reuse-buf keep-cursor)
- ;(setq hilit wl-summary-highlight)
(unwind-protect
- (let ((wl-summary-highlight (if reuse-buf wl-summary-highlight))
- (wl-use-scoring
+ (let ((wl-use-scoring
(if (or scoring interactive) wl-use-scoring)))
(if (and (not scan-type)
interactive
(forward-line -1)
(wl-summary-prev))
(setq retval 'more-next))
- ;(setq wl-summary-highlight hilit)
(if (and wl-summary-highlight
(not wl-summary-lazy-highlight)
(not reuse-buf))
(if (and interactive wl-summary-recenter)
(recenter (/ (- (window-height) 2) 2))))))
;; set current entity-id
- (if (and (not folder)
- (setq entity
- (wl-folder-search-entity-by-name (elmo-folder-name-internal
- folder)
- wl-folder-entity
- 'folder)))
- ;; entity-id is unknown.
- (wl-folder-set-current-entity-id
- (wl-folder-get-entity-id entity)))
+ (when (and folder
+ (setq entity
+ (wl-folder-search-entity-by-name
+ (elmo-folder-name-internal folder)
+ wl-folder-entity
+ 'folder)))
+ ;; entity-id is unknown.
+ (wl-folder-set-current-entity-id
+ (wl-folder-get-entity-id entity)))
+ (when (and wl-summary-lazy-highlight
+ wl-on-xemacs)
+ (sit-for 0))
(unwind-protect
(run-hooks 'wl-summary-prepared-hook)
(set-buffer-modified-p nil))
retval))
+(defun wl-summary-goto-previous-message-beginning ()
+ (end-of-line)
+ (re-search-backward "\r\\(-?[0-9]+\\)" nil t)
+ (beginning-of-line))
+
(defun wl-summary-goto-top-of-current-thread ()
(wl-summary-jump-to-msg
(wl-thread-entity-get-number
(ignore-errors
(run-hooks 'wl-summary-line-inserted-hook)))
-(defun wl-summary-insert-sequential (entity msgdb &rest args)
+(defun wl-summary-insert-sequential (entity folder &rest args)
(let ((inhibit-read-only t)
buffer-read-only)
(goto-char (point-max))
(wl-summary-insert-line
- (wl-summary-create-line entity nil nil))))
+ (wl-summary-create-line entity nil nil
+ (elmo-message-mark
+ folder
+ (elmo-message-entity-number
+ entity))))
+ (setq wl-summary-buffer-number-list
+ (wl-append wl-summary-buffer-number-list
+ (list (elmo-message-entity-number entity))))
+ nil))
(defun wl-summary-default-subject-filter (subject)
(let ((case-fold-search t))
(elmo-replace-in-string subject "^\\[.*\\]" "")))
(defun wl-summary-subject-equal (subject1 subject2)
- (string= (wl-summary-subject-filter-func-internal subject1)
- (wl-summary-subject-filter-func-internal subject2)))
+ (string= (funcall wl-summary-subject-filter-function subject1)
+ (funcall wl-summary-subject-filter-function subject2)))
(defmacro wl-summary-put-alike (alike)
(` (elmo-set-hash-val (format "#%d" (wl-count-lines))
(` (elmo-get-hash-val (format "#%d" (wl-count-lines))
wl-summary-alike-hashtb)))
-(defun wl-summary-insert-headers (overview func mime-decode)
- (let (ov this last alike)
+(defun wl-summary-insert-headers (folder func mime-decode)
+ (let ((numbers (elmo-folder-list-messages folder t t))
+ ov this last alike)
(buffer-disable-undo (current-buffer))
(make-local-variable 'wl-summary-alike-hashtb)
- (setq wl-summary-alike-hashtb (elmo-make-hash (* (length overview) 2)))
+ (setq wl-summary-alike-hashtb (elmo-make-hash (* (length numbers) 2)))
(when mime-decode
(elmo-set-buffer-multibyte default-enable-multibyte-characters))
- (while (setq ov (pop overview))
+ (while (setq ov (elmo-message-entity folder (pop numbers)))
(setq this (funcall func ov))
(and this (setq this (std11-unfold-string this)))
(if (equal last this)
- (wl-append alike (list ov))
+ (setq alike (cons ov alike))
(when last
(wl-summary-put-alike alike)
(insert last ?\n))
(eword-decode-region (point-min) (point-max))))
(run-hooks 'wl-summary-insert-headers-hook)))
-(defun wl-summary-search-by-subject (entity overview)
+(defun wl-summary-search-by-subject (entity folder)
(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)
+ match founds cur result)
(with-current-buffer buf
(let ((case-fold-search t))
(when (or (not (string= wl-summary-search-buf-folder-name folder-name))
(zerop (buffer-size)))
(setq wl-summary-search-buf-folder-name folder-name)
+ (message "Creating subject cache...")
(wl-summary-insert-headers
- overview
+ folder
(function
(lambda (x)
- (wl-summary-subject-filter-func-internal
- (elmo-msgdb-overview-entity-get-subject-no-decode x))))
- t))
- (setq match (wl-summary-subject-filter-func-internal
- (elmo-msgdb-overview-entity-get-subject entity)))
+ (funcall wl-summary-subject-filter-function
+ (elmo-message-entity-field x 'subject))))
+ t)
+ (message "Creating subject cache...done"))
+ (setq match (funcall wl-summary-subject-filter-function
+ (elmo-message-entity-field entity 'subject
+ 'decode)))
(if (string= match "")
(setq match "\n"))
- (goto-char (point-min))
- (while (and (not founds)
- (not (= (point) (point-max)))
- (search-forward match nil t))
+ (goto-char (point-max))
+ (while (and (null result)
+ (not (= (point) (point-min)))
+ (search-backward match nil t))
;; check exactly match
- (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))))
- (with-current-buffer summary-buf
+ (when (and (bolp) (= (point-at-eol)(match-end 0)))
+ (setq founds (wl-summary-get-alike))
+ (with-current-buffer summary-buf
+ (while founds
+ (when (and
+ ;; the first element of found-entity list exists on
+ ;; thread tree.
+ (wl-thread-get-entity
+ (elmo-message-entity-number (car founds)))
+ ;; message id is not same as myself.
+ (not (string=
+ (elmo-message-entity-field entity 'message-id)
+ (elmo-message-entity-field (car founds)
+ 'message-id)))
+ ;; not a descendant.
(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
- (car founds))))))
-
-(defun wl-summary-insert-thread-entity (entity msgdb update
- &optional force-insert)
- (let* ((overview (elmo-msgdb-get-overview msgdb))
- (mark-alist (elmo-msgdb-get-mark-alist msgdb))
- this-id
- parent-entity
- parent-number
- (case-fold-search t)
- cur number overview2 cur-entity linked retval delayed-entity
- update-list entity-stack)
+ (elmo-message-entity-number entity)
+ (elmo-message-entity-number (car founds)))))
+ (setq result (car founds)
+ founds nil))
+ (setq founds (cdr founds))))))
+ result))))
+
+(defun wl-summary-insert-thread (entity folder update
+ &optional force-insert)
+ (let ((case-fold-search t)
+ (depth 0)
+ this-id parent-entity parent-number relatives anumber
+ cur number cur-entity linked retval delayed-entity
+ update-list entity-stack)
(while entity
- (setq this-id (elmo-msgdb-overview-entity-get-id entity)
+ (setq this-id (elmo-message-entity-field entity 'message-id)
parent-entity
- (elmo-msgdb-get-parent-entity entity msgdb)
- parent-number (elmo-msgdb-overview-entity-get-number
- parent-entity))
- (setq number (elmo-msgdb-overview-entity-get-number entity))
- ;; If thread loop detected, set parent as nil.
+ (elmo-message-entity-parent folder entity)
+ parent-number (elmo-message-entity-number parent-entity))
+ (setq number (elmo-message-entity-number entity))
(setq cur entity)
+ ;; If thread loop detected, set parent as nil.
(while cur
- (if (eq number (elmo-msgdb-overview-entity-get-number
- (setq cur
- (elmo-msgdb-get-parent-entity cur msgdb))))
+ (setq anumber
+ (elmo-message-entity-number
+ (setq cur (elmo-message-entity-parent folder cur))))
+ (if (memq anumber relatives)
(setq parent-number nil
- cur nil)))
+ cur nil))
+ (setq relatives (cons
+ (elmo-message-entity-number cur)
+ relatives)))
(if (and parent-number
(not (wl-thread-get-entity parent-number))
(not force-insert))
(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)))
+ (let ((found (wl-summary-search-by-subject entity folder)))
(when (and found
(not (member found wl-summary-delayed-update)))
(setq parent-entity found)
(setq parent-number
- (elmo-msgdb-overview-entity-get-number parent-entity))
+ (elmo-message-entity-number parent-entity))
(setq linked t))))
;; If subject is change, divide thread.
(if (and parent-number
wl-summary-divide-thread-when-subject-changed
(not (wl-summary-subject-equal
- (or (elmo-msgdb-overview-entity-get-subject
- entity) "")
- (or (elmo-msgdb-overview-entity-get-subject
- parent-entity) ""))))
+ (or (elmo-message-entity-field entity
+ 'subject t) "")
+ (or (elmo-message-entity-field parent-entity
+ 'subject t) ""))))
(setq parent-number nil))
(setq retval
- (wl-thread-insert-message entity mark-alist
+ (wl-thread-insert-message entity
number parent-number update linked))
(and retval
(wl-append update-list (list retval)))
update-list))
(defun wl-summary-update-thread (entity
- mark-alist
thr-entity
parent-entity)
(let* ((this-id (elmo-msgdb-overview-entity-get-id entity))
(overview-entity entity)
(parent-id (elmo-msgdb-overview-entity-get-id parent-entity))
+ (number (elmo-msgdb-overview-entity-get-number entity))
(parent-number (elmo-msgdb-overview-entity-get-number parent-entity))
- summary-line msg subject-differ)
+ insert-line)
(cond
((or (not parent-id)
(string= this-id parent-id))
(goto-char (point-max))
- (beginning-of-line))
+ (beginning-of-line)
+ (setq insert-line t))
;; parent already exists in buffer.
((wl-summary-jump-to-msg parent-number)
- (wl-thread-goto-bottom-of-sub-thread)))
- (let ((inhibit-read-only t)
- (buffer-read-only nil))
- (wl-summary-insert-line
- (wl-summary-create-line
- entity
- parent-entity
- nil
- (wl-thread-maybe-get-children-num msg)
- (wl-thread-make-indent-string thr-entity)
- (wl-thread-entity-get-linked thr-entity))))))
-
-(defun wl-summary-mark-as-unread (&optional number
- no-server-update
- no-modeline-update)
- (interactive)
- (save-excursion
- (let* (eol
- (inhibit-read-only t)
- (buffer-read-only nil)
- (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)
- (if number
- (progn
- (setq visible (wl-summary-jump-to-msg number))
- (unless (setq mark (cadr (assq number mark-alist)))
- (setq mark " ")))
- ;; interactive
- (setq visible t))
- (when visible
- (if (null (wl-summary-message-number))
- (message "No message.")
- (end-of-line)
- (setq eol (point))
- (re-search-backward (concat "^" wl-summary-buffer-number-regexp
- "..../..")) ; set cursor line
- (beginning-of-line)))
- (if (or (and (not visible)
- ;; already exists in msgdb.
- (assq number (elmo-msgdb-get-number-alist msgdb)))
- (re-search-forward
- (format (concat "^ *\\("
- (if number (int-to-string number)
- "-?[0-9]+")
- "\\)[^0-9]\\(%s\\|%s\\)")
- wl-summary-read-uncached-mark
- " ") eol t))
- (progn
- (setq number (or number (string-to-int (wl-match-buffer 1))))
- (setq mark (or mark (elmo-match-buffer 2)))
- (save-match-data
- (setq new-mark (if (string= mark
- wl-summary-read-uncached-mark)
- wl-summary-unread-uncached-mark
- (if (elmo-message-use-cache-p folder number)
- wl-summary-unread-mark
- wl-summary-unread-uncached-mark))))
- ;; server side mark
- (unless no-server-update
- (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))
- (setq mark-alist
- (elmo-msgdb-mark-set mark-alist
- number
- new-mark))
- (elmo-msgdb-set-mark-alist msgdb mark-alist)
- (unless no-modeline-update
- (setq wl-summary-buffer-unread-count
- (+ 1 wl-summary-buffer-unread-count))
- (wl-summary-update-modeline)
- (wl-folder-update-unread
- (wl-summary-buffer-folder-name)
- (+ wl-summary-buffer-unread-count
- wl-summary-buffer-new-count)))
- (wl-summary-set-mark-modified)
- (if (and visible wl-summary-highlight)
- (wl-highlight-summary-current-line))))))
- (set-buffer-modified-p nil))
-
-(defun wl-summary-delete (&optional number)
- "Mark Delete mark 'D'.
-If optional argument NUMBER is specified, mark message specified by NUMBER."
- (interactive)
- (let* ((buffer-num (wl-summary-message-number))
- (msg-num (or number buffer-num))
- mark)
- (catch 'done
- (when (null msg-num)
- (if (interactive-p)
- (message "No message."))
- (throw 'done nil))
- (when (setq mark (wl-summary-get-mark msg-num))
- (when (wl-summary-reserve-temp-mark-p mark)
- (if (interactive-p)
- (error "Already marked as `%s'" mark))
- (throw 'done nil))
- (wl-summary-unmark msg-num))
- (if (or (interactive-p)
- (eq number buffer-num))
- (wl-summary-mark-line "D"))
- (setq wl-summary-buffer-delete-list
- (cons msg-num wl-summary-buffer-delete-list))
- (if (interactive-p)
- (if (eq wl-summary-move-direction-downward nil)
- (wl-summary-prev)
- (wl-summary-next)))
- msg-num)))
-
-(defun wl-summary-remove-destination ()
- (save-excursion
- (let ((inhibit-read-only t)
- (buffer-read-only nil)
- (buf (current-buffer))
- sol eol rs re)
- (beginning-of-line)
- (setq sol (point))
- (end-of-line)
- (setq eol (point))
- (setq rs (next-single-property-change sol 'wl-summary-destination
- buf eol))
- (setq re (next-single-property-change rs 'wl-summary-destination
- buf eol))
- (put-text-property rs re 'wl-summary-destination nil)
- (put-text-property rs re 'invisible nil)
- (goto-char re)
- (delete-char (- eol re)))))
-
-(defun wl-summary-check-mark (msg mark)
- (let ((check-func (cond ((string= mark "o")
- 'wl-summary-msg-marked-as-refiled)
- ((string= mark "O")
- 'wl-summary-msg-marked-as-copied)
- ((string= mark "D")
- 'wl-summary-msg-marked-as-deleted)
- ((string= mark "*")
- 'wl-summary-msg-marked-as-target))))
- (if check-func
- (funcall check-func msg))))
-
-(defun wl-summary-mark-collect (mark &optional begin end)
- (save-excursion
- (save-restriction
- (let (msglist)
- (narrow-to-region (or begin (point-min))
- (or end (point-max)))
- (goto-char (point-min))
- ;; for thread...
- (if (eq wl-summary-buffer-view 'thread)
- (progn
- (while (not (eobp))
- (let* ((number (wl-summary-message-number))
- (entity (wl-thread-get-entity number))
- result)
- ;; opened...only myself is checked.
- (if (wl-summary-check-mark number mark)
- (wl-append msglist (list number)))
- (unless (wl-thread-entity-get-opened entity)
- ;; closed...children is also checked.
- (if (setq result (wl-thread-get-children-msgs-with-mark
- number
- mark))
- (wl-append msglist result)))
- (forward-line 1)))
- (elmo-uniq-list msglist))
- (let* ((case-fold-search nil)
- (re (format (concat wl-summary-message-regexp "%s")
- (regexp-quote mark))))
- (while (re-search-forward re nil t)
- (setq msglist (cons (wl-summary-message-number) msglist)))
- (nreverse msglist)))))))
-
-(defun wl-summary-exec ()
- (interactive)
- (wl-summary-exec-subr (mapcar 'car wl-summary-buffer-refile-list)
- (reverse wl-summary-buffer-delete-list)
- (mapcar 'car wl-summary-buffer-copy-list)))
-
-(defun wl-summary-exec-region (beg end)
- (interactive "r")
- (message "Collecting marks ...")
- (save-excursion
- (goto-char beg)
- (beginning-of-line)
- (setq beg (point))
- (goto-char (1- end))
- (forward-line)
- (setq end (point))
- (wl-summary-exec-subr (wl-summary-mark-collect "o" beg end)
- (wl-summary-mark-collect "D" beg end)
- (wl-summary-mark-collect "O" beg end))))
-
-(defun wl-summary-exec-subr (moves dels copies)
- (if (not (or moves dels copies))
- (message "No marks")
- (save-excursion
- (let ((del-fld (wl-summary-get-delete-folder
- (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-failures 0)
- (copy-failures 0)
- (copy-len (length copies))
- refile-len
- dst-msgs ; loop counter
- result)
- (message "Executing ...")
- (while dels
- (when (not (assq (car dels) wl-summary-buffer-refile-list))
- (wl-append wl-summary-buffer-refile-list
- (list (cons (car dels) del-fld)))
- (setq wl-summary-buffer-delete-list
- (delete (car dels) wl-summary-buffer-delete-list)))
- (setq dels (cdr dels)))
- ;; begin refile...
- (setq refile-len (length refiles))
- (setq dst-msgs
- (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
- (setq result nil)
- (condition-case nil
- (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
- ;; update buffer.
- (wl-summary-delete-messages-on-buffer (cdr (car dst-msgs)))
- ;; update refile-alist.
- (setq wl-summary-buffer-refile-list
- (wl-delete-associations (cdr (car dst-msgs))
- wl-summary-buffer-refile-list)))
- (setq refile-failures
- (+ refile-failures (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
- (setq result nil)
- (condition-case nil
- (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
- ;; update buffer.
- (wl-summary-delete-copy-marks-on-buffer (cdr (car dst-msgs)))
- ;; update copy-alist
- (setq wl-summary-buffer-copy-list
- (wl-delete-associations (cdr (car dst-msgs))
- wl-summary-buffer-copy-list)))
- (setq copy-failures
- (+ copy-failures (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)
- (format " (%d refiling failed)" refile-failures)
- "")
- (if (> copy-failures 0)
- (format " (%d copying failed)" copy-failures)
- "")
- "."))))))
-
-(defun wl-summary-read-folder (default &optional purpose ignore-error
- no-create init)
- (let ((fld (completing-read
- (format "Folder name %s(%s): " (or purpose "")
- default)
- (or wl-folder-completion-function
- (if (memq 'read-folder wl-use-folder-petname)
- (wl-folder-get-entity-with-petname)
- wl-folder-entity-hashtb))
- nil nil (or init wl-default-spec)
- 'wl-read-folder-hist)))
- (if (or (string= fld wl-default-spec)
- (string= fld ""))
- (setq fld default))
- (setq fld (elmo-string (wl-folder-get-realname fld)))
- (if (string-match "\n" fld)
- (error "Not supported folder name: %s" fld))
- (unless no-create
- (if ignore-error
- (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)
- "Print refile destination on line."
- (wl-summary-remove-destination)
- (let ((inhibit-read-only t)
- (folder (copy-sequence folder))
- (buffer-read-only nil)
- len rs re c)
- (setq len (string-width folder))
- (if (< len 1) ()
- (end-of-line)
- (setq re (point))
- (setq c 0)
- (while (< c len)
- (forward-char -1)
- (setq c (+ c (char-width (following-char)))))
- (and (> c len) (setq folder (concat " " folder)))
- (setq rs (point))
- (put-text-property rs re 'invisible t)
- (put-text-property rs re 'wl-summary-destination t)
- (goto-char re)
- (wl-highlight-refile-destination-string folder)
- (insert folder)
- (set-buffer-modified-p nil))))
-
-(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")
- (and (assq number wl-summary-buffer-copy-list) "O")
- (and (assq number wl-summary-buffer-refile-list) "o")
- (and (memq number wl-summary-buffer-target-mark-list) "*")))
-
-(defsubst wl-summary-reserve-temp-mark-p (mark)
- "Return t if temporal MARK should be reserved."
- (member mark wl-summary-reserve-mark-list))
-
-(defun wl-summary-refile (&optional dst number)
- "Put refile mark on current line message.
-If optional argument DST is specified, put mark without asking
-destination folder.
-If optional argument NUMBER is specified, mark message specified by NUMBER.
-
-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))))
- (cond ((eq policy 'copy)
- (if (interactive-p)
- (call-interactively 'wl-summary-copy)
- (wl-summary-copy dst number)))
- (t
- (wl-summary-refile-subr 'refile (interactive-p) dst number)))))
-
-(defun wl-summary-copy (&optional dst number)
- "Put copy mark on current line message.
-If optional argument DST is specified, put mark without asking
-destination folder.
-If optional argument NUMBER is specified, mark message specified by NUMBER."
- (interactive)
- (wl-summary-refile-subr 'copy (interactive-p) dst number))
-
-(defun wl-summary-refile-subr (copy-or-refile interactive &optional dst number)
- (let* ((buffer-num (wl-summary-message-number))
- (msg-num (or number buffer-num))
- (msgid (and msg-num
- (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))))
- (variable
- (intern (format "wl-summary-buffer-%s-list" copy-or-refile)))
- folder mark already tmp-folder)
- (catch 'done
- (when (null entity)
- ;; msgdb is empty?
- (if interactive
- (message "Cannot refile."))
- (throw 'done nil))
- (when (null msg-num)
- (if interactive
- (message "No message."))
- (throw 'done nil))
- (when (setq mark (wl-summary-get-mark msg-num))
- (when (wl-summary-reserve-temp-mark-p mark)
- (if interactive
- (error "Already marked as `%s'" mark))
- (throw 'done nil)))
- (setq folder (and msg-num
- (or dst (wl-summary-read-folder
- (or (wl-refile-guess entity) wl-trash-folder)
- (format "for %s" copy-or-refile)))))
- ;; Cache folder hack by okada@opaopa.org
- (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/"
- (elmo-cache-get-path-subr
- (elmo-msgid-to-cache msgid)))))))
- (progn
- (setq folder tmp-folder)
- (message "Force refile to %s." folder)))
- (if (string= folder (wl-summary-buffer-folder-name))
- (error "Same folder"))
- (if (or (not (elmo-folder-writable-p (wl-folder-get-elmo-folder folder)))
- (string= folder wl-queue-folder)
- (string= folder wl-draft-folder))
- (error "Don't %s messages to %s" copy-or-refile folder))
- ;; learn for refile.
- (if (eq copy-or-refile 'refile)
- (wl-refile-learn entity folder))
- (wl-summary-unmark msg-num)
- (set variable (append
- (symbol-value variable)
- (list (cons msg-num folder))))
- (when (or interactive
- (eq number buffer-num))
- (wl-summary-mark-line (if (eq copy-or-refile 'refile)
- "o" "O"))
- ;; print refile destination
- (wl-summary-print-destination msg-num folder))
- (if interactive
- (if (eq wl-summary-move-direction-downward nil)
- (wl-summary-prev)
- (wl-summary-next)))
- (run-hooks (intern (format "wl-summary-%s-hook" copy-or-refile)))
- (setq wl-summary-buffer-prev-refile-destination folder)
- msg-num)))
-
-(defun wl-summary-refile-prev-destination ()
- "Refile message to previously refiled destination."
- (interactive)
- (wl-summary-refile wl-summary-buffer-prev-refile-destination
- (wl-summary-message-number))
- (if (eq wl-summary-move-direction-downward nil)
- (wl-summary-prev)
- (wl-summary-next)))
-
-(defun wl-summary-copy-prev-destination ()
- "Refile message to previously refiled destination."
- (interactive)
- (wl-summary-copy wl-summary-buffer-prev-copy-destination
- (wl-summary-message-number))
- (if (eq wl-summary-move-direction-downward nil)
- (wl-summary-prev)
- (wl-summary-next)))
-
-(defsubst wl-summary-no-auto-refile-message-p (msg mark-alist)
- (member (cadr (assq msg mark-alist)) wl-summary-auto-refile-skip-marks))
-
-(defun wl-summary-auto-refile (&optional open-all)
- "Set refile mark automatically according to 'wl-refile-guess-by-rule'."
- (interactive "P")
- (message "Marking...")
- (save-excursion
- (if (and (eq wl-summary-buffer-view 'thread)
- open-all)
- (wl-thread-open-all))
- (let* ((spec (wl-summary-buffer-folder-name))
- (mark-alist (elmo-msgdb-get-mark-alist
- (wl-summary-buffer-msgdb)))
- checked-dsts
- (count 0)
- number dst thr-entity)
- (goto-line 1)
- (while (not (eobp))
- (setq number (wl-summary-message-number))
- (dolist (number (cons number
- (and (eq wl-summary-buffer-view 'thread)
- ;; process invisible children.
- (not (wl-thread-entity-get-opened
- (setq thr-entity
- (wl-thread-get-entity number))))
- (wl-thread-entity-get-descendant
- thr-entity))))
- (when (and (not (wl-summary-no-auto-refile-message-p number
- mark-alist))
- (setq dst
- (wl-folder-get-realname
- (wl-refile-guess-by-rule
- (elmo-msgdb-overview-get-entity
- number (wl-summary-buffer-msgdb)))))
- (not (equal dst spec))
- (let ((pair (assoc dst checked-dsts))
- ret)
- (if pair
- (cdr pair)
- (setq ret
- (condition-case nil
- (progn
- (wl-folder-confirm-existence
- (wl-folder-get-elmo-folder dst))
- t)
- (error)))
- (setq checked-dsts (cons (cons dst ret) checked-dsts))
- ret)))
- (if (wl-summary-refile dst number)
- (incf count))
- (message "Marking...%d message(s)." count)))
- (forward-line))
- (if (eq count 0)
- (message "No message was marked.")
- (message "Marked %d message(s)." count)))))
-
-(defun wl-summary-unmark (&optional number)
- "Unmark marks (temporary, refile, copy, delete)of current line.
-If optional argument NUMBER is specified, unmark message specified by NUMBER."
- (interactive)
- (save-excursion
- (beginning-of-line)
- (let ((inhibit-read-only t)
- (buffer-read-only nil)
- visible
- msg-num
- cur-mark
- score-mark)
- (if number
- (setq visible (wl-summary-jump-to-msg number))
- (setq visible t))
- ;; Delete mark on buffer.
- (when (and visible
- (looking-at "^ *\\(-?[0-9]+\\)\\([^0-9]\\)"))
- (goto-char (match-end 2))
- (or number
- (setq number (string-to-int (wl-match-buffer 1))))
- (setq cur-mark (wl-match-buffer 2))
- (if (string= cur-mark " ")
- ()
- (delete-region (match-beginning 2) (match-end 2))
- (if (setq score-mark (wl-summary-get-score-mark number))
- (insert score-mark)
- (insert " ")))
- (if (or (string= cur-mark "o")
- (string= cur-mark "O"))
- (wl-summary-remove-destination))
- (if wl-summary-highlight
- (wl-highlight-summary-current-line nil nil score-mark))
- (set-buffer-modified-p nil))
- ;; Remove from temporary mark structure.
- (and number
- (wl-summary-delete-mark number)))))
-
-(defun wl-summary-msg-marked-as-target (msg)
- (if (memq msg wl-summary-buffer-target-mark-list)
- t))
-
-(defun wl-summary-msg-marked-as-copied (msg)
- (assq msg wl-summary-buffer-copy-list))
-
-(defun wl-summary-msg-marked-as-deleted (msg)
- (if (memq msg wl-summary-buffer-delete-list)
- t))
-
-(defun wl-summary-msg-marked-as-refiled (msg)
- (assq msg wl-summary-buffer-refile-list))
-
-(defun wl-summary-target-mark (&optional number)
- "Put target mark '*' on current message.
-If optional argument NUMBER is specified, mark message specified by NUMBER."
- (interactive)
- (let* ((buffer-num (wl-summary-message-number))
- (msg-num (or number buffer-num))
- mark)
- (catch 'done
- (when (null msg-num)
- (if (interactive-p)
- (message "No message."))
- (throw 'done nil))
- (when (setq mark (wl-summary-get-mark msg-num))
- (when (wl-summary-reserve-temp-mark-p mark)
- (if (interactive-p)
- (error "Already marked as `%s'" mark))
- (throw 'done nil))
- (wl-summary-unmark msg-num))
- (if (or (interactive-p)
- (eq number buffer-num))
- (wl-summary-mark-line "*"))
- (setq wl-summary-buffer-target-mark-list
- (cons msg-num wl-summary-buffer-target-mark-list))
- (if (interactive-p)
- (if (eq wl-summary-move-direction-downward nil)
- (wl-summary-prev)
- (wl-summary-next)))
- msg-num)))
-
-
-(defun wl-summary-refile-region (beg end)
- "Put copy mark on messages in the region specified by BEG and END."
- (interactive "r")
- (wl-summary-refile-region-subr "refile" beg end))
-
-(defun wl-summary-copy-region (beg end)
- "Put copy mark on messages in the region specified by BEG and END."
- (interactive "r")
- (wl-summary-refile-region-subr "copy" beg end))
-
-(defun wl-summary-refile-region-subr (copy-or-refile beg end)
- (save-excursion
- (save-restriction
- (goto-char beg)
- ;; guess by first msg
- (let* ((msgid (cdr (assq (wl-summary-message-number)
- (elmo-msgdb-get-number-alist
- (wl-summary-buffer-msgdb)))))
- (function (intern (format "wl-summary-%s" copy-or-refile)))
- (entity (assoc msgid (elmo-msgdb-get-overview
- (wl-summary-buffer-msgdb))))
- folder)
- (if entity
- (setq folder (wl-summary-read-folder (wl-refile-guess entity)
- (format "for %s"
- copy-or-refile))))
- (narrow-to-region beg end)
- (if (eq wl-summary-buffer-view 'thread)
- (progn
- (while (not (eobp))
- (let* ((number (wl-summary-message-number))
- (entity (wl-thread-get-entity number))
- children)
- (if (wl-thread-entity-get-opened entity)
- ;; opened...refile line.
- (funcall function folder number)
- ;; closed
- (setq children (wl-thread-get-children-msgs number))
- (while children
- (funcall function folder (pop children))))
- (forward-line 1))))
- (while (not (eobp))
- (funcall function folder (wl-summary-message-number))
- (forward-line 1)))))))
-
-(defun wl-summary-unmark-region (beg end)
- (interactive "r")
- (save-excursion
- (save-restriction
- (narrow-to-region beg end)
- (goto-char (point-min))
- (if (eq wl-summary-buffer-view 'thread)
- (progn
- (while (not (eobp))
- (let* ((number (wl-summary-message-number))
- (entity (wl-thread-get-entity number)))
- (if (wl-thread-entity-get-opened entity)
- ;; opened...unmark line.
- (wl-summary-unmark)
- ;; closed
- (wl-summary-delete-marks-on-buffer
- (wl-thread-get-children-msgs number))))
- (forward-line 1)))
- (while (not (eobp))
- (wl-summary-unmark)
- (forward-line 1))))))
-
-(defun wl-summary-mark-region-subr (function beg end)
- (save-excursion
- (save-restriction
- (narrow-to-region beg end)
- (goto-char (point-min))
- (if (eq wl-summary-buffer-view 'thread)
- (progn
- (while (not (eobp))
- (let* ((number (wl-summary-message-number))
- (entity (wl-thread-get-entity number))
- (wl-summary-move-direction-downward t)
- children)
- (if (wl-thread-entity-get-opened entity)
- ;; opened...delete line.
- (funcall function number)
- ;; closed
- (setq children (wl-thread-get-children-msgs number))
- (while children
- (funcall function (pop children))))
- (forward-line 1))))
- (while (not (eobp))
- (funcall function (wl-summary-message-number))
- (forward-line 1))))))
-
-(defun wl-summary-delete-region (beg end)
- (interactive "r")
- (wl-summary-mark-region-subr 'wl-summary-delete beg end))
-
-(defun wl-summary-target-mark-region (beg end)
- (interactive "r")
- (wl-summary-mark-region-subr 'wl-summary-target-mark beg end))
-
-(defun wl-summary-target-mark-all ()
- (interactive)
- (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)))))
-
-(defun wl-summary-delete-all-mark (mark)
- (goto-char (point-min))
- (let ((case-fold-search nil))
- (while (re-search-forward (format "^ *-?[0-9]+%s"
- (regexp-quote mark)) nil t)
- (wl-summary-unmark))
- (cond ((string= mark "*")
- (setq wl-summary-buffer-target-mark-list nil))
- ((string= mark "D")
- (setq wl-summary-buffer-delete-list nil))
- ((string= mark "O")
- (setq wl-summary-buffer-copy-list nil))
- ((string= mark "o")
- (setq wl-summary-buffer-refile-list nil)))))
-
-(defun wl-summary-unmark-all ()
- "Unmark all according to what you input."
- (interactive)
- (let ((unmarks (string-to-char-list (read-from-minibuffer "Unmark: ")))
- cur-mark)
- (save-excursion
- (while unmarks
- (setq cur-mark (char-to-string (car unmarks)))
- (wl-summary-delete-all-mark cur-mark)
- (setq unmarks (cdr unmarks))))))
-
-(defun wl-summary-target-mark-thread ()
- (interactive)
- (wl-thread-call-region-func 'wl-summary-target-mark-region t))
+ (wl-thread-goto-bottom-of-sub-thread)
+ (setq insert-line t)))
+ (when insert-line
+ (let (buffer-read-only)
+ (wl-summary-insert-line
+ (wl-summary-create-line
+ entity
+ parent-entity
+ nil
+ (elmo-message-mark wl-summary-buffer-elmo-folder number)
+ (wl-thread-maybe-get-children-num number)
+ (wl-thread-make-indent-string thr-entity)
+ (wl-thread-entity-get-linked thr-entity)))))))
(defun wl-summary-target-mark-msgs (msgs)
"Return the number of marked messages."
wl-summary-pick-field-default)
"/"
(wl-summary-buffer-folder-name))
- 'update nil nil t)))
+ 'update nil nil t)
+ (run-hooks 'wl-summary-virtual-hook)))
(defun wl-summary-delete-all-temp-marks (&optional no-msg)
"Erase all temp marks from buffer."
(interactive)
(when (or wl-summary-buffer-target-mark-list
- wl-summary-buffer-delete-list
- wl-summary-buffer-refile-list
- wl-summary-buffer-copy-list)
+ wl-summary-buffer-temp-mark-list)
(save-excursion
(goto-char (point-min))
(unless no-msg
(message "Unmarking..."))
(while (not (eobp))
- (wl-summary-unmark)
- (forward-line))
+ (wl-summary-unset-mark)
+ (forward-line 1))
(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))))
+ (setq wl-summary-buffer-temp-mark-list nil))))
-(defun wl-summary-delete-mark (number)
- "Delete temporary mark of the message specified by NUMBER."
- (cond
- ((memq number wl-summary-buffer-target-mark-list)
- (setq wl-summary-buffer-target-mark-list
- (delq number wl-summary-buffer-target-mark-list)))
- ((memq number wl-summary-buffer-delete-list)
- (setq wl-summary-buffer-delete-list
- (delq number wl-summary-buffer-delete-list)))
- (t
- (let (pair)
- (cond
- ((setq pair (assq number wl-summary-buffer-copy-list))
- (setq wl-summary-buffer-copy-list
- (delq pair wl-summary-buffer-copy-list)))
- ((setq pair (assq number wl-summary-buffer-refile-list))
- (setq wl-summary-buffer-refile-list
- (delq pair wl-summary-buffer-refile-list))))))))
+(defsubst wl-summary-temp-mark ()
+ "Move to the temp-mark column and return mark string."
+ (move-to-column wl-summary-buffer-temp-mark-column)
+ (buffer-substring (- (point) 1) (point)))
+
+(defsubst wl-summary-persistent-mark ()
+ "Move to the persistent-mark column and return mark string."
+ (move-to-column wl-summary-buffer-persistent-mark-column)
+ (buffer-substring (- (point) 1) (point)))
(defun wl-summary-mark-line (mark)
- "Put MARK on current line. Return message number."
+ "Put MARK on current line."
(save-excursion
(beginning-of-line)
(let ((inhibit-read-only t)
- (buffer-read-only nil)
- msg-num
- cur-mark)
- (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))
- (delete-region (match-beginning 2) (match-end 2))
-;;; (wl-summary-delete-mark msg-num)
- (insert mark)
- (if wl-summary-highlight
- (wl-highlight-summary-current-line nil nil t))
- (set-buffer-modified-p nil)
- msg-num))))
-
-(defun wl-summary-target-mark-delete ()
- (interactive)
- (save-excursion
- (goto-char (point-min))
- (let ((regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)"))
- number mlist)
- (while (re-search-forward regexp nil t)
- (let (wl-summary-buffer-disp-msg)
- (when (setq number (wl-summary-message-number))
- (wl-summary-delete number)
- (setq wl-summary-buffer-target-mark-list
- (delq number wl-summary-buffer-target-mark-list)))))
- (setq mlist wl-summary-buffer-target-mark-list)
- (while mlist
- (wl-append wl-summary-buffer-delete-list (list (car mlist)))
- (setq wl-summary-buffer-target-mark-list
- (delq (car mlist) wl-summary-buffer-target-mark-list))
- (setq mlist (cdr mlist))))))
-
-(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)
- (buffer-read-only nil)
- (count 0)
- (length (length mlist))
- (pos (point))
- skipped
- new-mark)
- (while mlist
- (setq new-mark (wl-summary-prefetch-msg (car mlist) ignore-cache))
- (if new-mark
- (progn
- (message "Prefetching... %d/%d message(s)"
- (setq count (+ 1 count)) length)
- (when (wl-summary-jump-to-msg (car mlist))
- (wl-summary-unmark)
- (when new-mark
- (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)
- (if wl-summary-highlight
- (wl-highlight-summary-current-line))
- (save-excursion
- (goto-char pos)
- (sit-for 0)))))
- (setq skipped (cons (car mlist) skipped)))
- (setq mlist (cdr mlist)))
- (setq wl-summary-buffer-target-mark-list skipped)
- (message "Prefetching... %d/%d message(s)." count length)
- (set-buffer-modified-p nil))))
-
-(defun wl-summary-target-mark-refile-subr (copy-or-refile)
- (let ((variable
- (intern (format "wl-summary-buffer-%s-list" copy-or-refile)))
- (function
- (intern (format "wl-summary-%s" copy-or-refile)))
- regexp number msgid entity folder mlist)
- (save-excursion
- (goto-char (point-min))
- (setq regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)"))
- ;; guess by first mark
- (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))))
- entity (assoc msgid
- (elmo-msgdb-get-overview
- (wl-summary-buffer-msgdb))))
- (if (null entity)
- (error "Cannot %s" copy-or-refile))
- (funcall function
- (setq folder (wl-summary-read-folder
- (wl-refile-guess entity)
- (format "for %s" copy-or-refile)))
- number)
- (if number
- (setq wl-summary-buffer-target-mark-list
- (delq number wl-summary-buffer-target-mark-list)))
- (while (re-search-forward regexp nil t)
- (let (wl-summary-buffer-disp-msg)
- (when (setq number (wl-summary-message-number))
- (funcall function folder number)
- (setq wl-summary-buffer-target-mark-list
- (delq number wl-summary-buffer-target-mark-list)))))
- ;; process invisible messages.
- (setq mlist wl-summary-buffer-target-mark-list)
- (while mlist
- (set variable
- (append (symbol-value variable)
- (list (cons (car mlist) folder))))
- (setq wl-summary-buffer-target-mark-list
- (delq (car mlist) wl-summary-buffer-target-mark-list))
- (setq mlist (cdr mlist)))))))
+ (buffer-read-only nil))
+ (wl-summary-temp-mark) ; mark
+ (delete-backward-char 1)
+ (insert mark))))
(defun wl-summary-next-buffer ()
"Switch to next summary buffer."
(or (cadr (memq (current-buffer) buffers))
(car buffers)))))
-(defun wl-summary-target-mark-copy ()
- (interactive)
- (wl-summary-target-mark-refile-subr "copy"))
-
-(defun wl-summary-target-mark-refile ()
- (interactive)
- (wl-summary-target-mark-refile-subr "refile"))
-
(defun wl-summary-target-mark-mark-as-read ()
(interactive)
(save-excursion
(goto-char (point-min))
- (let ((regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)"))
- (inhibit-read-only t)
+ (let ((inhibit-read-only t)
(buffer-read-only nil)
+ wl-summary-buffer-disp-msg
number mlist)
- (while (re-search-forward regexp nil t)
- (let (wl-summary-buffer-disp-msg)
+ (while (not (eobp))
+ (when (string= (wl-summary-temp-mark) "*")
;; delete target-mark from buffer.
- (delete-region (match-beginning 1) (match-end 1))
+ (delete-backward-char 1)
(insert " ")
- (setq number (wl-summary-mark-as-read t))
+ (setq number (wl-summary-message-number))
+ (setq mlist (append mlist (list number)))
(if wl-summary-highlight
(wl-highlight-summary-current-line))
(if number
(setq wl-summary-buffer-target-mark-list
- (delq number wl-summary-buffer-target-mark-list)))))
- (setq mlist wl-summary-buffer-target-mark-list)
- (while mlist
- (wl-summary-mark-as-read t nil nil (car mlist))
- (setq wl-summary-buffer-target-mark-list
- (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)))
- (wl-summary-update-modeline))))
+ (delq number wl-summary-buffer-target-mark-list))))
+ (forward-line 1))
+ (wl-summary-mark-as-read mlist)
+ ;; closed
+ (when (setq mlist wl-summary-buffer-target-mark-list)
+ (wl-summary-mark-as-read mlist)
+ (while mlist
+ (setq wl-summary-buffer-target-mark-list
+ (delq (car mlist) wl-summary-buffer-target-mark-list))
+ (setq mlist (cdr mlist)))))))
(defun wl-summary-target-mark-mark-as-unread ()
(interactive)
(save-excursion
(goto-char (point-min))
- (let ((regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)"))
- (inhibit-read-only t)
+ (let ((inhibit-read-only t)
(buffer-read-only nil)
+ wl-summary-buffer-disp-msg
number mlist)
- (while (re-search-forward regexp nil t)
- (let (wl-summary-buffer-disp-msg)
- ;; delete target-mark from buffer.
- (delete-region (match-beginning 1) (match-end 1))
+ (while (not (eobp))
+ (when (string= (wl-summary-temp-mark) "*")
+ (delete-backward-char 1)
(insert " ")
- (setq number (wl-summary-mark-as-unread))
+ (setq number (wl-summary-message-number))
+ (setq mlist (append mlist (list number)))
(if wl-summary-highlight
(wl-highlight-summary-current-line))
(if number
(setq wl-summary-buffer-target-mark-list
- (delq number wl-summary-buffer-target-mark-list)))))
- (setq mlist wl-summary-buffer-target-mark-list)
- (while mlist
- (wl-summary-mark-as-unread (car mlist))
-;;; (wl-thread-msg-mark-as-unread (car mlist))
- (setq wl-summary-buffer-target-mark-list
- (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)))
- (wl-summary-update-modeline))))
+ (delq number wl-summary-buffer-target-mark-list))))
+ (forward-line 1))
+ (wl-summary-mark-as-unread mlist)
+ ;; closed
+ (when (setq mlist wl-summary-buffer-target-mark-list)
+ (wl-summary-mark-as-unread mlist)
+ (while mlist
+ (setq wl-summary-buffer-target-mark-list
+ (delq (car mlist) wl-summary-buffer-target-mark-list))
+ (setq mlist (cdr mlist)))))))
(defun wl-summary-target-mark-mark-as-important ()
(interactive)
(save-excursion
(goto-char (point-min))
- (let ((regexp (concat "^" wl-summary-buffer-number-regexp "\\(\\*\\)"))
- (inhibit-read-only t)
+ (let ((inhibit-read-only t)
(buffer-read-only nil)
+ wl-summary-buffer-disp-msg
number mlist)
- (while (re-search-forward regexp nil t)
- (let (wl-summary-buffer-disp-msg)
+ (while (not (eobp))
+ (when (string= (wl-summary-temp-mark) "*")
;; delete target-mark from buffer.
- (delete-region (match-beginning 1) (match-end 1))
+ (delete-backward-char 1)
(insert " ")
(setq number (wl-summary-mark-as-important))
(if wl-summary-highlight
(wl-highlight-summary-current-line))
(if number
(setq wl-summary-buffer-target-mark-list
- (delq number wl-summary-buffer-target-mark-list)))))
+ (delq number wl-summary-buffer-target-mark-list))))
+ (forward-line 1))
(setq mlist wl-summary-buffer-target-mark-list)
(while mlist
(wl-summary-mark-as-important (car mlist))
(setq wl-summary-buffer-target-mark-list
(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)))
+ (wl-summary-count-unread)
(wl-summary-update-modeline))))
(defun wl-summary-target-mark-save ()
(interactive)
- (save-excursion
- (goto-char (point-min))
- (let ((wl-save-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))
- (make-directory wl-save-dir))
- (while (re-search-forward regexp nil t)
- (let (wl-summary-buffer-disp-msg)
- (setq number (wl-summary-save t wl-save-dir))
- (wl-summary-unmark)
- (if number
- (setq wl-summary-buffer-target-mark-list
- (delq number wl-summary-buffer-target-mark-list))))))))
+ (let ((wl-save-dir
+ (wl-read-directory-name "Save to directory: "
+ wl-temporary-file-directory))
+ number)
+ (if (null (file-exists-p wl-save-dir))
+ (make-directory wl-save-dir))
+ (while (setq number (car wl-summary-buffer-target-mark-list))
+ (wl-thread-jump-to-msg number)
+ (wl-summary-save t wl-save-dir)
+ (wl-summary-unmark number))))
(defun wl-summary-target-mark-pick ()
(interactive)
(wl-summary-pick wl-summary-buffer-target-mark-list 'delete))
-(defun wl-summary-mark-as-read (&optional notcrosses
- leave-server-side-mark-untouched
- displayed
- number
- cached)
+(defun wl-summary-update-mark (&optional number)
+ "Synch up persistent mark of current line with msgdb's."
+ (let ((number (or number (wl-summary-message-number)))
+ buffer-read-only cur-mark)
+ (ignore-errors
+ (setq cur-mark
+ (elmo-message-mark wl-summary-buffer-elmo-folder number))
+ (save-excursion
+ ;; set mark on buffer
+ (unless (string= (wl-summary-persistent-mark) cur-mark)
+ (delete-backward-char 1)
+ (insert (or cur-mark " ")))
+ (when wl-summary-highlight
+ (wl-highlight-summary-current-line))))
+ (set-buffer-modified-p nil)))
+
+
+(defsubst wl-summary-mark-as-read-internal (inverse
+ number-or-numbers
+ no-folder-mark
+ no-modeline-update)
+ (save-excursion
+ (let ((inhibit-read-only t)
+ (buffer-read-only nil)
+ (folder wl-summary-buffer-elmo-folder)
+ (case-fold-search nil)
+ unread-message number
+ number-list mark visible new-mark)
+ (setq number-list (cond ((numberp number-or-numbers)
+ (setq unread-message
+ (member (elmo-message-mark
+ folder
+ number-or-numbers)
+ (elmo-msgdb-unread-marks)))
+ (list number-or-numbers))
+ ((and (not (null number-or-numbers))
+ (listp number-or-numbers))
+ number-or-numbers)
+ ((setq number (wl-summary-message-number))
+ ;; interactive
+ (setq unread-message
+ (member (elmo-message-mark folder number)
+ (elmo-msgdb-unread-marks)))
+ (list number))))
+ (if (null number-list)
+ (message "No message.")
+ (if inverse
+ (elmo-folder-unmark-read folder number-list no-folder-mark)
+ (elmo-folder-mark-as-read folder number-list no-folder-mark))
+ (dolist (number number-list)
+ (setq visible (wl-summary-jump-to-msg number)
+ new-mark (elmo-message-mark folder number))
+ (unless inverse
+ (when unread-message
+ (run-hooks 'wl-summary-unread-message-hook)))
+ ;; set mark on buffer
+ (when visible
+ (unless (string= (wl-summary-persistent-mark) (or new-mark " "))
+ (delete-backward-char 1)
+ (insert (or new-mark " ")))
+ (if (and visible wl-summary-highlight)
+ (wl-highlight-summary-current-line))
+ (set-buffer-modified-p nil)))
+ (unless no-modeline-update
+ ;; Update unread numbers.
+ ;; should elmo-folder-mark-as-read return unread numbers?
+ (wl-summary-count-unread)
+ (wl-summary-update-modeline)
+ (wl-folder-update-unread
+ (wl-summary-buffer-folder-name)
+ (+ wl-summary-buffer-unread-count
+ wl-summary-buffer-new-count)))))))
+
+(defun wl-summary-mark-as-read (&optional number-or-numbers
+ no-folder-mark
+ no-modeline-update)
(interactive)
+ (wl-summary-mark-as-read-internal nil
+ number-or-numbers
+ no-folder-mark
+ no-modeline-update))
+
+(defun wl-summary-mark-as-unread (&optional number-or-numbers
+ no-folder-mark
+ no-modeline-update)
+ (interactive)
+ (wl-summary-mark-as-read-internal 'inverse
+ number-or-numbers
+ no-folder-mark
+ no-modeline-update))
+
+(defsubst wl-summary-mark-as-answered-internal (inverse
+ number-or-numbers
+ no-modeline-update)
(save-excursion
- (let* (eol
- (inhibit-read-only t)
- (buffer-read-only nil)
- (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 stat visible uncached new-mark marked)
- (if number
- (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\\).*$"
- (regexp-quote wl-summary-read-uncached-mark)
- (regexp-quote wl-summary-unread-uncached-mark)
- (regexp-quote wl-summary-unread-cached-mark)
- (regexp-quote wl-summary-new-mark))))
- (progn
- (setq mark (or mark (wl-match-buffer 2)))
- (when mark
- (cond
- ((string= mark wl-summary-new-mark) ; N
- (setq stat 'new)
- (setq uncached t))
- ((string= mark wl-summary-unread-uncached-mark) ; U
- (setq stat 'unread)
- (setq uncached t))
- ((string= mark wl-summary-unread-cached-mark) ; !
- (setq stat 'unread))
- (t
- ;; no need to mark server.
- (setq leave-server-side-mark-untouched t))))
- (setq number (or number (string-to-int (wl-match-buffer 1))))
- ;; set server side mark...
- (setq new-mark (if (and uncached
- (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)
- (save-match-data
- (setq marked (elmo-folder-mark-as-read
- folder
- (list number)))))
- (if (or leave-server-side-mark-untouched
- marked)
- (progn
- (cond ((eq stat 'unread)
- (setq wl-summary-buffer-unread-count
- (1- wl-summary-buffer-unread-count)))
- ((eq stat 'new)
- (setq wl-summary-buffer-new-count
- (1- wl-summary-buffer-new-count))))
- (wl-summary-update-modeline)
- (wl-folder-update-unread
- (wl-summary-buffer-folder-name)
- (+ wl-summary-buffer-unread-count
- wl-summary-buffer-new-count))
- (when (or stat cached)
- (when visible
- (goto-char (match-end 2))
- (delete-region (match-beginning 2) (match-end 2))
- (insert (or new-mark " ")))
- (setq mark-alist
- (elmo-msgdb-mark-set mark-alist number new-mark))
- (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 mark (message "Warning: Changing mark failed.")))))
- (set-buffer-modified-p nil)
- (if stat
- (run-hooks 'wl-summary-unread-message-hook))
- number ;return value
- )))
+ (let ((inhibit-read-only t)
+ (buffer-read-only nil)
+ (folder wl-summary-buffer-elmo-folder)
+ (case-fold-search nil)
+ number number-list mark visible new-mark)
+ (setq number-list (cond ((numberp number-or-numbers)
+ (list number-or-numbers))
+ ((and (not (null number-or-numbers))
+ (listp number-or-numbers))
+ number-or-numbers)
+ ((setq number (wl-summary-message-number))
+ ;; interactive
+ (list number))))
+ (if (null number-list)
+ (message "No message.")
+ (if inverse
+ (elmo-folder-unmark-answered folder number-list)
+ (elmo-folder-mark-as-answered folder number-list))
+ (dolist (number number-list)
+ (setq visible (wl-summary-jump-to-msg number)
+ new-mark (elmo-message-mark folder number))
+ ;; set mark on buffer
+ (when visible
+ (unless (string= (wl-summary-persistent-mark) (or new-mark " "))
+ (delete-backward-char 1)
+ (insert (or new-mark " ")))
+ (if (and visible wl-summary-highlight)
+ (wl-highlight-summary-current-line))
+ (set-buffer-modified-p nil)))
+ (unless no-modeline-update
+ ;; Update unread numbers.
+ ;; should elmo-folder-mark-as-read return unread numbers?
+ (wl-summary-count-unread)
+ (wl-summary-update-modeline)
+ (wl-folder-update-unread
+ (wl-summary-buffer-folder-name)
+ (+ wl-summary-buffer-unread-count
+ wl-summary-buffer-new-count)))))))
+
+(defun wl-summary-mark-as-answered (&optional number-or-numbers
+ no-modeline-update)
+ (interactive)
+ (wl-summary-mark-as-answered-internal
+ (and (interactive-p)
+ (member (elmo-message-mark wl-summary-buffer-elmo-folder
+ (wl-summary-message-number))
+ (elmo-msgdb-answered-marks)))
+ number-or-numbers
+ no-modeline-update))
+
+(defun wl-summary-mark-as-unanswered (&optional number-or-numbers
+ no-modeline-update)
+ (wl-summary-mark-as-answered-internal 'inverse
+ number-or-numbers
+ no-modeline-update))
(defun wl-summary-mark-as-important (&optional number
mark
(inhibit-read-only t)
(buffer-read-only nil)
(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)
+ message-id visible cur-mark)
(if number
(progn
(setq visible (wl-summary-jump-to-msg number))
- (setq mark (or mark (cadr (assq number mark-alist)))))
+ (setq mark (or mark (elmo-message-mark
+ wl-summary-buffer-elmo-folder number))))
(setq visible t))
(when visible
(if (null (setq number (wl-summary-message-number)))
(setq visible nil))
(end-of-line)
(setq eol (point))
- (re-search-backward (concat "^" wl-summary-buffer-number-regexp
- "..../..") nil t)) ; set cursor line
- (beginning-of-line))
+ (wl-summary-goto-previous-message-beginning)))
(if (or (and (not visible)
- (assq number (elmo-msgdb-get-number-alist msgdb)))
- (re-search-forward "^ *\\(-?[0-9]+\\)[^0-9]\\([^0-9]\\)" eol t))
+ ;; already exists in msgdb.
+ (elmo-message-entity wl-summary-buffer-elmo-folder
+ number))
+ (setq cur-mark (wl-summary-persistent-mark)))
(progn
- (setq number (or number (string-to-int (wl-match-buffer 1))))
- (setq mark (or mark (wl-match-buffer 2)))
+ (setq number (or number (wl-summary-message-number)))
+ (setq mark (or mark cur-mark))
(setq message-id (elmo-message-field
wl-summary-buffer-elmo-folder
number
'message-id))
- (if (string= mark wl-summary-important-mark)
+ (if (string= mark elmo-msgdb-important-mark)
(progn
;; server side mark
(save-match-data
+ (elmo-folder-unmark-important folder (list number)
+ no-server-update)
(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)
(elmo-file-cache-delete
(elmo-file-cache-get-path message-id))))
(when visible
- (delete-region (match-beginning 2) (match-end 2))
- (insert " "))
- (setq mark-alist
- (elmo-msgdb-mark-set mark-alist
- number
- nil)))
+ (delete-backward-char 1)
+ (insert (or (elmo-message-mark folder number) " "))))
;; server side mark
- (save-match-data
- (unless no-server-update
- (elmo-folder-mark-as-important folder (list number))))
+ (elmo-folder-mark-as-important folder (list number)
+ no-server-update)
(when visible
- (delete-region (match-beginning 2) (match-end 2))
- (insert wl-summary-important-mark))
- (setq mark-alist
- (elmo-msgdb-mark-set mark-alist
- number
- wl-summary-important-mark))
+ (delete-backward-char 1)
+ (insert elmo-msgdb-important-mark))
(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))
(unless no-server-update
(elmo-msgdb-global-mark-set message-id
- wl-summary-important-mark)))
- (elmo-msgdb-set-mark-alist msgdb mark-alist)
- (wl-summary-set-mark-modified)))
+ elmo-msgdb-important-mark)))))
(if (and visible wl-summary-highlight)
- (wl-highlight-summary-current-line nil nil t))))
+ (wl-highlight-summary-current-line))))
(set-buffer-modified-p nil)
number)
-(defsubst wl-summary-format-date (date-string)
+;;; Summary line.
+(defvar wl-summary-line-formatter nil)
+
+(defun wl-summary-view-old-p ()
+ "Return non-nil when summary view cache has old format."
+ (save-excursion
+ (goto-char (point-min))
+ (and wl-summary-buffer-number-list
+ (not (re-search-forward "\r-?[0-9]+" (point-at-eol) t)))))
+
+(defun wl-summary-line-format-changed-p ()
+ "Return non-nil when summary line format is changed."
+ (not (string=
+ wl-summary-buffer-line-format
+ (or (elmo-object-load (expand-file-name
+ wl-summary-line-format-file
+ (elmo-folder-msgdb-path
+ wl-summary-buffer-elmo-folder))
+ wl-summary-buffer-mime-charset)
+ wl-summary-buffer-line-format))))
+
+(defun wl-summary-line-format-save ()
+ "Save current summary line format."
+ (elmo-object-save
+ (expand-file-name wl-summary-line-format-file
+ (elmo-folder-msgdb-path
+ wl-summary-buffer-elmo-folder))
+ wl-summary-buffer-line-format
+ wl-summary-buffer-mime-charset))
+
+(defun wl-summary-line-number ()
+ (wl-set-string-width
+ (- wl-summary-buffer-number-column)
+ (number-to-string
+ (elmo-msgdb-overview-entity-get-number wl-message-entity))))
+
+(defun wl-summary-line-year ()
+ (aref wl-datevec 0))
+(defun wl-summary-line-month ()
+ (format "%02d" (aref wl-datevec 1)))
+(defun wl-summary-line-day ()
+ (format "%02d" (aref wl-datevec 2)))
+(defun wl-summary-line-day-of-week ()
(condition-case nil
- (let ((datevec (timezone-fix-time date-string nil
- wl-summary-fix-timezone)))
- (format "%02d/%02d(%s)%02d:%02d"
- (aref datevec 1)
- (aref datevec 2)
- (elmo-date-get-week (aref datevec 0)
- (aref datevec 1)
- (aref datevec 2))
- (aref datevec 3)
- (aref datevec 4)))
- (error "??/??(??)??:??")))
-
-(defun wl-summary-create-line (entity parent temp-mark
- &optional
- thr-children-number
- thr-indent-string
- thr-linked)
- "Create a summary line."
- (let ((wl-mime-charset wl-summary-buffer-mime-charset)
- (elmo-mime-charset wl-summary-buffer-mime-charset)
- (folder wl-summary-buffer-elmo-folder)
- (number (elmo-msgdb-overview-entity-get-number entity))
- (thr-indent-string (or thr-indent-string ""))
- no-parent from subject parent-raw-subject parent-subject
- line mark
- (elmo-lang wl-summary-buffer-weekday-name-lang)
- (children-num (if thr-children-number
- (int-to-string thr-children-number))))
- (if (string= thr-indent-string "")
+ (elmo-date-get-week (aref wl-datevec 0)
+ (aref wl-datevec 1)
+ (aref wl-datevec 2))
+ (error "??")))
+(defun wl-summary-line-hour ()
+ (format "%02d" (aref wl-datevec 3)))
+(defun wl-summary-line-minute ()
+ (format "%02d" (aref wl-datevec 4)))
+
+(defun wl-summary-line-size ()
+ (let ((size (elmo-msgdb-overview-entity-get-size wl-message-entity)))
+ (if size
+ (cond
+ ((<= 1 (/ size 1048576))
+ (format "%.0fM" (/ size 1048576.0)))
+ ((<= 1 (/ size 1024))
+ (format "%.0fK" (/ size 1024.0)))
+ (t (format "%dB" size)))
+ "")))
+
+(defun wl-summary-line-subject ()
+ (let (no-parent subject parent-raw-subject parent-subject)
+ (if (string= wl-thr-indent-string "")
(setq no-parent t)) ; no parent
- (if (and wl-summary-indent-length-limit
- (< wl-summary-indent-length-limit
- (string-width thr-indent-string)))
- (setq thr-indent-string (wl-set-string-width
- wl-summary-indent-length-limit
- thr-indent-string)))
- (setq from
- (wl-set-string-width
- (if children-num
- (- 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)))))
(setq subject
(elmo-delete-char ?\n
(or (elmo-msgdb-overview-entity-get-subject
- entity)
+ wl-message-entity)
wl-summary-no-subject-message)))
(setq parent-raw-subject
- (elmo-msgdb-overview-entity-get-subject parent))
+ (elmo-msgdb-overview-entity-get-subject wl-parent-message-entity))
(setq parent-subject
(if parent-raw-subject
(elmo-delete-char ?\n parent-raw-subject)))
- (setq line
- (concat
- (format (concat "%"
- (int-to-string
- wl-summary-buffer-number-column)
- "s%s%s%s %s")
- number
- (or temp-mark " ")
- (setq mark (or (elmo-message-mark folder number) " "))
- (wl-summary-format-date
- (elmo-msgdb-overview-entity-get-date entity))
- (or thr-indent-string ""))
- (format (if thr-linked
- "<%s > %s"
- "[%s ] %s")
- (if children-num
- (concat "+" children-num ": " from)
- (concat " " from))
- (progn
- (setq subject
- (if (or no-parent
- (null parent-subject)
- (not (wl-summary-subject-equal
- subject parent-subject)))
- (wl-summary-subject-func-internal subject) ""))
- (if (and (not wl-summary-width)
- wl-summary-subject-length-limit)
- (truncate-string subject
- wl-summary-subject-length-limit)
- subject)))))
+ (if (or no-parent
+ (null parent-subject)
+ (not (wl-summary-subject-equal
+ subject parent-subject)))
+ (funcall wl-summary-subject-function subject)
+ "")))
+
+(defun wl-summary-line-from ()
+ (elmo-delete-char ?\n
+ (funcall wl-summary-from-function
+ (elmo-msgdb-overview-entity-get-from
+ wl-message-entity))))
+
+(defun wl-summary-line-list-info ()
+ (let ((list-info (wl-summary-get-list-info wl-message-entity)))
+ (if (car list-info)
+ (format (if (cdr list-info) "(%s %05.0f)" "(%s)")
+ (car list-info) (cdr list-info))
+ "")))
+
+(defun wl-summary-line-list-count ()
+ (let ((ml-count (cdr (wl-summary-get-list-info wl-message-entity))))
+ (if ml-count
+ (format "%.0f" ml-count)
+ "")))
+
+(defun wl-summary-line-attached ()
+ (let ((content-type (elmo-msgdb-overview-entity-get-extra-field
+ wl-message-entity "content-type"))
+ (case-fold-search t))
+ (if (and content-type
+ (string-match "multipart/mixed" content-type))
+ "@"
+ "")))
+
+(defun wl-summary-create-line (wl-message-entity
+ wl-parent-message-entity
+ wl-temp-mark
+ wl-persistent-mark
+ &optional
+ wl-thr-children-number
+ wl-thr-indent-string
+ wl-thr-linked)
+ "Create a summary line."
+ (let ((wl-mime-charset wl-summary-buffer-mime-charset)
+ (elmo-mime-charset wl-summary-buffer-mime-charset)
+ (elmo-lang wl-summary-buffer-weekday-name-lang)
+ (wl-datevec (or (ignore-errors (timezone-fix-time
+ (elmo-msgdb-overview-entity-get-date
+ wl-message-entity)
+ nil
+ wl-summary-fix-timezone))
+ (make-vector 5 0)))
+ (entity wl-message-entity) ; backward compatibility.
+ line mark)
+ (if (and wl-thr-indent-string
+ wl-summary-indent-length-limit
+ (< wl-summary-indent-length-limit
+ (string-width wl-thr-indent-string)))
+ (setq wl-thr-indent-string (wl-set-string-width
+ wl-summary-indent-length-limit
+ wl-thr-indent-string)))
+ (setq line (funcall wl-summary-buffer-line-formatter))
(if wl-summary-width (setq line
(wl-set-string-width
- (- wl-summary-width 1) line)))
+ (- wl-summary-width 1) line nil
+ 'ignore-invalid)))
+ (setq line (concat line
+ "\r"
+ (number-to-string
+ (elmo-msgdb-overview-entity-get-number
+ wl-message-entity))))
(if wl-summary-highlight
(wl-highlight-summary-line-string line
- mark
- temp-mark
- thr-indent-string))
+ wl-persistent-mark
+ wl-temp-mark
+ wl-thr-indent-string))
line))
-(defsubst wl-summary-buffer-number-column-detect (update)
- (let (end)
- (save-excursion
- (goto-char (point-min))
- (setq wl-summary-buffer-number-column
- (or
- (if (and update
- (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-default-number-column))
- (setq wl-summary-buffer-number-regexp
- (wl-repeat-string "." wl-summary-buffer-number-column)))))
-
(defsubst wl-summary-proc-wday (wday-str year month mday)
(save-match-data
(if (string-match "\\([A-Z][a-z][a-z]\\).*" wday-str)
(wl-match-string 1 wday-str)
(elmo-date-get-week year month mday))))
-(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))))))))
+(defvar wl-summary-move-spec-alist
+ '((new . ((t . nil)
+ (p . new)
+ (p . unread)
+ (p . important)))
+ (unread . ((t . nil)
+ (p . unread)
+ (p . important)))))
(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))))
+ wl-summary-move-spec-alist)))
(nums (memq num (if (eq direction 'up)
(reverse wl-summary-buffer-number-list)
wl-summary-buffer-number-list)))
- marked-list nums2)
+ flagged-list nums2)
(unless hereto (setq nums (cdr nums)))
(setq nums2 nums)
(if cur-spec
(while cur-spec
(setq nums nums2)
(cond ((eq (car (car cur-spec)) 'p)
- (if (setq marked-list
- (elmo-folder-list-messages-mark-match
+ (if (setq flagged-list
+ (elmo-folder-list-flagged
wl-summary-buffer-elmo-folder
(cdr (car cur-spec))))
(while nums
- (if (memq (car nums) marked-list)
+ (if (and (memq (car nums) flagged-list)
+ (elmo-message-accessible-p
+ wl-summary-buffer-elmo-folder
+ (car nums)))
(throw 'done (car nums)))
(setq nums (cdr nums)))))
((eq (car (car cur-spec)) 't)
(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))
+ (temp-list (copy-sequence wl-summary-buffer-temp-mark-list))
(tmp-buffer (get-buffer-create " *wl-summary-save-view-cache*"))
+ (temp-column wl-summary-buffer-temp-mark-column)
(charset wl-summary-buffer-mime-charset))
(if (file-directory-p dir)
(); ok.
(elmo-make-directory dir)))
(if (eq save-view 'thread)
(wl-thread-save-entity dir))
+ (when wl-summary-check-line-format
+ (wl-summary-line-format-save))
(unwind-protect
(progn
(when (file-writable-p cache)
(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)
+ (make-local-variable 'wl-summary-highlight)
+ (setq wl-summary-highlight nil
+ wl-summary-buffer-target-mark-list mark-list
+ wl-summary-buffer-temp-mark-list temp-list
+ wl-summary-buffer-temp-mark-column temp-column)
(wl-summary-delete-all-temp-marks 'no-msg)
- (encode-mime-charset-region
- (point-min) (point-max) charset)
+ (encode-coding-region
+ (point-min) (point-max)
+ (or (and wl-on-mule ; one in mcs-ltn1(apel<10.4) cannot take 2 arg.
+ (mime-charset-to-coding-system charset 'LF))
+ ;; Mule 2 doesn't have `*ctext*unix'.
+ (mime-charset-to-coding-system charset)))
(write-region-as-binary (point-min)(point-max)
cache nil 'no-msg)))
(when (file-writable-p view) ; 'thread or 'sequence
(wl-message-select-buffer wl-message-buffer)
(delete-window)
(select-window (get-buffer-window cur-buf))
+ (setq wl-message-buffer nil)
(run-hooks 'wl-summary-toggle-disp-off-hook))
;;; (switch-to-buffer cur-buf)
- )))))
+ )))
+ (when wl-summary-lazy-highlight
+ (wl-highlight-summary-window))))
(defun wl-summary-next-line-content ()
"Show next line of the message."
start-point
draft-buf)
(wl-summary-jump-to-msg (car mlist))
- (wl-summary-reply arg t)
- (goto-char (point-max))
- (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)
- (goto-char (point-max))
- (wl-draft-yank-original)
- (setq mlist (cdr mlist)))
- (goto-char start-point)
- (save-excursion
- (set-buffer summary-buf)
- (wl-summary-delete-all-temp-marks)))
- (run-hooks 'wl-mail-setup-hook)))
+ (when (wl-summary-reply arg t)
+ (goto-char (point-max))
+ (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)
+ (goto-char (point-max))
+ (wl-draft-yank-original)
+ (setq mlist (cdr mlist)))
+ (goto-char start-point)
+ (save-excursion
+ (set-buffer summary-buf)
+ (wl-summary-delete-all-temp-marks)))
+ (wl-draft-reply-position wl-draft-reply-default-position)
+ (run-hooks 'wl-mail-setup-hook))))
(defun wl-summary-reply-with-citation (&optional arg)
(interactive "P")
(when (wl-summary-reply arg t)
(goto-char (point-max))
(wl-draft-yank-original)
+ (wl-draft-reply-position wl-draft-reply-default-position)
(run-hooks 'wl-mail-setup-hook)))
(defun wl-summary-jump-to-msg-by-message-id (&optional id)
(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)))
+ (entity (elmo-message-entity wl-summary-buffer-elmo-folder msgid))
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)
+ (errmsg (format "No message with id \"%s\" in the folder." msgid)))
+ (if (setq msg (elmo-message-entity-number entity))
(progn
(wl-thread-jump-to-msg msg)
t)
(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\" <y/n/s(elect)>?"
+ (message "Search message in nntp server \"%s\" <y/n/s(elect)>? "
elmo-nntp-default-server)
- (setq schar (read-char))
+ (setq schar (let ((cursor-in-echo-area t)) (read-char)))
(cond ((eq schar ?y)
(wl-summary-jump-to-msg-by-message-id-via-nntp msgid))
((eq schar ?s)
msgid
(read-from-minibuffer "NNTP Server: ")))
(t
- (message errmsg)
+ (message "%s" errmsg)
nil)))
- (wl-summary-search-via-nntp
+ ((or (eq wl-summary-search-via-nntp 'force)
+ (and
+ (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder)
+ 'nntp)
+ wl-summary-search-via-nntp))
(wl-summary-jump-to-msg-by-message-id-via-nntp msgid))
(t
- (message errmsg)
+ (message "%s" errmsg)
nil))))))
(defun wl-summary-jump-to-msg-by-message-id-via-nntp (&optional id server-spec)
folder scan-type nil nil t)
(if msgid
(setq msg
- (car (rassoc msgid
- (elmo-msgdb-get-number-alist
- (wl-summary-buffer-msgdb))))))
+ (elmo-message-entity-number
+ (elmo-message-entity
+ wl-summary-buffer-elmo-folder
+ msgid))))
(setq entity (wl-folder-search-entity-by-name folder
wl-folder-entity
'folder))
(defun wl-summary-jump-to-parent-message (arg)
(interactive "P")
(let ((cur-buf (current-buffer))
+ (disp-msg wl-summary-buffer-disp-msg)
(number (wl-summary-message-number))
(regexp "\\(<[^<>]*>\\)[ \t]*$")
(i -1) ;; xxx
(setq msg-id
(if (null arg) (nth 0 ref-list) ;; previous
(if (<= arg i) (nth (1- arg) ref-list)
- (nth i ref-list)))))))
- (set-buffer cur-buf)
+ (nth i ref-list))))))
+ (set-buffer cur-buf)
+ (or disp-msg (wl-summary-toggle-disp-msg 'off)))
(cond ((and (null msg-id) (null msg-num))
(message "No parent message!")
nil)
((and msg-id (wl-summary-jump-to-msg-by-message-id msg-id))
- (wl-summary-redisplay)
+ (if wl-summary-buffer-disp-msg (wl-summary-redisplay))
(message "Searching parent message...done")
t)
((and msg-num (wl-summary-jump-to-msg msg-num))
- (wl-summary-redisplay)
+ (if wl-summary-buffer-disp-msg (wl-summary-redisplay))
(message "Searching parent message...done")
t)
(t ; failed.
(let ((folder wl-summary-buffer-elmo-folder)
(number (wl-summary-message-number))
(summary-buf (current-buffer))
+ (winconf (current-window-configuration))
mes-buf)
(when number
(save-excursion
(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)))
+ (condition-case err
+ (when (setq mes-buf (wl-message-get-original-buffer))
+ (wl-draft-reply mes-buf arg summary-buf number)
+ (wl-draft-reply-position wl-draft-reply-default-position)
+ (unless without-setup-hook
+ (run-hooks 'wl-mail-setup-hook)))
+ (error (set-window-configuration winconf)
+ (signal (car err)(cdr err))))
+ (with-current-buffer summary-buf
+ (elmo-folder-mark-as-answered folder (list number))
+ (wl-summary-update-mark number))
t)))
(defun wl-summary-write ()
(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
(if (wl-message-next-page)
(wl-summary-down t)))))
-(defun wl-summary-prev (&optional interactive)
- ""
- (interactive)
+(defsubst wl-summary-cursor-move-surface (downward interactive)
(if wl-summary-move-direction-toggle
- (setq wl-summary-move-direction-downward nil))
- (let ((skip-mark-regexp (mapconcat
- 'regexp-quote
- wl-summary-skip-mark-list ""))
- goto-next regex-list regex next-entity finfo)
- (beginning-of-line)
+ (setq wl-summary-move-direction-downward downward))
+ (let ((start (point))
+ (skip-tmark-regexp (wl-regexp-opt wl-summary-skip-mark-list))
+ (skip t)
+ (column (current-column))
+ skip-pmark-regexp goto-next next-entity finfo)
(if (elmo-folder-plugged-p wl-summary-buffer-elmo-folder)
- (setq regex (format "^%s[^%s]"
- wl-summary-buffer-number-regexp
- skip-mark-regexp))
- (setq regex (format "^%s[^%s]\\(%s\\|%s\\| \\)"
- wl-summary-buffer-number-regexp
- skip-mark-regexp
- (regexp-quote wl-summary-unread-cached-mark)
- (regexp-quote wl-summary-important-mark))))
- (unless (re-search-backward regex nil t)
- (setq goto-next t))
+ ()
+ (setq skip-pmark-regexp
+ (wl-regexp-opt (list " "
+ elmo-msgdb-unread-cached-mark
+ elmo-msgdb-important-mark))))
(beginning-of-line)
- (if (not goto-next)
- (progn
- (if wl-summary-buffer-disp-msg
- (wl-summary-redisplay)))
- (if (or interactive (interactive-p))
- (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
- (setq finfo (wl-folder-get-entity-info next-entity))))
- (wl-ask-folder
- '(lambda () (wl-summary-next-folder-or-exit next-entity))
- (format
- "No more messages. Type SPC to go to %s."
- (wl-summary-entity-info-msg next-entity finfo))))))))
+ (let (case-fold-search)
+ (while (and skip
+ (not (if downward (eobp) (bobp))))
+ (if downward
+ (forward-line 1)
+ (forward-line -1))
+ (setq skip (or (string-match skip-tmark-regexp
+ (save-excursion
+ (wl-summary-temp-mark)))
+ (and skip-pmark-regexp
+ (not (string-match
+ skip-pmark-regexp
+ (save-excursion
+ (wl-summary-persistent-mark)))))))))
+ (if (if downward (eobp) (and (bobp) skip)) (setq goto-next t))
+ (if (or (eobp) (and (bobp) skip))
+ (goto-char start))
+ (move-to-column column)
-(defun wl-summary-next (&optional interactive)
- ""
- (interactive)
- (if wl-summary-move-direction-toggle
- (setq wl-summary-move-direction-downward t))
- (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-elmo-folder)
- (setq regex (format "^%s[^%s]"
- wl-summary-buffer-number-regexp
- skip-mark-regexp))
- (setq regex (format "^%s[^%s]\\(%s\\|%s\\| \\)"
- wl-summary-buffer-number-regexp
- skip-mark-regexp
- (regexp-quote wl-summary-unread-cached-mark)
- (regexp-quote wl-summary-important-mark))))
- (unless (re-search-forward regex nil t)
- (forward-line 1)
- (setq goto-next t))
- (beginning-of-line)
(if (not goto-next)
(if wl-summary-buffer-disp-msg
(wl-summary-redisplay))
- (if (or interactive (interactive-p))
- (if wl-summary-buffer-next-folder-function
- (funcall wl-summary-buffer-next-folder-function)
+ (if interactive
+ (cond
+ ((and (not downward) wl-summary-buffer-prev-folder-function)
+ (funcall wl-summary-buffer-prev-folder-function))
+ ((and downward wl-summary-buffer-next-folder-function)
+ (funcall wl-summary-buffer-next-folder-function))
+ (t
(when wl-auto-select-next
- (setq next-entity (wl-summary-get-next-folder))
+ (setq next-entity
+ (if downward
+ (wl-summary-get-next-folder)
+ (wl-summary-get-prev-folder)))
(if next-entity
(setq finfo (wl-folder-get-entity-info next-entity))))
(wl-ask-folder
'(lambda () (wl-summary-next-folder-or-exit next-entity))
(format
"No more messages. Type SPC to go to %s."
- (wl-summary-entity-info-msg next-entity finfo))))))))
+ (wl-summary-entity-info-msg next-entity finfo)))))))))
+
+(defun wl-summary-prev (&optional interactive)
+ (interactive)
+ (wl-summary-cursor-move-surface nil (or interactive (interactive-p))))
+
+(defun wl-summary-next (&optional interactive)
+ (interactive)
+ (wl-summary-cursor-move-surface t (or interactive (interactive-p))))
(defun wl-summary-up (&optional interactive skip-no-unread)
""
(defsubst wl-summary-redisplay-internal (&optional folder number force-reload)
(interactive)
- (let* ((msgdb (wl-summary-buffer-msgdb))
- (folder (or folder wl-summary-buffer-elmo-folder))
+ (let* ((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)
- fld-buf fld-win thr-entity)
+ no-folder-mark fld-buf fld-win thr-entity)
(if (and wl-thread-open-reading-thread
(eq wl-summary-buffer-view 'thread)
(not (wl-thread-entity-get-opened
(if (setq fld-win (get-buffer-window fld-buf))
(delete-window fld-win)))
(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 no-folder-mark
+ ;; If cache is used, change folder-mark.
+ (if (wl-message-redisplay folder num
+ 'mime
+ (or
+ force-reload
+ (string= (elmo-folder-name-internal
+ folder)
+ wl-draft-folder)))
+ nil
+ ;; plugged, then leave folder-mark.
+ (if (and (not (elmo-folder-local-p
+ wl-summary-buffer-elmo-folder))
+ (elmo-folder-plugged-p
+ wl-summary-buffer-elmo-folder))
+ 'leave)))
+ (when (elmo-message-use-cache-p folder num)
+ (elmo-message-set-cached folder num t))
+ (ignore-errors
+ (if (member (elmo-message-mark wl-summary-buffer-elmo-folder
+ num)
+ (elmo-msgdb-unread-marks))
+ (wl-summary-mark-as-read num no-folder-mark)
+ (wl-summary-update-mark)))
(setq wl-summary-buffer-current-msg num)
(when wl-summary-recenter
(recenter (/ (- (window-height) 2) 2))
(wl-message-redisplay fld num 'as-is
(string= (elmo-folder-name-internal fld)
wl-draft-folder))
- (wl-summary-mark-as-read nil nil t)
+ (wl-summary-mark-as-read num)
(setq wl-summary-buffer-current-msg num)
(when wl-summary-recenter
(recenter (/ (- (window-height) 2) 2))
(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))
+ (wl-summary-mark-as-read num))
(setq wl-summary-buffer-current-msg num)
(when wl-summary-recenter
(recenter (/ (- (window-height) 2) 2))
(defun wl-summary-supersedes-message ()
"Supersede current message."
(interactive)
+ (wl-summary-toggle-disp-msg 'off)
(let ((summary-buf (current-buffer))
message-buf from)
(wl-summary-set-message-buffer-or-redisplay)
(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))))
- (elmo-msgdb-get-overview
- (wl-summary-buffer-msgdb)))))
+ (elmo-message-entity
+ wl-summary-buffer-elmo-folder
+ (wl-summary-message-number))))
(wl-ps-subject
(and entity
(or (elmo-msgdb-overview-entity-get-subject entity)
(wl-summary-unmark num))))))
(defun wl-summary-folder-info-update ()
- (let ((folder (elmo-string (wl-summary-buffer-folder-name)))
- (num-db (elmo-msgdb-get-number-alist
- (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)))))
+ (wl-folder-set-folder-updated
+ (elmo-string (wl-summary-buffer-folder-name))
+ (list 0
+ (+ wl-summary-buffer-unread-count
+ wl-summary-buffer-new-count)
+ (elmo-folder-length
+ wl-summary-buffer-elmo-folder))))
(defun wl-summary-get-original-buffer ()
"Get original buffer for the current summary."