Merge pull request #1332 from mitchellh/wrap

ECH and EL should reset softwrap state
This commit is contained in:
Mitchell Hashimoto
2024-01-19 15:47:34 -08:00
committed by GitHub
3 changed files with 69 additions and 4 deletions

View File

@ -1370,6 +1370,9 @@ pub fn eraseLine(
if (cell.attrs.wide_spacer_tail) x -= 1;
}
// This resets the soft-wrap of this line
row.setWrapped(false);
break :right .{ x, row.lenCells() };
},
@ -1387,6 +1390,8 @@ pub fn eraseLine(
break :left .{ 0, x + 1 };
},
// Note that it seems like complete should reset the soft-wrap
// state of the line but in xterm it does not.
.complete => .{ 0, row.lenCells() },
else => {
@ -1492,6 +1497,9 @@ pub fn eraseChars(self: *Terminal, count_req: usize) void {
break :end end;
};
// This resets the soft-wrap of this line
row.setWrapped(false);
const pen: Screen.Cell = .{
.bg = self.screen.cursor.pen.bg,
};
@ -4833,7 +4841,7 @@ test "Terminal: deleteChars split wide character tail" {
}
}
test "Terminal: eraseChars resets wrap" {
test "Terminal: eraseChars resets pending wrap" {
const alloc = testing.allocator;
var t = try init(alloc, 5, 5);
defer t.deinit(alloc);
@ -4851,6 +4859,33 @@ test "Terminal: eraseChars resets wrap" {
}
}
test "Terminal: eraseChars resets wrap" {
const alloc = testing.allocator;
var t = try init(alloc, 5, 5);
defer t.deinit(alloc);
for ("ABCDE123") |c| try t.print(c);
{
const row = t.screen.getRow(.{ .active = 0 });
try testing.expect(row.isWrapped());
}
t.setCursorPos(1, 1);
t.eraseChars(1);
{
const row = t.screen.getRow(.{ .active = 0 });
try testing.expect(!row.isWrapped());
}
try t.print('X');
{
const str = try t.plainString(testing.allocator);
defer testing.allocator.free(str);
try testing.expectEqualStrings("XBCDE\n123", str);
}
}
test "Terminal: eraseChars simple operation" {
const alloc = testing.allocator;
var t = try init(alloc, 5, 5);
@ -5193,7 +5228,7 @@ test "Terminal: eraseLine simple erase right" {
}
}
test "Terminal: eraseLine resets wrap" {
test "Terminal: eraseLine resets pending wrap" {
const alloc = testing.allocator;
var t = try init(alloc, 5, 5);
defer t.deinit(alloc);
@ -5211,6 +5246,33 @@ test "Terminal: eraseLine resets wrap" {
}
}
test "Terminal: eraseLine resets wrap" {
const alloc = testing.allocator;
var t = try init(alloc, 5, 5);
defer t.deinit(alloc);
for ("ABCDE123") |c| try t.print(c);
{
const row = t.screen.getRow(.{ .active = 0 });
try testing.expect(row.isWrapped());
}
t.setCursorPos(1, 1);
t.eraseLine(.right, false);
{
const row = t.screen.getRow(.{ .active = 0 });
try testing.expect(!row.isWrapped());
}
try t.print('X');
{
const str = try t.plainString(testing.allocator);
defer testing.allocator.free(str);
try testing.expectEqualStrings("X\n123", str);
}
}
test "Terminal: eraseLine right preserves background sgr" {
const alloc = testing.allocator;
var t = try init(alloc, 5, 5);

View File

@ -12,7 +12,8 @@ or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
The rightmost column that can be erased is the rightmost column of the screen.
The [right margin](#) has no effect on this sequence.
This sequence always unsets the pending wrap state.
This sequence always unsets the pending wrap state. If the row under the cursor
is soft-wrapped, then the soft-wrap state is also reset.
For `n` cells up to the rightmost column, blank the cell by replacing it
with an empty character with the background color colored according to the

View File

@ -27,7 +27,9 @@ first or second cell of the two-cell character, both cells should be erased.
If `n` is `0`, perform an **erase line right** operation. Erase line right
is equivalent to [Erase Character (ECH)](/vt/ech) with `n` set to the total
remaining columns from the cursor to the end of the line (and including
the cursor).
the cursor). If the line is softwrapped, only the single row is erased;
it does not erase through the wrap. Further, the wrap state of the row is
reset such that the line is no longer considered wrapped.
If `n` is `1`, perform an **erase line left** operation. This replaces
the `n` cells left of and including the cursor with a blank character and