---
title: "The prompt"
description: "Ghost suggestions, tab completion that explains itself, syntax highlighting, and real multi-line editing."
---
tty7 puts an editor at the shell prompt. Nothing to install, no plugin to source
— the moment a supported shell starts in a pane, the prompt behaves like this.
## Ghost suggestions
As you type, the rest of the line is filled in from your history, greyed out
ahead of the cursor.
| | |
|---|---|
| → | Accept the whole suggestion |
| Keep typing | The suggestion narrows |
| Anything that does not match | It disappears |
Your existing shell history is what feeds it — there is no separate database to
build up first, and it carries across sessions and reboots.
## Tab completion, with descriptions
⇥ opens a completion menu that knows what it is offering:
- **Commands** from your PATH and your shell's builtins
- **Files and directories**, with `cd`, `pushd`, `popd`, and `rmdir` offering
directories only
- **Flags and subcommands** with their descriptions, for about 100 common
commands — `git`, `cargo`, `docker`, `kubectl`, `npm`, `brew` and the rest
- **Values** where a flag only takes certain ones
When tty7 has nothing useful to offer, the ⇥ falls through to your
shell's own completion, so a carefully configured zsh setup is not lost.
To hand ⇥ back to the shell entirely, turn off **Settings → Input →
Prompt → Tab completion** (`tab_completion` in `config.json`).
## Syntax highlighting
The line you are typing is coloured as you type it: the command, its flags, its
arguments, paths, quoted strings, operators, comments. It is a fast tokenizer,
not a shell parser — it never changes what gets run.
## Line editing
The prompt behaves like a text field, because it is one:
- **Click to place the caret** anywhere in the line
- **Select with the mouse**, drag to extend
- **Word motion** and word delete
- **Undo**
Everything readline does still works — this sits on top, it does not replace it.
On macOS, turn on **Settings → Input → Keyboard → Option (⌥) acts as Meta** if
you want ⌥ B / ⌥ F to move by word instead of typing
`∫` and `ƒ`.
## Typing with an IME
Pinyin, Kana, Hangul and the rest work in a pane the way they do in a text
field: the composition is drawn in place at the cursor and only the committed
text reaches the program.
Two rules decide who gets a keystroke:
- **A plain printable key goes to the IME.** A key held with ⌃,
⌘, fn, or ⌥ does not — those are chords, not
characters.
- **A program that asks for every key gets every key.** When something turns on
the kitty keyboard protocol's report-all-keys mode, the IME steps aside so the
program sees raw input.
On macOS with **Option (⌥) acts as Meta** turned on, ⌥ chords
bypass the IME entirely, so ⌥ B reaches your shell as meta-b
instead of being eaten as a dead key.
Rendering CJK well is a separate question — see
[fonts and the two-column grid](/customization/fonts#cjk-and-the-two-column-grid).
## Multi-line commands
A command that wraps, or one you deliberately break across lines, edits in
place. The grid shifts to keep the caret visible instead of scrolling the whole
screen away.
| | |
|---|---|
| ⇧ ⏎ · ⌥ ⏎ | Insert a newline instead of submitting |
| ⏎ | Submit the whole buffer, however many lines it is |
The newline key is rebindable as `InsertNewline` under **Settings →
Keybindings**.
## Which shells
The prompt features arrive through tty7's shell integration, which is injected
automatically — nothing to add to your rc file — for **zsh**, **bash**,
**fish**, **PowerShell**, and **WSL**. Other shells (nushell, elvish, xonsh, and
the rest) run perfectly well in a pane; they simply do not get the prompt layer.
The integration is also what reports the working directory, the exit code of
each command, and where prompts begin — which is what the sidebar's branch
readout, the "command finished" notification, and `tty7 procs` are built on.
[How shell integration works →](/reference/shell-integration)
## Turning it off
Each prompt feature is a switch, and turning one off hands its key straight back
to the shell:
| Setting | Key it releases |
|---|---|
| **Settings → Input → Prompt → Tab completion** | ⇥ → your shell's completion |
| **Settings → Input → Prompt → History search** | ⌃ R → your shell's reverse-i-search, or your fzf binding |
### Giving the whole prompt back to the shell
Turning off **Settings → Input → Prompt → Prompt editor**
(`prompt_editor: false`) hands over not one key but the line itself. Every
keystroke at the prompt — printable characters, arrows, IME commits, paste — goes
straight to the PTY, and your shell's own line editor does the editing: zsh's
ZLE, bash's readline, fish's reader. A widget you bound yourself runs exactly as
it does outside tty7:
```zsh
# ~/.zshrc — works at a tty7 prompt with the editor off
bindkey '^[[A' history-beginning-search-backward-end
```
What you give up is the layer this page describes: ghost suggestions, the
completion menu, the fuzzy ⌃ R, the multi-line editor, mouse caret
placement and undo on the prompt. Tab completion and history search grey out in
Settings while it is off — both are menus tty7 opens inside that editor, so
there is nothing left for them to switch.
What you keep is everything shell integration reports: prompt boundaries, the
working directory, exit codes, "command finished" notifications, the sidebar's
branch readout, `tty7 procs`. The setting moves the line editor, not the
integration.
It applies to open panes immediately, so there is nothing to restart, and a line
you had half-typed is handed to the shell rather than dropped.
Reach for this if the shell's own history traversal matters to you — shared
history between panes, `HIST_FIND_NO_DUPS`, a prefix search bound to
↑ — or if a plugin you rely on (zsh-autosuggestions,
zsh-syntax-highlighting, atuin) should own the line instead.