class Redwood::Mode

Attributes

buffer[RW]

Public Class Methods

load_all_modes(dir) click to toggle source
# File lib/sup/mode.rb, line 20
def self.load_all_modes dir
  Dir[File.join(dir, "*.rb")].each do |f|
    $stderr.puts "## loading mode #{f}"
    require f
  end
end
make_name(s;) click to toggle source
# File lib/sup/mode.rb, line 17
def self.make_name s; s.gsub(/.*::/, "").camel_to_hyphy; end
new() click to toggle source
# File lib/sup/mode.rb, line 13
def initialize
  @buffer = nil
end
register_keymap(keymap=nil, &b) click to toggle source
# File lib/sup/mode.rb, line 8
def self.register_keymap keymap=nil, &b
  keymap = Keymap.new(&b) if keymap.nil?
  @@keymaps[self] = keymap
end

Public Instance Methods

blur() click to toggle source
# File lib/sup/mode.rb, line 31
def blur; end
cancel_search!() click to toggle source
# File lib/sup/mode.rb, line 32
def cancel_search!; end
cleanup() click to toggle source
# File lib/sup/mode.rb, line 36
def cleanup
  @buffer = nil
end
draw() click to toggle source
# File lib/sup/mode.rb, line 29
def draw; end
focus() click to toggle source
# File lib/sup/mode.rb, line 30
def focus; end
handle_input(c) click to toggle source
# File lib/sup/mode.rb, line 49
def handle_input c
  action = resolve_input(c) or return false
  send action
  true
end
help_text() click to toggle source
# File lib/sup/mode.rb, line 55
  def help_text
    used_keys = {}
    ancestors.map do |klass|
      km = @@keymaps[klass] or next
      title = "Keybindings from #{Mode.make_name klass.name}"
      s = <<EOS
#{title}
#{'-' * title.display_length}

#{km.help_text used_keys}
EOS
      begin
        used_keys.merge! km.keysyms.to_boolean_h
      rescue ArgumentError
        raise km.keysyms.inspect
      end
      s
    end.compact.join "\n"
  end
in_search?() click to toggle source
# File lib/sup/mode.rb, line 33
def in_search?; false end
killable?() click to toggle source
# File lib/sup/mode.rb, line 27
def killable?; true; end
name() click to toggle source
# File lib/sup/mode.rb, line 18
def name; Mode.make_name self.class.name; end
pipe_to_process(command) { |data| ... } click to toggle source
# File lib/sup/mode.rb, line 96
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*$/
        warn "error running #{command} (but no error message)"
        BufferManager.flash "Error running #{command}!"
      else
        warn "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
resize(rows, cols;) click to toggle source
# File lib/sup/mode.rb, line 35
def resize rows, cols; end
resolve_input(c) click to toggle source
# File lib/sup/mode.rb, line 40
def resolve_input 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
save_to_file(fn, talk=true) { |f| ... } click to toggle source

helper functions

# File lib/sup/mode.rb, line 77
def save_to_file fn, talk=true
  if File.exists? fn
    unless BufferManager.ask_yes_or_no "File \"#{fn}\" exists. Overwrite?"
      info "Not overwriting #{fn}"
      return
    end
  end
  begin
    File.open(fn, "w") { |f| yield f }
    BufferManager.flash "Successfully wrote #{fn}." if talk
    true
  rescue SystemCallError, IOError => e
    m = "Error writing file: #{e.message}"
    info m
    BufferManager.flash m
    false
  end
end
status() click to toggle source
# File lib/sup/mode.rb, line 34
def status; ""; end
unsaved?() click to toggle source
# File lib/sup/mode.rb, line 28
def unsaved?; false end