所有 worktree,一个键就到
Obelus 不分屏,想同时看两份代码就开两个窗口。所以同一个项目开着好几个 Obelus、各看一个 worktree,是很平常的事。按 F2 再按 Tab,能看到这个仓库所有的 worktree,每棵树下面,开着的每个 Obelus 各占一行,写着它正在看什么。把当前这个 Obelus 换到另一棵树上时,有没保存的文件会先问你,上次在那边开着的东西会重新打开。
照我自己的习惯做的编辑器,agent 就在里面。
Obelus 是一个代码编辑器,有窗口版,也有终端版。它不追求功能多,只照我自己的干活方式来:你把要做的事交给 agent,它到一个单独的 worktree 里去改;你随时能过去看它改到哪了;改完你试一试,让它审一遍,再开 PR 合进去。从头到尾不用离开编辑器,也不用自己敲 git。
挑你的系统,下载安装包,双击装上就行。想用一行命令装,或者也要终端版,往下看。
| 系统 | 下载 |
|---|---|
| macOS(Intel 和 Apple 芯片通用) | Obelus.app |
| Windows x64 | 安装包(.msi) · 压缩包(.zip) |
| Windows ARM64 | 安装包(.msi) · 压缩包(.zip) |
| Linux x86_64 | .deb · .rpm · AppImage |
| Linux arm64 | .deb · .rpm · AppImage |
obg。终端版 ob 用下面的脚本装,或者在 Releases 页下载压缩包。所有文件的 SHA256 也在那里。xattr -dr com.apple.quarantine /Applications/Obelus.app。脚本会下载最新版本,用发布页里的 SHA256SUMS 校验,再把窗口版 obg 放到 PATH 找得到的地方。
curl -fsSL https://raw.githubusercontent.com/obelus-editor/obelus/master/contrib/install.sh | sh
irm https://raw.githubusercontent.com/obelus-editor/obelus/master/contrib/install.ps1 | iex
终端版 ob 是另一个程序,要说一声才装。Windows 上管道没法给脚本传参数,所以先把脚本下载下来再跑。
curl -fsSL https://raw.githubusercontent.com/obelus-editor/obelus/master/contrib/install.sh | sh -s -- --bin both
irm https://raw.githubusercontent.com/obelus-editor/obelus/master/contrib/install.ps1 -OutFile install.ps1
.\install.ps1 -Binary both
--bin ob 只装终端版,--dir 指定装到哪,--help 看其余选项。-NoShortcut 不建)。Linux 上会在 ~/.local/share 下建启动项和图标(--no-desktop 不建),各种启动器都能找到它,omarchy 的 Apps 菜单也是。目录不在 PATH 上的话,脚本会告诉你该加哪一行。-Uninstall;Linux 和 macOS 用 --uninstall,装的时候用了 --dir,卸的时候也要带上。两边都不动你的设置。ob。mise tool-alias set obg 'github:obelus-editor/obelus[matching=obg-]'
mise use -g obg
mise tool-alias set ob 'github:obelus-editor/obelus[matching=ob-]'
mise use -g ob
obg,第二组装终端版 ob,两组都跑就两个都有。matching 决定下载哪个压缩包。用 mise upgrade 升级。obg 要按名字启动。ob。mise 不会检查,装 obg 时会下载 glibc 版,在 musl 上跑不起来。只要一套 stable 的 Rust 工具链(edition 2024)。
git clone https://github.com/obelus-editor/obelus
cd obelus
# 窗口版,装到 ~/.cargo/bin,命令叫 obg
cargo install --path crates/obelus-gui
# 终端版,命令叫 ob
cargo install --path crates/obelus-cli
# 或者只构建:target/release/obg 和 target/release/ob
cargo build --release
rust-analyzer)。没装也能看代码,只是没有跳转定义、报错提示和大纲。要在设置里打开 language_servers,Obelus 才会启动它。obg # 不带参数:在当前目录打开欢迎页
obg src/main.rs # 打开一个文件,它所在的仓库就是项目
obg ../another-repo # 打开一个目录,它就是项目
ob src/main.rs # 同一个文件,在终端里打开
open-settings 改颜色、换行、tab 宽度;choose-theme 换主题。所有按键、命令和设置都在参考里。
这是 Obelus 最主要的用法:从一个想法到一个合进去的改动。agent 在它自己的 worktree 里改代码,你正在看的这份代码一直不动;每到要你拿主意的时候,它就停下来问你。
先记一笔,或者直接开聊。
看到哪行代码不对劲,在那一行按 Alt+t 写一句;想做的事不对着哪一行,就写在笔记页里(Ctrl+t)。不想记笔记也行,F4 直接开一段新对话。
和 agent 把需求聊清楚。
在笔记页里选中一条,按 Alt+a,就开了一段关于它的对话,agent 一上来就知道这条笔记写的是什么。商量好的步骤,它问过你之后记在这条笔记底下。
agent 开一个 worktree 去改。
动手之前,它在 .worktree/ 下面新建一个 worktree 和分支,先编译、跑一遍测试,确认改之前是好的。之后的改动全在那边,你这边的代码一个字都不会变。对话顶上写着它在哪个分支上。
中途随时过去看。
不用等它改完。F2 再按 Tab,选那个 worktree,就切到那棵树上。还没提交的改动,边栏上标着,F3 列出改过的文件;已经提交的,F9 列出这个文件的提交,选一个,就打开那个提交时的文件,那次提交改了什么标在边栏上。
改完了,它告诉你去哪试,然后等你。
它再跑一遍测试,告诉你在哪个目录、哪个分支、跑了什么、结果怎样——是真跑出来的结果,不是「应该没问题」。然后就等着:你没试过,它不往下走。
你试过了,它再审一遍。
你说没问题,它会问要不要先审一遍代码——能开新的上下文就开,不带着写代码时的思路去看。审出来的问题按轻重排好,你勾要修哪些,它一个一个修。
开 PR,一直跟到合并。
接着问你怎么合:直接合并、开 PR,还是先放着。选了 PR,它用 gh 去开,盯着 CI,哪项挂了就告诉你原因,你同意就修,全过了再合并。没装 gh 或者没登录,它就把分支推上去,把链接给你。
最后收拾干净。
合并以后,它会问:要不要把你本地的分支更新到最新,要不要删掉那个 worktree,要不要把笔记打勾,要不要关掉这段对话。
每一个要你决定的地方,agent 都会在对话里弹一张卡片,方向键选、回车定。推送、合并、删除、打勾,没有一样是 agent 自己拍板的。
这套流程是默认的。想让 agent 直接改你眼前的文件,可以在设置里把 workflow 改成 in-place:步骤一样,只是不开 worktree,每处改动都能 Ctrl+z 撤掉;改成 none,就是让 agent 按它自己的习惯来。Obelus 自己从不跑 git,上面的 git 命令都是 agent 跑的。
Obelus 不分屏,想同时看两份代码就开两个窗口。所以同一个项目开着好几个 Obelus、各看一个 worktree,是很平常的事。按 F2 再按 Tab,能看到这个仓库所有的 worktree,每棵树下面,开着的每个 Obelus 各占一行,写着它正在看什么。把当前这个 Obelus 换到另一棵树上时,有没保存的文件会先问你,上次在那边开着的东西会重新打开。
终端版 ob 里,换过去就是在树上按 Enter,也只有这一个键:ob 没法替你开新终端,也没法把别的终端窗口调到前面。窗口版 obg 里换过去是 Ctrl+Enter,因为 Enter 是去另一个窗口:在树上按是在那里新开一个,在某个窗口那一行上按是把它调到前面。
多个窗口一起用的其余细节,在参考里。
Obelus 自己没有模型。它通过 ACP(Agent Client Protocol)连你已经在用的 agent;还没有的话,按 F4 新建对话,在 agents 页里就能装一个。
在一行上按 Alt+t 记一条笔记,Ctrl+t 打开全部。笔记可以对着某一行,也可以对着整个项目,还能一条挂在另一条底下。它记着写下时的提交,所以就算文件后来改了很多,上周写的笔记也还能找到当初那一行。笔记存在 Obelus 自己的目录里,不在仓库里,所以所有 worktree 都看得到,也不会混进你的提交。
不管是 agent 改的还是你改的,改动都直接在文件里看:边栏标出哪些行改过,Alt+d 把旧代码就地展开,再按一下收起来。
git diff 一致gitobg 是窗口版,ob 是终端版,就像 gvim 和 vim:界面一样,按键也一样不用先进「插入模式」才能打字——像 VS Code、Emacs,不像 vim、helix。规律很简单:功能键打开要看的东西,Ctrl 对当前文件做事,Alt 问光标下面是什么。记不住的,Ctrl+p 按名字搜命令;列表有自己的按键时,底部那一行会写出它们是做什么的。完整的按键表在参考里。
上面是 Obelus 和别人不一样的地方。下面是它的全部,每一行都链到功能页里讲它的那一节,连按键带设置。
Obelus 是照一种特定的干活方式做的。下面这些大多说中你的话,它应该会顺手:
这些是故意不做的,不是没来得及。
git,而且先问过你。如果你挑编辑器正是看重上面某一条,Obelus 可能不适合你——没关系,它本来就不是为这个做的。
做取舍时拿来对照的几句话,大多是踩过坑才写下来的。
照一种干活方式做,不照功能清单做。
一个功能留下来,是因为干活时真用得上,不是因为别的编辑器都有。
agent 做的事,你看得见,也撤得回。
agent 改文件,跟你自己改一样,Ctrl+z 就能撤。它跑的命令撤不回,所以命令原样显示、输出全都留着,让 agent 停下的那个键也会把命令一起停掉。
改完的看文件,还没改的看对话。
agent 改完的东西,边栏上已经标出来了,对话里不再重复一遍;它还在请求要做的事,才留在对话里。
你正在看的文件被别人改了,很正常。
agent 改了、格式化工具跑了、分支切了,Obelus 都会自己重新读,你看到哪还是哪;文件被删了,就标上 [stale],内容先留在屏幕上。
说实话,这是我写给自己用的。每个取舍先问「我用着顺不顺手」,再问「会不会有人因为少了某个功能就不用」——所以这页说的习惯,都是我的习惯。
vim 那套我一直用不惯。模式、hjkl、冒号命令,习惯的人是肌肉记忆,我却每次都得想一想。我想要的是打开就能看:方向键就是方向键,Ctrl+c 就是复制,不用先退出什么模式。
而且我写代码的方式变了。现在大部分代码是一堆 Claude Code、Codex 写的,我坐在屏幕前主要是读、确认、标出可疑的地方、决定下一步,还想把待办清单放在代码旁边。终端里的编辑器都在比谁功能多;Obelus 也是编辑器,但走的是另一条路:把语法树、Git 历史、语言服务器和 agent,按我干活的方式摆在一起。
名字的来历:obelus(÷、†)是古代学者在手稿边上做的记号,标在他们觉得可疑的那一行旁边——是读的人边读边留下的。