X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=wl%2Fwl-summary.el;h=227a820408c4c3f10acfeb3d0955efe31c41e29e;hb=167053919d525e30162c34e574b6452bb858211b;hp=74093f9018faaf5447c97684fbb875a59525f1f1;hpb=f3d9904c7ca0f96e7ba0bcae3771145428e19008;p=elisp%2Fwanderlust.git diff --git a/wl/wl-summary.el b/wl/wl-summary.el index 74093f9..227a820 100644 --- a/wl/wl-summary.el +++ b/wl/wl-summary.el @@ -345,6 +345,7 @@ "----" ("Writing Messages" ["Write a message" wl-summary-write t] + ["Write for current folder" wl-summary-write-current-folder t] ["Reply" wl-summary-reply t] ["Reply with citation" wl-summary-reply-with-citation t] ["Forward" wl-summary-forward t]) @@ -387,6 +388,7 @@ (define-key wl-summary-mode-map "-" 'wl-summary-prev-line-content) (define-key wl-summary-mode-map "\e\r" 'wl-summary-prev-line-content) (define-key wl-summary-mode-map "g" 'wl-summary-goto-folder) + (define-key wl-summary-mode-map "G" 'wl-summary-goto-folder-sticky) (define-key wl-summary-mode-map "c" 'wl-summary-mark-as-read-all) ; (define-key wl-summary-mode-map "D" 'wl-summary-drop-unsync) @@ -411,6 +413,8 @@ (define-key wl-summary-mode-map "e" 'wl-summary-save) (define-key wl-summary-mode-map "\C-c\C-o" 'wl-jump-to-draft-buffer) (define-key wl-summary-mode-map "\C-c\C-a" 'wl-addrmgr) + (define-key wl-summary-mode-map "\C-c\C-p" 'wl-summary-previous-buffer) + (define-key wl-summary-mode-map "\C-c\C-n" 'wl-summary-next-buffer) (define-key wl-summary-mode-map "H" 'wl-summary-redisplay-all-header) (define-key wl-summary-mode-map "M" 'wl-summary-redisplay-no-mime) (define-key wl-summary-mode-map "B" 'wl-summary-burst) @@ -521,6 +525,7 @@ (define-key wl-summary-mode-map "\M-t" 'wl-toggle-plugged) (define-key wl-summary-mode-map "\C-t" 'wl-plugged-change) ;; + (define-key wl-summary-mode-map "\C-x\C-s" 'wl-summary-save-status) (wl-summary-setup-mouse) (easy-menu-define wl-summary-mode-menu @@ -1006,6 +1011,16 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (wl-summary-thread-modified-p))) (wl-summary-save-view-cache)))) +(defun wl-summary-save-status () + "Save summary view and msgdb." + (interactive) + (if (interactive-p) (message "Saving summary status...")) + (wl-summary-save-view) + (elmo-folder-commit wl-summary-buffer-elmo-folder) + (elmo-folder-check wl-summary-buffer-elmo-folder) + (if wl-use-scoring (wl-score-save)) + (if (interactive-p) (message "Saving summary status...done."))) + (defun wl-summary-force-exit () "Exit current summary. Buffer is deleted even the buffer is sticky." (interactive) @@ -1022,7 +1037,8 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (run-hooks 'wl-summary-exit-pre-hook) (if wl-summary-buffer-exit-function (funcall wl-summary-buffer-exit-function) - (wl-summary-cleanup-temp-marks sticky) + (if (or force-exit (not sticky)) + (wl-summary-cleanup-temp-marks sticky)) (unwind-protect ;; save summary status (progn @@ -1122,10 +1138,9 @@ Entering Folder mode calls the value of `wl-summary-mode-hook'." (and msg (wl-summary-jump-to-msg msg)))) ((or (string-match "last:" range) (string-match "first:" range)) - (wl-summary-goto-folder-subr - (wl-folder-get-elmo-folder (concat "/" range "/" - (elmo-folder-name-internal - folder))) + (wl-summary-goto-folder-subr (concat "/" range "/" + (elmo-folder-name-internal + folder)) 'force-update nil nil t)) (t (wl-summary-sync-update unset-cursor @@ -2354,7 +2369,11 @@ If ARG, without confirm." (defun wl-summary-goto-folder (&optional arg) (interactive "P") - (wl-summary-goto-folder-subr nil nil nil arg t)) + (wl-summary-goto-folder-subr nil nil nil nil t nil arg)) + +(defun wl-summary-goto-folder-sticky () + (interactive) + (wl-summary-goto-folder-subr nil nil nil t t)) (defun wl-summary-goto-last-visited-folder () (interactive) @@ -2488,7 +2507,8 @@ If ARG, without confirm." folder))))) (defun wl-summary-goto-folder-subr (&optional name scan-type other-window - sticky interactive scoring) + sticky interactive scoring + force-exit) "Display target folder on summary." (interactive) (let* ((keep-cursor (memq this-command @@ -2506,9 +2526,12 @@ If ARG, without confirm." (eq major-mode 'wl-summary-mode)) ; called in summary. (setq wl-summary-last-visited-folder (wl-summary-buffer-folder-name)) (run-hooks 'wl-summary-exit-pre-hook) - (wl-summary-cleanup-temp-marks (wl-summary-sticky-p)) + (if (or force-exit (not (wl-summary-sticky-p))) + (wl-summary-cleanup-temp-marks (wl-summary-sticky-p))) (wl-summary-save-view) - (elmo-folder-commit wl-summary-buffer-elmo-folder)) + (elmo-folder-commit wl-summary-buffer-elmo-folder) + (if (and (wl-summary-sticky-p) force-exit) + (kill-buffer (current-buffer)))) (setq buf (wl-summary-get-buffer-create (elmo-folder-name-internal folder) sticky)) (setq reuse-buf @@ -3679,33 +3702,44 @@ If optional argument NUMBER is specified, mark message specified by NUMBER." (wl-summary-target-mark-region beg end))) (defun wl-summary-target-mark-msgs (msgs) - (while msgs - (if (eq wl-summary-buffer-view 'thread) - (wl-thread-jump-to-msg (car msgs)) - (wl-summary-jump-to-msg (car msgs))) - (wl-summary-target-mark (wl-summary-message-number)) - (setq msgs (cdr msgs)))) + "Return the number of marked messages." + (let ((i 0) num) + (while msgs + (if (eq wl-summary-buffer-view 'thread) + (wl-thread-jump-to-msg (car msgs)) + (wl-summary-jump-to-msg (car msgs))) + (setq num (wl-summary-message-number)) + (when (eq num (car msgs)) + (wl-summary-target-mark num) + (setq i (1+ i))) + (setq msgs (cdr msgs))) + i)) (defun wl-summary-pick (&optional from-list delete-marks) (interactive) - (let* ((condition (car (elmo-parse-search-condition - (elmo-read-search-condition - wl-summary-pick-field-default)))) - (result (elmo-folder-search wl-summary-buffer-elmo-folder - condition - from-list))) - (if delete-marks - (let ((mlist wl-summary-buffer-target-mark-list)) - (while mlist - (when (wl-summary-jump-to-msg (car mlist)) - (wl-summary-unmark)) - (setq mlist (cdr mlist))) - (setq wl-summary-buffer-target-mark-list nil))) - (if result - (progn - (wl-summary-target-mark-msgs result) - (message "%d message(s) are picked." (length result))) - (message "No message was picked.")))) + (save-excursion + (let* ((condition (car (elmo-parse-search-condition + (elmo-read-search-condition + wl-summary-pick-field-default)))) + (result (elmo-folder-search wl-summary-buffer-elmo-folder + condition + from-list)) + num) + (if delete-marks + (let ((mlist wl-summary-buffer-target-mark-list)) + (while mlist + (when (wl-summary-jump-to-msg (car mlist)) + (wl-summary-unmark)) + (setq mlist (cdr mlist))) + (setq wl-summary-buffer-target-mark-list nil))) + (if (and result + (setq num (wl-summary-target-mark-msgs result)) + (> num 0)) + (if (= num (length result)) + (message "%d message(s) are picked." num) + (message "%d(%d) message(s) are picked." num + (- (length result) num))) + (message "No message was picked."))))) (defun wl-summary-unvirtual () "Exit from current virtual folder." @@ -3732,19 +3766,26 @@ If ARG, exit virtual folder." (wl-summary-buffer-folder-name)) 'update nil nil t))) -(defun wl-summary-delete-all-temp-marks () +(defun wl-summary-delete-all-temp-marks (&optional no-msg) + "Erase all temp marks from buffer." (interactive) - (save-excursion - (goto-char (point-min)) - (message "Unmarking...") - (while (not (eobp)) - (wl-summary-unmark) - (forward-line)) - (message "Unmarking...done") - (setq wl-summary-buffer-target-mark-list nil) - (setq wl-summary-buffer-delete-list nil) - (setq wl-summary-buffer-refile-list nil) - (setq wl-summary-buffer-copy-list nil))) + (when (or wl-summary-buffer-target-mark-list + wl-summary-buffer-delete-list + wl-summary-buffer-refile-list + wl-summary-buffer-copy-list) + (save-excursion + (goto-char (point-min)) + (unless no-msg + (message "Unmarking...")) + (while (not (eobp)) + (wl-summary-unmark) + (forward-line)) + (unless no-msg + (message "Unmarking...done")) + (setq wl-summary-buffer-target-mark-list nil) + (setq wl-summary-buffer-delete-list nil) + (setq wl-summary-buffer-refile-list nil) + (setq wl-summary-buffer-copy-list nil)))) (defun wl-summary-delete-mark (number) "Delete temporary mark of the message specified by NUMBER." @@ -3882,6 +3923,28 @@ If ARG, exit virtual folder." (delq (car mlist) wl-summary-buffer-target-mark-list)) (setq mlist (cdr mlist))))))) +(defun wl-summary-next-buffer () + "Switch to next summary buffer." + (interactive) + (let ((buffers (sort (wl-collect-summary) + (lambda (buffer1 buffer2) + (string-lessp (buffer-name buffer1) + (buffer-name buffer2)))))) + (switch-to-buffer + (or (cadr (memq (current-buffer) buffers)) + (car buffers))))) + +(defun wl-summary-previous-buffer () + "Switch to previous summary buffer." + (interactive) + (let ((buffers (sort (wl-collect-summary) + (lambda (buffer1 buffer2) + (not (string-lessp (buffer-name buffer1) + (buffer-name buffer2))))))) + (switch-to-buffer + (or (cadr (memq (current-buffer) buffers)) + (car buffers))))) + (defun wl-summary-target-mark-copy () (interactive) (wl-summary-target-mark-refile-subr "copy")) @@ -4164,7 +4227,7 @@ If ARG, exit virtual folder." (elmo-msgdb-mark-set mark-alist number wl-summary-important-mark)) - (if (elmo-file-cache-exists-p message-id) + (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)) @@ -4390,6 +4453,10 @@ If ARG, exit virtual folder." (cache (expand-file-name wl-summary-cache-file dir)) (view (expand-file-name wl-summary-view-file dir)) (save-view wl-summary-buffer-view) + (mark-list (copy-sequence wl-summary-buffer-target-mark-list)) + (refile-list (copy-sequence wl-summary-buffer-refile-list)) + (copy-list (copy-sequence wl-summary-buffer-copy-list)) + (delete-list (copy-sequence wl-summary-buffer-delete-list)) (tmp-buffer (get-buffer-create " *wl-summary-save-view-cache*")) (charset wl-summary-buffer-mime-charset)) (if (file-directory-p dir) @@ -4405,6 +4472,11 @@ If ARG, exit virtual folder." (copy-to-buffer tmp-buffer (point-min) (point-max)) (with-current-buffer tmp-buffer (widen) + (setq wl-summary-buffer-target-mark-list mark-list + wl-summary-buffer-refile-list refile-list + wl-summary-buffer-copy-list copy-list + wl-summary-buffer-delete-list delete-list) + (wl-summary-delete-all-temp-marks 'no-msg) (encode-mime-charset-region (point-min) (point-max) charset) (write-region-as-binary (point-min)(point-max) @@ -4598,11 +4670,19 @@ If ARG, exit virtual folder." (defun wl-summary-next-page () (interactive) - (wl-message-next-page)) + (let ((cur-buf (current-buffer))) + (wl-summary-toggle-disp-msg 'on) + (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original) + (set-buffer cur-buf) + (wl-message-next-page)))) (defun wl-summary-prev-page () (interactive) - (wl-message-prev-page)) + (let ((cur-buf (current-buffer))) + (wl-summary-toggle-disp-msg 'on) + (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original) + (set-buffer cur-buf) + (wl-message-prev-page)))) (defsubst wl-summary-no-mime-p (folder) (wl-string-match-member (elmo-folder-name-internal folder) @@ -4626,7 +4706,7 @@ Return t if message exists." (set-buffer wl-message-buffer) t) (if (wl-summary-no-mime-p folder) - (wl-summary-redisplay-no-mime folder number) + (wl-summary-redisplay-no-mime-internal folder number) (wl-summary-redisplay-internal folder number)) (when (buffer-live-p wl-message-buffer) (set-buffer wl-message-buffer)) @@ -4908,8 +4988,7 @@ Reply to author if invoked with ARG." "Write a new draft from Summary." (interactive) (wl-draft nil nil nil nil nil - nil nil nil nil nil nil (current-buffer) - nil (wl-summary-buffer-folder-name)) + (wl-summary-buffer-folder-name)) (run-hooks 'wl-mail-setup-hook) (mail-position-on-field "To")) @@ -4935,20 +5014,19 @@ Use function list is `wl-summary-write-current-folder-functions'." (setq func-list (cdr func-list)) (setq guess-func (car func-list)) (setq func-list nil))) - (when (null guess-func) - (error "Can't guess by folder %s" folder)) - (unless (or (stringp (nth 0 guess-list)) - (stringp (nth 1 guess-list)) - (stringp (nth 2 guess-list))) - (error "Invalid value return guess function `%s'" - (symbol-name guess-func))) - (wl-draft (nth 0 guess-list) nil nil ; To: - (nth 1 guess-list) nil ; Cc: - (nth 2 guess-list) ; Newsgroups: - nil nil nil nil nil nil nil - folder) - (run-hooks 'wl-mail-setup-hook) - (mail-position-on-field "Subject"))) + (if (null guess-func) + (wl-draft) + (unless (or (stringp (nth 0 guess-list)) + (stringp (nth 1 guess-list)) + (stringp (nth 2 guess-list))) + (error "Invalid value return guess function `%s'" + (symbol-name guess-func))) + (wl-draft (list (cons 'To (nth 0 guess-list)) + (cons 'Cc (nth 1 guess-list)) + (cons 'Newsgroups (nth 2 guess-list))) + nil nil nil nil folder) + (run-hooks 'wl-mail-setup-hook) + (mail-position-on-field "Subject")))) (defun wl-summary-forward (&optional without-setup-hook) "" @@ -5241,8 +5319,18 @@ Use function list is `wl-summary-write-current-folder-functions'." (run-hooks 'wl-summary-redisplay-hook)) (message "No message to display.")))) -(defun wl-summary-redisplay-no-mime (&optional folder number) - (interactive) +(defun wl-summary-redisplay-no-mime (&optional ask-coding) + "Display message without MIME decoding. +If ASK-CODING is non-nil, coding-system for the message is asked." + (interactive "P") + (let ((elmo-mime-display-as-is-coding-system + (if ask-coding + (or (read-coding-system "Coding system: ") + elmo-mime-display-as-is-coding-system) + elmo-mime-display-as-is-coding-system))) + (wl-summary-redisplay-no-mime-internal))) + +(defun wl-summary-redisplay-no-mime-internal (&optional folder number) (let* ((fld (or folder wl-summary-buffer-elmo-folder)) (num (or number (wl-summary-message-number))) wl-break-pages)