Files
tty7/docs/features.md
T
l0ng-ai 6753b9697b fix(completion): fall through to shell completion, dir-only candidates, opt-out (#136)
Three fixes for tty7's Tab completion:

- Tab is no longer swallowed when the engine has no candidates: the
  locally edited line is handed off to the shell (text shipped raw,
  cursor walked back, Tab sent) and the local editor suspends until the
  next prompt cycle, so shell-native completion (compsys, fzf-tab, ...)
  answers instead. The handoff release keys off a new entered-prompt
  cycle counter rather than the raw Prompt-frame seq, so same-prompt
  redraws (PS1-embedded 133;B re-emissions) cannot re-engage the editor
  while zle still holds the handed-off text.
- cd/pushd/popd/rmdir complete directories only in the no-signature
  path fallback; Fig 'folders' templates narrow signature slots the
  same way. Symlinks now classify by their target.
- New tab_completion config field (default true) plus a Settings ->
  Terminal -> Keyboard toggle; when off every Tab goes to the shell.
2026-07-21 18:25:49 +08:00

6.9 KiB
Raw Permalink Blame History

Features

English · 简体中文

Input

  • Ghost suggestions — your history completes the whole line as you type; to accept
  • Explained tab completion — every flag and subcommand with its description, for ~100 common commands; when tty7 has nothing to offer the Tab falls through to your shell's own completion, and the whole feature can be turned off (Settings → Terminal → Keyboard, or tab_completion in config.json)
  • Syntax highlighting — as you type, nothing to install
  • Fuzzy history search⌃ R shows what you ran, where, and whether it failed
  • History from day one — your existing shell history works as-is and carries across sessions
  • Line editing — click to place the caret, mouse selection, word motion, undo
  • Multi-line editing — wrapped and multi-line commands edit in place; the grid shifts to keep the caret visible

In the window

  • Tabs & splits — always open in the current directory
  • Repo-grouped sidebar — the left tab sidebar groups rows under a header per git repository, non-repo tabs in a trailing Scratch section; branch switches and in-repo cds never move a row (sidebar_grouping in config.json: repo default, none for a flat list)
  • Command palette ⌘ P · scrollback search ⌘ F
  • ⌘-click links · desktop notifications · copy on select (opt-in, Settings → Terminal → Clipboard)
  • Smart double-click selection — double-click grabs the whole URL, file path, bracket/quote pair, or dictionary-segmented CJK word under the cursor; Shift-click extends a selection (toggle in Settings → Terminal → Mouse; word separators via word_separators in config.json)
  • Eight themes, plus your own — YAML seed themes with solid, gradient, or image backgrounds; iTerm2 .itermcolors import; in-app color editor with a background-image picker
  • Sync with system — Settings → Appearance; pick separate light and dark themes and tty7 follows the OS appearance live (theme_follow_system, theme_preset_light / theme_preset_dark in config.json)
  • Window opacity & blur — Settings → Appearance → Window; applies to every theme, Follow theme returns to the theme's own opacity / blur
  • CJK / IME input

Coding agents

tty7 recognizes third-party coding agents running in a pane (Claude Code, Codex, Gemini CLI, Aider, Amp, OpenCode, and ~10 more) and adds around them — it never wraps or replaces the agent.

  • Brand avatars — the tab chip / sidebar row shows which agent runs where; custom wrappers map in via agent_commands in config.json
  • Status dot — working (blue) / needs your input (amber) / done (green), driven by agent-reported events over an OSC channel; run Agent: Install Claude Code Hooks from the palette to wire Claude Code up
  • Notifications — "needs your permission…" the moment an agent blocks on you, and "finished after Ns" per turn, honoring your notification policy
  • Branch at a glance — each sidebar row shows its pane's git branch and working-tree diff (+N M), refreshed on cd and when a command finishes
  • Session resume — panes lost to a reboot re-launch their agent conversation on restore, carrying the original launch flags (claude --dangerously-skip-permissions --resume …) (restore_agent_sessions, on by default)
  • Context feed — palette commands send the current selection or the repo's git diff to the running agent as a ready-made prompt
  • Tray icon — a system tray / menu bar item that flips to an attention state the moment any agent needs your input; its menu lists every agent pane (brand avatar + status dot, click to reveal), switches the notification policy, and offers Quit and Stop Daemon alongside the plain session-keeping quit (show_tray_icon, on by default)

SSH

A native Rust SSH stack (russh) is the only path — profiles, credentials, and SFTP without shelling out to ssh. There is no system-ssh compat mode.

  • QuickConnect — type user@host[:port] in the palette and connect; IPv6 [::1]:port supported
  • Saved profiles — full connection config with passwords / passphrases in the OS keychain, never on disk
  • ~/.ssh/config aliases — type one to connect (resolved natively — common fields, best-effort — over russh), or import them as profiles in Settings
  • GUI auth — in-pane sheets for password, key passphrase, 2FA, and host-key confirmation (new vs. changed)
  • Built-in SFTP — a slide-in file panel: browse, upload / download, rename / delete / chmod, drag to Finder
  • Port forwarding — Local / Remote / Dynamic, preconfigured or added live, plus ⌘-click localhost:PORT to auto-forward
  • Jump hosts & proxies — multi-hop via profile references or ProxyJump, ProxyCommand, SOCKS5 / HTTP
Entry point Connects via
Saved profiles · QuickConnect · typed user@host[:port] Native russh — SFTP · keychain · GUI auth · L/R/D forwards
~/.ssh/config aliases Resolved natively, then russh (Match/canonicalize/GSSAPI unsupported — no fallback)

Keybindings

Keys are shown in macOS notation — on Windows and Linux, read as Ctrl. The essentials:

⌘ T · ⌘ W · ⌘ ⇧ T new tab · close tab · reopen closed tab
⌘ 1⌘ 9 · ⌃ ⇥ · ⌃ ⇧ ⇥ jump to tab 19 · next tab · previous tab
⌘ D · ⌘ ⇧ D split right · split down
⌘ ] · ⌘ [ next pane · previous pane
⌘ ⌥ ←→↑↓ focus the pane in that direction
⌘ ⏎ · ⌘ ⇧ ⏎ toggle fullscreen · maximize / restore the pane
⌘ K clear the screen and scrollback
⌘ P command palette
⌘ F search the scrollback
⌃ R fuzzy-search shell history
⌘ + · · ⌘ 0 font size up · down · reset

Settings → Keybindings (⌘ ,) lists every shortcut. Click one, press the new keys (Esc cancels, Backspace resets to default), and it takes effect immediately. Pane resize and swap have no default keys — bind them here or run them from the command palette.

tmux preset — remaps pane/tab actions onto a prefix (default ⌃ B): ⌃ B C opens a tab, ⌃ B % splits, ⌃ B then an arrow moves focus. A bare prefix reaches the shell after a brief pause; prefix + an unbound key passes straight through.

Performance notes

  • The PTY is read at device speed and parsed in large batches, off the render path
  • Hot paths are lock-free — a big cat never waits on drawing
  • The daemon buffers up to 16 MiB ahead of the window before backpressure applies