diff --git a/iTerm2XCTests/VT100CSIParserTest.m b/iTerm2XCTests/VT100CSIParserTest.m index 2f52f0ff6e..e726012ecc 100644 --- a/iTerm2XCTests/VT100CSIParserTest.m +++ b/iTerm2XCTests/VT100CSIParserTest.m @@ -68,7 +68,6 @@ - (void)testSimpleCSI { XCTAssert(token->type == VT100CSI_CUB); XCTAssert(token.csi->count == 1); XCTAssert(token.csi->p[0] == 1); // Default - XCTAssert(token.csi->subCount[0] == 0); } - (void)testSimpleCSIWithParameter { @@ -76,7 +75,6 @@ - (void)testSimpleCSIWithParameter { XCTAssert(token->type == VT100CSI_CUB); XCTAssert(token.csi->count == 1); XCTAssert(token.csi->p[0] == 2); // Parameter - XCTAssert(token.csi->subCount[0] == 0); } - (void)testSimpleCSIWithTwoDigitParameter { @@ -84,7 +82,6 @@ - (void)testSimpleCSIWithTwoDigitParameter { XCTAssert(token->type == VT100CSI_CUB); XCTAssert(token.csi->count == 1); XCTAssert(token.csi->p[0] == 23); // Parameter - XCTAssert(token.csi->subCount[0] == 0); } - (void)testParameterPrefix { @@ -92,7 +89,6 @@ - (void)testParameterPrefix { XCTAssert(token->type == VT100CSI_DA2); XCTAssert(token.csi->count == 1); XCTAssert(token.csi->p[0] == 23); // Parameter - XCTAssert(token.csi->subCount[0] == 0); } - (void)testTwoParameters { @@ -101,7 +97,20 @@ - (void)testTwoParameters { XCTAssert(token.csi->count == 2); XCTAssert(token.csi->p[0] == 5); XCTAssert(token.csi->p[1] == 6); - XCTAssert(token.csi->subCount[0] == 0); +} + +- (void)testCursorForwardTabulation { + VT100Token *token = [self tokenForDataWithFormat:@"%c[2I", VT100CC_ESC]; + XCTAssert(token->type == VT100CSI_CHT); + XCTAssert(token.csi->count == 1); + XCTAssert(token.csi->p[0] == 2); +} + +- (void)testCursorForwardTabulationDefault { + VT100Token *token = [self tokenForDataWithFormat:@"%c[I", VT100CC_ESC]; + XCTAssert(token->type == VT100CSI_CHT); + XCTAssert(token.csi->count == 1); + XCTAssert(token.csi->p[0] == 1); } - (void)testSubParameter { @@ -109,14 +118,18 @@ - (void)testSubParameter { XCTAssert(token->type == VT100CSI_SGR); XCTAssert(token.csi->count == 1); XCTAssert(token.csi->p[0] == 38); - XCTAssert(token.csi->subCount[0] == 7); - XCTAssert(token.csi->sub[0][0] == 2); - XCTAssert(token.csi->sub[0][1] == 255); - XCTAssert(token.csi->sub[0][2] == 128); - XCTAssert(token.csi->sub[0][3] == 64); - XCTAssert(token.csi->sub[0][4] == 0); - XCTAssert(token.csi->sub[0][5] == 5); - XCTAssert(token.csi->sub[0][6] == 1); + + int subs[VT100CSISUBPARAM_MAX]; + int numberOfSubparameters = iTermParserGetAllCSISubparametersForParameter(token.csi, 0, subs); + + XCTAssert(numberOfSubparameters == 7); + XCTAssert(subs[0] == 2); + XCTAssert(subs[1] == 255); + XCTAssert(subs[2] == 128); + XCTAssert(subs[3] == 64); + XCTAssert(subs[4] == 0); + XCTAssert(subs[5] == 5); + XCTAssert(subs[6] == 1); } - (void)testBogusCharacterInParameters { @@ -131,7 +144,6 @@ - (void)testIntermediateByte { XCTAssert(token->type == VT100CSI_DECSCUSR); XCTAssert(token.csi->count == 1); XCTAssert(token.csi->p[0] == 3); - XCTAssert(token.csi->subCount[0] == 0); } - (void)testBogusCharInParameterSection { diff --git a/sources/VT100CSIParser.m b/sources/VT100CSIParser.m index 7f572296c5..a277723dc4 100644 --- a/sources/VT100CSIParser.m +++ b/sources/VT100CSIParser.m @@ -427,6 +427,11 @@ static void SetCSITypeAndDefaultParameters(CSIParam *param, VT100Token *result) iTermParserSetCSIParameterIfDefault(param, 1, 1); break; + case 'I': + result->type = VT100CSI_CHT; + iTermParserSetCSIParameterIfDefault(param, 0, 1); + break; + case 'c': result->type = VT100CSI_DA; iTermParserSetCSIParameterIfDefault(param, 0, 0); diff --git a/sources/VT100Terminal.m b/sources/VT100Terminal.m index ed60058e98..1d9d281050 100644 --- a/sources/VT100Terminal.m +++ b/sources/VT100Terminal.m @@ -1377,6 +1377,11 @@ - (void)executeToken:(VT100Token *)token { case VT100CSI_CUP: [delegate_ terminalMoveCursorToX:token.csi->p[1] y:token.csi->p[0]]; break; + case VT100CSI_CHT: + for (int i = 0; i < token.csi->p[0]; i++) { + [delegate_ terminalAppendTabAtCursor:!_softAlternateScreenMode]; + } + break; case VT100CSI_CUU: [delegate_ terminalCursorUp:token.csi->p[0] > 0 ? token.csi->p[0] : 1 andToStartOfLine:NO]; diff --git a/sources/VT100Token.h b/sources/VT100Token.h index 893cd1cc1f..bb117679f7 100644 --- a/sources/VT100Token.h +++ b/sources/VT100Token.h @@ -54,6 +54,7 @@ typedef enum { VT100CSI_CUD, // Cursor Down VT100CSI_CUF, // Cursor Forward VT100CSI_CUP, // Cursor Position + VT100CSI_CHT, // Cursor Forward Tabulation Ps tab stops VT100CSI_CUU, // Cursor Up VT100CSI_CNL, // Cursor Next Line VT100CSI_CPL, // Cursor Preceding Line diff --git a/sources/VT100Token.m b/sources/VT100Token.m index bfa7435ca6..4fdcd75273 100644 --- a/sources/VT100Token.m +++ b/sources/VT100Token.m @@ -122,6 +122,7 @@ - (NSString *)codeName { @(VT100CSI_CUD): @"VT100CSI_CUD", @(VT100CSI_CUF): @"VT100CSI_CUF", @(VT100CSI_CUP): @"VT100CSI_CUP", + @(VT100CSI_CHT): @"VT100CSI_CHT", @(VT100CSI_CUU): @"VT100CSI_CUU", @(VT100CSI_DA): @"VT100CSI_DA", @(VT100CSI_DA2): @"VT100CSI_DA2", diff --git a/tests/CHT.txt b/tests/CHT.txt new file mode 100644 index 0000000000..a5fea2a484 --- /dev/null +++ b/tests/CHT.txt @@ -0,0 +1,20 @@ +Back tab by 1: +01234567890123456789_ + +Back tab by 2: +01234567890123456789_ + +Back tab by 99: +012345678901234567899 + +Regular tab: +01234567890123456789 _ + +Default CHT: +01234567890123456789_ + +CHT 2: +01234567890123456789_ + +CHT 99: +01234567890123456789_