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.
13 14 15 |
# File 'lib/textbringer/keymap.rb', line 13 def initialize @map = {} end |
Class Method Details
.key_name(key) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# 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) ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 93 |
# 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 |
Instance Method Details
#define_key(key, command) ⇒ Object Also known as: []
17 18 19 20 21 22 23 24 25 26 27 28 29 |
# 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 |
#each(prefixes = [], &block) ⇒ Object
49 50 51 52 53 54 55 56 57 |
# 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 ⇒ Object
59 60 61 |
# File 'lib/textbringer/keymap.rb', line 59 def handle_undefined_key @map.default_proc = Proc.new { |h, k| yield(k) } end |
#lookup(key_sequence) ⇒ Object
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# 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 |