ghostty/website/app/vt/cub/page.mdx
Mitchell Hashimoto 894e5f0626 website: cub
2023-10-06 11:25:00 -07:00

83 lines
2.7 KiB
Plaintext

import VTSequence from "@/components/VTSequence";
# Cursor Backward (CUB)
<VTSequence sequence={["CSI", "Pn", "D"]} />
Move the cursor `n` cells left.
The parameter `n` must be an integer greater than or equal to 1. If `n` is less than
or equal to 0, adjust `n` to be 1. If `n` is omitted, `n` defaults to 1.
This sequence always unsets the pending wrap state.
The leftmost boundary the cursor can move to is determined by the current
cursor column and the [left margin](#TODO). If the cursor begins to the left
of the left margin, modify the left margin to be the leftmost column
for the duration of the sequence. The leftmost column the cursor can be on
is the left margin.
With the above in place, there are three different cursor backward behaviors
depending on the mode state of the terminal:
- **Reverse wrap**: [wraparound (mode 7)](#TODO) and [reverse wrap (mode 45)](#TODO)
are **BOTH** enabled
- **Extended reverse wrap**: [wraparound (mode 7)](#TODO) and [extended reverse wrap (mode 1045)](#TODO)
are **BOTH** enabled
- **No wrap**: The default behavior if the above wrapping behaviors
do not have their conditions met.
For the **no wrap** behavior, move the cursor to the left `n` cells while
respecting the aforementioned leftmost boundary. Upon reaching the leftmost
boundary, stop moving the cursor left regardless of the remaining value of `n`.
The cursor row remains unchanged.
For the **extended reverse wrap** behavior, move the cursor to the left `n`
cells while respecting the aforementioned leftmost boundary. Upon reaching the
leftmost boundary, if `n > 0` then move the cursor to the [right margin](#TODO)
of the line above the cursor. If the cursor is already on the
[top margin](#TODO), move the cursor to the right margin of the
[bottom margin](#TODO). Both the cursor column and row can change in this
mode.
For the **reverse wrap** (non-extended) behavior, moe the cursor to the left `n`
cells while respecting the aforementioned leftmost boundary. Upon reaching the
leftmost boundary, if `n > 0` then move the cursor to the [right margin](#TODO)
of the line above the cursor. If the cursor is already on the
[top margin](#TODO), do not move the cursor up and the sequence is complete.
This wrapping mode does not wrap the cursor row back to the bottom margin.
## Validation
### CUB V-1: Pending Wrap is Unset
```bash
cols=$(tput cols)
printf "\033[${cols}G" # move to last column
printf "A" # set pending wrap state
printf "\033[D" # move back one
printf "XYZ"
echo
```
```
|________XY|
|Zc________|
```
### CUB V-2: Leftmost Boundary with Reverse Wrap Disabled
```bash
printf "\033[?45l" # disable reverse wrap
echo "A"
printf "\033[10D" # back
printf "B"
```
```
|A_________|
|Bc________|
```
### TODO: Reverse Wrap, Scroll Region Validations