@@ -1470,6 +1470,10 @@ - (void)testIPCSelectedText {
1470
1470
NSString *regcontents = [vc evaluateVimExpression:@"getreg()"];
1471
1471
XCTAssertEqualObjects(regcontents, @"abcd\n");
1472
1472
1473
+ // Visual mode
1474
+
1475
+ NSString *changedtick1 = [vc evaluateVimExpression:@"b:changedtick"];
1476
+
1473
1477
// Get selected texts in visual mode
1474
1478
XCTAssertFalse([vc hasSelectedText]);
1475
1479
XCTAssertNil([vc selectedText]);
@@ -1491,30 +1495,79 @@ - (void)testIPCSelectedText {
1491
1495
XCTAssertEqualObjects([vc selectedText], @"bc\nfg");
1492
1496
1493
1497
// Set selected texts in visual block mode
1494
- NSString *changedtick = [vc evaluateVimExpression:@"b:changedtick"];
1495
- [vc replaceSelectedText:@"xyz\n1234"];
1496
- NSString *changedtick2 = [vc evaluateVimExpression:@"b:changedtick"];
1498
+ [vc insertOrReplaceSelectedText:@"xyz\n1234"];
1497
1499
XCTAssertEqualObjects([vc evaluateVimExpression:@"getline(1)"], @"axyz d");
1498
1500
XCTAssertEqualObjects([vc evaluateVimExpression:@"getline(2)"], @"e1234h");
1499
1501
XCTAssertEqualObjects([vc evaluateVimExpression:@"getline(3)"], @"ijkl");
1500
- XCTAssertNotEqualObjects(changedtick, changedtick2);
1501
-
1502
- // Make sure replacing texts when nothing is selected won't set anything
1503
- [vc replaceSelectedText:@"foobar"];
1504
- NSString *changedtick3 = [vc evaluateVimExpression:@"b:changedtick"];
1505
- XCTAssertEqualObjects(changedtick2, changedtick3);
1506
1502
1507
1503
// Select in visual block again but send a different number of lines, make sure we intentionaly won't treat it as block text
1508
1504
[self sendStringToVim:@"ggjjvll" withMods:0];
1509
1505
[self sendKeyToVim:@"v" withMods:NSEventModifierFlagControl];
1510
1506
[self waitForEventHandlingAndVimProcess];
1511
- [vc replaceSelectedText :@"xyz\n1234\n"]; // ending in newline means it gets interpreted as line-wise
1507
+ [vc insertOrReplaceSelectedText :@"xyz\n1234\n"]; // ending in newline means it gets interpreted as line-wise
1512
1508
XCTAssertEqualObjects([vc evaluateVimExpression:@"getline(1)"], @"axyz d");
1513
1509
XCTAssertEqualObjects([vc evaluateVimExpression:@"getline(2)"], @"e1234h");
1514
1510
XCTAssertEqualObjects([vc evaluateVimExpression:@"getline(3)"], @"xyz");
1515
1511
XCTAssertEqualObjects([vc evaluateVimExpression:@"getline(4)"], @"1234");
1516
1512
XCTAssertEqualObjects([vc evaluateVimExpression:@"getline(5)"], @"l");
1517
1513
1514
+ // Normal mode
1515
+
1516
+ // When nothing is selected this will simply insert the text and not replace anything
1517
+ [self sendStringToVim:@"ggll" withMods:0];
1518
+ [self waitForEventHandlingAndVimProcess];
1519
+ [vc insertOrReplaceSelectedText:@"_normtext_"];
1520
+ XCTAssertEqualObjects([vc evaluateVimExpression:@"getline(1)"], @"ax_normtext_yz d");
1521
+
1522
+ // Insert mode
1523
+
1524
+ [self sendStringToVim:@"ggjja" withMods:0];
1525
+ [self waitForEventHandlingAndVimProcess];
1526
+ // Should insert the text at the cursor
1527
+ [vc insertOrReplaceSelectedText:@"_inserttext_"];
1528
+ XCTAssertEqualObjects([vc evaluateVimExpression:@"getline(3)"], @"x_inserttext_yz");
1529
+ // Should leave the cursor past the inserted text
1530
+ [self sendStringToVim:@"additional_text" withMods:0];
1531
+ [self waitForEventHandlingAndVimProcess];
1532
+ XCTAssertEqualObjects([vc evaluateVimExpression:@"getline(3)"], @"x_inserttext_additional_textyz");
1533
+ [self sendKeyToVim:@"[" withMods:NSEventModifierFlagControl]; // escape insert mode
1534
+ [self waitForEventHandlingAndVimProcess];
1535
+
1536
+ // Cmdline mode
1537
+
1538
+ NSString *changedtick2 = [vc evaluateVimExpression:@"b:changedtick"];
1539
+ XCTAssertNotEqualObjects(changedtick1, changedtick2);
1540
+
1541
+ [self sendStringToVim:@":cnoremap z <Left>\n" withMods:0];
1542
+ [self sendStringToVim:@":123" withMods:0];
1543
+ [self waitForEventHandlingAndVimProcess];
1544
+ [vc insertOrReplaceSelectedText:@"a\nb\n"];
1545
+ XCTAssertEqualObjects([vc evaluateVimExpression:@"getcmdline()"], @"123a\rb\r"); // Vim does internal \n to \r conversion
1546
+ XCTAssertEqualObjects([vc evaluateVimExpression:@"getcmdpos()"], @"8");
1547
+ [self sendKeyToVim:@"[" withMods:NSEventModifierFlagControl]; // escape cmdline
1548
+ [self waitForEventHandlingAndVimProcess];
1549
+
1550
+ [self sendStringToVim:@":123zzz" withMods:0];
1551
+ [self waitForEventHandlingAndVimProcess];
1552
+ [vc insertOrReplaceSelectedText:@"foobar"];
1553
+ XCTAssertEqualObjects([vc evaluateVimExpression:@"getcmdline()"], @"foobar123");
1554
+ XCTAssertEqualObjects([vc evaluateVimExpression:@"getcmdpos()"], @"7");
1555
+ [self sendKeyToVim:@"[" withMods:NSEventModifierFlagControl]; // escape cmdline
1556
+
1557
+ [self waitForEventHandlingAndVimProcess];
1558
+ [self sendStringToVim:@":123z" withMods:0];
1559
+ [self waitForEventHandlingAndVimProcess];
1560
+ [vc insertOrReplaceSelectedText:@"foobar"];
1561
+ XCTAssertEqualObjects([vc evaluateVimExpression:@"getcmdline()"], @"12foobar3");
1562
+ XCTAssertEqualObjects([vc evaluateVimExpression:@"getcmdpos()"], @"9");
1563
+ [self sendKeyToVim:@"[" withMods:NSEventModifierFlagControl]; // escape cmdline
1564
+ [self waitForEventHandlingAndVimProcess];
1565
+
1566
+ // Make sure that the actual buffer wasn't changed at all during these insertions as they all
1567
+ // went to the cmdline.
1568
+ NSString *changedtick3 = [vc evaluateVimExpression:@"b:changedtick"];
1569
+ XCTAssertEqualObjects(changedtick2, changedtick3);
1570
+
1518
1571
// Make sure registers didn't get stomped (internally the implementation uses register and manually restores it)
1519
1572
regcontents = [[app keyVimController] evaluateVimExpression:@"getreg()"];
1520
1573
XCTAssertEqualObjects(regcontents, @"abcd\n");
0 commit comments