mirror of
https://github.com/l0ng-ai/tty7.git
synced 2026-09-22 00:02:23 +00:00
5f7a7719386b76817720dd5efca13d6522183ecc
`wsl.exe` is a launcher, not a shell, so the integration has to reach through it into the distro. Probe the distro's login shell, write the matching rcfile on the Windows side, and pass its path in via `WSLENV`, whose `/p` flag rewrites it to the distro's own view of the filesystem (`C:\…` -> `/mnt/c/…`) — so the `/mnt` automount root, which is configurable in `/etc/wsl.conf`, is never hardcoded. The argv becomes `[<launch flags>] -- sh -c 'exec <shell> --rcfile "$RC" -i'` rather than `-- <shell> --rcfile <path>`: the path only exists as an env var *inside* the distro after translation, and `wsl.exe` execs its command directly with no shell to expand it. The one-shot `sh` execs away at once. No new shell code — the distro runs bash, so the existing snippet applies verbatim. Only bash is wired up; zsh and fish inside a distro are reachable the same way but each needs its own verification pass, and declining leaves those panes launching bare, as every WSL pane did before. Tag WSL panes with a new `RemoteKind::Wsl` so `TerminalView::local_cwd` declines their cwd. This is the load-bearing half: the distro reports `/home/me/proj`, which Windows reads not as invalid but as *drive-relative*, resolving to `C:\home\me\proj`. Without the tag, the local git probe, path completion, link resolution and cwd inheritance would all consume it — and on a machine that happens to have such a directory, silently consume the wrong one. The gate itself landed in #133; this adds the third kind to it. Two consequences of that tag needed explicit handling, since nothing matches exhaustively on `RemoteKind` and every miss would have been a silent fall-through: - the foreground-`ssh` poll cleared any context the probe didn't produce, which would have blanked the WSL tag (and the pane's cwd with it) twice a second. It now only replaces the kind it authors. - the tab status dot and `active_ssh_pane` treated "has a RemoteContext" as "is an SSH pane". Both now test the kind. `Injection::force_non_login` is renamed `replaces_argv`: bash needed it because `--rcfile` is ignored for login shells, WSL needs it because the launch flags and command must be reordered around `--`. The mechanism was always "these args replace rather than extend"; only the name was bash's. Verified end-to-end on a real ConPTY into a real distro — the new test asserts the full A/B/C/D cycle comes back through `wsl.exe`, which is the only way to show `WSLENV` translation, `wsl.exe`'s argv passing and the distro's own startup chain all survive together. It shares its harness with the Git Bash test, including the two ConPTY behaviors that harness encodes. 736 tests pass, clippy warning count unchanged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
tty7
A terminal workbench: shells, sessions, SSH, coding agents.
Pure Rust · GPU rendering on Zed's gpui · VT core from Alacritty
English · 简体中文
Why
- Fast — ~2× the throughput of Alacritty, Ghostty, or Kitty (benchmarks)
- Sessions persist — quit or reboot; your shells keep running, no tmux
- Editor-grade input — completion, syntax highlighting, history search built in; zero config for zsh, bash, fish, PowerShell
- Agent-aware — recognizes Claude Code & co. in a pane: status, notifications, session resume
Install
Native builds for each platform on Releases:
| macOS | …-macos-arm64.dmg · …-x86_64.dmg |
drag into Applications |
| Windows | …-setup.exe · portable ….zip |
|
| Linux | …-x86_64.AppImage |
chmod +x and run — x11/wayland libs bundled |
What's inside
| Input | ghost suggestions from history · explained tab completion · syntax highlighting · multi-line editing · click places the caret · ⌃ R fuzzy history |
| Window | tabs & splits · ⌘ P palette · ⌘ F scrollback search · eight themes · IME |
| Coding agents | per-pane agent detection (~17 CLIs): status dot, notifications, branch + diff, resume after reboot, tray icon that signals "needs your input" |
| SSH | native russh stack: profiles with keychain secrets, SFTP panel, port forwarding, jump hosts |
Details for every row: docs/features.md. Keybindings: ⌘ , opens Settings — browse and remap everything, tmux preset included (full list).
Benchmarks
Same machine, same day, same 155×40 grid — Apple M1 Pro, macOS 26.3.1, five-run averages (2026-07-04):
| tty7 | Alacritty | Ghostty | Kitty | |
|---|---|---|---|---|
Plaintext IO — 11 MB cat (lower = better) |
95 ms | 239 ms | 179 ms | 185 ms |
| DOOM-fire frame rate (higher = better) | 888 fps | 485 fps | 552 fps | 617 fps |
| Cold-launch memory | 116 MB¹ | 105 MB | 128 MB | 130 MB |
¹ GUI 105 MB + the persistent daemon 11 MB.
Methodology and one-command reproduction: scripts/bench/.
Built on gpui and alacritty_terminal · Apache-2.0 · Discord · Changelog
Description
A terminal workbench in pure Rust: shells, persistent sessions, SSH, coding agents. GPU-rendered on Zed's gpui, VT core from Alacritty.
ai-agentsalacrittyclaude-codecoding-agentcross-platformdaemondeveloper-toolsgpugpuilinuxmacosptyrustshellsshterminalterminal-emulatorterminal-multiplexertmuxwindows
Readme
Apache-2.0
34 MiB
Languages
Rust
99.1%
Shell
0.5%
PowerShell
0.2%
Inno Setup
0.1%