mirror of
https://github.com/l0ng-ai/tty7.git
synced 2026-09-21 16:02:20 +00:00
Opening a file covered the workspace. The terminal underneath kept running and was neither visible nor typeable, so reading a file while an agent talked was a toggle loop: open it, close it to read the reply, open it again. The Files tree already docks; the two surfaces you go to *from* it did not. They dock now, as a flex sibling of the terminal column rather than a narrower overlay — that distinction is the feature. `set_grid_size` is driven by the terminal element's laid-out bounds, so a column takes width away from the grid and the PTY reflows into what is left; a card painted over half the workspace would have left the grid full width with half of it hidden. `overlay_top` stops ordering a pair and starts choosing between them: a column has one child, and two `flex_1` siblings would split it and fight. Fill mode keeps the old vector, the old opaque paint and the old platform hoist untouched, so nothing about today's overlay changes for anyone who picks it. - Half the terminal column by default; drag the divider, double-click it to cycle a third / half / two thirds, or use the palette commands. Two thirds deliberately runs past the half-window cap the side panels obey — only the terminal's floor binds it. - `DOCUMENT_MIN_W` joins the width budget: both side panels reserve it the way they already reserve each other, and the column is derived from the *live* sidebar and panel widths rather than their floors, so a panel someone dragged wider is width the terminal keeps. - A window too narrow to seat both fills for that frame. The fallback is derived at render time and never stored, so widening re-docks on the next frame with nothing to undo. - Fill or dock is per tab, on the header's context menu. Reading a long file over the whole window in one tab while an agent keeps half of another is the normal case, and one global switch made each of those flip the other. A tab that has not been told reads `document_layout` from the config, which is what a fresh tab starts as — and which the menu therefore does not write, since every untold tab is reading it. - Everywhere but macOS the title bar spans the workspace, which left a bar's height of nothing above the column. The header is drawn into it, and behaves like the title bar it now sits in. With the detail panel closed the column reaches the window's right edge, so the header stops short of the trailing chrome through a width the tab strip's own reservation shares. - The docked headers drop the traffic-light inset they never had to clear, and the diff header's branch name becomes the thing that yields so the view toggle and the close tile survive a column's width. New in `config.json`: `document_ratio`, and `document_layout` for what a fresh tab starts as. Four new actions, bindable and unbound by default.
190 lines
10 KiB
Plaintext
190 lines
10 KiB
Plaintext
---
|
||
title: "config.json"
|
||
description: "Every key tty7 reads, its type, and its default."
|
||
---
|
||
|
||
| | |
|
||
|---|---|
|
||
| macOS / Linux | `~/.config/tty7/config.json` |
|
||
| Windows | `%APPDATA%\tty7\config.json` |
|
||
| Override the whole directory | `TTY7_CONFIG_DIR` |
|
||
|
||
Every key is optional — a missing one means its default, so you only write what
|
||
you change. Out-of-range numbers are clamped rather than rejected, and an
|
||
unrecognised enum value falls back to the default with a log line instead of
|
||
failing the file.
|
||
|
||
```json
|
||
{
|
||
"font_family": "JetBrains Mono",
|
||
"font_size": 14,
|
||
"theme_follow_system": true,
|
||
"theme_preset_light": "one_light",
|
||
"theme_preset_dark": "dracula",
|
||
"macos_option_as_alt": true,
|
||
"scrollback_limit": 50000
|
||
}
|
||
```
|
||
|
||
## Typography
|
||
|
||
| Key | Type | Default | |
|
||
|---|---|---|---|
|
||
| `font_family` | string | `"Hack"` | Primary face. Hack is bundled. |
|
||
| `font_fallbacks` | string[] | platform list | Ordered fallbacks. Stock platform faces are appended to whatever you write. |
|
||
| `font_family_bold` | string | — | A distinct bold face. |
|
||
| `font_family_italic` | string | — | A distinct italic face. |
|
||
| `font_features` | object | — | OpenType tags, e.g. `{"calt": true, "liga": 1}`. Four alphanumeric characters per tag. |
|
||
| `font_size` | number | `15` | Terminal text size in px (4–256). |
|
||
| `line_height` | number | `1.4` | Multiple of the font size (0.5–4). |
|
||
| `ui_font_size` | number | `16` | The interface's root size in px (12–24). |
|
||
|
||
[More about fonts →](/customization/fonts)
|
||
|
||
## Theme and window
|
||
|
||
| Key | Type | Default | |
|
||
|---|---|---|---|
|
||
| `theme_preset` | string | `"light"` | Active theme id. |
|
||
| `theme_follow_system` | bool | `false` | Follow the OS appearance. |
|
||
| `theme_preset_light` | string | `"light"` | Used when following the system. |
|
||
| `theme_preset_dark` | string | `"dark"` | Used when following the system. |
|
||
| `theme_legible_palette` | bool | `true` | Brighten or darken bright ANSI colours that would be unreadable on the background. |
|
||
| `window_opacity` | number | — | 0.2–1.0. Unset means "follow the theme". |
|
||
| `window_blur` | bool | — | Blur behind a translucent window (macOS). Unset means "follow the theme". |
|
||
| `window_backdrop` | enum | `"auto"` | Windows only: `auto`, `blur`, `mica`, `mica-alt`, `acrylic`, `off`. |
|
||
| `dim_inactive_panes` | bool | `true` | Dim panes that are not focused. |
|
||
| `startup_mode` | enum | `"normal"` | `normal`, `maximized`, `fullscreen`. |
|
||
| `remember_window_size` | bool | `true` | Reopen at the last size and position. |
|
||
| `restore_session` | bool | `true` | Reopen the last window's tabs, splits, and directories. |
|
||
| `gui_language` | enum | `"en"` | `en`, `zh-CN`, `ja-JP`. Anything else falls back to `en`. |
|
||
|
||
Built-in theme ids: `light`, `one_light`, `catppuccin_latte`, `rose_pine_dawn`,
|
||
`dark`, `dracula`, `harbor`, `one_dark_pro`, `rose_pine`. Your own themes take
|
||
their id from the file name. [More about themes →](/customization/themes)
|
||
|
||
## Tabs, sidebar, panels
|
||
|
||
| Key | Type | Default | |
|
||
|---|---|---|---|
|
||
| `tab_bar_position` | enum | `"left"` | `left` (sidebar) or `top` (strip). |
|
||
| `new_tab_position` | enum | `"after-current"` | Or `end`. |
|
||
| `sidebar_grouping` | enum | `"repo"` | Or `repo-or-directory` to group non-repo tabs by their folder, or `none` for a flat list. |
|
||
| `sidebar_diff_preview` | bool | `true` | Clicking a row's `+N −M` opens the diff overlay. |
|
||
| `sidebar_width` | number | `220` | Pixels (100–2000). |
|
||
| `sidebar_collapsed` | bool | `false` | |
|
||
| `right_panel_visible` | bool | `false` | |
|
||
| `right_panel_width` | number | `260` | Pixels (100–2000). |
|
||
| `right_panel_tab` | enum | `"info"` | `info`, `changes`, `files`. |
|
||
| `diff_view` | enum | `"split"` | Or `unified`. Global, not per file. |
|
||
| `document_layout` | enum | `"dock"` | Where an open file or diff is drawn: `dock` beside the terminal, or `fill` over the workspace. What a fresh tab starts as — each tab keeps its own from there. |
|
||
| `document_ratio` | number | `0.5` | The docked column’s share of the terminal column (0.2–0.8). Named widths are `0.333`, `0.5`, `0.667`. |
|
||
| `scm_graph_expanded` | bool | `false` | Whether the history section starts open. |
|
||
| `show_tray_icon` | bool | `true` | The tray / menu bar status item. |
|
||
|
||
## Terminal
|
||
|
||
| Key | Type | Default | |
|
||
|---|---|---|---|
|
||
| `shell` | object | — | `{"program": "fish", "args": ["-l"]}`. Unset uses the platform default. `args` you write are launched verbatim, which also turns off [shell integration](/reference/shell-integration) for that shell — leave them out to keep it. |
|
||
| `custom_shells` | array | `[]` | Extra entries for the new-tab menu: `[{"label": "Ubuntu", "program": "wsl.exe", "args": ["-d", "Ubuntu"]}]`. Launched exactly as written, listed after the detected shells. Give an entry arguments and tty7 also skips [shell integration](/reference/shell-integration) for it, so it has no prompt marks, working-directory tracking, or command-finished notifications; an entry with no arguments, on a shell tty7 recognizes, is integrated like the detected row beside it. An entry with no `program` is skipped; with no `label` it is named after its program. |
|
||
| `working_directory` | object | `{"strategy":"inherit"}` | `strategy` is `inherit`, `home`, or `custom`; `path` is used when custom. |
|
||
| `env` | object | `{}` | Extra environment variables for every pane. |
|
||
| `scrollback_limit` | number | `10000` | Lines per pane (100–100,000). New panes only. |
|
||
| `cursor_style` | enum | `"block"` | `block`, `bar`, `underline`. |
|
||
| `cursor_blink` | bool | `true` | |
|
||
| `bell` | enum | `"visual"` | `none`, `visual`, `audible`, `both`. |
|
||
| `per_pane_history` | bool | `false` | Give each pane its own shell history file. |
|
||
|
||
## Mouse and scrolling
|
||
|
||
| Key | Type | Default | |
|
||
|---|---|---|---|
|
||
| `mouse_scroll_multiplier` | number | `1.0` | 0.1–10. |
|
||
| `smooth_scroll` | bool | `true` | Ease each wheel notch. Trackpads unaffected. |
|
||
| `mouse_reporting` | bool | `true` | Let full-screen apps handle clicks and scrolling. |
|
||
| `mouse_zoom_modifier` | enum | `"platform"` | Modifier that makes the wheel resize the font: `platform` (⌘ on macOS, Ctrl elsewhere), `ctrl`, `alt`, `none`. |
|
||
| `mouse_hide_while_typing` | bool | `true` | |
|
||
| `focus_follows_mouse` | bool | `false` | |
|
||
|
||
## Input and clipboard
|
||
|
||
| Key | Type | Default | |
|
||
|---|---|---|---|
|
||
| `prompt_editor` | bool | `true` | tty7 edits the shell prompt. Off sends every key at the prompt to the shell, so its own line editor (ZLE, readline) owns editing. Shell integration stays on. |
|
||
| `tab_completion` | bool | `true` | tty7's completion menu on <kbd>⇥</kbd>. Off hands the key to the shell. Needs `prompt_editor`. |
|
||
| `history_search` | bool | `true` | tty7's fuzzy history on <kbd>⌃ R</kbd>. Off hands the key to the shell. Needs `prompt_editor`. |
|
||
| `smart_select` | bool | `true` | Double-click grabs URLs, paths, bracket pairs, CJK words. |
|
||
| `word_separators` | string | see below | Characters that end a word. Used when smart selection is off. |
|
||
| `copy_on_select` | bool | `false` | |
|
||
| `clipboard_trim_trailing_spaces` | bool | `false` | |
|
||
| `macos_option_as_alt` | bool | `false` | <kbd>⌥</kbd>+key sends the escape chord instead of typing a special character. |
|
||
| `keybindings` | object | `{}` | `{"SplitRight": "cmd-d"}`. [Syntax →](/customization/keybindings) |
|
||
| `keybinding_preset` | string | `"default"` | Or `"tmux"`. |
|
||
| `prefix` | string | `"ctrl-b"` | The tmux preset's prefix. |
|
||
|
||
The default `word_separators` are a comma, a box-drawing bar, a backtick, a
|
||
pipe, a colon, both quote characters, a space, the six bracket characters, the
|
||
angle brackets, and a tab:
|
||
|
||
```json
|
||
{ "word_separators": ",│`|:\"' ()[]{}<>\t" }
|
||
```
|
||
|
||
## Links
|
||
|
||
| Key | Type | Default | |
|
||
|---|---|---|---|
|
||
| `link_url` | bool | `true` | Underline and open URLs on ⌘/Ctrl-click. |
|
||
| `link_file_open` | string | `internal` | What a file link opens: `internal` (tty7's editor, at the line), `system` (the OS file association), `command`. A file on another machine always uses `internal`. |
|
||
| `link_file_command` | string | — | Command for file links under `link_file_open: command`. `{path}`, `{line}`, `{column}` are substituted; a flag whose value is missing is dropped. |
|
||
| `ssh_loopback_forward` | bool | `false` | Open `localhost:PORT` links through a temporary forward when the pane is in SSH. |
|
||
|
||
## Notifications
|
||
|
||
| Key | Type | Default | |
|
||
|---|---|---|---|
|
||
| `notify_on_command_finish` | enum | `"unfocused"` | `never`, `unfocused`, `always`. |
|
||
| `notify_threshold_secs` | number | `10` | How long a command must run to qualify (1–3600). |
|
||
|
||
## Agents
|
||
|
||
| Key | Type | Default | |
|
||
|---|---|---|---|
|
||
| `agent_commands` | object | `{}` | Map a wrapper command to an agent slug: `{"cc": "claude"}`. |
|
||
| `restore_agent_sessions` | bool | `true` | Relaunch an agent conversation when a lost pane is restored. |
|
||
| `install_cli_on_path` | bool | `true` | Put the bundled `tty7` command on PATH at launch. |
|
||
|
||
[Agent slugs →](/agents/overview#your-own-wrapper)
|
||
|
||
## SSH
|
||
|
||
| Key | Type | Default | |
|
||
|---|---|---|---|
|
||
| `ssh_profiles` | array | `[]` | Managed from **Settings → SSH**. Secrets live in the OS keychain, never here. |
|
||
| `verify_host_keys` | bool | `true` | |
|
||
| `ssh_warn_on_close` | bool | `false` | Confirm before closing a live connection. |
|
||
|
||
## Updates and network
|
||
|
||
| Key | Type | Default | |
|
||
|---|---|---|---|
|
||
| `check_for_updates` | bool | `true` | |
|
||
| `update_channel` | enum | `"stable"` | Or `nightly`. |
|
||
| `auto_download_updates` | bool | `true` | Fetch and verify in the background so installing is a restart. Packages are ~25–30 MB and a check happens every six hours. |
|
||
| `http_proxy` | string | — | For tty7's *own* traffic only — update checks, downloads, remote-server installs. `http://…` or `socks5://…`. Programs in a pane are unaffected. |
|
||
|
||
[Updates →](/reference/updates)
|
||
|
||
## Keys tty7 manages itself
|
||
|
||
`ssh_profile_frecency` and `command_frecency` record how often and how recently
|
||
you use a profile or command, so the pickers can rank them. They are written by
|
||
the app; there is no reason to edit them.
|
||
|
||
<Note>
|
||
If the file cannot be parsed, tty7 starts on defaults, keeps your original at
|
||
`config.json.corrupt`, and logs the reason. It never silently overwrites what
|
||
you wrote.
|
||
</Note>
|