÷ Obelus 代码编辑器 English GitHub
÷

Obelus

照我自己的习惯做的编辑器,agent 就在里面。

Obelus 是一个代码编辑器,有窗口版,也有终端版。它不追求功能多,只照我自己的干活方式来:你把要做的事交给 agent,它到一个单独的 worktree 里去改;你随时能过去看它改到哪了;改完你试一试,让它审一遍,再开 PR 合进去。从头到尾不用离开编辑器,也不用自己敲 git。

安装 看看工作流 全部功能 GitHub
一个 Rust 文件停在某个提交上,改过的一行就地展开,旧行在上,新行在下。 一个 Rust 文件停在某个提交上,改过的一行就地展开,旧行在上,新行在下。
看 agent 的一次提交:改动直接展开在代码里,删掉的旧行在上、新行在下,边栏标着每一行是谁写的。
一段对话:agent 说了问题出在哪、怎么改的、跑了什么、改动在哪,下面一张卡片问要不要审一遍。 一段对话:agent 说了问题出在哪、怎么改的、跑了什么、改动在哪,下面一张卡片问要不要审一遍。
一段对话:agent 说清楚改了什么、改在哪个分支,等你试过,再用卡片问要不要审一遍。
笔记页:一条笔记底下挂着几步,有的打了勾,开过对话的那条旁边有标记。 笔记页:一条笔记底下挂着几步,有的打了勾,开过对话的那条旁边有标记。
笔记页:agent 拆出来的步骤挂在笔记底下,开过对话的笔记旁边有标记。
Worktrees 标签页:主 checkout 和 agent 的 worktree,两个都有窗口开着。 Worktrees 标签页:主 checkout 和 agent 的 worktree,两个都有窗口开着。
F2 再按 Tab:这个仓库所有的 worktree,选一个就切过去。

01安装

挑你的系统,下载安装包,双击装上就行。想用一行命令装,或者也要终端版,往下看。

下载安装包

系统下载
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 也在那里。
  • macOS:Obelus 没有经过 Apple 公证,第一次打开会提示无法验证开发者。到「系统设置 → 隐私与安全性」里点「仍要打开」;或者在终端里运行 xattr -dr com.apple.quarantine /Applications/Obelus.app。
  • Windows:安装包没有签名,SmartScreen 可能会拦一下,点「更多信息 → 仍要运行」。MSI 装在你自己的用户目录下,不用管理员权限,会加开始菜单入口和 PATH,在「设置 → 应用」里能卸载。

用一行命令安装

脚本会下载最新版本,用发布页里的 SHA256SUMS 校验,再把窗口版 obg 放到 PATH 找得到的地方。

Linux 和 macOS

curl -fsSL https://raw.githubusercontent.com/obelus-editor/obelus/master/contrib/install.sh | sh

Windows,在 PowerShell 里

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 看其余选项。
  • Windows 上脚本会把目录加进 PATH,在开始菜单建一个入口(-NoShortcut 不建)。Linux 上会在 ~/.local/share 下建启动项和图标(--no-desktop 不建),各种启动器都能找到它,omarchy 的 Apps 菜单也是。目录不在 PATH 上的话,脚本会告诉你该加哪一行。
  • 卸载:Windows 用 -Uninstall;Linux 和 macOS 用 --uninstall,装的时候用了 --dir,卸的时候也要带上。两边都不动你的设置。
  • musl 系统上没有窗口版:窗口要在运行时加载 Vulkan、Wayland 和 X11,静态链接的程序做不到。脚本会说明,然后改装 ob。

用 mise,哪个系统都行

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,两组都跑就两个都有。
  • 各起一个名字,两个才能并存:mise 一个名字只记一个工具,直接装两次同一个仓库,后一次会顶掉前一次。matching 决定下载哪个压缩包。用 mise upgrade 升级。
  • 这样装没有启动项,也没有开始菜单入口,obg 要按名字启动。
  • musl 系统上只装 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 是 rust-analyzer)。没装也能看代码,只是没有跳转定义、报错提示和大纲。要在设置里打开 language_servers,Obelus 才会启动它。
  • 一个支持 ACP 的 agent。没有的话 Obelus 能帮你装,见接上你已经在用的 agent。
  • 终端版想显示图标的话,装一套 Nerd Font。图标默认是关的,没装也不会出现方框;窗口版自带,不用装。

跑起来

obg                  # 不带参数:在当前目录打开欢迎页
obg src/main.rs      # 打开一个文件,它所在的仓库就是项目
obg ../another-repo  # 打开一个目录,它就是项目
ob src/main.rs       # 同一个文件,在终端里打开

