summaryrefslogtreecommitdiff
path: root/src/tui_engine.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/tui_engine.zig')
-rw-r--r--src/tui_engine.zig14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/tui_engine.zig b/src/tui_engine.zig
index 4924347..a779747 100644
--- a/src/tui_engine.zig
+++ b/src/tui_engine.zig
@@ -80,6 +80,17 @@ pub fn visibleWidth(line: []const u8) usize {
i += skipEscape(line[i..]);
continue;
}
+ if (b == '\t') {
+ const rem = cols % 8;
+ cols += if (rem == 0) 8 else 8 - rem;
+ i += 1;
+ continue;
+ }
+ if (b == '\r') {
+ cols = 0;
+ i += 1;
+ continue;
+ }
// Count one column per UTF-8 codepoint start byte.
const seq_len = std.unicode.utf8ByteSequenceLength(b) catch 1;
cols += 1;
@@ -1010,6 +1021,9 @@ test "visibleWidth strips CSI and counts codepoints" {
try testing.expectEqual(@as(usize, 5), visibleWidth("hello"));
try testing.expectEqual(@as(usize, 5), visibleWidth("\x1b[2mhello\x1b[0m"));
try testing.expectEqual(@as(usize, 0), visibleWidth("\x1b[0m"));
+ try testing.expectEqual(@as(usize, 8), visibleWidth("\t"));
+ try testing.expectEqual(@as(usize, 9), visibleWidth("a\tX"));
+ try testing.expectEqual(@as(usize, 9), visibleWidth("prepainted\r\tX"));
// CURSOR_MARKER (APC string) is zero-width.
try testing.expectEqual(@as(usize, 2), visibleWidth("a" ++ CURSOR_MARKER ++ "b"));
// multibyte UTF-8 counts one column per codepoint.