HTS Horizontal Tabulation Set
Set a tab stop at the cursor's column.
ESC H
- ECMA-48
- §8.3.62 HTS – Character Tabulation Set, p. 46
- DEC STD 070
- §5.4.5 Horizontal Tabulation Set, p. 5-69
- VT220
- §4.8 Tab Stops
- VT510
- HTS—Horizontal Tab Set
Set a horizontal tab stop at the column the cursor is in. The cursor does not move, and the other tab stops are not affected. The next HT or CHT from left of that column stops there.
HTS is a C1 control. ECMA-48 defines it both as the single byte 88 and as ESC H, and the VT510 manual accepts either. libghostty-vt decodes its input as UTF-8, so it accepts only ESC H: a lone 88 byte is not valid UTF-8 and is printed as U+FFFD, the replacement character, and the code point U+0088 sent as UTF-8 is ignored.
TBC clears tab stops, one or all of them.
Support
| Terminal | Version | Support | Notes |
|---|---|---|---|
| VT220 | manual, 2nd ed., 1984 | Yes | §4.8 Tab Stops |
| VT510 | manual, 1st ed., 1993 | Yes | HTS |
| xterm | patch 412, xterm-411a | Yes | |
| libghostty-vt | 0f171f6 | Yes | ESC H only; U+0088 is ignored |
| pyte | 0.8.2, run as a library | Yes | passes the 3 cases that show it working |
| xterm.js headless | 6.0.0, run as a library | Yes | passes the 3 cases that show it working |
| alacritty_terminal | 0.26.0, run as a library | Yes | passes the 3 cases that show it working |
| ConEmu | build 230724, its documentation | No | not in ConEmu’s ANSI escape codes |
| rxvt-unicode | 9.31, run in a VM | Yes | passes the 3 cases that show it working |
| VTE | 0.84.1, run as a library | Yes | passes the 3 cases that show it working |
Validation
HTS-1: Set a stop
\e[?5W # reset tab stops: 9 and 17
\e[1;5H
\eH
\e[1;1H
\tX
|____X_______________|
HTS-2: The other stops stay
\e[?5W # reset tab stops: 9 and 17
\e[1;5H
\eH
\e[1;1H
\t\tX # 5, then 9
|________X___________|
HTS-3: After clearing every stop
\e[3g # clear every tab stop
\e[1;12H
\eH
\e[1;1H
\tX
|___________X________|
HTS-4: The 8-bit form, sent as UTF-8
\e[3g # clear every tab stop
\e[1;12H
\u{88} # U+0088 is HTS in 8 bits; ignored
\e[1;1H
\tX # no stop was set
|___________________X|