English | 中文
Mori 是给同时跑多个 git 分支的开发者做的 macOS 终端。不用再翻匿名标签页,也不用担心切换上下文时 tmux 状态丢掉——每个分支有自己的独立环境,侧边栏点一下就切过去。
| 浅色 | 深色 | Lazygit | Yazi | 设置 |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
- 侧边栏管所有分支 — 项目和工作树都在侧边栏,不用再找匿名标签页对应哪个分支
- 关掉再开,状态还在 — Mori 退出后 tmux 继续跑,第二天打开接着用
- 分支真正隔离 — 每个工作树有独立目录和 tmux 会话,
main和feat/auth同时跑互不影响 - 本地和 SSH 都支持 — 本地目录或远程服务器都能连,Mac 原生界面
- GPU 渲染 — 用 Ghostty 的 libghostty 引擎,Metal 加速
- 终端拖放 — 拖入文件、URL 或文本,自动插入适用于 shell 的路径和内容
- CLI + 适合 Agent —
mori命令行通过 Unix socket 控制一切,脚本和 AI Agent 工作流都好用 - MoriRemote — 不在 Mac 旁边时,用 iPhone/iPad 通过 SSH 连进来
Mori 把开发的层级结构直接映射到 tmux:每个 git 工作树是一个 tmux 会话,会话里有窗口(标签页)和面板(分屏)。关掉 Mori,明天回来,里面跑的东西一个不少。
Project 项目(git 仓库)
└── Worktree 工作树(分支) ← tmux 会话 例如 myapp/feat-auth
├── Window 窗口(标签页) ← tmux 窗口 例如 "shell"
│ ├── Pane 面板(左侧分屏) ← tmux 面板
│ └── Pane 面板(右侧分屏) ← tmux 面板
└── Window 窗口(标签页) ← tmux 窗口 例如 "logs"
└── Pane 面板
- Project(项目) — 一个 git 仓库,用根路径和短名称标识。
- Worktree(工作树) —
git worktree检出的分支目录,对应一个 tmux 会话(<项目>/<分支>)。 - Window(窗口) — 会话里的 tmux 窗口,就是标签页。
- Pane(面板) — 窗口里的 tmux 面板,就是分屏。
侧边栏列出所有项目和工作树,点一下就接上对应会话,切换是即时的。
brew tap vaayne/tap
brew install --cask mori也可以从 GitHub Releases 下载。MoriRemote iOS 版在 TestFlight。
MoriRemote 是 iPhone/iPad 上的 SSH 与 tmux 伴侣,不是远程桌面。它要求显式确认主机密钥,支持密码和导入的 OpenSSH 私钥,并保证移动端导航不干扰其他 tmux 客户端。服务器需要 tmux 3.2 或更高版本。本地终端历史和选择只保留在设备上;分屏、关闭与新建窗口属于共享工作区操作。软件键盘支持输入法组合文本;从照片或剪贴板选择的图片会通过已认证 SSH 连接上传,再以经过 shell 转义的远程路径插入终端,不会自动提交。
从源码构建 MoriRemote 需要 Xcode、XcodeGen 和固定的 remux Ghostty 源码。本地任务会构建一份同时支持 macOS 与 iOS 的通用 XCFramework;CI 也只构建一次同一源码制品,并由 macOS 和 iOS job 共享。
mise run ios:test
mise run ios:run # 验证启动、存活、崩溃日志和截图该框架从固定 commit 的 h3nock/remux-ghostty 源码构建,而非下载第三方预构建制品。详见
MoriRemote/UPSTREAM.md。
从源码编译
需要 macOS 14+、tmux、mise、Zig 0.15.2 和 Xcode。
mise run build # Debug 构建(自动引导 macOS libghostty)
# `mise run ios:*` 会自动引导通用 macOS + iOS GhosttyKit 制品
mise run dev # 构建并运行
mise run test # 跑所有测试mori 命令行通过 Unix socket 跟应用通信,没开的话会自动启动。在 Mori 终端里用的话,--project、--worktree 这些参数可以省掉,Mori 会自动从环境变量读。
mori project open . # 把当前目录加为项目
mori worktree new feat/auth --project myapp # 新建工作树,自动创建 tmux 会话
mori pane read --lines 100 # 读取面板输出(Agent 常用)
mori focus --project myapp --worktree feat/auth # 切换到指定工作树所有命令加 --json 可以输出机器可读格式。完整文档见 docs/cli-redesign.md。
Mori 用的是 Ghostty 那套配置,直接改 ~/.config/ghostty/config 就行。Mori 只覆盖了几个嵌入相关的选项(去掉窗口装饰、最后一个窗口关掉不退出应用)。
Mori 管理的 tmux 会话默认会加一小段预设:开鼠标、关状态栏,方便快速上手。如果你已经有自己的 tmux.conf,在设置 → Tools 里关掉这个预设就好。
完整列表见 docs/keymaps.zh-Hans.md,常用的:
| 快捷键 | 操作 |
|---|---|
| ⌘+T | 新建窗口(标签页) |
| ⌘+D / ⌘+⇧+D | 右分屏 / 下分屏 |
| ⌃+Tab | 切换工作树 |
| ⌘+⇧+N | 新建工作树 |
| ⌘+⇧+P | 命令面板 |
| ⌘+G | Lazygit |
| ⌘+E | Yazi |




