class Redwood::Mode

Attributes

buffer[RW]

Public Class Methods

keymap() click to toggle source
# File lib/sup/mode.rb, line 13
def self.keymap
  @@keymaps[self] || register_keymap
end
keymaps() click to toggle source
# File lib/sup/mode.rb, line 17
def self.keymaps
  @@keymaps
end
load_all_modes(dir) click to toggle source
# File lib/sup/mode.rb, line 28
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 25
def self.make_name s; s.gsub(/.*::/, "").camel_to_hyphy; end
new() click to toggle source
# File lib/sup/mode.rb, line 21
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 39
def blur; end
cancel_search!() click to toggle source
# File lib/sup/mode.rb, line 40
def cancel_search!; end
cleanup() click to toggle source
# File lib/sup/mode.rb, line 44
def cleanup
  @buffer = nil
end
draw() click to toggle source
# File lib/sup/mode.rb, line 37
def draw; end
focus() click to toggle source
# File lib/sup/mode.rb, line 38
def focus; end
handle_input(c) click to toggle source
# File lib/sup/mode.rb, line 57
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 63
  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 41
def in_search?; false end
killable?() click to toggle source
# File lib/sup/mode.rb, line 35
def killable?; true; end
name() click to toggle source
# File lib/sup/mode.rb, line 26
def name; Mode.make_name self.class.name; end
pipe_to_process(command) { |data| ... } click to toggle source
# File lib/sup/mode.rb, line 104
def pipe_to_process command
  begin
    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 nil, false
      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!"
        return nil, true
      else
        return data.read, true
      end
    end
  rescue Errno::ENOENT
    # If the command is invalid
    return nil, false
  end
end
resize(rows, cols;) click to toggle source
# File lib/sup/mode.rb, line 43
def resize rows, cols; end
resolve_input(c) click to toggle source
# File lib/sup/mode.rb, line 48
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 85
def save_to_file fn, talk=true
  if File.exist? 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 42
def status; ""; end
unsaved?() click to toggle source
# File lib/sup/mode.rb, line 36
def unsaved?; false end