Appearance
CHT forward tab (CSI I)
CSI Ps ICHT (Cursor Horizontal Forward Tab) advances the cursor forward by N tab stops. The sequence is
CSI Ps I where Ps is the number of tab stops to advance (default 1). Unlike a simple tab character (HT, 0x09) which advances by one tab stop, CHT can jump multiple tab stops in a single sequence. With default 8-column tab stops, CSI 2 I from column 0 would advance to column 16.How this is testedautomated
From column 0, send
From column 0, send
\x1b[2I (CHT 2) with default 8-column tab stops, verify cursor advanced to column 16 (two tab stops forward).The same probe runs against headless backends (via Termless) and real terminal apps (via a daemon launched in each terminal). This lets us distinguish parser correctness from rendering correctness.
Analysis2026-04-06
Supported by 4 of 14 backends (29%)
Terminal Applications
| Terminal | Version | Support | Notes |
|---|---|---|---|
| iTerm2 | 3.6.9 | ✗ no | cursor at col 80, expected 17 |
| Ghostty | 1.3.1 | ✗ no | cursor at col 270, expected 17 |
| VS Code | ✗ no | ||
| Warp | ✗ no | ||
| Cursor | ✗ no | ||
| Terminal.app | ✗ no |
Headless Backends
Parser correctness only — a ✓ means the parser accepts the sequence.
| Backend | Version | Support | Notes |
|---|---|---|---|
| Alacritty | 0.26.0 | ✓ yes | |
| Kitty | 0.40.0 | ✓ yes | |
| WezTerm | 0.1.0-fork.5 | ✓ yes | |
| xterm.js | 5.5.0 | ✓ yes | |
| vt100.js | 0.2.1 | ✗ no | Tab stop manipulation not implemented in vt100.js |
| vterm | 0.2.0 | ✗ no | Tab stop manipulation not implemented in vterm.js |