diff options
Diffstat (limited to 'src/tui_engine.zig')
| -rw-r--r-- | src/tui_engine.zig | 14 |
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. |
