@@ -1306,6 +1306,102 @@ def test_X_delete_char_before(self):
13061306 self .assertEqual (reader .get_unicode (), "helo" )
13071307 self .assertEqual (reader .vi_mode , ViMode .NORMAL )
13081308
1309+ def test_dd_deletes_current_line (self ):
1310+ events = itertools .chain (
1311+ code_to_events ("first" ),
1312+ [Event (evt = "key" , data = "\n " , raw = bytearray (b"\n " ))],
1313+ code_to_events ("second" ),
1314+ [Event (evt = "key" , data = "\n " , raw = bytearray (b"\n " ))],
1315+ code_to_events ("third" ),
1316+ [
1317+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1318+ Event (evt = "key" , data = "k" , raw = bytearray (b"k" )), # up to second
1319+ Event (evt = "key" , data = "d" , raw = bytearray (b"d" )), # dd
1320+ Event (evt = "key" , data = "d" , raw = bytearray (b"d" )),
1321+ ],
1322+ )
1323+ reader , _ = self ._run_vi (events )
1324+ self .assertEqual (reader .get_unicode (), "first\n \n third" )
1325+
1326+ def test_j_k_navigation_between_lines (self ):
1327+ events = itertools .chain (
1328+ code_to_events ("short" ),
1329+ [Event (evt = "key" , data = "\n " , raw = bytearray (b"\n " ))],
1330+ code_to_events ("longer line" ),
1331+ [
1332+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1333+ Event (evt = "key" , data = "k" , raw = bytearray (b"k" )), # up
1334+ Event (evt = "key" , data = "$" , raw = bytearray (b"$" )), # end of line
1335+ Event (evt = "key" , data = "j" , raw = bytearray (b"j" )), # down
1336+ ],
1337+ )
1338+ reader , _ = self ._run_vi (events )
1339+ self .assertEqual (reader .get_unicode (), "short\n longer line" )
1340+ # Cursor should be somewhere on second line
1341+ self .assertGreater (reader .pos , 6 ) # past the newline
1342+
1343+ def test_dollar_stops_at_line_end (self ):
1344+ events = itertools .chain (
1345+ code_to_events ("first" ),
1346+ [Event (evt = "key" , data = "\n " , raw = bytearray (b"\n " ))],
1347+ code_to_events ("second" ),
1348+ [
1349+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1350+ Event (evt = "key" , data = "k" , raw = bytearray (b"k" )), # up to first
1351+ Event (evt = "key" , data = "0" , raw = bytearray (b"0" )), # BOL
1352+ Event (evt = "key" , data = "$" , raw = bytearray (b"$" )), # EOL
1353+ ],
1354+ )
1355+ reader , _ = self ._run_vi (events )
1356+ # $ should stop at end of "first", not go to newline or beyond
1357+ self .assertEqual (reader .pos , 4 ) # 'first'[4] = 't'
1358+
1359+ def test_zero_goes_to_line_start (self ):
1360+ events = itertools .chain (
1361+ code_to_events ("first" ),
1362+ [Event (evt = "key" , data = "\n " , raw = bytearray (b"\n " ))],
1363+ code_to_events ("second" ),
1364+ [
1365+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1366+ Event (evt = "key" , data = "0" , raw = bytearray (b"0" )), # BOL of second
1367+ ],
1368+ )
1369+ reader , _ = self ._run_vi (events )
1370+ # 0 should go to start of "second" line (position 6)
1371+ self .assertEqual (reader .pos , 6 )
1372+
1373+ def test_o_opens_line_below (self ):
1374+ events = itertools .chain (
1375+ code_to_events ("first" ),
1376+ [Event (evt = "key" , data = "\n " , raw = bytearray (b"\n " ))],
1377+ code_to_events ("third" ),
1378+ [
1379+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1380+ Event (evt = "key" , data = "k" , raw = bytearray (b"k" )), # up to first
1381+ Event (evt = "key" , data = "o" , raw = bytearray (b"o" )), # open below
1382+ ],
1383+ code_to_events ("second" ),
1384+ )
1385+ reader , _ = self ._run_vi (events )
1386+ self .assertEqual (reader .get_unicode (), "first\n second\n third" )
1387+ self .assertEqual (reader .vi_mode , ViMode .INSERT )
1388+
1389+ def test_w_motion_crosses_lines (self ):
1390+ events = itertools .chain (
1391+ code_to_events ("end" ),
1392+ [Event (evt = "key" , data = "\n " , raw = bytearray (b"\n " ))],
1393+ code_to_events ("start" ),
1394+ [
1395+ Event (evt = "key" , data = "\x1b " , raw = bytearray (b"\x1b " )), # ESC
1396+ Event (evt = "key" , data = "k" , raw = bytearray (b"k" )), # up
1397+ Event (evt = "key" , data = "$" , raw = bytearray (b"$" )), # end of "end"
1398+ Event (evt = "key" , data = "w" , raw = bytearray (b"w" )), # word forward
1399+ ],
1400+ )
1401+ reader , _ = self ._run_vi (events )
1402+ # w from end of first line should go to start of "start"
1403+ self .assertEqual (reader .pos , 4 ) # position of 's' in "start"
1404+
13091405
13101406@force_not_colorized_test_class
13111407class TestHistoricalReaderBindings (TestCase ):
0 commit comments