* wl-util.el (wl-read-shell-commande): New function or alias.
[elisp/wanderlust.git] / wl / wl-addrmgr.el
index 4714a90..4c121a8 100644 (file)
@@ -169,7 +169,34 @@ See info under Wanderlust for full documentation.
    (lambda (addr)
      (nth 1 (std11-extract-address-components addr)))
    (wl-parse-addresses
-    (mapconcat 'identity (elmo-multiple-fields-body-list (list field)) ","))))
+    (mapconcat
+     'identity
+     (elmo-multiple-fields-body-list (list field) mail-header-separator)
+     ","))))
+
+(defun wl-addrmgr-pickup-entry-list (buffer)
+  "Return a list of address entiry from BUFFER."
+  (when buffer
+    (with-current-buffer buffer
+      (mapcar
+       (lambda (addr)
+        (let ((structure (std11-extract-address-components addr)))
+          (list (cadr structure)
+                (or (car structure) "")
+                (or (car structure) ""))))
+       (wl-parse-addresses
+       (mapconcat
+        'identity
+        (elmo-multiple-fields-body-list '("to" "cc" "bcc")
+                                        mail-header-separator)
+        ","))))))
+
+(defun wl-addrmgr-merge-entries (base-list append-list)
+  "Return a merged list of address entiry."
+  (dolist (entry append-list)
+    (unless (assoc (car entry) base-list)
+      (setq base-list (nconc base-list (list entry)))))
+  base-list)
 
 ;;;###autoload
 (defun wl-addrmgr ()
@@ -201,7 +228,9 @@ See info under Wanderlust for full documentation.
     (unless wl-addrmgr-sort-order
       (setq wl-addrmgr-sort-order wl-addrmgr-default-sort-order))
     (setq wl-addrmgr-draft-buffer buffer)
-    (setq wl-addrmgr-list (wl-addrmgr-list))
+    (setq wl-addrmgr-list
+         (wl-addrmgr-merge-entries (wl-addrmgr-list)
+                                   (wl-addrmgr-pickup-entry-list buffer)))
     (wl-addrmgr-draw already-list)
     (setq wl-addrmgr-unknown-list already-list)
     (wl-addrmgr-goto-top)))
@@ -362,13 +391,16 @@ Return nil if no ADDRESS exists."
       (forward-char 4)))))
 
 (defun wl-addrmgr-quit-yes ()
-  (if (and wl-addrmgr-draft-buffer
-          (buffer-live-p wl-addrmgr-draft-buffer)
-          (null (get-buffer-window wl-addrmgr-draft-buffer)))
-      (switch-to-buffer wl-addrmgr-draft-buffer)
-    (unless (one-window-p)
-      (delete-window)))
-  (kill-buffer wl-addrmgr-buffer-name))
+  (let ((draft-buffer wl-addrmgr-draft-buffer))
+    (if (and draft-buffer
+            (buffer-live-p draft-buffer)
+            (null (get-buffer-window draft-buffer 'visible)))
+       (switch-to-buffer draft-buffer)
+      (unless (one-window-p)
+       (delete-window)))
+    (kill-buffer wl-addrmgr-buffer-name)
+    (if (and draft-buffer (not (one-window-p)))
+       (switch-to-buffer-other-window draft-buffer))))
 
 (defun wl-addrmgr-quit ()
   "Exit from electric reference mode without inserting reference."
@@ -578,7 +610,9 @@ Return nil if no ADDRESS exists."
        (cond
         ((string= mark "To:")
          (setq to-list (cons
-                        (if (and full (not (string= realname "")))
+                        (if (and full
+                                 (not (or (string= realname "")
+                                          (string-match ".*:.*;$" addr))))
                             (concat
                              (wl-address-quote-specials realname)
                              " <" addr">")
@@ -586,7 +620,9 @@ Return nil if no ADDRESS exists."
                         to-list)))
         ((string= mark "Cc:")
          (setq cc-list (cons
-                        (if (and full (not (string= realname "")))
+                        (if (and full
+                                 (not (or (string= realname "")
+                                          (string-match ".*:.*;$" addr))))
                             (concat
                              (wl-address-quote-specials realname)
                              " <" addr">")
@@ -594,7 +630,9 @@ Return nil if no ADDRESS exists."
                         cc-list)))
         ((string= mark "Bcc:")
          (setq bcc-list (cons
-                         (if (and full (not (string= realname "")))
+                         (if (and full
+                                  (not (or (string= realname "")
+                                           (string-match ".*:.*;$" addr))))
                              (concat
                               (wl-address-quote-specials realname)
                               " <" addr">")
@@ -613,8 +651,8 @@ Return nil if no ADDRESS exists."
     (when (or (null wl-addrmgr-draft-buffer)
              (not (buffer-live-p wl-addrmgr-draft-buffer)))
       (setq wl-addrmgr-draft-buffer (save-window-excursion
-                                  (wl-draft)
-                                  (current-buffer))))
+                                     (call-interactively 'wl-draft)
+                                     (current-buffer))))
     (with-current-buffer wl-addrmgr-draft-buffer
       (setq from (std11-field-body "From"))
       (if from