* wl-summary.el (wl-summary-write-current-folder): Call wl-draft
[elisp/wanderlust.git] / wl / wl-summary.el
index 24f0637..f724f55 100644 (file)
     "----"
     ("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])
   (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)
 
   (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-next-buffer)
+  (define-key wl-summary-mode-map "\C-c\C-n" 'wl-summary-previous-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)
   (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
@@ -2353,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)
@@ -2487,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
@@ -2505,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
@@ -3742,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."
@@ -3892,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"))
@@ -4174,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))
@@ -4400,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)
@@ -4415,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)
@@ -4608,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)
@@ -4918,7 +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 nil nil nil nil nil
            nil (wl-summary-buffer-folder-name))
   (run-hooks 'wl-mail-setup-hook)
   (mail-position-on-field "To"))
@@ -4945,20 +5015,20 @@ 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 (nth 0 guess-list) nil nil ; To:
+               (nth 1 guess-list) nil  ; Cc:
+               (nth 2 guess-list)      ; Newsgroups:
+               nil nil nil nil nil nil
+               folder)
+      (run-hooks 'wl-mail-setup-hook)
+      (mail-position-on-field "Subject"))))
 
 (defun wl-summary-forward (&optional without-setup-hook)
   ""