(defvar wl-summary-buffer-saved-message nil)
(defvar wl-summary-buffer-prev-folder-func nil)
(defvar wl-summary-buffer-next-folder-func nil)
+(defvar wl-summary-buffer-next-message-func nil)
(defvar wl-summary-buffer-exit-func nil)
(defvar wl-summary-buffer-number-list nil)
(make-variable-buffer-local 'wl-thread-space-str-internal)
(make-variable-buffer-local 'wl-summary-buffer-prev-folder-func)
(make-variable-buffer-local 'wl-summary-buffer-next-folder-func)
+(make-variable-buffer-local 'wl-summary-buffer-next-message-func)
(make-variable-buffer-local 'wl-summary-buffer-exit-func)
(make-variable-buffer-local 'wl-summary-buffer-number-list)
(if wl-summary-buffer-disp-msg
(wl-summary-redisplay)))
-(defun wl-summary-collect-unread (mark-alist &optional folder)
- (let (mark ret-val)
- (while mark-alist
- (setq mark (cadr (car mark-alist)))
- (and mark
- (or (string= mark wl-summary-new-mark)
- (string= mark wl-summary-unread-uncached-mark)
- (string= mark wl-summary-unread-cached-mark))
- (setq ret-val (cons (car (car mark-alist)) ret-val)))
- (setq mark-alist (cdr mark-alist)))
- ret-val))
-
(defun wl-summary-count-unread (mark-alist &optional folder)
(let ((new 0)
(unread 0)
(cond
((and
(re-search-forward
- (concat "^\\($\\|[Cc]ontent-[Tt]ype:[ \t]+multipart/report\\)") nil t)
+ (concat "^\\($\\|[Cc]ontent-[Tt]ype:[ \t]+multipart/\\(report\\|mixed\\)\\)") nil t)
(not (bolp))
(re-search-forward "boundary=\"\\([^\"]+\\)\"" nil t))
(let ((boundary (buffer-substring (match-beginning 1) (match-end 1)))
(cond
((and (setq start (re-search-forward
(concat "^--" boundary "\n"
+ "\\([Cc]ontent-[Dd]escription:.*\n\\)?"
"[Cc]ontent-[Tt]ype:[ \t]+"
"\\(message/rfc822\\|text/rfc822-headers\\)\n"
"\\(.+\n\\)*\n") nil t))
wl-summary-buffer-unread-status))
(easy-menu-add wl-summary-mode-menu)
(when wl-summary-lazy-highlight
- (make-local-variable 'window-scroll-functions)
- (add-hook 'window-scroll-functions 'wl-highlight-summary-window))
+ (make-local-hook 'window-scroll-functions)
+ (add-hook 'window-scroll-functions 'wl-highlight-summary-window nil t))
;; 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))
(if (setq message-buf (get-buffer wl-message-buf-name))
(if (setq message-win (get-buffer-window message-buf))
(delete-window message-win)))
+ (if (and wl-summary-use-frame
+ (> (length (visible-frame-list)) 1))
+ (delete-frame))
(if (setq folder-buf (get-buffer wl-folder-buffer-name))
- (if (setq folder-win (get-buffer-window folder-buf))
- ;; folder win is already displayed.
- (select-window folder-win)
- ;; folder win is not displayed.
- (switch-to-buffer folder-buf))
+ (if wl-summary-use-frame
+ (let (select-frame)
+ (save-selected-window
+ (dolist (frame (visible-frame-list))
+ (select-frame frame)
+ (if (get-buffer-window folder-buf)
+ (setq select-frame frame))))
+ (if select-frame
+ (select-frame select-frame)
+ (switch-to-buffer folder-buf)))
+ (if (setq folder-win (get-buffer-window folder-buf))
+ ;; folder win is already displayed.
+ (select-window folder-win)
+ ;; folder win is not displayed.
+ (switch-to-buffer folder-buf)))
;; currently no folder buffer
(wl-folder))
(and wl-folder-move-cur-folder
(let* ((folder wl-summary-buffer-folder-name)
(cur-buf (current-buffer))
(msgdb wl-summary-buffer-msgdb)
-;;; (number-alist (elmo-msgdb-get-number-alist msgdb))
+ (number-alist (elmo-msgdb-get-number-alist msgdb))
(mark-alist (elmo-msgdb-get-mark-alist msgdb))
(malist mark-alist)
(inhibit-read-only t)
(case-fold-search nil)
msg mark)
(message "Setting all msgs as read...")
- (elmo-mark-as-read folder (wl-summary-collect-unread mark-alist)
+ (elmo-mark-as-read folder
+ (elmo-list-folder-unread
+ folder
+ number-alist
+ mark-alist
+ (list wl-summary-unread-cached-mark
+ wl-summary-unread-uncached-mark
+ wl-summary-new-mark))
msgdb)
(save-excursion
(goto-char (point-min))
(progn
(delete-region (match-beginning 0) (match-end 0))
(delete-char 1) ; delete '\n'
- )))
+ (setq wl-summary-buffer-number-list
+ (delq (car msgs) wl-summary-buffer-number-list)))))
(when (and deleting-info
(> len elmo-display-progress-threshold))
(setq i (1+ i))
(lambda (x) (elmo-msgdb-overview-entity-get-number x))
(elmo-msgdb-get-overview wl-summary-buffer-msgdb))))
+(defun wl-summary-auto-select-msg-p (unread-msg)
+ (and unread-msg
+ (not (string=
+ (cadr (assoc unread-msg
+ (elmo-msgdb-get-mark-alist
+ wl-summary-buffer-msgdb)))
+ wl-summary-important-mark))))
+
(defun wl-summary-goto-folder-subr (&optional folder scan-type other-window
sticky interactive scoring)
"Display target folder on summary."
(let ((case-fold-search nil)
(inhibit-read-only t)
(buffer-read-only nil))
+ ;; Load msgdb
+ (setq wl-summary-buffer-msgdb nil) ; new msgdb
+ (setq wl-summary-buffer-msgdb
+ (wl-summary-msgdb-load-async fld))
+ (if (null wl-summary-buffer-msgdb)
+ (setq wl-summary-buffer-msgdb
+ (elmo-msgdb-load (elmo-string fld))))
(erase-buffer)
- ;; resume summary cache
+ ;; Resume summary view
(if wl-summary-cache-use
(let* ((dir (elmo-msgdb-expand-path fld))
(cache (expand-file-name wl-summary-cache-file dir))
(wl-summary-load-file-object view)))
(if (eq wl-summary-buffer-view 'thread)
(wl-thread-resume-entity fld)
- (wl-summary-make-number-list))))
- ;; Load msgdb
- (setq wl-summary-buffer-msgdb nil) ; new msgdb
- (setq wl-summary-buffer-msgdb
- (wl-summary-msgdb-load-async fld))
- (if (null wl-summary-buffer-msgdb)
- (setq wl-summary-buffer-msgdb
- (elmo-msgdb-load (elmo-string fld))))
+ (wl-summary-make-number-list)))
+ (setq wl-summary-buffer-view
+ (wl-summary-load-file-object
+ (expand-file-name wl-summary-view-file
+ (elmo-msgdb-expand-path fld))))
+ (wl-summary-rescan))
(wl-summary-count-unread
(elmo-msgdb-get-mark-alist wl-summary-buffer-msgdb))
(wl-summary-update-modeline)))
(if (wl-summary-cursor-down t)
(let ((unreadp (wl-summary-next-message
(wl-summary-message-number)
- 'down nil)))
- (cond ((and wl-auto-select-first unreadp)
+ 'down t)))
+ (cond ((and wl-auto-select-first
+ (wl-summary-auto-select-msg-p unreadp))
+ ;; wl-auto-select-first is non-nil and
+ ;; unreadp is non-nil but not important
(setq retval 'disp-msg))
- ((not unreadp)
+ ((not (wl-summary-auto-select-msg-p unreadp))
+ ;; unreadp is nil or important
(setq retval 'more-next))))
(goto-char (point-max))
(if (elmo-folder-plugged-p folder)
(defun wl-summary-default-subject-filter (subject)
(let ((case-fold-search t))
- (setq subject (elmo-replace-in-string subject "[ \t]*\\(re\\|was\\):" ""))
+ (setq subject (elmo-replace-in-string subject "[ \t]*\\(re\\|was\\)[:>]" ""))
(setq subject (elmo-replace-in-string subject "[ \t]" ""))
(elmo-replace-in-string subject "^\\[.*\\]" "")))
(wl-match-string 1 wday-str)
(elmo-date-get-week year month mday))))
-(defvar wl-summary-move-spec-alist
- '((new . ((p . "\\(N\\|\\$\\)")
- (p . "\\(U\\|!\\)")
- (t . nil)))
- (unread . ((p . "\\(N\\|\\$\\|U\\|!\\)")
- (t . nil)))))
+(defvar wl-summary-move-spec-plugged-alist
+ (list (cons 'new (list (cons 't nil)
+ (cons 'p wl-summary-new-mark)
+ (cons 'p (wl-regexp-opt
+ (list wl-summary-unread-uncached-mark
+ wl-summary-unread-cached-mark)))
+ (cons 'p (regexp-quote wl-summary-important-mark))))
+ (cons 'unread (list (cons 't nil)
+ (cons 'p (wl-regexp-opt
+ (list wl-summary-new-mark
+ wl-summary-unread-uncached-mark
+ wl-summary-unread-cached-mark)))
+ (cons 'p (regexp-quote
+ wl-summary-important-mark))))))
+
+(defvar wl-summary-move-spec-unplugged-alist
+ (list (cons 'new (list (cons 't nil)
+ (cons 'p wl-summary-unread-cached-mark)
+ (cons 'p (regexp-quote wl-summary-important-mark))))
+ (cons 'unread (list (cons 't nil)
+ (cons 'p wl-summary-unread-cached-mark)
+ (cons 'p (regexp-quote
+ wl-summary-important-mark))))))
(defsubst wl-summary-next-message (num direction hereto)
- (let ((cur-spec (cdr (assq wl-summary-move-order
- 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)
- (unless hereto (setq nums (cdr nums)))
- (setq nums2 nums)
- (catch 'done
- (while cur-spec
- (setq nums nums2)
- (cond ((eq (car (car cur-spec)) 'p)
- (if (setq marked-list (elmo-msgdb-list-messages-mark-match
- wl-summary-buffer-msgdb
- (cdr (car cur-spec))))
- (while nums
- (if (memq (car nums) marked-list)
- (throw 'done (car nums)))
- (setq nums (cdr nums)))))
- ((eq (car (car cur-spec)) 't)
- (while nums
- (if (and wl-summary-buffer-target-mark-list
- (memq (car nums)
- wl-summary-buffer-target-mark-list))
- (throw 'done (car nums)))
- (setq nums (cdr nums)))))
- (setq cur-spec (cdr cur-spec))))))
+ (if wl-summary-buffer-next-message-func
+ (funcall wl-summary-buffer-next-message-func num direction hereto)
+ (let ((cur-spec (cdr (assq wl-summary-move-order
+ (if (elmo-folder-plugged-p
+ wl-summary-buffer-folder-name)
+ wl-summary-move-spec-plugged-alist
+ wl-summary-move-spec-unplugged-alist))))
+ (nums (memq num (if (eq direction 'up)
+ (reverse wl-summary-buffer-number-list)
+ wl-summary-buffer-number-list)))
+ marked-list nums2)
+ (unless hereto (setq nums (cdr nums)))
+ (setq nums2 nums)
+ (if cur-spec
+ (catch 'done
+ (while cur-spec
+ (setq nums nums2)
+ (cond ((eq (car (car cur-spec)) 'p)
+ (if (setq marked-list (elmo-msgdb-list-messages-mark-match
+ wl-summary-buffer-msgdb
+ (cdr (car cur-spec))))
+ (while nums
+ (if (memq (car nums) marked-list)
+ (throw 'done (car nums)))
+ (setq nums (cdr nums)))))
+ ((eq (car (car cur-spec)) 't)
+ (while nums
+ (if (and wl-summary-buffer-target-mark-list
+ (memq (car nums)
+ wl-summary-buffer-target-mark-list))
+ (throw 'done (car nums)))
+ (setq nums (cdr nums)))))
+ (setq cur-spec (cdr cur-spec))))
+ (car nums)))))
(defsubst wl-summary-cursor-move (direction hereto)
(when (and (eq direction 'up)
(let (num)
(when (setq num (wl-summary-next-message (wl-summary-message-number)
direction hereto))
- (wl-thread-jump-to-msg num)
+ (if (numberp num)
+ (wl-thread-jump-to-msg num))
t)))
;;
;; Goto unread or important
(nth 2 guess-list)) ; Newsgroups:
(setq flist nil)
(setq flist (cdr flist))))
- (if guess-list
- (progn
- (wl-draft (nth 0 guess-list) ; To:
- nil nil
- (nth 1 guess-list) ; Cc:
- nil
- (nth 2 guess-list)) ; Newsgroups:
- (run-hooks 'wl-mail-setup-hook))
-;;; (error "%s is not newsgroup" folder)
- (error "Can't guess by folder %s" folder)))))
+ (when (null guess-list)
+ (error "Can't guess by folder %s" folder))
+ (wl-draft (nth 0 guess-list) nil nil ; To:
+ (nth 1 guess-list) nil ; Cc:
+ (nth 2 guess-list)) ; Newsgroups:
+ (run-hooks 'wl-mail-setup-hook)
+ (mail-position-on-field "Subject"))))
(defun wl-summary-forward (&optional without-setup-hook)
""
(if (setq fld-win (get-buffer-window fld-buf))
(delete-window fld-win)))
(setq wl-current-summary-buffer (current-buffer))
- (if (wl-message-redisplay fld num 'mime msgdb force-reload)
+ (if (wl-message-redisplay fld num 'mime msgdb
+ (or force-reload
+ ;; if draft folder, force reload.
+ (string= fld wl-draft-folder)))
(wl-summary-mark-as-read nil
;; cached, then change server-mark.
(if wl-message-cache-used
(setq wl-summary-buffer-last-displayed-msg
wl-summary-buffer-current-msg)
(setq wl-current-summary-buffer (current-buffer))
- (wl-normal-message-redisplay fld num 'no-mime msgdb)
+ (wl-normal-message-redisplay fld num 'no-mime msgdb
+ ;; if draft folder, force reload.
+ (string= fld wl-draft-folder))
(wl-summary-mark-as-read nil nil t)
(setq wl-summary-buffer-current-msg num)
(when wl-summary-recenter
(setq wl-summary-buffer-last-displayed-msg
wl-summary-buffer-current-msg)
(setq wl-current-summary-buffer (current-buffer))
- (if (wl-message-redisplay fld num 'all-header msgdb); t if displayed.
+ (if (wl-message-redisplay fld num 'all-header msgdb
+ ;; if draft folder, force reload.
+ (string= fld wl-draft-folder))
(wl-summary-mark-as-read nil nil t))
(setq wl-summary-buffer-current-msg num)
(when wl-summary-recenter