Starship Bracketed Segments 预设详解:用方括号统一全部内置模块的分段样式
Starship 的 Bracketed Segments(方括号分段) 预设会重写内置各模块的 format,把原本依靠文字连接词(如 "via"、"on")描述的提示分段统一改为 [ ... ] 方括号包裹的形式。本文以仓库中的西班牙语文档 docs/es-ES/presets/bracketed-segments.md 为主体,结合其引用的完整预设配置文件与源码,说明该预设的效果、安装方式、完整配置内容以及格式字符串语法背后的实现原理。读完本文,你可以通过一条命令应用该预设,也能理解并手动定制“方括号风”的任意模块样式。
Bracketed Segments 预设要解决什么问题
默认情况下,Starship 的部分模块会用自然语言连接词交代上下信息。例如 Python 模块默认写作 via 🐍 v3.10.0,命令耗时模块默认会出现 took 2s 之类的描述;分支、版本、状态等信息也各自独立呈现。
而 Bracketed Segments 预设(来源文档原文见 docs/es-ES/presets/bracketed-segments.md)的做法是:
改变所有内置模块的
format,让它们的分段用方括号展示,而不是使用 Starship 默认的文字表达("via"、"on" 等)。
从上方截图中可以看到效果:Git 分支显示为 [trunk]、软件包版本为 [📦 v1.1.0]、Rust 工具链为 [🦀 v1.58.1]、Node.js 为 [@ v17.6.0]、命令耗时为 [⏱ 3s],连用户名、目录切换前后的提示都由方括号统一包裹,视觉上更加规整、紧凑,便于快速扫描当前环境的关键状态。
该预设属于 Starship 官方 Presets 社区预设合集 中的一员,仓库内另有多语言版本的说明(如 docs/ar-SA/presets/bracketed-segments.md、docs/ja-JP/presets/bracketed-segments.md 等),本文对应的是 docs/es-ES/presets/bracketed-segments.md。
如何安装与应用该预设
安装方式非常简单,Starship 内置了 preset 子命令,直接执行:
starship preset bracketed-segments -o ~/.config/starship.toml
各参数含义如下:
| 参数 | 作用 |
|---|---|
starship preset |
内置子命令,用于输出预设内容 |
bracketed-segments |
预设名称,对应本主题 |
-o <路径> |
将预设内容原子化写入指定文件(即 --output) |
从源码看,preset 命令在 src/print.rs 中实现:当指定预设名后,函数从内嵌资源中取出预设 TOML 文本(get_preset_content),再通过 write_file_atomic 写入 -o 指定的输出文件;若不传 -o,则把内容直接打印到标准输出(stdout),方便你先行预览:
starship preset bracketed-segments # 预览 TOML 内容
starship preset bracketed-segments -o ~/.config/starship.toml # 直接应用
如果你不确定当前支持哪些预设,可以列出全部名称(src/print.rs 中 preset_list 的实现,测试用例见 src/print.rs):
starship preset --list
由于 -o 是覆盖写,在应用预设前建议先备份现有配置,便于日后还原:
cp ~/.config/starship.toml ~/.config/starship.toml.bak
取消或还原该预设
预设写入的只是一份常规 TOML 配置。要还原默认风格,只需把备份的配置文件恢复回去,或删除配置中由该预设加入的 [module] format = '...' 段落即可。由于本预设没有引入全局变量或 format 顶层覆盖,仅逐模块改写 format,因此也可以手动逐段删除后重启 Shell。
完整预设配置解读
该预设的完整 TOML 源文件位于 docs/public/presets/toml/bracketed-segments.toml,文档页面通过内嵌方式直接展示,内容如下(共覆盖 120+ 个内置模块):
"$schema" = 'https://starship.rs/config-schema.json'
[aws]
format = '\[[$symbol($profile)(\($region\))(\[$duration\])]($style)\]'
[azure]
format = '\[$symbol($subscription)\]'
[battery]
format = '\[$symbol$percentage\]'
[buf]
format = '\[$symbol($version)\]'
[bun]
format = '\[$symbol($version)\]'
[c]
format = '\[$symbol($version(-$name))\]'
[cmake]
format = '\[$symbol($version)\]'
[cmd_duration]
format = '\[⏱ $duration\]'
[cobol]
format = '\[$symbol($version)\]'
[conda]
format = '\[$symbol$environment\]'
[container]
format = '\[[$symbol \[$name\]]($style)\]'
[cpp]
format = '\[$symbol($version(-$name))\]'
[crystal]
format = '\[$symbol($version)\]'
[daml]
format = '\[$symbol($version)\]'
[dart]
format = '\[$symbol($version)\]'
[deno]
format = '\[$symbol($version)\]'
[direnv]
format = '\[$symbol$loaded/$allowed\]'
[docker_context]
format = '\[$symbol$context\]'
[dotnet]
format = '\[$symbol($version)(🎯 $tfm)\]'
[elixir]
format = '\[$symbol($version \(OTP $otp_version\))\]'
[elm]
format = '\[$symbol($version)\]'
[erlang]
format = '\[$symbol($version)\]'
[fennel]
format = '\[$symbol($version)\]'
[fortran]
format = '\[$symbol($version)\]'
[fossil_branch]
format = '\[$symbol$branch\]'
[fossil_metrics]
format = '\[+$added\]\[-$deleted\]'
[gcloud]
format = '\[$symbol$account(@$domain)(\($region\))\]'
[git_branch]
format = '\[$symbol$branch\]'
[git_commit]
format = '\[\($hash$tag\)\]'
[git_metrics]
format = '\[+$added\]\[-$deleted\]'
[git_state]
format = '\[$state ($progress_current/$progress_total)\]'
[git_status]
format = '([\[$all_status$ahead_behind\]]($style))'
[gleam]
format = '\[$symbol($version)\]'
[golang]
format = '\[$symbol($version)\]'
[gradle]
format = '\[$symbol($version)\]'
[guix_shell]
format = '\[$symbol\]'
[haskell]
format = '\[$symbol($version)\]'
[haxe]
format = '\[$symbol($version)\]'
[helm]
format = '\[$symbol($version)\]'
[hg_branch]
format = '\[$symbol$branch\]'
[hostname]
format = '\[$ssh_symbol($hostname)\] '
[java]
format = '\[$symbol($version)\]'
[jj_bookmark]
format = '\[$symbol$bookmark(@$remote)$diverged( \(+$overflow_count others\))\]'
[jj_change]
format = '\[\($change\)\]'
[jobs]
format = '\[$symbol$number\]'
[julia]
format = '\[$symbol($version)\]'
[kotlin]
format = '\[$symbol($version)\]'
[kubernetes]
format = '\[$symbol$context( \($namespace\))\]'
[localip]
format = '\[$localipv4\]'
[lua]
format = '\[$symbol($version)\]'
[maven]
format = '\[$symbol($version)\]'
[memory_usage]
format = '\$symbol[$ram( | $swap)\]'
[meson]
format = '\[$symbol$project\]'
[mise]
format = '\[$symbol$health\]'
[mojo]
format = '\[$symbol($version)\]'
[nats]
format = '\[$symbol$name\]'
[netns]
format = '\[[$symbol \[$name\]]($style)\]'
[nim]
format = '\[$symbol($version)\]'
[nix_shell]
format = '\[$symbol$state( \($name\))\]'
[nodejs]
format = '\[$symbol($version)\]'
[ocaml]
format = '\[$symbol($version)(\($switch_indicator$switch_name\))\]'
[odin]
format = '\[$symbol($version )\]'
[opa]
format = '\[$symbol($version)\]'
[openstack]
format = '\[$symbol$cloud(\($project\))\]'
[os]
format = '\[$symbol\]'
[package]
format = '\[$symbol$version\]'
[perl]
format = '\[$symbol($version)\]'
[php]
format = '\[$symbol($version)\]'
[pijul_channel]
format = '\[$symbol$channel\]'
[pixi]
format = '\[$symbol$version( $environment)\]'
[pulumi]
format = '\[$symbol$stack\]'
[purescript]
format = '\[$symbol($version)\]'
[python]
format = '\[${symbol}${pyenv_prefix}(${version})(\($virtualenv\))\]'
[quarto]
format = '\[$symbol($version)\]'
[raku]
format = '\[$symbol($version-$vm_version)\]'
[red]
format = '\[$symbol($version)\]'
[rlang]
format = '\[$symbol($version)\]'
[ruby]
format = '\[$symbol($version)\]'
[rust]
format = '\[$symbol($version)\]'
[scala]
format = '\[$symbol($version)\]'
[shell]
format = '\[$indicator\]'
[singularity]
format = '\[[$symbol\[$env\]]($style)\]'
[solidity]
format = '\[$symbol($version)\]'
[spack]
format = '\[$symbol$environment\]'
[status]
format = '\[$symbol$status\]'
[sudo]
format = '\[as $symbol\]'
[swift]
format = '\[$symbol($version)\]'
[terraform]
format = '\[$symbol$workspace\]'
[time]
format = '\[$time\]'
[typst]
format = '\[$symbol($version)\]'
[username]
format = '\[$user\]'
[vagrant]
format = '\[$symbol($version)\]'
[vcsh]
format = '\vcsh [$symbol$repo\]'
[vlang]
format = '\[$symbol($version)\]'
[xmake]
format = '\[$symbol($version)\]'
[zig]
format = '\[$symbol($version)\]'
可以看到该预设统一遵循一个设计范式:用反斜杠转义的 \[ 与 \] 作为字面方括号,把“图标 + 关键变量 + 可选的括号条件组”封装成一个 textgroup(形如 内容),且样式变量沿用模块自带的 $style、$added_style 等。这样既保留了各模块原有的配色语义,又保证了外观的统一。
几条典型模块样式拆解
[git_branch]:\[$symbol$branch\]。默认 Git 分支模块会附带描述性前缀,这里直接输出[🦀 trunk]一类的紧凑分支段。[python]:\[${symbol}${pyenv_prefix}(${version})(\($virtualenv\))\]。它把 Python 模块默认的via措辞去掉,输出[🐍 v3.10.0];同时用(\($virtualenv\))这类嵌套写法,只有当虚拟环境存在时才会渲染出字面的(venv)。[cmd_duration]:\[⏱ $duration\]。将默认的 "took" 表述替换成[⏱ 3s]。[status]与[sudo]:把错误码、提权状态同样放入方括号,例如截图中的红色[root]、[as 🟡]。
转义与语法的实现依据
方括号在 Starship 的格式字符串中不是普通字符:format 构成一个带样式的 textgroup,( ... ) 构成条件组(仅当组内变量全部为空时才隐藏)。因此预设中所有“看起来是字面量”的中括号都必须写成 \[ / \]。这条规则在 src/formatter/spec.pest 的语法定义中有据可查:
escaped_char = { "[" | "]" | "(" | ")" | "\\" | "$" }
\[、\]、\(、\)、\\、\$ 均为合法转义字符;同时 textgroup、conditional、variable 等规则共同决定了格式化文本的解析顺序。这正是该预设能够把“带样式的分段”整齐嵌套进“字面中括号”里的原理所在。各模块的默认 format 与样式变量定义则分别位于 src/configs(配置声明)与 src/modules(渲染逻辑),如果你希望自行微调某个模块的方括号样式,修改对应 [模块名] 段落后重新打开终端即可生效。
注意事项与适用边界
- 该预设仅覆盖其 TOML 中显式列出的内置模块;未列出的模块(如
character、directory、line_break、fill等)保持你原有配置不变。 - 应用前请确认
~/.config/starship.toml是否为你的实际配置文件路径——在 Windows 上通常为%USERPROFILE%\.config\starship.toml;若已使用自定义路径,可将-o指向该文件。 $schema字段用于编辑器补全与校验,可保留不动。- 如需在应用前查看全部差异,可先运行
starship preset bracketed-segments将内容输出到终端,再手工合并进现有配置。
总而言之,Bracketed Segments 通过一份“纯 format 改写”的 TOML 预设,为希望拥有统一、紧凑、无连接词风格提示符的开发者提供了开箱即用的方案;理解了其中 \[ 转义与 textgroup 语法后,你完全可以基于这份配置进一步定制出自己的专属风格。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
