@@ -30,6 +30,7 @@ pub struct Vi {
30
30
previous : Option < ReedlineEvent > ,
31
31
// last f, F, t, T motion for ; and ,
32
32
last_char_search : Option < ViCharSearch > ,
33
+ seq_completed : bool ,
33
34
}
34
35
35
36
impl Default for Vi {
@@ -41,6 +42,7 @@ impl Default for Vi {
41
42
mode : ViMode :: Insert ,
42
43
previous : None ,
43
44
last_char_search : None ,
45
+ seq_completed : true ,
44
46
}
45
47
}
46
48
}
@@ -65,23 +67,26 @@ impl EditMode for Vi {
65
67
( ViMode :: Normal , modifier, KeyCode :: Char ( c) ) => {
66
68
let c = c. to_ascii_lowercase ( ) ;
67
69
68
- if let Some ( event ) = self
70
+ let binding = self
69
71
. normal_keybindings
70
- . find_binding ( modifiers, KeyCode :: Char ( c) )
72
+ . find_binding ( modifiers, KeyCode :: Char ( c) ) ;
73
+ if self . seq_completed
74
+ || binding. is_none ( )
75
+ && ( modifier == KeyModifiers :: NONE || modifier == KeyModifiers :: SHIFT )
71
76
{
72
- event
73
- } else if modifier == KeyModifiers :: NONE || modifier == KeyModifiers :: SHIFT {
74
77
self . cache . push ( if modifier == KeyModifiers :: SHIFT {
75
78
c. to_ascii_uppercase ( )
76
79
} else {
77
80
c
78
81
} ) ;
79
82
80
83
let res = parse ( & mut self . cache . iter ( ) . peekable ( ) ) ;
81
-
84
+ self . seq_completed = res . is_complete ( ) ;
82
85
if !res. is_valid ( ) {
83
86
self . cache . clear ( ) ;
84
87
ReedlineEvent :: None
88
+ } else if let Some ( event) = binding {
89
+ event
85
90
} else if res. is_complete ( ) {
86
91
if res. enters_insert_mode ( ) {
87
92
self . mode = ViMode :: Insert ;
@@ -264,4 +269,42 @@ mod test {
264
269
265
270
assert_eq ! ( result, ReedlineEvent :: None ) ;
266
271
}
272
+
273
+ #[ test]
274
+ fn find_custom_keybinding_test ( ) {
275
+ let mut keybindings = default_vi_normal_keybindings ( ) ;
276
+ keybindings. add_binding (
277
+ KeyModifiers :: SHIFT ,
278
+ KeyCode :: Char ( 'B' ) ,
279
+ ReedlineEvent :: Edit ( vec ! [ EditCommand :: MoveBigWordLeft ] ) ,
280
+ ) ;
281
+ let mut vi = Vi {
282
+ insert_keybindings : default_vi_insert_keybindings ( ) ,
283
+ normal_keybindings : keybindings,
284
+ mode : ViMode :: Normal ,
285
+ ..Default :: default ( )
286
+ } ;
287
+
288
+ let _ = vi. parse_event (
289
+ ReedlineRawEvent :: convert_from ( Event :: Key ( KeyEvent :: new (
290
+ KeyCode :: Char ( 'f' ) ,
291
+ KeyModifiers :: NONE ,
292
+ ) ) )
293
+ . unwrap ( ) ,
294
+ ) ;
295
+ let res = vi. parse_event (
296
+ ReedlineRawEvent :: convert_from ( Event :: Key ( KeyEvent :: new (
297
+ KeyCode :: Char ( 'B' ) ,
298
+ KeyModifiers :: SHIFT ,
299
+ ) ) )
300
+ . unwrap ( ) ,
301
+ ) ;
302
+
303
+ assert_eq ! (
304
+ res,
305
+ ReedlineEvent :: Multiple ( vec![ ReedlineEvent :: Edit ( vec![
306
+ EditCommand :: MoveRightUntil ( 'B' )
307
+ ] ) ] )
308
+ ) ;
309
+ }
267
310
}
0 commit comments