bin/sup in sup-0.3 vs bin/sup in sup-0.4

- old
+ new

@@ -5,10 +5,24 @@ require 'curses' require 'fileutils' require 'trollop' require "sup" +BIN_VERSION = "0.4" + +unless Redwood::VERSION == BIN_VERSION + $stderr.puts <<EOS + +Error: version mismatch! +The sup executable is at version #{BIN_VERSION.inspect}. +The sup libraries are at version #{Redwood::VERSION.inspect}. + +Is your development environment conflicting with rubygems? +EOS + exit(-1) +end + $exceptions = [] $opts = Trollop::options do version "sup v#{Redwood::VERSION}" banner <<EOS Sup is a curses-based email client. @@ -18,10 +32,11 @@ Options are: EOS opt :list_hooks, "List all hooks and descriptions thereof, and quit." opt :no_threads, "Turn of threading. Helps with debugging. (Necessarily disables background polling for new messages.)" + opt :no_initial_poll, "Don't poll for new messages when starting." opt :search, "Search for threads ", :type => String end if $opts[:list_hooks] Redwood::HookManager.print_hooks @@ -152,13 +167,12 @@ Ncurses::A_BOLD c.add :draft_notification_color, Ncurses::COLOR_RED, Ncurses::COLOR_BLACK, Ncurses::A_BOLD c.add :completion_character_color, Ncurses::COLOR_WHITE, Ncurses::COLOR_BLACK, Ncurses::A_BOLD - c.add :reply_mode_selected_color, Ncurses::COLOR_YELLOW, Ncurses::COLOR_BLACK, Ncurses::A_BOLD - c.add :reply_mode_unselected_color, Ncurses::COLOR_CYAN, Ncurses::COLOR_BLACK - c.add :reply_mode_label_color, Ncurses::COLOR_CYAN, Ncurses::COLOR_BLACK + c.add :horizontal_selector_selected_color, Ncurses::COLOR_YELLOW, Ncurses::COLOR_BLACK, Ncurses::A_BOLD + c.add :horizontal_selector_unselected_color, Ncurses::COLOR_CYAN, Ncurses::COLOR_BLACK c.add :search_highlight_color, Ncurses::COLOR_BLACK, Ncurses::COLOR_YELLOW, Ncurses::A_BOLD, :highlight => :search_highlight_color end bm = BufferManager.new @@ -178,13 +192,13 @@ s.connect rescue SourceError => e Redwood::log "fatal error loading from #{s}: #{e.message}" end end - end + end unless $opts[:no_initial_poll] - imode.load_threads :num => ibuf.content_height, :when_done => lambda { reporting_thread("poll after loading inbox") { sleep 1; PollManager.poll } unless $opts[:no_threads] } + imode.load_threads :num => ibuf.content_height, :when_done => lambda { reporting_thread("poll after loading inbox") { sleep 1; PollManager.poll } unless $opts[:no_threads] || $opts[:no_initial_poll] } unless $opts[:no_threads] PollManager.start SuicideManager.start Index.start_lock_update_thread @@ -197,70 +211,80 @@ until $exceptions.nonempty? || SuicideManager.die? c = Ncurses.nonblocking_getch next unless c bm.erase_flash - unless bm.handle_input(c) - x = global_keymap.action_for c - case x - when :quit - break if bm.kill_all_buffers_safely - when :help - curmode = bm.focus_buf.mode - bm.spawn_unless_exists("<help for #{curmode.name}>") { HelpMode.new curmode, global_keymap } - when :roll_buffers - bm.roll_buffers - when :roll_buffers_backwards - bm.roll_buffers_backwards - when :kill_buffer - bm.kill_buffer_safely bm.focus_buf - when :list_buffers - bm.spawn_unless_exists("Buffer List") { BufferListMode.new } - when :list_contacts - b, new = bm.spawn_unless_exists("Contact List") { ContactListMode.new } - b.mode.load_in_background if new - when :search - query = BufferManager.ask :search, "search all messages: " - next unless query && query !~ /^\s*$/ - SearchResultsMode.spawn_from_query query - when :list_labels - labels = LabelManager.listable_labels.map { |l| LabelManager.string_for l } - user_label = bm.ask_with_completions :label, "Show threads with label (enter for listing): ", labels - unless user_label.nil? - if user_label.empty? - bm.spawn_unless_exists("Label list") { LabelListMode.new } if user_label && user_label.empty? - else - LabelSearchResultsMode.spawn_nicely user_label - end + action = + begin + if bm.handle_input c + :nothing + else + bm.resolve_input_with_keymap c, global_keymap end - when :compose - ComposeMode.spawn_nicely - when :poll - reporting_thread("user-invoked poll") { PollManager.poll } - when :recall_draft - case Index.num_results_for :label => :draft - when 0 - bm.flash "No draft messages." - when 1 - m = nil - Index.each_id_by_date(:label => :draft) { |mid, builder| m = builder.call } - r = ResumeMode.new(m) - BufferManager.spawn "Edit message", r - r.edit_message + rescue InputSequenceAborted + :nothing + end + + case action + when :quit + break if bm.kill_all_buffers_safely + when :help + curmode = bm.focus_buf.mode + bm.spawn_unless_exists("<help for #{curmode.name}>") { HelpMode.new curmode, global_keymap } + when :roll_buffers + bm.roll_buffers + when :roll_buffers_backwards + bm.roll_buffers_backwards + when :kill_buffer + bm.kill_buffer_safely bm.focus_buf + when :list_buffers + bm.spawn_unless_exists("Buffer List") { BufferListMode.new } + when :list_contacts + b, new = bm.spawn_unless_exists("Contact List") { ContactListMode.new } + b.mode.load_in_background if new + when :search + query = BufferManager.ask :search, "search all messages: " + next unless query && query !~ /^\s*$/ + SearchResultsMode.spawn_from_query query + when :list_labels + labels = LabelManager.listable_labels.map { |l| LabelManager.string_for l } + user_label = bm.ask_with_completions :label, "Show threads with label (enter for listing): ", labels + unless user_label.nil? + if user_label.empty? + bm.spawn_unless_exists("Label list") { LabelListMode.new } if user_label && user_label.empty? else - b, new = BufferManager.spawn_unless_exists("All drafts") { LabelSearchResultsMode.new [:draft] } - b.mode.load_threads :num => b.content_height if new + LabelSearchResultsMode.spawn_nicely user_label end - when :nothing - when :redraw - bm.completely_redraw_screen + end + when :compose + ComposeMode.spawn_nicely + when :poll + reporting_thread("user-invoked poll") { PollManager.poll } + when :recall_draft + case Index.num_results_for :label => :draft + when 0 + bm.flash "No draft messages." + when 1 + m = nil + Index.each_id_by_date(:label => :draft) { |mid, builder| m = builder.call } + r = ResumeMode.new(m) + BufferManager.spawn "Edit message", r + r.edit_message else - bm.flash "Unknown keypress '#{c.to_character}' for #{bm.focus_buf.mode.name}." + b, new = BufferManager.spawn_unless_exists("All drafts") { LabelSearchResultsMode.new [:draft] } + b.mode.load_threads :num => b.content_height if new end + when :nothing, InputSequenceAborted + when :redraw + bm.completely_redraw_screen + else + bm.flash "Unknown keypress '#{c.to_character}' for #{bm.focus_buf.mode.name}." end bm.draw_screen end + + bm.kill_all_buffers if SuicideManager.die? rescue Exception => e $exceptions << [e, "main"] ensure unless $opts[:no_threads] PollManager.stop if PollManager.instantiated?