# Text Cursor Enable Mode (DECTCEM)

> Show or hide the cursor.

- **Sequence:** `CSI ? 25 h`
- **DEC STD 070:** [§5.4.2 Set/Reset Text Cursor Enable Mode, p. 5-21](https://archive.org/details/bitsavers_decstandar0VideoSystemsReferenceManualDec91_74264381/page/n275/mode/1up)
- **VT510:** [DECTCEM—Text Cursor Enable Mode](https://vt100.net/docs/vt510-rm/DECTCEM.html)

`CSI ? 25 h` shows the cursor and `CSI ? 25 l` hides it. Shown is the
default.

Only the cursor's symbol on the screen is affected. A hidden cursor still
has its position, still moves, and text is still written where it is.
DEC STD 070 asks that turning it off be immediate, and
suggests that a terminal's setup screen offer a way to turn it back on, in
case a program forgets to.

On this site the cursor's cell is outlined in the drawn terminal only while
it is visible; the `cursor-visible` line in a case checks the mode itself.

## Validation

### DECTCEM-1: Hidden where it is

Input, one step per line:

```text
\e[2;3H
\e[?25l
```

Expected screen:

```text
|_____|
|_____|
cursor 2,3
cursor-visible no
```

### DECTCEM-2: Text is still written

Input, one step per line:

```text
\e[?25l
AB
```

Expected screen:

```text
|AB___|
cursor 1,3
cursor-visible no
```

### DECTCEM-3: Shown again

Input, one step per line:

```text
\e[?25l
\e[?25h
```

Expected screen:

```text
|_____|
cursor-visible yes
```

### DECTCEM-4: Shown to begin with

Input, one step per line:

```text
\e[?25$p  # DECRQM: is mode 25 set?
```

Expected screen:

```text
|_____|
cursor-visible yes
reply \e[?25;1$y
```

---

This is the Markdown version of <https://control-codes.page/modes/dectcem/>. On that page every validation case runs live in libghostty-vt, the terminal emulation core of Ghostty, compiled to WebAssembly.

The validation cases are written in the notation described in <https://control-codes.page/notation/index.html.md>.
