lib/sup/mode.rb in sup-0.3 vs lib/sup/mode.rb in sup-0.4

- old
+ new

@@ -33,21 +33,16 @@ def resize rows, cols; end def cleanup @buffer = nil end - ## turns an input keystroke into an action symbol def resolve_input c - ## try all keymaps in order of age - action = nil - klass = self.class - - ancestors.each do |klass| - action = @@keymaps.member?(klass) && @@keymaps[klass].action_for(c) + ancestors.each do |klass| # try all keymaps in order of ancestry + next unless @@keymaps.member?(klass) + action = BufferManager.resolve_input_with_keymap c, @@keymaps[klass] return action if action end - nil end def handle_input c action = resolve_input(c) or return false @@ -73,19 +68,55 @@ end s end.compact.join "\n" end - ## helper function +### helper functions + def save_to_file fn if File.exists? fn return unless BufferManager.ask_yes_or_no "File exists. Overwrite?" end begin File.open(fn, "w") { |f| yield f } BufferManager.flash "Successfully wrote #{fn}." rescue SystemCallError, IOError => e BufferManager.flash "Error writing to file: #{e.message}" + end + end + + def pipe_to_process command + Open3.popen3(command) do |input, output, error| + err, data, * = IO.select [error], [input], nil + + unless err.empty? + message = err.first.read + if message =~ /^\s*$/ + Redwood::log "error running #{command} (but no error message)" + BufferManager.flash "Error running #{command}!" + else + Redwood::log "error running #{command}: #{message}" + BufferManager.flash "Error: #{message}" + end + return + end + + data = data.first + data.sync = false # buffer input + + yield data + data.close # output will block unless input is closed + + ## BUG?: shows errors or output but not both.... + data, * = IO.select [output, error], nil, nil + data = data.first + + if data.eof + BufferManager.flash "'#{command}' done!" + nil + else + data.read + end end end end end