Skip to content

Latest commit

 

History

History
120 lines (86 loc) · 5.84 KB

File metadata and controls

120 lines (86 loc) · 5.84 KB

Mori

English | 中文

Mori 是给同时跑多个 git 分支的开发者做的 macOS 终端。不用再翻匿名标签页,也不用担心切换上下文时 tmux 状态丢掉——每个分支有自己的独立环境,侧边栏点一下就切过去。

截图

浅色 深色 Lazygit Yazi 设置

功能

  • 侧边栏管所有分支 — 项目和工作树都在侧边栏,不用再找匿名标签页对应哪个分支
  • 关掉再开,状态还在 — Mori 退出后 tmux 继续跑,第二天打开接着用
  • 分支真正隔离 — 每个工作树有独立目录和 tmux 会话,mainfeat/auth 同时跑互不影响
  • 本地和 SSH 都支持 — 本地目录或远程服务器都能连,Mac 原生界面
  • GPU 渲染 — 用 Ghostty 的 libghostty 引擎,Metal 加速
  • 终端拖放 — 拖入文件、URL 或文本,自动插入适用于 shell 的路径和内容
  • CLI + 适合 Agentmori 命令行通过 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

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     # 跑所有测试

CLI

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

许可证

MIT