头五分钟

  1. F1 打开文件:打字筛选,↑↓ 选,Enter 打开,Esc 取消。
  2. 列表底部只列现在能用的键,按了没用的键不会出现在那里。
  3. Ctrl+p 是命令面板,记不住快捷键的,都能按名字搜到。
  4. 光标放到一处改动上按 Alt+d,改之前的样子会就地展开。
  5. 看到可疑的一行,按 Alt+t 记一句。再按 Ctrl+t 打开笔记页,选中它按 Alt+a,和 agent 聊聊——这就是下面那套工作流的起点。
  6. Ctrl+p → open-settings 改颜色、换行、tab 宽度;choose-theme 换主题。
  7. Ctrl+q 退出。

所有按键、命令和设置都在参考里。

02工作流

这是 Obelus 最主要的用法:从一个想法到一个合进去的改动。agent 在它自己的 worktree 里改代码,你正在看的这份代码一直不动;每到要你拿主意的时候,它就停下来问你。

  1. 01

    先记一笔,或者直接开聊。

    看到哪行代码不对劲,在那一行按 Alt+t 写一句;想做的事不对着哪一行,就写在笔记页里(Ctrl+t)。不想记笔记也行,F4 直接开一段新对话。

  2. 02

    和 agent 把需求聊清楚。

    在笔记页里选中一条,按 Alt+a,就开了一段关于它的对话,agent 一上来就知道这条笔记写的是什么。商量好的步骤,它问过你之后记在这条笔记底下。

  3. 03

    agent 开一个 worktree 去改。

    动手之前,它在 .worktree/ 下面新建一个 worktree 和分支,先编译、跑一遍测试,确认改之前是好的。之后的改动全在那边,你这边的代码一个字都不会变。对话顶上写着它在哪个分支上。

  4. 04

    中途随时过去看。

    不用等它改完。F2 再按 Tab,选那个 worktree,就切到那棵树上。还没提交的改动,边栏上标着,F3 列出改过的文件;已经提交的,F9 列出这个文件的提交,选一个,就打开那个提交时的文件,那次提交改了什么标在边栏上。

  5. 05

    改完了,它告诉你去哪试,然后等你。

    它再跑一遍测试,告诉你在哪个目录、哪个分支、跑了什么、结果怎样——是真跑出来的结果,不是「应该没问题」。然后就等着:你没试过,它不往下走。

  6. 06

    你试过了,它再审一遍。

    你说没问题,它会问要不要先审一遍代码——能开新的上下文就开,不带着写代码时的思路去看。审出来的问题按轻重排好,你勾要修哪些,它一个一个修。

  7. 07

    开 PR,一直跟到合并。

    接着问你怎么合:直接合并、开 PR,还是先放着。选了 PR,它用 gh 去开,盯着 CI,哪项挂了就告诉你原因,你同意就修,全过了再合并。没装 gh 或者没登录,它就把分支推上去,把链接给你。

  8. 08

    最后收拾干净。

    合并以后,它会问:要不要把你本地的分支更新到最新,要不要删掉那个 worktree,要不要把笔记打勾,要不要关掉这段对话。

每一个要你决定的地方,agent 都会在对话里弹一张卡片,方向键选、回车定。推送、合并、删除、打勾,没有一样是 agent 自己拍板的。

这套流程是默认的。想让 agent 直接改你眼前的文件,可以在设置里把 workflow 改成 in-place:步骤一样,只是不开 worktree,每处改动都能 Ctrl+z 撤掉;改成 none,就是让 agent 按它自己的习惯来。Obelus 自己从不跑 git,上面的 git 命令都是 agent 跑的。

所有 worktree,一个键就到

Obelus 不分屏,想同时看两份代码就开两个窗口。所以同一个项目开着好几个 Obelus、各看一个 worktree,是很平常的事。按 F2 再按 Tab,能看到这个仓库所有的 worktree,每棵树下面,开着的每个 Obelus 各占一行,写着它正在看什么。把当前这个 Obelus 换到另一棵树上时,有没保存的文件会先问你,上次在那边开着的东西会重新打开。

Worktrees 标签页:tally 在 main 上,tally/.worktree/stable-tie-order 在它自己的分支上,两棵都有窗口开着。 Worktrees 标签页:tally 在 main 上,tally/.worktree/stable-tie-order 在它自己的分支上,两棵都有窗口开着。

