(` (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-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-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-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)
-(defconst wl-summary-message-regexp "^ *-?[0-9]+"
- "Regexp for the message.")
-
(defvar wl-summary-shell-command-last "")
(defvar wl-ps-preprint-hook nil)
(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-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-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-msgdb)
(make-variable-buffer-local 'wl-summary-buffer-folder-name)
(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)
-;; internal functions (dummy)
-(unless (fboundp 'wl-summary-append-message-func-internal)
- (defun wl-summary-append-message-func-internal (entity msgdb update
- &optional force-insert)))
+(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-msgdb-overview-entity-get-to
+ wl-message-entity))
(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)
(wl-parse-addresses tos)
","))))
((setq ng (elmo-msgdb-overview-entity-get-extra-field
- entity "newsgroups"))
+ 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]
(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)
(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 ()
- (let ((pair
- (elmo-msgdb-count-marks (wl-summary-buffer-msgdb)
- wl-summary-new-mark
- (list wl-summary-unread-uncached-mark
- wl-summary-unread-cached-mark))))
+ (let ((lst (elmo-msgdb-count-marks (wl-summary-buffer-msgdb))))
(if (eq major-mode 'wl-summary-mode)
- (setq wl-summary-buffer-new-count (car pair)
- wl-summary-buffer-unread-count (cdr pair)))
- pair))
+ (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.
(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))
(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-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-summary-default-number-column))
(wl-line-formatter-setup
wl-summary-buffer-line-formatter
- (or (wl-get-assoc-list-value
- wl-folder-summary-line-format-alist
- (elmo-folder-name-internal folder))
- wl-summary-line-format)
+ (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))
(string< (elmo-msgdb-overview-entity-get-subject-no-decode x)
(elmo-msgdb-overview-entity-get-subject-no-decode y)))
+(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-msgdb-overview-entity-get-extra-field
+ entity "x-sequence")
+ ml-name (or (elmo-msgdb-overview-entity-get-extra-field
+ entity "x-ml-name")
+ (and sequence
+ (car (split-string sequence " "))))
+ ml-count (or (elmo-msgdb-overview-entity-get-extra-field
+ entity "x-mail-count")
+ (elmo-msgdb-overview-entity-get-extra-field
+ entity "x-ml-count")
+ (and sequence
+ (cadr (split-string sequence " ")))))
+ (and (setq subject (elmo-msgdb-overview-entity-get-subject
+ entity))
+ (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-msgdb-overview-entity-get-extra-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-msgdb-overview-entity-get-extra-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-msgdb-overview-entity-get-extra-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)
(wl-summary-rescan "date"))
(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."
(inhibit-read-only t)
(buffer-read-only nil)
expunged)
- (fset 'wl-summary-append-message-func-internal
- (wl-summary-get-append-message-func))
(erase-buffer)
(message "Re-scanning...")
(setq i 0)
(setq wl-summary-buffer-delete-list nil)
(setq 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)
+ (wl-summary-insert-message entity msgdb nil)
(setq curp (cdr curp))
(when (> num elmo-display-progress-threshold)
(setq i (+ i 1))
(caar wl-summary-delayed-update)
(elmo-msgdb-overview-entity-get-number
(cdar wl-summary-delayed-update)))
- (wl-summary-append-message-func-internal
+ (wl-summary-insert-message
(cdar wl-summary-delayed-update) msgdb nil t)
(setq wl-summary-delayed-update (cdr wl-summary-delayed-update))))
(message "Constructing summary structure...done")
(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-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 ()
(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? ")
+ (if (y-or-n-p (format "Execute remaining marks in %s? "
+ (wl-summary-buffer-folder-name)))
(progn
(wl-summary-exec)
(if (or wl-summary-buffer-refile-list
(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)))
(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)
+ (wl-message-entity ov)
+ (entity ov) ; backward compatibility.
(size (elmo-msgdb-overview-entity-get-size ov))
(inhibit-read-only t)
(buffer-read-only nil)
(file-cached (elmo-file-cache-exists-p message-id))
(force-read (and size
- (or (null wl-prefetch-threshold)
+ (or (and (null wl-prefetch-confirm) arg)
+ (null wl-prefetch-threshold)
(< size wl-prefetch-threshold))))
mark new-mark)
(unwind-protect
(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)))
- (elmo-msgdb-set-mark msgdb number new-mark)
- (or new-mark (setq new-mark " "))
- (wl-summary-set-mark-modified)
+ (or (elmo-message-mark wl-summary-buffer-elmo-folder
+ number)
+ " "))
(wl-summary-update-modeline)
(wl-folder-update-unread
(wl-summary-buffer-folder-name)
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)
(interactive "r")
(let ((count 0)
(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-summary-prefetch))
(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))
"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)))))
+ (let ((inhibit-read-only t)
+ (buffer-read-only nil)
+ (mark (wl-summary-persistent-mark)))
+ (setq mark (wl-summary-prefetch-msg (wl-summary-message-number) arg))
+ (when mark
+ (delete-backward-char 1)
+ (insert mark)
+ (if wl-summary-highlight
+ (wl-highlight-summary-current-line)))
+ (set-buffer-modified-p nil)
+ mark)))
(defun wl-summary-delete-marks-on-buffer (marks)
(while marks
(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-message-regexp "\\([^ 0-9]\\)" )))
- (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))))))
-
-;; Does not work correctly...
+ (buffer-read-only nil))
+ (while (not (eobp))
+ (unless (string= (wl-summary-temp-mark) " ")
+ (delete-backward-char 1)
+ (insert " "))
+ (forward-line 1)))))
+
(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
children)
(if (wl-thread-entity-get-opened entity)
;; opened...mark line.
- ;; Crossposts are not processed
- (wl-summary-mark-as-read t)
+ (wl-summary-mark-as-read number)
;; closed
- (wl-summary-mark-as-read t) ; mark itself.
+ (wl-summary-mark-as-read number) ; mark itself.
(setq children (wl-thread-get-children-msgs number))
(while children
- (wl-summary-mark-as-read t nil nil (car children))
+ (wl-summary-mark-as-read (car children))
(setq children (cdr children))))
(forward-line 1))))
(while (not (eobp))
- (wl-summary-mark-as-read t)
+ (wl-summary-mark-as-read (wl-summary-message-number))
(forward-line 1)))))
(wl-summary-count-unread)
(wl-summary-update-modeline))
(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 " ")
- (elmo-msgdb-set-mark msgdb msg nil))
- ;; New mark and unread-uncached mark
- (insert wl-summary-read-uncached-mark)
- (elmo-msgdb-set-mark
- msgdb msg 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)))))
- (elmo-folder-replace-marks
- folder
- (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)))
- (wl-summary-set-mark-modified)
+ (wl-highlight-summary-current-line nil nil t)))
+ (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)
(msgdb (wl-summary-buffer-msgdb))
(number-alist (elmo-msgdb-get-number-alist msgdb))
(case-fold-search nil)
- mark number unread new-mark)
- (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)))
- (elmo-msgdb-set-mark msgdb number new-mark)
- (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 nil nil t))
+ (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))
- (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 (elmo-msgdb-get-field msgdb msg 'message-id))
+ (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)
- (elmo-msgdb-set-mark msgdb msg
- (if (string= set-mark " ") nil set-mark))
(if wl-summary-highlight
- (wl-highlight-summary-current-line))))
- (wl-summary-set-mark-modified)
+ (wl-highlight-summary-current-line)))
+ (forward-line 1))
(wl-summary-count-unread)
(wl-summary-update-modeline)
(message "Resuming cache status...done")
(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)))))
(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-message-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))))))
+ 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-get-delete-folder (folder)
(if (string= folder wl-trash-folder)
(error "Trash Folder is not created"))))
wl-trash-folder)))))
-(defun wl-summary-get-append-message-func ()
+(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-entity 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."
(interactive)
(let ((last-progress 0)
+ (folder wl-summary-buffer-elmo-folder)
(i 0)
- unread-marks importants unreads
+ importants unreads
importants-in-db unreads-in-db diff diffs
mes progress)
;; synchronize marks.
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)
- importants-in-db (elmo-folder-list-messages-mark-match
+ (setq importants-in-db (elmo-folder-list-messages-mark-match
wl-summary-buffer-elmo-folder
- (regexp-quote wl-summary-important-mark))
+ (regexp-quote elmo-msgdb-important-mark))
unreads-in-db (elmo-folder-list-messages-mark-match
wl-summary-buffer-elmo-folder
- (wl-regexp-opt unread-marks))
- importants (elmo-folder-list-importants
- wl-summary-buffer-elmo-folder
- wl-summary-important-mark)
+ (wl-regexp-opt (elmo-msgdb-unread-marks)))
+ 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))
+ wl-summary-buffer-elmo-folder))
(setq diff (elmo-list-diff importants importants-in-db))
(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
(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-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)))))
(buffer-read-only nil)
gc-message
overview number-alist
- curp num i new-msgdb
+ 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))
; (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...")
+ (wl-summary-delete-messages-on-buffer
+ delete-list "Deleting...")
(message "Deleting...done"))
- (when new-msgdb
- (wl-summary-replace-status-marks
- wl-summary-new-mark
- wl-summary-unread-uncached-mark))
- (setq append-list (elmo-msgdb-get-overview new-msgdb))
+ (wl-summary-update-status-marks)
(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 wl-summary-delayed-update nil)
(elmo-kill-buffer wl-summary-search-buf-name)
(while curp
- (setq entity (car curp))
+ (setq entity (elmo-msgdb-overview-get-entity
+ (car curp) (elmo-folder-msgdb folder)))
(when (setq update-thread
- (wl-summary-append-message-func-internal
+ (wl-summary-insert-message
entity (elmo-folder-msgdb folder)
(not sync-all)))
(wl-append update-top-list update-thread))
(setq i (+ i 1))
(if (or (zerop (% i 5)) (= i num))
(elmo-display-progress
- 'wl-summary-sync-update "Updating thread..."
+ '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
(elmo-msgdb-overview-entity-get-number
(cdar wl-summary-delayed-update)))
(when (setq update-thread
- (wl-summary-append-message-func-internal
+ (wl-summary-insert-message
(cdar wl-summary-delayed-update)
(elmo-folder-msgdb folder)
(not sync-all) t))
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))
+ (message (if (eq wl-summary-buffer-view 'thread)
+ "Making thread...done"
+ "Inserting message...done")))
(wl-summary-set-message-modified)
- (wl-summary-set-mark-modified)
(when (and sync-all (eq wl-summary-buffer-view 'thread))
(elmo-kill-buffer wl-summary-search-buf-name)
- (message "Inserting thread...")
- (setq wl-thread-entity-cur 0)
+ (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
(wl-folder-set-folder-updated
(elmo-folder-name-internal folder)
(list 0
- (let ((pair (wl-summary-count-unread)))
- (+ (car pair) (cdr pair)))
+ (let ((lst (wl-summary-count-unread)))
+ (+ (car lst) (nth 1 lst)))
(elmo-folder-messages folder)))
(wl-summary-update-modeline)
;;
(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 nil nil t))
+ (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))
dels)
;;; (elmo-msgdb-save (wl-summary-buffer-folder-name) nil)
(wl-summary-set-message-modified)
- (wl-summary-set-mark-modified)
(wl-folder-set-folder-updated (wl-summary-buffer-folder-name)
(list 0 0 0))
;;; for thread.
wl-summary-buffer-target-mark-list
wl-summary-buffer-elmo-folder
wl-summary-buffer-number-column
+ 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
(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))
+ (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
(elmo-msgdb-get-mark
(wl-summary-buffer-msgdb)
unread-msg)
- wl-summary-important-mark))))
+ 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
(wl-summary-update-modeline)))
(unless (eq wl-summary-buffer-view 'thread)
(wl-summary-make-number-list))
+ (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)
;; 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))
(defun wl-summary-goto-previous-message-beginning ()
(end-of-line)
- (re-search-backward wl-summary-message-regexp nil t)
+ (re-search-backward "\r\\(-?[0-9]+\\)" nil t)
(beginning-of-line))
(defun wl-summary-goto-top-of-current-thread ()
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-msgdb-get-mark
+ msgdb
+ (elmo-msgdb-overview-entity-get-number
+ entity))))
+ (setq wl-summary-buffer-number-list
+ (wl-append wl-summary-buffer-number-list
+ (list (elmo-msgdb-overview-entity-get-number entity))))
+ nil))
(defun wl-summary-default-subject-filter (subject)
(let ((case-fold-search t))
wl-summary-alike-hashtb)))
(defun wl-summary-insert-headers (overview func mime-decode)
+ (message "Creating subject cache...")
(let (ov this last alike)
(buffer-disable-undo (current-buffer))
(make-local-variable 'wl-summary-alike-hashtb)
elmo-mime-charset)
(when (eq mime-decode 'mime)
(eword-decode-region (point-min) (point-max))))
+ (message "Creating subject cache...done")
(run-hooks 'wl-summary-insert-headers-hook)))
(defun wl-summary-search-by-subject (entity overview)
(let* ((this-id (elmo-msgdb-overview-entity-get-id entity))
(overview-entity entity)
(parent-id (elmo-msgdb-overview-entity-get-id parent-entity))
- (parent-number (elmo-msgdb-overview-entity-get-number parent-entity))
- summary-line msg subject-differ)
+ (number (elmo-msgdb-overview-entity-get-number entity))
+ (parent-number (elmo-msgdb-overview-entity-get-number parent-entity)))
(cond
((or (not parent-id)
(string= this-id parent-id))
entity
parent-entity
nil
- (wl-thread-maybe-get-children-num msg)
+ (elmo-msgdb-get-mark (wl-summary-buffer-msgdb) 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-mark-as-unread (&optional number
- no-server-update
+ no-folder-mark
no-modeline-update)
(interactive)
(save-excursion
- (let* (eol
- (inhibit-read-only t)
- (buffer-read-only nil)
+ (let ((buffer-read-only nil)
(folder wl-summary-buffer-elmo-folder)
- (msgdb (wl-summary-buffer-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 (elmo-msgdb-get-mark msgdb number))
- (setq mark " ")))
- ;; interactive
- (setq visible t))
+ mark new-mark visible)
+ (setq visible (if number
+ (wl-summary-jump-to-msg number)
+ t)
+ number (or number (wl-summary-message-number))
+ mark (elmo-message-mark folder number))
+ (unless (member mark (elmo-msgdb-unread-marks))
+ (elmo-folder-unmark-read folder (list number) no-folder-mark))
+ (setq new-mark (elmo-message-mark folder number))
+ (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)))
(when visible
- (if (null (wl-summary-message-number))
- (message "No message.")
- (end-of-line)
- (setq eol (point))
- (wl-summary-goto-previous-message-beginning)))
- (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))
- (elmo-msgdb-set-mark msgdb number new-mark)
- (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))
+ (unless (string= (wl-summary-persistent-mark) 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)))
+ number)))
(defun wl-summary-delete (&optional number)
- "Mark Delete mark 'D'.
+ "Mark a delete mark 'D'.
If optional argument NUMBER is specified, mark message specified by NUMBER."
(interactive)
(let* ((buffer-num (wl-summary-message-number))
sol eol rs re)
(beginning-of-line)
(setq sol (point))
- (end-of-line)
+ (search-forward "\r")
+ (forward-char -1)
(setq eol (point))
(setq rs (next-single-property-change sol 'wl-summary-destination
buf eol))
(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)
+ (while (not (eobp))
+ (when (string= (wl-summary-temp-mark) mark)
(setq msglist (cons (wl-summary-message-number) msglist)))
- (nreverse msglist)))))))
+ (forward-line 1)))))))
(defun wl-summary-exec ()
(interactive)
(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)
(not (null (cdr dst-msgs)))
nil ; no-delete
nil ; same-number
- unread-marks
t))
(error nil))
(if result ; succeeded.
(not (null (cdr dst-msgs)))
t ; t is no-delete (copy)
nil ; same number
- unread-marks
t))
(error nil))
(if result ; succeeded.
;; 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)
len rs re c)
(setq len (string-width folder))
(if (< len 1) ()
- (end-of-line)
+ ;;(end-of-line)
+ (beginning-of-line)
+ (search-forward "\r")
+ (forward-char -1)
(setq re (point))
(setq c 0)
(while (< c len)
(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))
+ (when visible
+ (setq cur-mark (wl-summary-temp-mark))
(if (string= cur-mark " ")
()
- (delete-region (match-beginning 2) (match-end 2))
+ (delete-backward-char 1)
+ (or number
+ (setq number (wl-summary-message-number)))
(if (setq score-mark (wl-summary-get-score-mark number))
(insert score-mark)
(insert " ")))
(if wl-summary-highlight
(wl-highlight-summary-current-line nil nil score-mark))
(set-buffer-modified-p nil))
- ;; Remove from temporary mark structure.
+ ;; Remove from temporal mark structure.
(and number
(wl-summary-delete-mark number)))))
(defun wl-summary-refile-region (beg end)
- "Put copy mark on messages in the region specified by BEG and END."
+ "Put refile mark on messages in the region specified by BEG and END."
(interactive "r")
(wl-summary-refile-region-subr "refile" beg end))
(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)
+ (while (not (eobp))
+ (when (string= (wl-summary-temp-mark) mark)
(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)))))
+ (forward-line 1))
+ (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."
(message "Unmarking..."))
(while (not (eobp))
(wl-summary-unmark)
- (forward-line))
+ (forward-line 1))
(unless no-msg
(message "Unmarking...done"))
(setq wl-summary-buffer-target-mark-list nil)
(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."
(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))))
+ (buffer-read-only nil))
+ (wl-summary-temp-mark) ; mark
+ (delete-backward-char 1)
+ (insert mark)
+ (if wl-summary-highlight
+ (wl-highlight-summary-current-line nil nil t))
+ (set-buffer-modified-p nil))))
(defun wl-summary-target-mark-delete ()
(interactive)
(save-excursion
(goto-char (point-min))
- (let ((regexp (concat wl-summary-message-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)))))
+ (let (number mlist)
+ (while (not (eobp))
+ (when (string= (wl-summary-temp-mark) "*")
+ (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)))))
+ (forward-line 1))
(setq mlist wl-summary-buffer-target-mark-list)
(while mlist
(wl-append wl-summary-buffer-delete-list (list (car mlist)))
(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))
+ (wl-summary-persistent-mark) ; move
+ (delete-backward-char 1)
(insert new-mark)
(if wl-summary-highlight
(wl-highlight-summary-current-line))
(intern (format "wl-summary-buffer-%s-list" copy-or-refile)))
(function
(intern (format "wl-summary-%s" copy-or-refile)))
+ (numlist wl-summary-buffer-number-list)
regexp number msgid entity folder mlist)
(save-excursion
- (goto-char (point-min))
- (setq regexp (concat wl-summary-message-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))))
+ (while numlist
+ (if (memq (car numlist) wl-summary-buffer-target-mark-list)
+ (setq number (car numlist)
+ numlist nil))
+ (setq numlist (cdr numlist)))
+ (when number
+ (setq msgid (elmo-message-field wl-summary-buffer-elmo-folder
+ number 'message-id)
+ entity (elmo-msgdb-overview-get-entity
+ number (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)))))
+ (setq folder (wl-summary-read-folder
+ (wl-refile-guess entity)
+ (format "for %s" copy-or-refile)))
+ (goto-char (point-min))
+ (while (not (eobp))
+ (when (string= (wl-summary-temp-mark) "*")
+ (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)))))
+ (forward-line 1))
;; process invisible messages.
(setq mlist wl-summary-buffer-target-mark-list)
(while mlist
(interactive)
(save-excursion
(goto-char (point-min))
- (let ((regexp (concat wl-summary-message-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))
+ (wl-summary-mark-as-read 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)))))
+ (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-read t nil nil (car mlist))
+ (wl-summary-mark-as-read (car mlist))
(setq wl-summary-buffer-target-mark-list
(delq (car mlist) wl-summary-buffer-target-mark-list))
(setq mlist (cdr mlist)))
(interactive)
(save-excursion
(goto-char (point-min))
- (let ((regexp (concat wl-summary-message-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))
(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-unread (car mlist))
(interactive)
(save-excursion
(goto-char (point-min))
- (let ((regexp (concat wl-summary-message-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))
(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-message-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-mark-as-read (&optional number
+ no-folder-mark
+ 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))
-;;; (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 (elmo-msgdb-get-mark msgdb number)))
- ;; 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 " ")))
- (elmo-msgdb-set-mark msgdb number new-mark)
- (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
+ (let ((buffer-read-only nil)
+ (folder wl-summary-buffer-elmo-folder)
+ (msgdb (wl-summary-buffer-msgdb))
+ (case-fold-search nil)
+ mark visible new-mark)
+ (setq visible (if number
+ (wl-summary-jump-to-msg number)
+ ;; interactive
+ t)
+ number (or number (wl-summary-message-number))
+ mark (elmo-message-mark folder number))
+ (when (member mark (elmo-msgdb-unread-marks))
+ ;; folder mark.
+ (elmo-folder-mark-as-read folder (list number) no-folder-mark))
+ (setq new-mark (elmo-message-mark folder number))
+ (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)))
+ ;; set mark on buffer
+ (when visible
+ (unless (string= (wl-summary-persistent-mark) new-mark)
+ (delete-backward-char 1)
+ (insert (or new-mark " ")))
+ (if (and visible wl-summary-highlight)
+ (wl-highlight-summary-current-line nil nil t))
+ (set-buffer-modified-p nil))
+ (if (member mark (elmo-msgdb-unread-marks))
(run-hooks 'wl-summary-unread-message-hook))
number ;return value
)))
(folder wl-summary-buffer-elmo-folder)
(msgdb (wl-summary-buffer-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 eol (point))
(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-msgdb-overview-get-entity number msgdb))
+ (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-file-cache-delete
(elmo-file-cache-get-path message-id))))
(when visible
- (delete-region (match-beginning 2) (match-end 2))
+ (delete-backward-char 1)
(insert " "))
(elmo-msgdb-set-mark msgdb number nil))
;; server side mark
(unless no-server-update
(elmo-folder-mark-as-important folder (list number))))
(when visible
- (delete-region (match-beginning 2) (match-end 2))
- (insert wl-summary-important-mark))
+ (delete-backward-char 1)
+ (insert elmo-msgdb-important-mark))
(elmo-msgdb-set-mark msgdb number
- wl-summary-important-mark)
+ 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)))
- (wl-summary-set-mark-modified)))
+ elmo-msgdb-important-mark)))))
(if (and visible wl-summary-highlight)
(wl-highlight-summary-current-line nil nil t))))
(set-buffer-modified-p nil)
;;; Summary line.
(defvar wl-summary-line-formatter nil)
-(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)
+(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-day ()
(format "%02d" (aref wl-datevec 2)))
(defun wl-summary-line-day-of-week ()
- (elmo-date-get-week (aref wl-datevec 0)
- (aref wl-datevec 1)
- (aref wl-datevec 2)))
+ (condition-case nil
+ (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-open-bracket ()
- (if wl-thr-linked "<" "["))
-(defun wl-summary-line-close-bracket ()
- (if wl-thr-linked ">" "]"))
-(defun wl-summary-line-children-number ()
- (if wl-thr-children-number
- (concat "+" (int-to-string wl-thr-children-number) ":")
- ""))
-(defun wl-summary-line-thread-indent ()
- (or wl-thr-indent-string ""))
(defun wl-summary-line-size ()
(let ((size (elmo-msgdb-overview-entity-get-size wl-message-entity)))
(t (format "%dB" size)))
"")))
+(defvar wl-summary-line-subject-minimum-length nil)
(defun wl-summary-line-subject ()
(let (no-parent subject parent-raw-subject parent-subject)
(if (string= wl-thr-indent-string "")
subject parent-subject)))
(funcall wl-summary-subject-function subject)
""))
+ (when (and wl-summary-line-subject-minimum-length
+ (< (string-width subject)
+ wl-summary-line-subject-minimum-length))
+ (while (< (string-width subject)
+ wl-summary-line-subject-minimum-length)
+ (setq subject (concat subject " "))))
(if (and (not wl-summary-width)
wl-summary-subject-length-limit)
- (truncate-string subject
+ (truncate-string subject
wl-summary-subject-length-limit)
subject)))
(elmo-msgdb-overview-entity-get-from
wl-message-entity))))
-(defun wl-summary-line-children-and-from ()
- (concat
- (wl-summary-line-children-number) " "
- (wl-summary-line-from)))
+(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 %05d)" "(%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
- temp-mark
+ wl-temp-mark
+ wl-persistent-mark
&optional
wl-thr-children-number
wl-thr-indent-string
(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 (timezone-fix-time
- (elmo-msgdb-overview-entity-get-date
- wl-message-entity)
- nil
- wl-summary-fix-timezone))
+ (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-summary-indent-length-limit
+ (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
- (concat
- (format
- (concat "%"
- (number-to-string wl-summary-buffer-number-column)
- "s%s%s")
- (number-to-string
- (elmo-msgdb-overview-entity-get-number wl-message-entity))
- (or temp-mark " ")
- (setq mark
- (or (elmo-msgdb-get-mark
- (wl-summary-buffer-msgdb)
- (elmo-msgdb-overview-entity-get-number
- wl-message-entity))
- " ")))
- (funcall wl-summary-buffer-line-formatter)))
+ (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
+ wl-persistent-mark
+ wl-temp-mark
wl-thr-indent-string))
line))
(defvar wl-summary-move-spec-plugged-alist
(` ((new . ((t . nil)
- (p . (, wl-summary-new-mark))
+ (p . (, elmo-msgdb-new-mark))
(p . (, (wl-regexp-opt
- (list wl-summary-unread-uncached-mark
- wl-summary-unread-cached-mark))))
- (p . (, (regexp-quote wl-summary-important-mark)))))
+ (list elmo-msgdb-unread-uncached-mark
+ elmo-msgdb-unread-cached-mark))))
+ (p . (, (regexp-quote elmo-msgdb-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))))))))
+ (list elmo-msgdb-new-mark
+ elmo-msgdb-unread-uncached-mark
+ elmo-msgdb-unread-cached-mark))))
+ (p . (, (regexp-quote elmo-msgdb-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)))))
+ (p . (, elmo-msgdb-unread-cached-mark))
+ (p . (, (regexp-quote elmo-msgdb-important-mark)))))
(unread . ((t . nil)
- (p . (, wl-summary-unread-cached-mark))
- (p . (, (regexp-quote wl-summary-important-mark))))))))
+ (p . (, elmo-msgdb-unread-cached-mark))
+ (p . (, (regexp-quote elmo-msgdb-important-mark))))))))
(defsubst wl-summary-next-message (num direction hereto)
(if wl-summary-buffer-next-message-function
(copy-list (copy-sequence wl-summary-buffer-copy-list))
(delete-list (copy-sequence wl-summary-buffer-delete-list))
(tmp-buffer (get-buffer-create " *wl-summary-save-view-cache*"))
+ (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
+ (make-local-variable 'wl-summary-highlight)
+ (setq wl-summary-highlight nil
+ wl-summary-buffer-target-mark-list mark-list
wl-summary-buffer-refile-list refile-list
wl-summary-buffer-copy-list copy-list
- wl-summary-buffer-delete-list delete-list)
- (wl-summary-delete-all-temp-marks 'no-msg)
- (encode-mime-charset-region
- (point-min) (point-max) charset)
+ wl-summary-buffer-delete-list delete-list
+ wl-summary-buffer-temp-mark-column temp-column)
+ (wl-summary-delete-all-temp-marks)
+ (encode-coding-region
+ (point-min) (point-max)
+ (or (and wl-on-mule ; one in mcs-ltn1 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
(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.
(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)
+ 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-message-regexp
- skip-mark-regexp))
- (setq regex (format "%s[^%s]\\(%s\\|%s\\| \\)"
- wl-summary-message-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))
- (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))))))))
+ ()
+ (setq skip-pmark-regexp
+ (wl-regexp-opt (list " "
+ elmo-msgdb-unread-cached-mark
+ elmo-msgdb-important-mark))))
+ (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))
-(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-message-regexp
- skip-mark-regexp))
- (setq regex (format "%s[^%s]\\(%s\\|%s\\| \\)"
- wl-summary-message-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 interactive
(if wl-summary-buffer-next-folder-function
(funcall wl-summary-buffer-next-folder-function)
(when wl-auto-select-next
- (setq next-entity (wl-summary-get-next-folder))
+ (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
"No more messages. Type SPC to go to %s."
(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)
""
(interactive)
(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)))
+ (if (elmo-message-use-cache-p folder num)
+ (elmo-message-set-cached folder num t))
+ (wl-summary-mark-as-read num no-folder-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))