end
   end
 
-  def ask_many_with_completions domain, question, completions, default=nil, sep=" "
+  def ask_many_with_completions domain, question, completions, default=nil
     ask domain, question, default do |partial|
       prefix, target = 
-        case partial#.gsub(/#{sep}+/, sep)
+        case partial
         when /^\s*$/
           ["", ""]
-        when /^(.*#{sep})?(.*?)$/
+        when /^(.*\s+)?(.*?)$/
           [$1 || "", $2]
         else
           raise "william screwed up completion: #{partial.inspect}"
     end
   end
 
+  def ask_many_emails_with_completions domain, question, completions, default=nil
+    ask domain, question, default do |partial|
+      prefix, target = partial.split_on_commas_with_remainder
+      Redwood::log "before: prefix #{prefix.inspect}, target #{target.inspect}"
+      target ||= prefix.pop || ""
+      prefix = prefix.join(", ") + (prefix.empty? ? "" : ", ")
+      Redwood::log "after: prefix #{prefix.inspect}, target #{target.inspect}"
+      completions.select { |x| x =~ /^#{target}/i }.map { |x| [prefix + x, x] }
+    end
+  end
+
   def ask_for_filename domain, question, default=nil
     answer = ask domain, question, default do |s|
       if s =~ /(~([^\s\/]*))/ # twiddle directory expansion
     contacts = ContactManager.contacts.map { |c| [ContactManager.alias_for(c), c.full_address, c.email] }
 
     completions = (recent + contacts).flatten.uniq.sort
-    answer = BufferManager.ask_many_with_completions domain, question, completions, default, /\s*,\s*/
+    answer = BufferManager.ask_many_emails_with_completions domain, question, completions, default
 
     if answer
       answer.split_on_commas.map { |x| ContactManager.contact_for(x.downcase) || PersonManager.person_for(x) }
 
         char = nil
         newpos = length
       end
-        
-      $stderr.puts "pos #{newpos} (len #{length}), state #{state}, char #{(char || ?$).chr}, region_start #{region_start}"
+
       case char
       when ?"
         state = case state
       when ?,, nil
         state = case state
           when :outstring, :escaped_outstring:
-            ret << self[region_start ... newpos]
+            ret << self[region_start ... newpos].gsub(/^\s+|\s+$/, "")
             region_start = newpos + 1
             :outstring
           when :instring: :instring
 
     remainder = case state
       when :instring
-        self[region_start .. -1]
+        self[region_start .. -1].gsub(/^\s+/, "")
       else
         nil
       end