终端版 ob 里,换过去就是在树上按 Enter,也只有这一个键:ob 没法替你开新终端,也没法把别的终端窗口调到前面。窗口版 obg 里换过去是 Ctrl+Enter,因为 Enter 是去另一个窗口:在树上按是在那里新开一个,在某个窗口那一行上按是把它调到前面。

  • 同一个仓库的所有 worktree 共用一份笔记,这个窗口记的,那个窗口马上能看到。
  • 一段对话同时只能在一个窗口里打开,不会两边各说各的。
  • 保存之前,Obelus 会先看一眼磁盘:别的窗口、agent 或者格式化工具改过这个文件的话,不会被你悄悄覆盖掉。

多个窗口一起用的其余细节,在参考里。

03编辑器本身

接上你已经在用的 agent

Obelus 自己没有模型。它通过 ACP(Agent Client Protocol)连你已经在用的 agent;还没有的话,按 F4 新建对话,在 agents 页里就能装一个。

对话里,agent 说了改动在哪、听到已经试过,下面一张卡片问要不要先审一遍。 对话里,agent 说了改动在哪、听到已经试过,下面一张卡片问要不要先审一遍。
要你拿主意的问题是一张卡片:方向键选,回车定。
  • 对话和文件一样,是一个打开着的文档。今天没聊完,明天回来接着聊。
  • 从笔记开的对话跟着这条笔记走;你改了笔记,agent 会知道改了什么。
  • agent 想在笔记底下加步骤、给哪步打勾、改写哪一条,都会先问你。
  • agent 已经改了的,直接看文件,边栏上标着;它还在问能不能改的,才留在对话里。

笔记一直指着它说的那一行

在一行上按 Alt+t 记一条笔记,Ctrl+t 打开全部。笔记可以对着某一行,也可以对着整个项目,还能一条挂在另一条底下。它记着写下时的提交,所以就算文件后来改了很多,上周写的笔记也还能找到当初那一行。笔记存在 Obelus 自己的目录里,不在仓库里,所以所有 worktree 都看得到,也不会混进你的提交。

笔记页:一条笔记底下挂着三步,其中一步打了勾,旁边还有两条笔记。 笔记页:一条笔记底下挂着三步,其中一步打了勾,旁边还有两条笔记。
agent 拆出来的步骤,挂在对应的那条笔记底下。

改动就在代码里看

不管是 agent 改的还是你改的,改动都直接在文件里看:边栏标出哪些行改过,Alt+d 把旧代码就地展开,再按一下收起来。

一个提交在它改的那一行就地展开,旧行在上,新行在下。 一个提交在它改的那一行就地展开,旧行在上,新行在下。
agent 的一次提交,就地展开在它改的那一行:红色的旧行在上,现在的行在下。

Git

  • 边栏标出改过的行,和 git diff 一致
  • 滚动条旁边能看到整个文件的改动分布
  • Alt+d 展开 / 收起一处改动,Alt+p / Alt+n 跳到上一处 / 下一处
  • 边栏显示每一行最后是谁改的(可以关掉)
  • F9 看这个文件的历史,F10 看整个项目的历史;选一个提交就打开它当时的文件,还没推到远端的提交会标出来
  • 只读:Obelus 不改你的仓库,也不替你跑 git

