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
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