class Textbringer::Keymap

Public Class Methods

key_name(key) click to toggle source
# File lib/textbringer/keymap.rb, line 63
def self.key_name(key)
  case key
  when Symbol
    "<#{key}>"
  when " "
    "SPC"
  when "\t"
    "TAB"
  when "\e"
    "ESC"
  when "\C-m"
    "RET"
  when /\A[\0-\x1f\x7f]\z/
    "C-" + (key.ord ^ 0x40).chr.downcase
  else
    key.to_s
  end
end
key_sequence_string(key_sequence) click to toggle source
# File lib/textbringer/keymap.rb, line 82
def self.key_sequence_string(key_sequence)
  ks = key_sequence.dup
  key_names = []
  while key = ks.shift
    if key == "\e" && !ks.empty?
      key_names.push("M-" + key_name(ks.shift))
    else
      key_names.push(key_name(key))
    end
  end
  key_names.join(" ")
end
new() click to toggle source
# File lib/textbringer/keymap.rb, line 13
def initialize
  @map = {}
end

Public Instance Methods

[](key, command)
Alias for: define_key
define_key(key, command) click to toggle source
# File lib/textbringer/keymap.rb, line 17
def define_key(key, command)
  key_sequence = kbd(key)

  case key_sequence.size
  when 0
    raise ArgumentError, "Empty key"
  when 1
    @map[key_sequence.first] = command
  else
    k, *ks = key_sequence
    (@map[k] ||= Keymap.new).define_key(ks, command)
  end
end
Also aliased as: []
each(prefixes = []) { |[*prefixes, key], val| ... } click to toggle source
# File lib/textbringer/keymap.rb, line 49
def each(prefixes = [], &block)
  @map.each do |key, val|
    if val.is_a?(Keymap)
      val.each([*prefixes, key], &block)
    else
      yield([*prefixes, key], val)
    end
  end
end
handle_undefined_key() { |k| ... } click to toggle source
# File lib/textbringer/keymap.rb, line 59
def handle_undefined_key
  @map.default_proc = Proc.new { |h, k| yield(k) }
end
lookup(key_sequence) click to toggle source
# File lib/textbringer/keymap.rb, line 32
def lookup(key_sequence)
  case key_sequence.size
  when 0
    raise ArgumentError, "Empty key"
  when 1
    @map[key_sequence.first]
  else
    k, *ks = key_sequence
    km = @map[k]
    if km.is_a?(Keymap)
      km.lookup(ks)
    else
      nil
    end
  end
end

Private Instance Methods

kbd(key) click to toggle source
# File lib/textbringer/keymap.rb, line 97
def kbd(key)
  case key
  when Symbol
    [key]
  when String
    key.b.gsub(/[\x80-\xff]/n) { |c| "\e" + (c.ord & 0x7f).chr }.chars
  when Array
    key
  else
    raise TypeError, "invalid key type #{key.class}"
  end
end