窗口版和终端版

  • obg 是窗口版,ob 是终端版,就像 gvim 和 vim:界面一样,按键也一样
  • 窗口版能分清终端分不清的键,比如 Ctrl+i 和 Tab、Ctrl+m 和 Enter、Ctrl+[ 和 Esc;Ctrl+Shift+X 这类组合,大多数终端根本不发
  • 窗口版自带图标字体,不用另装 Nerd Font,也不会出现方框
  • 窗口版里光标和列表是滑过去的,输入法拼字时也直接显示在页面上

问代码

  • 跳到定义、查谁调用了它、看类型、看报错,都交给你已经装好的语言服务器:rust-analyzer、gopls、clangd、pylsp 等
  • 搜索都用同一个界面,只是范围不同:F5 搜当前文件,F6 搜整个项目,F8 搜函数名、类型名;Alt+← 跳回原处
  • 设置文件写错了,Obelus 会像编译报错那样,标在写错的那一行上

没有模式,按什么键就是什么意思

不用先进「插入模式」才能打字——像 VS Code、Emacs,不像 vim、helix。规律很简单:功能键打开要看的东西,Ctrl 对当前文件做事,Alt 问光标下面是什么。记不住的,Ctrl+p 按名字搜命令;列表有自己的按键时,底部那一行会写出它们是做什么的。完整的按键表在参考里。

04它都有什么

上面是 Obelus 和别人不一样的地方。下面是它的全部,每一行都链到功能页里讲它的那一节,连按键带设置。

  • 打开与切换。文件树、打开着的东西、改过的文件、问你开哪个项目的页面,上次开着的下次照样打开打开 ›
  • 阅读。边栏上的改动和这行是谁写的、折叠、markdown 和日志排好了看、二十多种语言的高亮、项目代码行数统计阅读 ›
  • 查找。一个搜索界面搜当前文件、整个项目或所有名字;大纲;每次跳转都能后退、前进查找 ›
  • 语言服务器。定义、引用、调用关系、悬停、补全、code action、重命名、问题列表语言服务器 ›
  • Git。改动就地展开、文件和项目历史、任何一个提交时的文件、pull request 和 issueGit ›
  • 笔记。指着某一行,文件改了也找得回来,所有 worktree 共用笔记 ›
  • Agent。任何 ACP agent,从列表里装;对话能接着聊;它的问题是卡片;能发图片;Obelus 自己给它的工具Agent ›
  • 从聊天里用。在手机上的 Slack 或飞书里接着同一段对话,或者干脆跑一个没有界面的 Obelus从聊天里用 ›
  • Worktree 与多窗口。每个 worktree、每个开在上面的窗口,一个键就到;编译任务数在窗口之间共享Worktree ›
  • 终端。你的 shell,作为一个单独的文档终端 ›
  • 按键与设置。命令面板、任意改键、主题、设置页、项目自己的设置按键与设置 ›

05适合谁

Obelus 是照一种特定的干活方式做的。下面这些大多说中你的话,它应该会顺手:

  • 大部分代码是 agent 写的,你主要是读、判断、决定下一步
  • 你常常同时推进好几件事,一个仓库开着好几个 worktree
  • 你想把待办清单放在代码旁边,而不是另一个应用里
  • 你不想学一套模式,方向键、Ctrl+c、Ctrl+z 拿来就用
  • 你习惯开好几个窗口,让终端或者桌面去排

06它不做什么

这些是故意不做的,不是没来得及。

  • 没有多光标,没有宏。大改动现在交给 agent;这里只留读代码时顺手改一两行要用的。
  • 不分屏。想并排看就开两个窗口,终端和窗口管理器排得比编辑器好。
  • 没有模式。没有 vim、helix 的键位,也没有开关能打开。
  • 自己不写 Git。Obelus 只读 Git。提交、推送、合并都是 agent 在跑 git,而且先问过你。
  • 一次只连一个 agent。连两个的话,每个问题都得先说清是问哪个。
  • 没有自己的模型。用的是你已经在用的 agent。

如果你挑编辑器正是看重上面某一条,Obelus 可能不适合你——没关系,它本来就不是为这个做的。

07设计理念

做取舍时拿来对照的几句话,大多是踩过坑才写下来的。

  1. 01

    照一种干活方式做,不照功能清单做。

    一个功能留下来,是因为干活时真用得上,不是因为别的编辑器都有。

  2. 02

    agent 做的事,你看得见,也撤得回。

    agent 改文件,跟你自己改一样,Ctrl+z 就能撤。它跑的命令撤不回,所以命令原样显示、输出全都留着,让 agent 停下的那个键也会把命令一起停掉。

  3. 03

    改完的看文件,还没改的看对话。

    agent 改完的东西,边栏上已经标出来了,对话里不再重复一遍;它还在请求要做的事,才留在对话里。

  4. 04

    你正在看的文件被别人改了,很正常。

    agent 改了、格式化工具跑了、分支切了,Obelus 都会自己重新读,你看到哪还是哪;文件被删了,就标上 [stale],内容先留在屏幕上。

08为什么写它

说实话,这是我写给自己用的。每个取舍先问「我用着顺不顺手」,再问「会不会有人因为少了某个功能就不用」——所以这页说的习惯,都是我的习惯。

vim 那套我一直用不惯。模式、hjkl、冒号命令,习惯的人是肌肉记忆,我却每次都得想一想。我想要的是打开就能看:方向键就是方向键,Ctrl+c 就是复制,不用先退出什么模式。

而且我写代码的方式变了。现在大部分代码是一堆 Claude Code、Codex 写的,我坐在屏幕前主要是读、确认、标出可疑的地方、决定下一步,还想把待办清单放在代码旁边。终端里的编辑器都在比谁功能多;Obelus 也是编辑器,但走的是另一条路:把语法树、Git 历史、语言服务器和 agent,按我干活的方式摆在一起。

名字的来历:obelus(÷、†)是古代学者在手稿边上做的记号,标在他们觉得可疑的那一行旁边——是读的人边读边留下的。