X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=lib%2Fsup%2Fmode.rb;h=bea46d92d425835142f2ae3b94eca035b0a64148;hb=85f89a5ed5b7bc844410adc243d05cc528205a9f;hp=640fbbecbd03f3b0f91df84b23119707d96b7a0d;hpb=86db2c43393c9981291945ba810c53272849f0df;p=sup diff --git a/lib/sup/mode.rb b/lib/sup/mode.rb index 640fbbe..bea46d9 100644 --- a/lib/sup/mode.rb +++ b/lib/sup/mode.rb @@ -24,26 +24,24 @@ class Mode end def killable?; true; end + def unsaved?; false end def draw; end def focus; end def blur; end + def cancel_search!; end + def in_search?; false end def status; ""; end 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 @@ -73,7 +71,8 @@ EOS 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?" @@ -81,10 +80,45 @@ EOS begin File.open(fn, "w") { |f| yield f } BufferManager.flash "Successfully wrote #{fn}." - rescue SystemCallError => e + 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