手一抖按了 Esc:Hermes CLI 现在给输入框加了 vim 键位(顺便说说状态栏的分支名)

你在 Hermes 的输入框里敲了一段挺长的提示词,回车之前发现中间有个词拼错了。手指条件反射地按了 Esc,然后敲 dd——输入框纹丝不动。因为在默认的 emacs 键位下,Esc 不是“退出插入模式”,它只是一个“清空/取消”的按键,而 dd 被原样输入成了两个字符。对用了十年 vim 的人来说,这个瞬间的别扭感很难解释给别人听。
现在这个问题有了官方答案:Hermes CLI 的输入框可以切换成 vi/vim 键位。做法比想象中简单——一个配置键,没有新的斜杠命令。
打开它:display.vim_mode
在 ~/.hermes/config.yaml 的 display 段落里加一行:
display:
# CLI 专用:输入框使用 vi/vim 键位(Esc → NORMAL,i → INSERT)
# 打开后,状态栏右侧会实时显示当前的 NORMAL / INSERT / REPLACE 模式
# 仅由配置控制,启动时读取
vim_mode: true
然后用 hermes config edit 打开配置文件编辑(或者直接用你习惯的编辑器改),保存后重启 Hermes即可生效。
这里有一个容易踩的坑必须先说清楚:没有 /vim 斜杠命令。 这个功能的早期版本确实带过 /vim on|off|status,但在最终合并前被去掉了——理由也很合理:它的同类功能(/statusbar、/battery、/timestamps)是“临时开关显示项”,而键位属于编辑习惯,和配置文件绑在一起更一致,也不需要在会话里来回去切。所以如果你在网上别处看到 /vim on 这种写法,那是被砍掉的中间态,敲了不会有任何反应。
打开之后是什么样子
行为上和你在 vim 里习惯的一致:
- Esc 进入 NORMAL 模式,此时按键是命令而不是文本;
i(或a、o等)回到 INSERT 模式,正常输入;- 状态栏右端会显示当前模式:
NORMAL、INSERT、REPLACE三个标签之一。这一点比很多编辑器都贴心——在多行输入时你最容易忘记自己现在到底在哪个模式,有个常驻标签能省掉不少“为什么打字没反应”的困惑。
需要强调一个细节:这个标签是实时的,跟随你按 Esc / i 而变化,不是启动时固定的。实现上,它由状态栏组件动态读取编辑模式生成(cli_status_bar_mixin.py 里的 _vim_mode_label)。
对没用过 vim 的人呢?默认值是关闭,也就是 emacs 键位保持不变——你不改配置,就什么都不会变。这也是这个功能采取“opt-in”而不是“默认打开”的原因。
顺带一个同源的小功能:状态栏里的当前分支
既然在聊状态栏,顺便说一个同样“默认关闭、需要显式打开”的字段:当前 git 分支。
在多仓库、多 worktree 的机器上,“我现在这个会话是在哪个分支上”是一个高频且容易搞错的问题——尤其当 agent 帮你改文件、你回头不确定它改的是哪个分支时。把它钉在状态栏上,一行就能看见:
display:
status_bar:
# 非空 = 只显示列出的字段(保留内置顺序,配置只控制显隐)
# 空数组 = 使用默认字段集合
fields: ["model", "git_branch", "duration"]
可选的字段包括 model、context_pct、cache_hit、latency、tps、compressions、bg_tasks、bg_subagents、goal、git_branch(显示为 ⎇ 分支名)、duration、focus、yolo、battery、title、total_tokens 等等。两个使用要点:
- 非空列表 = 白名单:只显示你列出来的字段;留空数组则回到默认集合。字段顺序由内置规则决定,配置只控制“显不显示”。
- 窄终端会自动取舍:窗口太窄时,
context_detail、prompt_elapsed、idle_since这类较宽的字段会被自动丢掉,避免挤成一团。这是预期行为,不是你配置写错了。
如果你只是想临时开关状态栏本身,可以用 /statusbar;字段清单则走配置。
注意事项
- 改完要重启。
vim_mode是启动时读取的(配置注释里写得很明白:read at startup),热改配置不会在已经开着的会话里立刻生效。 - 只作用于输入框。 它改变的是你敲提示词时那个 composer 的键位,不影响 Hermes 的其他交互,也不影响 agent 做事的方式。
- CLI 专用。 这个键位属于经典 CLI 的输入框;桌面端、TUI 的其他交互面有自己的按键逻辑,不要指望一处打开处处生效。
- 别把它当成 vim 的全部。 这是 prompt_toolkit 提供的 vi 编辑模式,能覆盖日常编辑(移动、删除、进入插入),但不是把整个 Neovim 搬进输入框——没有插件、没有寄存器之间的复杂操作。
- 这个功能有先例可循。 需求最早来自仓库 issue #4254(“希望输入框支持 vim 键位”),而同期 GitHub Copilot CLI 也把 vim 模式推到了正式可用(它的 v1.0.84-2 版本说明里明确写了
/vim或editorMode两种入口)。两边的方向一致:终端里的编辑习惯值得被尊重。
想继续优化 CLI 的使用体验,站内这几篇可以接着看:命令面板(Ctrl+P)指南、状态栏指标详解、以及长会话不被打断的 max_turns 不设上限指南。从零开始装环境走 安装指南。
小结
一句话:想要 vim 键位,就在配置里写 display.vim_mode: true,然后重启——不要去找 /vim 命令,它不存在。
三个要点带走:
- 默认关闭,不配置就没有任何变化;打开后状态栏右端会常驻显示 NORMAL / INSERT / REPLACE。
- 顺手可以把
git_branch加进display.status_bar.fields,多分支环境下少犯低级错误。 - 这个改动合并于 v0.21.2 打标签之后,写作时位于
main分支、尚未进入已发布版本;hermes update取最新代码,或等下一个版本。
对于把 vim 肌肉记忆带进终端的人来说,这条改动很小,但每天都会用到好几次。