@@ -1058,6 +1058,90 @@ def test_vi_word_boundaries(self):
10581058 self .assertEqual (reader .pos , expected_pos ,
10591059 f"Expected pos { expected_pos } but got { reader .pos } for '{ text } ' with keys '{ keys } '" )
10601060
1061+ def test_find_char_forward (self ):
1062+ events = itertools .chain (
1063+ code_to_events ("hello world" ),
1064+ [
1065+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1066+ Event (evt = "key" , data = "0" , raw = bytearray (b"0" )), # Go to BOL
1067+ Event (evt = "key" , data = "f" , raw = bytearray (b"f" )), # Find
1068+ Event (evt = "key" , data = "o" , raw = bytearray (b"o" )), # Target char
1069+ ],
1070+ )
1071+ reader , _ = self ._run_vi (events )
1072+ self .assertEqual (reader .pos , 4 )
1073+ self .assertEqual (reader .buffer [reader .pos ], 'o' )
1074+
1075+ def test_find_char_backward (self ):
1076+ events = itertools .chain (
1077+ code_to_events ("hello world" ),
1078+ [
1079+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1080+ Event (evt = "key" , data = "F" , raw = bytearray (b"F" )), # Find back
1081+ Event (evt = "key" , data = "l" , raw = bytearray (b"l" )), # Target char
1082+ ],
1083+ )
1084+ reader , _ = self ._run_vi (events )
1085+ self .assertEqual (reader .buffer [reader .pos ], 'l' )
1086+
1087+ def test_till_char_forward (self ):
1088+ events = itertools .chain (
1089+ code_to_events ("hello world" ),
1090+ [
1091+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1092+ Event (evt = "key" , data = "0" , raw = bytearray (b"0" )), # Go to BOL
1093+ Event (evt = "key" , data = "t" , raw = bytearray (b"t" )), # Till
1094+ Event (evt = "key" , data = "o" , raw = bytearray (b"o" )), # Target char
1095+ ],
1096+ )
1097+ reader , _ = self ._run_vi (events )
1098+ self .assertEqual (reader .pos , 3 )
1099+ self .assertEqual (reader .buffer [reader .pos ], 'l' )
1100+
1101+ def test_semicolon_repeat_find (self ):
1102+ events = itertools .chain (
1103+ code_to_events ("hello world" ),
1104+ [
1105+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1106+ Event (evt = "key" , data = "0" , raw = bytearray (b"0" )), # Go to BOL
1107+ Event (evt = "key" , data = "f" , raw = bytearray (b"f" )), # Find
1108+ Event (evt = "key" , data = "o" , raw = bytearray (b"o" )), # First 'o'
1109+ Event (evt = "key" , data = ";" , raw = bytearray (b";" )), # Repeat - second 'o'
1110+ ],
1111+ )
1112+ reader , _ = self ._run_vi (events )
1113+ self .assertEqual (reader .pos , 7 )
1114+ self .assertEqual (reader .buffer [reader .pos ], 'o' )
1115+
1116+ def test_comma_repeat_find_opposite (self ):
1117+ events = itertools .chain (
1118+ code_to_events ("hello world" ),
1119+ [
1120+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1121+ Event (evt = "key" , data = "0" , raw = bytearray (b"0" )), # Go to BOL
1122+ Event (evt = "key" , data = "f" , raw = bytearray (b"f" )), # Find forward
1123+ Event (evt = "key" , data = "l" , raw = bytearray (b"l" )), # First 'l' at pos 2
1124+ Event (evt = "key" , data = ";" , raw = bytearray (b";" )), # Second 'l' at pos 3
1125+ Event (evt = "key" , data = "," , raw = bytearray (b"," )), # Reverse - back to pos 2
1126+ ],
1127+ )
1128+ reader , _ = self ._run_vi (events )
1129+ self .assertEqual (reader .pos , 2 )
1130+ self .assertEqual (reader .buffer [reader .pos ], 'l' )
1131+
1132+ def test_find_char_escape_cancels (self ):
1133+ events = itertools .chain (
1134+ code_to_events ("hello" ),
1135+ [
1136+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC to normal
1137+ Event (evt = "key" , data = "0" , raw = bytearray (b"0" )), # Go to BOL
1138+ Event (evt = "key" , data = "f" , raw = bytearray (b"f" )), # Start find
1139+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC to cancel
1140+ ],
1141+ )
1142+ reader , _ = self ._run_vi (events )
1143+ self .assertEqual (reader .pos , 0 )
1144+
10611145
10621146@force_not_colorized_test_class
10631147class TestHistoricalReaderBindings (TestCase ):
0 commit comments