Class: Textbringer::Keymap
- Inherits:
-
Object
- Object
- Textbringer::Keymap
- Includes:
- Enumerable
- Defined in:
- lib/textbringer/keymap.rb,
sig/lib/textbringer/keymap.rbs
Class Method Summary collapse
Instance Method Summary collapse
- #define_key(key, command) ⇒ Object (also: #[])
- #each(prefixes = [], &block) ⇒ Hash[untyped, untyped]
- #handle_undefined_key ⇒ Proc
-
#initialize ⇒ Keymap
constructor
A new instance of Keymap.
- #kbd(key) ⇒ Object
- #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(arg0) ⇒ String .key_name(arg0) ⇒ String
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) ⇒ String
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(arg0, arg1) ⇒ Symbol #define_key(arg0, arg1) ⇒ Symbol #define_key(arg0, arg1) ⇒ Symbol #define_key(arg0, arg1) ⇒ Proc #define_key(arg0, arg1) ⇒ nil #define_key(arg0, arg1) ⇒ nil 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) ⇒ Hash[untyped, untyped]
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 ⇒ Proc
59 60 61 |
# File 'lib/textbringer/keymap.rb', line 59 def handle_undefined_key @map.default_proc = Proc.new { |h, k| yield(k) } end |
#kbd(arg0) ⇒ Array[untyped] #kbd(arg0) ⇒ Array[untyped] #kbd(arg0) ⇒ Array[untyped] #kbd(arg0) ⇒ nil
97 98 99 100 101 102 103 104 105 106 107 108 |
# 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 |
#lookup(arg0) ⇒ nil #lookup(arg0) ⇒ Symbol #lookup(arg0) ⇒ Proc #lookup(arg0) ⇒ Textbringer::Keymap
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 |