Class: Textbringer::Keymap
- Inherits:
-
Object
- Object
- Textbringer::Keymap
- Includes:
- Enumerable
- Defined in:
- lib/textbringer/keymap.rb
Class Method Summary collapse
Instance Method Summary collapse
- #define_key(key, command) ⇒ Object (also: #[])
- #each(prefixes = [], &block) ⇒ Object
- #handle_undefined_key ⇒ Object
-
#initialize ⇒ Keymap
constructor
A new instance of Keymap.
- #lookup(key_sequence) ⇒ Object
Constructor Details
#initialize ⇒ Keymap
Returns a new instance of Keymap.
5 6 7 |
# File 'lib/textbringer/keymap.rb', line 5 def initialize @map = {} end |
Class Method Details
.key_name(key) ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/textbringer/keymap.rb', line 55 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) ⇒ Object
74 75 76 |
# File 'lib/textbringer/keymap.rb', line 74 def self.key_sequence_string(key_sequence) key_sequence.map { |key| key_name(key) }.join(" ") end |
Instance Method Details
#define_key(key, command) ⇒ Object Also known as: []
9 10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/textbringer/keymap.rb', line 9 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 |
#each(prefixes = [], &block) ⇒ Object
41 42 43 44 45 46 47 48 49 |
# File 'lib/textbringer/keymap.rb', line 41 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 ⇒ Object
51 52 53 |
# File 'lib/textbringer/keymap.rb', line 51 def handle_undefined_key @map.default_proc = Proc.new { |h, k| yield(k) } end |
#lookup(key_sequence) ⇒ Object
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/textbringer/keymap.rb', line 24 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 |