你用 /model 切换了模型,换了分支,又打开了另一个目录,半小时后已经记不清自己在用哪个模型、上下文用掉了多少。状态栏就是为此准备的:Verboo Code 输入框下方固定显示的一行,内容由你决定,每次代理回复后刷新。/statusline 命令可以帮你生成这一行。
Verboo Code 的状态栏是什么?
它是输入框下方的一行文字,由你自己的 shell 命令生成。Verboo Code 运行这个命令,通过标准输入传给它一个包含会话状态的 JSON,然后显示命令打印出的内容。
在源码中,只有 settings 里存在 statusLine 键时才会显示。没有这个键,就没有状态栏。文字以暗色显示,并支持 ANSI 颜色码,所以可以用 printf 上色。
如何用 /statusline 配置状态栏?
在会话中输入 /statusline。不带参数时,它会尝试复制你终端的提示符。带参数时,它按你的要求来做。
/statusline
不带参数时,默认请求是 Configure my statusLine from my shell PS1 configuration。一个名为 statusline-setup 的子代理(只有 Read 和 Edit 两个工具)按以下顺序查找 PS1 变量:~/.zshrc、~/.bashrc、~/.bash_profile、~/.profile。它会把 PS1 转义符转换成命令(\u 变成 $(whoami),\w 变成 $(pwd),\W 变成 $(basename "$(pwd)")),并去掉末尾的 $ 或 >。
如果你没有自定义 PS1,或者想要别的内容,直接描述:
/statusline 显示模型、目录名、git 分支和已用上下文百分比
子代理会把结果写入你的 settings.json,并保留文件其余内容。如果命令较长,它会另存一个脚本,并让 settings 指向它。如果 CLI 请求编辑文件的权限,批准即可。之后想调整,再次运行 /statusline 并写上新要求。
注意:
/statusline在非交互模式下不可用。在脚本或 CI 中,请按下一节手动配置。
如何手动配置状态栏?
创建脚本,赋予执行权限,然后让 statusLine 键指向它。一共三步。
1. 脚本。保存为 ~/.verboo/statusline.sh,用 jq 读取 JSON:
#!/usr/bin/env bash
input=$(cat)
model=$(echo "$input" | jq -r '.model.display_name')
dir=$(echo "$input" | jq -r '.workspace.current_dir')
used=$(echo "$input" | jq -r '.context_window.used_percentage // empty')
branch=$(git -C "$dir" --no-optional-locks branch --show-current 2>/dev/null)
out="$model · $(basename "$dir")"
[ -n "$branch" ] && out="$out · $branch"
[ -n "$used" ] && out="$out · ctx $(printf '%.0f' "$used")%"
printf '%s\n' "$out"
git 加上 --no-optional-locks 是源码本身的建议:状态栏每次回复后都会运行,不加这个参数,git 可能会和代理争抢仓库锁。
2. 执行权限:
chmod +x ~/.verboo/statusline.sh
3. settings。写入 ~/.verboo/settings.json(如果你设置了 VERBOO_CONFIG_DIR,则写入该目录):
{
"statusLine": {
"type": "command",
"command": "~/.verboo/statusline.sh",
"padding": 0
}
}
type 只接受 "command"。padding 可选,用于设置这一行的左右间距。只想在某个项目生效,就在仓库根目录使用 .verboo/settings.json。无需重启:settings 中的命令一变,状态栏会立即重新计算。
使用前如何测试脚本?
通过标准输入传一个假的 JSON。能打印出那一行,就说明可以用了。
echo '{"model":{"display_name":"deepseek-v4-pro"},"workspace":{"current_dir":"'"$PWD"'"},"context_window":{"used_percentage":42.7}}' | ~/.verboo/statusline.sh
在 main 分支的 git 仓库中,输出如下:
deepseek-v4-pro · my-project · main · ctx 43%
会话第一次回复之前,used_percentage 为 null。jq 中的 // empty 和 [ -n "$used" ] 判断会让上下文部分直接不显示,而不是显示 ctx null%。
状态栏的 JSON 包含哪些字段?
主要字段如下,来自 src/components/StatusLine.tsx 中的构造逻辑:
| 字段 | 含义 | 何时出现 |
|---|---|---|
model.display_name 和 model.id | 当前回答的模型 | 始终。用 /model 切换时变化 |
workspace.current_dir | 当前目录 | 始终 |
workspace.project_dir | 会话启动时的目录 | 始终 |
workspace.added_dirs | 用 /add-dir 添加的目录 | 始终(列表,可能为空) |
context_window.used_percentage | 已用上下文百分比,0 到 100 | 第一次回复前为 null |
context_window.remaining_percentage | 剩余上下文百分比 | 第一次回复前为 null |
context_window.context_window_size | 当前模型的上下文窗口大小(token) | 始终 |
session_name | 用 /rename 设置的会话名 | 仅当会话有名字时 |
output_style.name | 当前输出风格 | 始终(未设置时为 default) |
vim.mode | INSERT 或 NORMAL | 仅在开启 vim 模式时 |
worktree.name 和 worktree.branch | 会话的 worktree 和分支 | 仅在 --worktree 会话中 |
version | Verboo Code 版本 | 始终 |
未发送的可选字段在 JSON 中直接缺失,所以在 jq 里始终加上 // empty,避免屏幕上出现 null 字样。
状态栏什么时候刷新?
代理有新回复时,以及你切换权限模式、vim 模式或模型时。它不是时钟:这些都不变,命令就不会再次运行。
源码在最后一次变化后等待 300 毫秒再运行命令,并且新的运行开始时会取消正在进行的那次。实际效果:慢脚本不会卡住界面,但显示时间的状态栏(date +%H:%M)只显示上次刷新的时间,而不是当前时间。
状态栏为什么不显示?
几乎总是以下六种原因之一。脚本出错会被静默忽略,所以状态栏只是消失,没有任何提示。
| 现象 | 源码中的原因 | 怎么办 |
|---|---|---|
提示 statusline skipped · restart to fix | 目录尚未被标记为可信。在此之前不会运行任何用户命令 | 接受目录信任对话框,然后重启会话 |
| 状态栏为空,脚本看起来没问题 | 脚本以非 0 退出码结束。只有 exit 0 的输出才会显示 | 用假 JSON 测试,并检查 echo $? |
| 状态栏为空,exit 0 | stdout 没有输出。空行会被丢弃 | 用 printf 或 echo 输出到 stdout,而不是 stderr |
测试时出现 jq: command not found | 没有安装 jq,脚本失败 | brew install jq 或 sudo apt install jq |
测试时出现 Permission denied | 脚本没有执行权限 | chmod +x ~/.verboo/statusline.sh |
| 所有目录都不显示 | settings 中的 "disableAllHooks": true 会同时关闭 hooks 和状态栏 | 删除该键或改为 false |
命令在 bash 中运行。在 Windows 上它通过 Git Bash 执行,所以在那里也请用 bash 语法写脚本。
可以上色或显示多行吗?
可以。只要用 printf,ANSI 颜色码就能生效:
printf '\033[35m%s\033[0m · %s\n' "$model" "$(basename "$dir")"
想显示多行,就打印多行。Verboo Code 会保留所有行,只丢弃空行。注意状态栏以暗色显示,太深的颜色不容易看清。
上下文百分比显示在屏幕上,你就知道该在会话变慢之前运行 /compact。在 Verboo Code 上 token 不限量,所以这是你唯一需要关注的数字:在 verboo.ai 创建账号,打开 CLI,运行 /statusline。



