@@ -29,18 +29,20 @@ class InvalidInputrc < RuntimeError
29
29
attr_accessor :autocompletion
30
30
31
31
def initialize
32
- @additional_key_bindings = { } # from inputrc
33
- @additional_key_bindings [ :emacs ] = { }
34
- @additional_key_bindings [ :vi_insert ] = { }
35
- @additional_key_bindings [ :vi_command ] = { }
36
- @oneshot_key_bindings = { }
32
+ @additional_key_bindings = { # from inputrc
33
+ emacs : Reline ::KeyActor ::Base . new ,
34
+ vi_insert : Reline ::KeyActor ::Base . new ,
35
+ vi_command : Reline ::KeyActor ::Base . new
36
+ }
37
+ @oneshot_key_bindings = Reline ::KeyActor ::Base . new
37
38
@editing_mode_label = :emacs
38
39
@keymap_label = :emacs
39
40
@keymap_prefix = [ ]
40
- @key_actors = { }
41
- @key_actors [ :emacs ] = Reline ::KeyActor ::Emacs . new
42
- @key_actors [ :vi_insert ] = Reline ::KeyActor ::ViInsert . new
43
- @key_actors [ :vi_command ] = Reline ::KeyActor ::ViCommand . new
41
+ @default_key_bindings = {
42
+ emacs : Reline ::KeyActor ::Base . new ( Reline ::KeyActor ::EMACS_MAPPING ) ,
43
+ vi_insert : Reline ::KeyActor ::Base . new ( Reline ::KeyActor ::VI_INSERT_MAPPING ) ,
44
+ vi_command : Reline ::KeyActor ::Base . new ( Reline ::KeyActor ::VI_COMMAND_MAPPING )
45
+ }
44
46
@vi_cmd_mode_string = '(cmd)'
45
47
@vi_ins_mode_string = '(ins)'
46
48
@emacs_mode_string = '@'
@@ -62,7 +64,7 @@ def reset
62
64
end
63
65
64
66
def editing_mode
65
- @key_actors [ @editing_mode_label ]
67
+ @default_key_bindings [ @editing_mode_label ]
66
68
end
67
69
68
70
def editing_mode = ( val )
@@ -74,7 +76,7 @@ def editing_mode_is?(*val)
74
76
end
75
77
76
78
def keymap
77
- @key_actors [ @keymap_label ]
79
+ @default_key_bindings [ @keymap_label ]
78
80
end
79
81
80
82
def loaded?
@@ -133,26 +135,26 @@ def read(file = nil)
133
135
134
136
def key_bindings
135
137
# The key bindings for each editing mode will be overwritten by the user-defined ones.
136
- kb = @key_actors [ @editing_mode_label ] . default_key_bindings . dup
137
- kb . merge! ( @additional_key_bindings [ @editing_mode_label ] )
138
- kb . merge! ( @oneshot_key_bindings )
139
- kb
138
+ Reline ::KeyActor ::Composite . new ( [ @oneshot_key_bindings , @additional_key_bindings [ @editing_mode_label ] , @default_key_bindings [ @editing_mode_label ] ] )
140
139
end
141
140
142
141
def add_oneshot_key_binding ( keystroke , target )
143
- @oneshot_key_bindings [ keystroke ] = target
142
+ # IRB sets invalid keystroke [Reline::Key]. We should ignore it.
143
+ return unless keystroke . all? { |c | c . is_a? ( Integer ) }
144
+
145
+ @oneshot_key_bindings . add ( keystroke , target )
144
146
end
145
147
146
148
def reset_oneshot_key_bindings
147
149
@oneshot_key_bindings . clear
148
150
end
149
151
150
152
def add_default_key_binding_by_keymap ( keymap , keystroke , target )
151
- @key_actors [ keymap ] . default_key_bindings [ keystroke ] = target
153
+ @default_key_bindings [ keymap ] . add ( keystroke , target )
152
154
end
153
155
154
156
def add_default_key_binding ( keystroke , target )
155
- @key_actors [ @ keymap_label] . default_key_bindings [ keystroke ] = target
157
+ add_default_key_binding_by_keymap ( @ keymap_label, keystroke , target )
156
158
end
157
159
158
160
def read_lines ( lines , file = nil )
@@ -192,7 +194,7 @@ def read_lines(lines, file = nil)
192
194
func_name = func_name . split . first
193
195
keystroke , func = bind_key ( key , func_name )
194
196
next unless keystroke
195
- @additional_key_bindings [ @keymap_label ] [ @keymap_prefix + keystroke ] = func
197
+ @additional_key_bindings [ @keymap_label ] . add ( @keymap_prefix + keystroke , func )
196
198
end
197
199
end
198
200
unless if_stack . empty?
0 commit comments