Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,25 @@ listed under a **Changed** or **Removed** heading.
cell and style assertions. Every Rust block in it is compiled against the
crate in CI, and the README shows the one-line install for Claude Code.

### Fixed

- **Custom tab stops are honoured: `HTS`, `TBC`, `CHT` and `CBT` do what
they say.** Stops were fixed at every eighth column — the backend's
hardcoded value — and all four escapes reached a dispatch table with no
entry for them and vanished, though `hts`, `tbc` and `cbt` are all in the
terminfo entry termlens hands every child. An application that laid a
table out by setting its own stops and tabbing between them drew every
column in the wrong place, and did it *silently*: the characters were all
present, so `contains` still passed and only a column assertion or a
whole-screen snapshot could catch it. The stop set now lives in the
sequence tracker beside the character sets, and the emulator rewrites each
motion as a `CHA` the backend does dispatch. Plain `\t` is rewritten too,
or the backend's eight and a custom stop would disagree the moment one was
set. `RIS` and `DECSTR` restore the every-eighth default; a resize extends
the set into its new columns with that same pattern and leaves the stops
it already had alone. `CBT` is also what `Shift-Tab` sends, so an
application echoing one now moves. (#262)

## [0.9.0] - 2026-09-05

### Added
Expand Down
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,14 @@ design. termlens's position:
ROMs, the other national sets — is acknowledged and reads as ASCII.
`DECSC`/`DECRC` save and restore this state with the cursor. Locking
shifts remain G0/G1 only (`LS2`/`LS3` are not modelled).
- **Tab stops are the application's to set.** `HTS` (`ESC H`), `TBC`
(`CSI g`, `CSI 3 g`), `CHT` (`CSI I`) and `CBT` (`CSI Z`) all work, and a
plain `\t` honours whatever stops are set rather than a fixed eight.
`RIS` and `DECSTR` restore the every-eighth default, and a resize extends
the set into its new columns with that pattern while leaving existing
stops alone. Back-tab moves to the nearest stop *strictly* left of the
cursor, as xterm does. Only `TBC 0` and `TBC 3` are modelled; the rest of
that family clears *line* tab stops, which this crate has no notion of.
- `wait_frame` needs the application to bracket its repaints in DEC 2026
synchronized updates, and only the last 8 completed frames are retained;
everything else waits with `wait_until`, under the three rules in
Expand Down
Loading
Loading