Class: Reline::KeyStroke
- Inherits:
-
Object
- Object
- Reline::KeyStroke
- Defined in:
- lib/reline/key_stroke.rb
Constant Summary collapse
- ESC_BYTE =
27
- CSI_PARAMETER_BYTES_RANGE =
0x30..0x3f
- CSI_INTERMEDIATE_BYTES_RANGE =
(0x20..0x2f)
Instance Method Summary collapse
- #compress_meta_key(ary) ⇒ Object
- #equal?(me, other) ⇒ Boolean
- #expand(input) ⇒ Object
-
#initialize(config) ⇒ KeyStroke
constructor
A new instance of KeyStroke.
- #match_status(input) ⇒ Object
- #start_with?(me, other) ⇒ Boolean
Constructor Details
#initialize(config) ⇒ KeyStroke
Returns a new instance of KeyStroke.
6 7 8 |
# File 'lib/reline/key_stroke.rb', line 6 def initialize(config) @config = config end |
Instance Method Details
#compress_meta_key(ary) ⇒ Object
10 11 12 13 14 15 16 17 18 19 20 |
# File 'lib/reline/key_stroke.rb', line 10 def (ary) return ary unless @config. ary.inject([]) { |result, key| if result.size > 0 and result.last == "\e".ord result[result.size - 1] = Reline::Key.new(key, key | 0b10000000, true) else result << key end result } end |
#equal?(me, other) ⇒ Boolean
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/reline/key_stroke.rb', line 46 def equal?(me, other) case me when Array compressed_me = (me) compressed_other = (other) compressed_me.size == compressed_other.size and [compressed_me, compressed_other].transpose.all?{ |i| equal?(i[0], i[1]) } when Integer if other.is_a?(Reline::Key) if other.combined_char == "\e".ord false else other.combined_char == me end else me == other end when Reline::Key if other.is_a?(Integer) me.combined_char == other else me == other end end end |
#expand(input) ⇒ Object
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/reline/key_stroke.rb', line 87 def (input) lhs = key_mapping.keys.select { |item| start_with?(input, item) }.sort_by(&:size).last unless lhs status, size = match_unknown_escape_sequence(input) case status when :matched return [:ed_unassigned] + (input.drop(size)) when :matching return [:ed_unassigned] else return input end end rhs = key_mapping[lhs] case rhs when String rhs_bytes = rhs.bytes ((rhs_bytes) + (input.drop(lhs.size))) when Symbol [rhs] + (input.drop(lhs.size)) when Array rhs end end |
#match_status(input) ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/reline/key_stroke.rb', line 71 def match_status(input) key_mapping.keys.select { |lhs| start_with?(lhs, input) }.tap { |it| return :matched if it.size == 1 && equal?(it[0], input) return :matching if it.size == 1 && !equal?(it[0], input) return :matched if it.max_by(&:size)&.size&.< input.size return :matching if it.size > 1 } if key_mapping.keys.any? { |lhs| start_with?(input, lhs) } :matched else match_unknown_escape_sequence(input).first end end |
#start_with?(me, other) ⇒ Boolean
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/reline/key_stroke.rb', line 22 def start_with?(me, other) compressed_me = (me) compressed_other = (other) i = 0 loop do my_c = compressed_me[i] other_c = compressed_other[i] other_is_last = (i + 1) == compressed_other.size me_is_last = (i + 1) == compressed_me.size if my_c != other_c if other_c == "\e".ord and other_is_last and my_c.is_a?(Reline::Key) and my_c. return true else return false end elsif other_is_last return true elsif me_is_last return false end i += 1 end end |