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
def handle_input c
- if(action = resolve_input c)
- send action
- true
- else
- false
- end
+ action = resolve_input(c) or return false
+ send action
+ true
end
def help_text
s
end.compact.join "\n"
end
+
+### 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