X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=wl%2Fwl-summary.el;h=f719f8a390a8152105c38571b9eb783c7835e444;hb=6444631eeac4bef1933e27202080f62ac536aada;hp=afedf62fcbc318d63886f951ca9f274526d28a45;hpb=298179ef92e7400bdab05f509725ebfb9672b038;p=elisp%2Fwanderlust.git diff --git a/wl/wl-summary.el b/wl/wl-summary.el index afedf62..f719f8a 100644 --- a/wl/wl-summary.el +++ b/wl/wl-summary.el @@ -91,7 +91,7 @@ (defvar wl-summary-buffer-temp-mark-column nil) (defvar wl-summary-buffer-persistent-mark-column nil) -(defvar wl-summary-buffer-unsync-mark-number-list nil) +(defvar wl-summary-buffer-persistent-mark-version 0) (defvar wl-summary-buffer-persistent nil) (defvar wl-summary-buffer-thread-nodes nil) @@ -110,8 +110,7 @@ (defvar wl-summary-buffer-mode-line-formatter nil) (defvar wl-summary-buffer-mode-line nil) (defvar wl-summary-buffer-display-mime-mode 'mime) -(defvar wl-summary-buffer-display-all-header nil) -(defvar wl-summary-buffer-event-handler nil) +(defvar wl-summary-buffer-display-header-mode 'partial) (defvar wl-thread-indent-level-internal nil) (defvar wl-thread-have-younger-brother-str-internal nil) @@ -156,7 +155,7 @@ (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-unsync-mark-number-list) +(make-variable-buffer-local 'wl-summary-buffer-persistent-mark-version) (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) @@ -186,8 +185,7 @@ (make-variable-buffer-local 'wl-summary-buffer-mode-line-formatter) (make-variable-buffer-local 'wl-summary-buffer-mode-line) (make-variable-buffer-local 'wl-summary-buffer-display-mime-mode) -(make-variable-buffer-local 'wl-summary-buffer-display-all-header) -(make-variable-buffer-local 'wl-summary-buffer-event-handler) +(make-variable-buffer-local 'wl-summary-buffer-display-header-mode) (defvar wl-datevec) (defvar wl-thr-indent-string) @@ -398,6 +396,11 @@ See also variable `wl-use-petname'." () (setq wl-summary-mode-map (make-keymap)) (suppress-keymap wl-summary-mode-map) + (substitute-key-definition 'kill-buffer + 'wl-summary-mimic-kill-buffer + wl-summary-mode-map + global-map) + ;; basic commands (define-key wl-summary-mode-map " " 'wl-summary-read) (define-key wl-summary-mode-map "." 'wl-summary-redisplay) (define-key wl-summary-mode-map "<" 'wl-summary-display-top) @@ -580,6 +583,15 @@ See also variable `wl-use-petname'." "Menu used in Summary mode." wl-summary-mode-menu-spec)) +(defun wl-summary-mimic-kill-buffer (buffer) + "Kill the current (Summary) buffer with query." + (interactive "bKill buffer: ") + (if (or (not buffer) + (string-equal buffer "") + (string-equal buffer (buffer-name))) + (wl-summary-exit 'force-exit) + (kill-buffer buffer))) + (defsubst wl-summary-message-visible-p (number) "Return non-nil if the message with NUMBER is visible." (or (eq wl-summary-buffer-view 'sequence) @@ -598,7 +610,8 @@ See also variable `wl-use-petname'." (save-excursion (goto-char beg) (while (and (< (point) end) (not (eobp))) - (when (null (get-text-property (point) 'face)) + (when (or (null (get-text-property (point) 'face)) + (wl-summary-persistent-mark-invalid-p)) (setq number (wl-summary-message-number)) (when number (setq flags (elmo-message-flags wl-summary-buffer-elmo-folder @@ -620,22 +633,79 @@ See also variable `wl-use-petname'." (wl-summary-lazy-update-mark (list 'wl-summary-update-mark-window)))) +(defun wl-summary-after-resize-function (frame) + "Called from `window-size-change-functions'." + (save-excursion + (save-selected-window + (select-frame frame) + (walk-windows + (lambda (window) + (set-buffer (window-buffer window)) + (when (eq major-mode 'wl-summary-mode) + (run-hook-with-args 'wl-summary-buffer-window-scroll-functions + window))) + 'nomini frame)))) + ;; Handler of event from elmo-folder -(eval-and-compile - (luna-define-class wl-summary-event-handler (elmo-event-handler) - (buffer)) - (luna-define-internal-accessors 'wl-summary-event-handler)) - -(luna-define-method elmo-event-handler-flag-changed ((handler - wl-summary-event-handler) - numbers) - (with-current-buffer (wl-summary-event-handler-buffer-internal handler) - (save-excursion +(defun wl-summary-update-persistent-mark-on-event (buffer numbers) + (save-excursion + (set-buffer buffer) + (if wl-summary-lazy-update-mark + (let ((window-list (get-buffer-window-list (current-buffer) 'nomini t)) + invalidate) + (dolist (number numbers) + (when (wl-summary-message-visible-p number) + (if (catch 'visible + (let ((window-list window-list) + win) + (while (setq win (car window-list)) + (when (wl-summary-jump-to-msg number + (window-start win) + (window-end win)) + (throw 'visible t)) + (setq window-list (cdr window-list))))) + (wl-summary-update-persistent-mark number) + (setq invalidate t)))) + (when invalidate + (wl-summary-invalidate-persistent-mark) + (dolist (win window-list) + (wl-summary-validate-persistent-mark + (window-start win) + (window-end win))))) (dolist (number numbers) (when (and (wl-summary-message-visible-p number) (wl-summary-jump-to-msg number)) (wl-summary-update-persistent-mark number)))))) +(defun wl-summary-buffer-attach () + (when wl-summary-buffer-elmo-folder + (elmo-connect-signal + wl-summary-buffer-elmo-folder + 'flag-changed + (current-buffer) + (elmo-define-signal-handler (buffer folder numbers) + (wl-summary-update-persistent-mark-on-event buffer numbers))) + (elmo-connect-signal + wl-summary-buffer-elmo-folder + 'cache-changed + (current-buffer) + (elmo-define-signal-handler (buffer folder number) + (wl-summary-update-persistent-mark-on-event buffer (list number)))) + (elmo-connect-signal + wl-summary-buffer-elmo-folder + 'update-overview + (current-buffer) + (elmo-define-signal-handler (buffer folder number) + (with-current-buffer buffer + (wl-summary-rescan-message number)))))) + +(defun wl-summary-buffer-detach () + (when (and (eq major-mode 'wl-summary-mode) + wl-summary-buffer-elmo-folder) + (elmo-disconnect-signal 'flag-changed (current-buffer)) + (elmo-disconnect-signal 'cache-changed (current-buffer)) + (elmo-disconnect-signal 'update-overview (current-buffer)))) + (defun wl-status-update () (interactive) (wl-address-init)) @@ -672,21 +742,18 @@ If optional USE-CACHE is non-nil, use cache if exists." (folder wl-summary-buffer-elmo-folder)) (if (null number) (message "No message.") - (elmo-set-work-buf - (elmo-message-fetch folder - number - (elmo-make-fetch-strategy - 'entire - use-cache ; use cache - nil ; save cache (should `t'?) - (and - use-cache - (elmo-file-cache-get-path - (elmo-message-field folder number 'message-id)))) - nil - (current-buffer) - 'unread) - (buffer-string))))) + (elmo-message-fetch-string folder + number + (elmo-make-fetch-strategy + 'entire + use-cache ; use cache + nil ; save cache (should `t'?) + (and + use-cache + (elmo-file-cache-get-path + (elmo-message-field folder number + 'message-id)))) + 'unread)))) (defun wl-summary-reedit (&optional arg) "Re-edit current message. @@ -694,7 +761,7 @@ If ARG is non-nil, Supersedes message" (interactive "P") (wl-summary-toggle-disp-msg 'off) (cond - ((not (wl-summary-message-number)) + ((null (wl-summary-message-number)) (message "No message.")) (arg (wl-summary-supersedes-message)) @@ -704,7 +771,7 @@ If ARG is non-nil, Supersedes message" (mail-position-on-field "Newsgroups") (mail-position-on-field "To"))) (t - (wl-draft-edit-string (wl-summary-message-string))))) + (wl-draft-edit-string (wl-summary-message-string 'maybe))))) (defun wl-summary-resend-bounced-mail () "Re-mail the current message. @@ -783,6 +850,7 @@ you." wl-summary-buffer-persistent-mark-column persistent))) (defun wl-summary-buffer-set-folder (folder) + (wl-summary-buffer-detach) (if (stringp folder) (setq folder (wl-folder-get-elmo-folder folder))) (setq wl-summary-buffer-elmo-folder folder) @@ -819,11 +887,7 @@ you." (setq wl-summary-buffer-persistent (wl-folder-persistent-p (elmo-folder-name-internal folder))) (elmo-folder-set-persistent-internal folder wl-summary-buffer-persistent) - (elmo-folder-add-handler folder - (setq wl-summary-buffer-event-handler - (luna-make-entity - 'wl-summary-event-handler - :buffer (current-buffer)))) + (wl-summary-buffer-attach) ;; process duplicates. (elmo-folder-set-process-duplicates-internal folder (cdr (elmo-string-matched-assoc @@ -866,7 +930,8 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." ;;;(setq default-directory (or wl-tmp-dir (expand-file-name "~/"))) (setq buffer-read-only t) (setq truncate-lines t) - (setq show-trailing-whitespace nil) + (when (boundp 'show-trailing-whitespace) + (setq show-trailing-whitespace nil)) ;;;(make-local-variable 'tab-width) ;;;(setq tab-width 1) (buffer-disable-undo (current-buffer)) @@ -880,7 +945,12 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (let ((hook (if wl-on-xemacs 'pre-idle-hook 'window-scroll-functions))) (make-local-hook hook) (dolist (function wl-summary-buffer-window-scroll-functions) - (add-hook hook function nil t)))) + (add-hook hook function nil t))) + (add-hook 'window-size-change-functions + #'wl-summary-after-resize-function)) + (dolist (hook '(change-major-mode-hook kill-buffer-hook)) + (make-local-hook hook) + (add-hook hook #'wl-summary-buffer-detach 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)) @@ -1034,7 +1104,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." wl-thread-entities nil wl-summary-scored nil wl-summary-buffer-number-list nil - wl-summary-buffer-unsync-mark-number-list nil + wl-summary-buffer-persistent-mark-version 0 wl-summary-buffer-target-mark-list nil wl-summary-buffer-temp-mark-list nil wl-summary-delayed-update nil) @@ -1082,6 +1152,49 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (forward-line -1) (set-buffer-modified-p nil))) +(defun wl-summary-rescan-message (number &optional reparent) + "Rescan current message without updating." + (interactive (list (wl-summary-message-number))) + (let ((start-number (wl-summary-message-number)) + (start-column (current-column))) + (when (wl-summary-jump-to-msg number) + (let* ((folder wl-summary-buffer-elmo-folder) + (entity (elmo-message-entity folder number)) + (inhibit-read-only t)) + (if (eq wl-summary-buffer-view 'thread) + (let* ((thread-entity (wl-thread-get-entity number)) + (descendant (wl-thread-entity-get-descendant thread-entity)) + (thread-parent (wl-thread-entity-get-parent thread-entity)) + (entity-parent (elmo-message-entity-number + (elmo-message-entity-parent folder entity))) + update-top-list) + (if (and (not reparent) + (eq thread-parent entity-parent)) + (progn + (wl-thread-entity-set-linked thread-entity nil) + (wl-thread-update-line-on-buffer-sub nil number)) + (wl-thread-delete-message number 'deep 'update) + (dolist (number (cons number descendant)) + (setq update-top-list + (nconc + update-top-list + (wl-summary-insert-thread + (elmo-message-entity folder number) + folder + 'update)))) + (when update-top-list + (wl-thread-update-indent-string-thread + (elmo-uniq-list update-top-list))))) + (delete-region (point-at-bol) (1+ (point-at-eol))) + (wl-summary-insert-line + (wl-summary-create-line entity nil + (wl-summary-temp-mark number) + (elmo-message-flags folder number) + (elmo-message-cached-p folder number))))) + (wl-summary-set-message-modified) + (wl-summary-jump-to-msg start-number) + (move-to-column start-column)))) + (defun wl-summary-next-folder-or-exit (&optional next-entity upward) (if (and next-entity wl-auto-select-next) @@ -1196,10 +1309,7 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (progn (wl-summary-save-view) (if (or force-exit (not sticky)) - (progn - (elmo-folder-close wl-summary-buffer-elmo-folder) - (elmo-folder-remove-handler wl-summary-buffer-elmo-folder - wl-summary-buffer-event-handler)) + (elmo-folder-close wl-summary-buffer-elmo-folder) (elmo-folder-commit wl-summary-buffer-elmo-folder) (elmo-folder-check wl-summary-buffer-elmo-folder)) (if wl-use-scoring (wl-score-save))) @@ -1326,18 +1436,17 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (if body (setq candidates (append candidates body))) (setq fields (cdr fields))) (setq candidates (elmo-uniq-list candidates)) - (elmo-set-work-buf - (set-buffer-multibyte default-enable-multibyte-characters) - (mapcar (function - (lambda (x) - (setq components (std11-extract-address-components x)) - (cons (nth 1 components) - (and (car components) - (eword-decode-string - (decode-mime-charset-string - (car components) - mime-charset)))))) - candidates)))) + (elmo-with-enable-multibyte + (mapcar (function + (lambda (x) + (setq components (std11-extract-address-components x)) + (cons (nth 1 components) + (and (car components) + (eword-decode-string + (decode-mime-charset-string + (car components) + mime-charset)))))) + candidates)))) (defun wl-summary-edit-addresses-subr (the-email name-in-addr) ;; returns nil if there's no change. @@ -1510,20 +1619,11 @@ If ARG is non-nil, checking is omitted." (save-excursion (save-match-data ;; online - (if (or arg (not file-cached)) - (elmo-message-encache - wl-summary-buffer-elmo-folder - number)) + (when (or arg (not file-cached)) + (elmo-message-encache wl-summary-buffer-elmo-folder + number)) (elmo-message-set-cached wl-summary-buffer-elmo-folder - number t) - (when (and (wl-summary-jump-to-msg number) - (wl-summary-update-persistent-mark)) - (sit-for 0) - (wl-summary-count-unread) - (wl-summary-update-modeline) - (wl-folder-update-unread - (wl-summary-buffer-folder-name) - wl-summary-buffer-unread-count))) + number t)) t) nil))))) @@ -1703,7 +1803,7 @@ If ARG is non-nil, checking is omitted." number) (setq number (wl-summary-message-number)) (elmo-message-set-cached folder number nil) - (when (wl-summary-update-persistent-mark) + (ignore-errors (elmo-file-cache-delete (elmo-file-cache-get-path (elmo-message-field wl-summary-buffer-elmo-folder @@ -1723,7 +1823,6 @@ If ARG is non-nil, checking is omitted." (setq msgid (elmo-message-field folder number 'message-id)) (elmo-message-set-cached folder number (elmo-file-cache-exists-p msgid)) - (wl-summary-update-persistent-mark) (forward-line 1)) (wl-summary-count-unread) (wl-summary-update-modeline) @@ -1777,12 +1876,7 @@ If ARG is non-nil, checking is omitted." (goto-char beg) (while (and (< (point) end) (not (eobp))) (when (or (not check) - (let ((number (wl-summary-message-number))) - (when (memq number wl-summary-buffer-unsync-mark-number-list) - (setq wl-summary-buffer-unsync-mark-number-list - (delq number - wl-summary-buffer-unsync-mark-number-list)) - t))) + (wl-summary-persistent-mark-invalid-p)) (wl-summary-update-persistent-mark)) (forward-line 1)))) @@ -1889,7 +1983,7 @@ This function is defined for `window-scroll-functions'" (not disable-killed) 'in-msgdb) wl-summary-buffer-number-list)) - (setq append-list (car diff)) + (setq append-list (sort (car diff) #'<)) (setq delete-list (cadr diff)) (when delete-list @@ -2037,18 +2131,27 @@ This function is defined for `window-scroll-functions'" (setq wl-summary-buffer-mode-line (funcall wl-summary-buffer-mode-line-formatter))) -(defun wl-summary-jump-to-msg (&optional number) +(defun wl-summary-jump-to-msg (&optional number beg end) (interactive "NJump to Number:") (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 (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))) + (read-from-minibuffer "Jump to Message(No.): ")))) + (pos (point)) + regexp) + (setq regexp (concat "\r" (int-to-string num) "[^0-9]")) + (if (and beg end (or (< pos beg) (< end pos))) + (progn + (goto-char beg) + (if (re-search-forward regexp end t) + (progn (backward-char 1) (beginning-of-line) t) + (goto-char pos) + nil)) + (beginning-of-line) + (if (or (and (re-search-forward regexp end t) + (progn (backward-char 1) t)) + (re-search-backward regexp beg t)) + (progn (beginning-of-line) t) + nil)))) (defun wl-summary-highlight-msgs (msgs) (save-excursion @@ -2124,21 +2227,16 @@ If ARG, without confirm." (defun wl-summary-load-file-object (filename) "Load lisp object from dir." - (save-excursion - (let ((tmp-buffer (get-buffer-create " *wl-summary-load-file-object*")) - insert-file-contents-pre-hook ; To avoid autoconv-xmas... + (with-temp-buffer + (let (insert-file-contents-pre-hook ; To avoid autoconv-xmas... insert-file-contents-post-hook ret-val) (if (not (file-readable-p filename)) () - (set-buffer tmp-buffer) (as-binary-input-file (insert-file-contents filename)) - (setq ret-val - (condition-case nil - (read (current-buffer)) - (error (error "Reading failed"))))) - (kill-buffer tmp-buffer) - ret-val))) + (condition-case nil + (read (current-buffer)) + (error (error "Reading failed"))))))) (defun wl-summary-goto-folder (&optional arg) (interactive "P") @@ -2201,7 +2299,7 @@ If ARG, without confirm." wl-summary-buffer-message-modified wl-summary-buffer-thread-modified wl-summary-buffer-number-list - wl-summary-buffer-unsync-mark-number-list + wl-summary-buffer-persistent-mark-version wl-summary-buffer-folder-name wl-summary-buffer-line-formatter) (and (eq wl-summary-buffer-view 'thread) @@ -2320,9 +2418,6 @@ If ARG, without confirm." (if other-window (delete-other-windows)) (set-buffer buf) - (when wl-summary-buffer-event-handler - (elmo-folder-remove-handler wl-summary-buffer-elmo-folder - wl-summary-buffer-event-handler)) (unless (eq major-mode 'wl-summary-mode) (wl-summary-mode)) (wl-summary-buffer-set-folder folder) @@ -2333,6 +2428,7 @@ If ARG, without confirm." (setq wl-summary-buffer-disp-msg nil) (setq wl-summary-buffer-last-displayed-msg nil) (setq wl-summary-buffer-current-msg nil) + (setq wl-summary-buffer-persistent-mark-version 0) (let ((inhibit-read-only t) (buffer-read-only nil)) (erase-buffer) @@ -2370,8 +2466,6 @@ If ARG, without confirm." (wl-summary-update-modeline))) (unless (eq wl-summary-buffer-view 'thread) (wl-summary-make-number-list)) - (setq wl-summary-buffer-unsync-mark-number-list - (copy-sequence wl-summary-buffer-number-list)) (when (and wl-summary-cache-use (or (and wl-summary-check-line-format (wl-summary-line-format-changed-p)) @@ -2449,7 +2543,8 @@ If ARG, without confirm." (wl-message-buffer-prefetch folder (wl-summary-message-number) - wl-message-buffer-prefetch-depth + (min (or wl-message-buffer-prefetch-depth 0) + (1- wl-message-buffer-cache-size)) (current-buffer) wl-summary-buffer-mime-charset)) (if mes (message "%s" mes)) @@ -2540,7 +2635,7 @@ If ARG, without confirm." (defun wl-summary-default-subject-filter (subject) (setq subject (elmo-replace-in-string subject "[ \t]*\\(re\\|was\\)[:>]" "")) (setq subject (elmo-replace-in-string subject "[ \t]" "")) - (elmo-replace-in-string subject "^\\[.*\\]" "")) + (elmo-replace-in-string subject "^\\[[^]]*\\]" "")) (defun wl-summary-subject-equal (subject1 subject2) (string= (funcall wl-summary-subject-filter-function subject1) @@ -2765,7 +2860,7 @@ If ARG, without confirm." 'in-msgdb) (error "No messages"))) (condition (car (elmo-parse-search-condition - (elmo-read-search-condition + (wl-read-search-condition wl-summary-pick-field-default)))) (result (elmo-folder-search wl-summary-buffer-elmo-folder condition @@ -2806,7 +2901,7 @@ If ARG, exit virtual folder." (if arg (wl-summary-unvirtual) (wl-summary-goto-folder-subr (concat "/" - (elmo-read-search-condition + (wl-read-search-condition wl-summary-pick-field-default) "/" (wl-summary-buffer-folder-name)) @@ -2842,6 +2937,31 @@ If ARG, exit virtual folder." (wl-summary-get-score-mark number) " "))) +(defun wl-summary-persistent-mark-invalid-p () + (not + (equal + ;; mey be nil. + (get-text-property (point) 'wl-summary-persistent-mark-version) + wl-summary-buffer-persistent-mark-version))) + +(defun wl-summary-validate-persistent-mark (beg end) + (let ((inhibit-read-only t) + (buffer-read-only nil)) + (put-text-property beg end + 'wl-summary-persistent-mark-version + wl-summary-buffer-persistent-mark-version) + (set-buffer-modified-p nil))) + +(defun wl-summary-validate-persistent-mark-string (string) + (put-text-property 0 (length string) + 'wl-summary-persistent-mark-version + wl-summary-buffer-persistent-mark-version + string)) + +(defun wl-summary-invalidate-persistent-mark () + (setq wl-summary-buffer-persistent-mark-version + (1+ wl-summary-buffer-persistent-mark-version))) + (defsubst wl-summary-persistent-mark-string (folder flags cached) "Return the persistent mark string. The mark is decided according to the FOLDER, FLAGS and CACHED." @@ -3023,11 +3143,14 @@ Return non-nil if the mark is updated" (buffer-read-only nil) (mark (buffer-substring (- (point) 1) (point))) (new-mark (wl-summary-persistent-mark number flags))) - (unless (string= new-mark mark) - (delete-backward-char 1) - (insert new-mark) - (wl-summary-set-message-modified) - t)))) + (prog1 + (unless (string= new-mark mark) + (delete-backward-char 1) + (insert new-mark) + (wl-summary-set-message-modified) + t) + (wl-summary-validate-persistent-mark (point-at-bol) + (point-at-eol)))))) (when wl-summary-highlight (wl-highlight-summary-current-line)) (set-buffer-modified-p nil))) @@ -3243,6 +3366,8 @@ Return non-nil if the mark is updated" (unless (memq flag elmo-global-flags) (when (elmo-local-flag-p flag) (error "Cannot treat `%s'." flag)) + (unless (elmo-flag-valid-p flag) + (error "Invalid char in `%s'" flag)) (if (y-or-n-p (format "Flag `%s' is not registered yet. Register?" (capitalize (symbol-name flag)))) (setq elmo-global-flags (append @@ -3459,6 +3584,7 @@ Return non-nil if the mark is updated" (number-to-string (elmo-message-entity-number wl-message-entity)))) + (wl-summary-validate-persistent-mark-string line) (if wl-summary-highlight (wl-highlight-summary-line-string (elmo-message-entity-number wl-message-entity) @@ -3585,11 +3711,9 @@ Return non-nil if the mark is updated" (write-region-as-binary (point-min)(point-max) cache nil 'no-msg))) (when (file-writable-p view) ; 'thread or 'sequence - (save-excursion - (set-buffer tmp-buffer) - (erase-buffer) - (prin1 save-view tmp-buffer) - (princ "\n" tmp-buffer) + (with-temp-buffer + (prin1 save-view (current-buffer)) + (princ "\n" (current-buffer)) (write-region (point-min) (point-max) view nil 'no-msg)))) ;; kill tmp buffer. (kill-buffer tmp-buffer)))))) @@ -4110,9 +4234,7 @@ Reply to author if invoked with ARG." (when number (save-excursion (wl-summary-set-message-buffer-or-redisplay)) - (setq mes-buf wl-message-buffer) (wl-message-select-buffer wl-message-buffer) - (set-buffer mes-buf) (condition-case err (when (setq mes-buf (wl-message-get-original-buffer)) (wl-draft-reply mes-buf arg summary-buf number) @@ -4175,7 +4297,6 @@ Use function list is `wl-summary-write-current-folder-functions'." (number (wl-summary-message-number)) (summary-buf (current-buffer)) (wl-draft-forward t) - mes-buf entity subject num) (if (null number) (message "No message.") @@ -4187,17 +4308,10 @@ Use function list is `wl-summary-write-current-folder-functions'." ;; Reload. (wl-summary-redisplay-internal nil nil 'force-reload) (wl-summary-redisplay-internal folder number)) - (setq mes-buf wl-message-buffer) - (wl-message-select-buffer mes-buf) - ;; get original subject. - (if summary-buf - (save-excursion - (set-buffer summary-buf) - (setq subject - (or (elmo-message-entity-field - (elmo-message-entity folder number) 'subject 'decode) - "")))) - (set-buffer mes-buf) + (wl-message-select-buffer wl-message-buffer) + (setq subject (with-current-buffer + wl-message-buffer-original-buffer + (std11-field-body "Subject"))) (wl-draft-forward subject summary-buf number) (with-current-buffer summary-buf (run-hooks 'wl-summary-forward-hook)) (unless without-setup-hook @@ -4370,6 +4484,24 @@ Use function list is `wl-summary-write-current-folder-functions'." (wl-summary-redisplay))) (message "No last message."))) +(defun wl-summary-message-display-type () + (when (and wl-summary-buffer-disp-msg + (buffer-live-p wl-message-buffer) + wl-summary-buffer-current-msg + (wl-summary-message-number) + (= (wl-summary-message-number) wl-summary-buffer-current-msg)) + (wl-message-buffer-display-type wl-message-buffer))) + +(defun wl-summary-buffer-display-mime-mode () + (or (wl-message-display-type-property (wl-summary-message-display-type) + :mime) + wl-summary-buffer-display-mime-mode)) + +(defun wl-summary-buffer-display-header-mode () + (or (wl-message-display-type-property (wl-summary-message-display-type) + :header) + wl-summary-buffer-display-header-mode)) + (defun wl-summary-toggle-mime (&optional arg) "Toggle MIME decoding. If ARG is non-nil, ask coding-system to display the message in the current @@ -4380,37 +4512,41 @@ If ARG is numeric number, decode message as following: 2: Enable MIME analysis only for headers. 3: Disable MIME analysis." (interactive "P") - (let ((rest (memq wl-summary-buffer-display-mime-mode - wl-summary-display-mime-mode-list)) + (let ((mime-mode (wl-summary-buffer-display-mime-mode)) (elmo-mime-display-as-is-coding-system elmo-mime-display-as-is-coding-system)) - (if (numberp arg) - (setq wl-summary-buffer-display-mime-mode - (case arg - (1 'mime) - (2 'header-only) - (3 'as-is))) - (if arg - ;; Specify coding-system (doesn't change the MIME mode). - (setq elmo-mime-display-as-is-coding-system - (if (and arg (not (eq wl-summary-buffer-display-mime-mode - 'mime))) - (or (read-coding-system "Coding system: ") - elmo-mime-display-as-is-coding-system) - elmo-mime-display-as-is-coding-system)) + (if (and (consp arg) (> (prefix-numeric-value arg) 4)) + (progn + (setq wl-summary-buffer-display-mime-mode mime-mode) + (wl-summary-update-modeline)) + (cond + ((numberp arg) + (setq mime-mode (case arg + (1 'mime) + (2 'header-only) + (3 'as-is) +;;; (4 'decode-only) + (5 'no-merge)))) + (arg + ;; Specify coding-system (doesn't change the MIME mode). + (setq elmo-mime-display-as-is-coding-system + (if (and arg + (not (wl-message-mime-analysis-p + (wl-summary-message-display-type)))) + (or (read-coding-system "Coding system: ") + elmo-mime-display-as-is-coding-system) + elmo-mime-display-as-is-coding-system))) + (t ;; Change the MIME mode. - (if (cadr rest) - (setq wl-summary-buffer-display-mime-mode (cadr rest)) - (setq wl-summary-buffer-display-mime-mode - (car wl-summary-display-mime-mode-list))))) - (wl-summary-redisplay arg) - (wl-summary-update-modeline) + (setq mime-mode (or (cadr (memq mime-mode + wl-summary-display-mime-mode-list)) + (car wl-summary-display-mime-mode-list))))) + (wl-summary-redisplay-internal nil nil arg mime-mode)) (message "MIME decoding: %s%s" - (upcase (symbol-name wl-summary-buffer-display-mime-mode)) - (if (and arg - (not (numberp arg)) - (not (eq wl-summary-buffer-display-mime-mode - 'mime))) + (upcase (symbol-name mime-mode)) + (if (and (not (eq mime-mode 'mime)) + (not (eq elmo-mime-display-as-is-coding-system + wl-cs-autoconv))) (concat " (" (symbol-name elmo-mime-display-as-is-coding-system) ")") @@ -4419,24 +4555,28 @@ If ARG is numeric number, decode message as following: (defun wl-summary-redisplay (&optional arg) "Redisplay message." (interactive "P") - (wl-summary-redisplay-internal nil nil arg)) + (apply #'wl-summary-redisplay-internal nil nil arg + (unless (and (consp arg) (> (prefix-numeric-value arg) 4)) + (list wl-summary-buffer-display-mime-mode + wl-summary-buffer-display-header-mode)))) (defun wl-summary-toggle-all-header (&optional arg) "Toggle displaying message with all header." (interactive "P") - (setq wl-summary-buffer-display-all-header - (not wl-summary-buffer-display-all-header)) - (wl-summary-redisplay-internal nil nil arg)) + (let ((header-mode (wl-summary-buffer-display-header-mode))) + (if (and (consp arg) (> (prefix-numeric-value arg) 4)) + (setq wl-summary-buffer-display-header-mode header-mode) + (wl-summary-redisplay-internal + nil nil arg nil + (if (eq header-mode 'all) 'partial 'all))))) (defun wl-summary-redisplay-internal (&optional folder number force-reload - mode all-header) + mime-mode header-mode) (let* ((folder (or folder wl-summary-buffer-elmo-folder)) - (mode (or mode wl-summary-buffer-display-mime-mode)) - (all-header (or all-header wl-summary-buffer-display-all-header)) (num (or number (wl-summary-message-number))) (wl-mime-charset wl-summary-buffer-mime-charset) (default-mime-charset wl-summary-buffer-mime-charset) - no-folder-mark fld-buf fld-win thr-entity + fld-buf fld-win thr-entity (elmo-message-fetch-confirm (or elmo-message-fetch-confirm (and force-reload elmo-message-fetch-threshold)))) @@ -4458,40 +4598,39 @@ If ARG is numeric number, decode message as following: (if (setq fld-win (get-buffer-window fld-buf)) (delete-window fld-win))) (setq wl-current-summary-buffer (current-buffer)) - (setq no-folder-mark - ;; If cache is used, change folder-mark. - (if (wl-message-redisplay folder num - mode all-header - (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))) + (wl-message-redisplay folder num + (wl-message-make-display-type + (or mime-mode + (wl-summary-buffer-display-mime-mode)) + (or header-mode + (wl-summary-buffer-display-header-mode))) + (or force-reload + (string= (elmo-folder-name-internal folder) + wl-draft-folder))) (when (elmo-message-use-cache-p folder num) (elmo-message-set-cached folder num t)) (ignore-errors (if (elmo-message-flagged-p wl-summary-buffer-elmo-folder num 'unread) - (wl-summary-mark-as-read num no-folder-mark) - (wl-summary-update-persistent-mark))) + (wl-summary-mark-as-read num) + (wl-summary-count-unread) + (wl-summary-update-modeline) + (wl-folder-update-unread + (wl-summary-buffer-folder-name) + wl-summary-buffer-unread-count))) (setq wl-summary-buffer-current-msg num) (when wl-summary-recenter (recenter (/ (- (window-height) 2) 2)) (if (not wl-summary-indent-length-limit) (wl-horizontal-recenter))) (wl-highlight-summary-displaying) - (wl-message-buffer-prefetch-next folder num - wl-message-buffer-prefetch-depth - (current-buffer) - wl-summary-buffer-mime-charset) + (wl-message-buffer-prefetch-next + folder num + (min (or wl-message-buffer-prefetch-depth 0) + (1- wl-message-buffer-cache-size)) + (current-buffer) + wl-summary-buffer-mime-charset) (run-hooks 'wl-summary-redisplay-hook)) (message "No message to display.")))) @@ -4596,25 +4735,23 @@ If ARG is numeric number, decode message as following: (interactive) (let ((filename) (num (wl-summary-message-number))) - (if (null wl-save-dir) - (setq wl-save-dir wl-temporary-file-directory)) + (unless wl-save-dir + (setq wl-save-dir wl-temporary-file-directory)) (if num (save-excursion (setq filename (expand-file-name (concat (int-to-string num) wl-summary-save-file-suffix) wl-save-dir)) - (if (null (and arg - (null (file-exists-p filename)))) - (setq filename - (read-file-name "Save to file: " filename))) - + (when (or (null arg) + (file-exists-p filename)) + (setq filename (read-file-name "Save to file: " filename))) (wl-summary-set-message-buffer-or-redisplay) (set-buffer (wl-message-get-original-buffer)) - (if (and (null arg) (file-exists-p filename)) - (if (y-or-n-p "File already exists. override it? ") - (write-region (point-min) (point-max) filename)) - (write-region (point-min) (point-max) filename))) + (when (or arg + (not (file-exists-p filename)) + (y-or-n-p "File already exists. override it? ")) + (write-region-as-binary (point-min) (point-max) filename))) (message "No message to save.")) num))