sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit 462eba9c8b1178fd37130739863486e273c2ef54
parent 59b5fb611389bd84e383b128f4628d1a68a8a381
Author: wmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Date:   Fri,  9 Nov 2007 06:44:20 +0000

fix email tab completion (i think!)

git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@687 5c8cc53c-5e98-4d25-b20a-d8db53a31250

Diffstat:
M lib/sup/buffer.rb | 19 +++++++++++++++----
M lib/sup/util.rb | 7 +++----
2 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/lib/sup/buffer.rb b/lib/sup/buffer.rb
@@ -355,13 +355,13 @@ class BufferManager
     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}"
@@ -371,6 +371,17 @@ class BufferManager
     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
@@ -436,7 +447,7 @@ class BufferManager
     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) }
diff --git a/lib/sup/util.rb b/lib/sup/util.rb
@@ -222,8 +222,7 @@ class String
         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
@@ -235,7 +234,7 @@ class String
       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
@@ -254,7 +253,7 @@ class String
 
     remainder = case state
       when :instring
-        self[region_start .. -1]
+        self[region_start .. -1].gsub(/^\s+/, "")
       else
         nil
       end