@@ -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,20 +67,21 @@ 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
@@ -93,6 +96,8 @@ impl EditMode for Vi {
93
96
} else {
94
97
ReedlineEvent :: None
95
98
}
99
+ } else if let Some ( event) = binding {
100
+ event
96
101
} else {
97
102
ReedlineEvent :: None
98
103
}
@@ -277,4 +282,45 @@ mod test {
277
282
278
283
assert_eq ! ( result, ReedlineEvent :: None ) ;
279
284
}
285
+
286
+ #[ test]
287
+ fn find_custom_keybinding_test ( ) {
288
+ let mut keybindings = default_vi_normal_keybindings ( ) ;
289
+ keybindings. add_binding (
290
+ KeyModifiers :: SHIFT ,
291
+ KeyCode :: Char ( 'B' ) ,
292
+ ReedlineEvent :: Edit ( vec ! [ EditCommand :: MoveBigWordLeft { select: false } ] ) ,
293
+ ) ;
294
+ let mut vi = Vi {
295
+ insert_keybindings : default_vi_insert_keybindings ( ) ,
296
+ normal_keybindings : keybindings,
297
+ mode : ViMode :: Normal ,
298
+ ..Default :: default ( )
299
+ } ;
300
+
301
+ let _ = vi. parse_event (
302
+ ReedlineRawEvent :: convert_from ( Event :: Key ( KeyEvent :: new (
303
+ KeyCode :: Char ( 'f' ) ,
304
+ KeyModifiers :: NONE ,
305
+ ) ) )
306
+ . unwrap ( ) ,
307
+ ) ;
308
+ let res = vi. parse_event (
309
+ ReedlineRawEvent :: convert_from ( Event :: Key ( KeyEvent :: new (
310
+ KeyCode :: Char ( 'B' ) ,
311
+ KeyModifiers :: SHIFT ,
312
+ ) ) )
313
+ . unwrap ( ) ,
314
+ ) ;
315
+
316
+ assert_eq ! (
317
+ res,
318
+ ReedlineEvent :: Multiple ( vec![ ReedlineEvent :: Edit ( vec![
319
+ EditCommand :: MoveRightUntil {
320
+ c: 'B' ,
321
+ select: false
322
+ }
323
+ ] ) ] )
324
+ ) ;
325
+ }
280
326
}
0 commit comments