TUI settings

Customize input layout, mouse interaction, and status placement.

Open /settings and choose tui settings to control the main input chrome, mouse interaction, and where status information appears. Changes apply immediately and are saved in $ZOT_HOME/config.json.

SettingValues
click to position cursorOn or off, off by default. Click in the main input to move its cursor, or drag visible text to select it.
input styleplain keeps the default prompt line. lines draws separator lines above and below the input area. block renders a user-bubble-style input block.
status positionabove input or below input for model, usage, and working-directory information.
working spinner positionabove input or below input for the busy spinner shown while a turn is running.

Config keys

$ZOT_HOME/config.json
{
  "tui_click_to_position": true,
  "tui_input_style": "block",
  "tui_status_position": "below_input",
  "tui_working_position": "above_input"
}

tui_click_to_position accepts true or false. Input style accepts plain, lines, and block. Position fields accept above_input and below_input. Missing keys use the defaults: mouse interaction off, plain input, status above input, and spinner above input.

Mouse cursor and text selection

Enable **click to position cursor** under /settings > **tui settings**. A stationary left click in the main input moves the cursor, including wrapped lines and Unicode text. Click-drag selects visible chat or input text without moving the editor cursor. The selection stays highlighted after release and is not copied automatically.

ActionResult
[[ctrl+c]] with a selectionCopy explicitly without clearing the selection. Copying is silent unless an error can be detected.
[[esc]] with a selectionDismiss the selection without cancelling a running turn.
New click, typing, or scrollingClear the previous selection. The wheel browses zot's transcript.
Resize or disable the settingClear the selection. Disabling restores native terminal mouse behavior.

Display updates pause until the selection is dismissed so streaming cannot move selected text. The agent continues working, and the view catches up when the selection clears. Mouse interaction is ignored while a dialog owns input. Without a selection, ctrl+c and esc retain their usual behavior.

ctrl+shift+c and cmd+c can also copy if your terminal forwards the chord to zot. Terminal-native copy shortcuts that the emulator consumes cannot copy zot's highlighted selection. Use ctrl+c for explicit copying in zot.

Clipboard copy uses pbcopy on macOS, PowerShell on Windows, or wl-copy, xclip, or xsel on Linux. Over SSH, or when local copying fails, zot sends an OSC 52 clipboard request instead. Your terminal or multiplexer must allow it, and zot cannot verify that the request succeeded.

Requires a terminal with SGR button-motion reporting, such as Windows Terminal, iTerm2, Ghostty, or VS Code's integrated terminal on its supported operating systems. Selection covers only current visible text, excludes inline images, and copies displayed line breaks rather than reconstructing unwrapped source text. Dragging does not auto-scroll, and double-click word selection is not supported. This is zot-managed selection, not native terminal selection. Many terminals allow Shift-drag for native selection, including scrollback, but the bypass depends on the terminal.

Custom shortcuts

Bind key chords to slash commands with keymap in $ZOT_HOME/config.json. There is no /settings row for this yet; edit the file and restart zot. Each key is a case-insensitive chord made of at least one modifier (ctrl, alt or option, shift, cmd or super) plus a single character or a named key (enter, tab, space, esc, backspace, delete, up, down, left, right, home, end, pageup, pagedown). Each value is a slash command: built-in commands, extension commands, and /skill:<name> all work.

$ZOT_HOME/config.json
{
  "keymap": {
    "ctrl+n": "/new",
    "ctrl+s": "/settings",
    "ctrl+g": "/git-tools:status",
    "alt+r": "/skill:code-review"
  }
}

Shortcuts run in the main interactive input and use the same dispatch path as typing the command. They do not apply while a dialog, extension panel, or tool confirmation has focus. The example ctrl+n binding starts a fresh persisted session, but it is unavailable when zot runs with --no-session. Entries that cannot be bound are skipped and reported above the transcript at startup (the notice clears with /clear): unmodified keys such as enter or g, values that do not start with /, and the reserved ctrl+c, ctrl+d, and esc chords. /help lists the active bindings under custom keys.

Without enhanced keyboard reporting (kitty keyboard protocol or xterm modifyOtherKeys), a terminal cannot distinguish ctrl+h, ctrl+i, and ctrl+m from Backspace, Tab, and Enter, and it does not report Shift on Ctrl+letter chords. zot therefore lets a ctrl+shift+<letter> binding also fire on plain ctrl+<letter> unless a separate ctrl+<letter> binding exists. Chords the terminal emulator or multiplexer consumes itself, such as a tmux prefix or cmd+k, never reach zot.