Starship Bracketed Segments 预设完全指南:用方括号统一所有模块段样式
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
Starship 内置了丰富的"Preset(预设)"机制,可以在不手动编辑成百上千行配置的前提下,一键套用社区整理好的整套提示符风格。本指南以 Bracketed Segments 预设(bracketed-segments)为讲解对象,说明它如何把aws、git_branch、python等所有内置模块原本以 "via"、"on" 等默认措辞连接的段,统一改写成清晰、紧凑的方括号[...]包裹形态,并给出完整可复制的 TOML 模板与底层命令实现原理。读完本文,你将能熟练使用starship preset命令安装该预设、理解其格式字符串的转义写法,并能够在此基础上二次定制自己的模块格式。
截图来源:docs/public/presets/img/bracketed-segments.png。可以看到目录名、Git 分支、包版本、语言运行时版本、用户名乃至命令耗时等信息,都被整齐地收纳进
[]之中,视觉上每个信息单元边界清晰。
这个预设究竟改了什么
Starship 的每个模块默认自带一段由format控制的输出文案,其中常包含 "via"、"on" 这类自然语言连接词(例如 Rust 模块默认输出形如via 🦀 v1.58.1)。Bracketed Segments 预设的核心动作是:为所有内置模块覆写format,让每个段落的文本全部出现在方括号内,替代掉默认的 "via"、"on" 等连接措辞,使提示符呈现出统一的"信息块"风格。
该预设位于社区预设目录中,和 Nerd Font Symbols、Plain Text Symbols、Tokyo Night 等预设并列展示,详见 Presets 总览。
从效果上看,改动发生在"排版层"而非"采集层":模块探测运行环境、收集版本号等逻辑完全不变,变的只是渲染这些信息时套用的文本骨架。因此它不会影响模块的判定条件、颜色(默认仍由style变量提供)与显示顺序。
快速上手:一条命令安装预设
预设的作者们已经将完整配置整理成独立 TOML 文件。安装最直接的方式是使用starship preset子命令:
starship preset bracketed-segments -o ~/.config/starship.toml该命令会把预生成好的配置写入 Starship 的默认配置文件~/.config/starship.toml,随后重开一个终端(或执行exec $SHELL)即可看到效果。
前提条件:你需要已安装并配置好 Starship 本体(其 Shell 初始化脚本负责让 prompt 生效),本预设只负责写入
starship.toml里的模块格式内容。
如果不想覆盖现有配置,也可以先让内容输出到终端(不指定-o时默认写往 stdout),再由你自己决定如何合并进已有配置:
starship preset bracketed-segments社区还提供了可下载的模板文件,便于查看与离线复用:下载 bracketed-segments.toml。
preset 子命令的完整用法与实现原理
starship preset是官方 CLI 的子命令之一,其参数定义位于 src/main.rs:
name:预设名称(可选值由编译期枚举决定,比如bracketed-segments);-o, --output <FILE>:把预设内容写入指定文件而非 stdout(与--list互斥);-f, --force:当目标输出文件已存在时强制覆盖(要求与--output同时使用);-l, --list:列出当前可用的全部预设名称。
若想确认你的 Starship 版本内置了哪些预设,可执行:
starship preset --list命令背后的执行逻辑位于 src/print.rs 的preset_command:当传入--list时遍历所有预设名并打印;否则通过shadow::get_preset_content(variant.0)取出对应预设的完整文本,写入指定文件或 stdout。这里有一个值得注意的实现细节:预设内容并不是运行时去磁盘读取的,而是在构建期就打包进二进制里的。构建脚本 build.rs 在编译时扫描docs/public/presets/toml/目录,为每个.toml生成get_preset_list与get_preset_content函数(见 build.rs),因此预设名清单与内容随版本固定、离线可用。仓库对这部分逻辑的测试也很完备,见 src/print.rs:既有"预设列表非空"的校验,也有"输出内容与模板文件逐字节一致"以及"强制覆盖已存在文件"的用例。
模板全解:每一类模块的方括号写法
该预设的完整模板保存在 docs/public/presets/toml/bracketed-segments.toml,首行通过"$schema"声明了 JSON Schema 校验地址。模板为仓库中的每个内置模块逐一覆写了format,大致可归为如下几类模式。
1. 语言运行时与工具链:[$symbol($version)]
数量最多的一类,即"图标 + 可选版本号"整体入框,典型如:
[rust] format = '\[$symbol($version)\]' [python] format = '\[${symbol}${pyenv_prefix}(${version})(\($virtualenv\))\]'rust输出为[🦀 v1.58.1]形态;python则在框内同时容纳 pyenv 前缀、解释器版本与可选的虚拟环境名。c、cpp、go(golang)、nodejs、ruby、java、dotnet、elixir、zig、vlang、mojo、typst等大量运行时/工具链模块都遵循$symbol($version)这一简洁结构,部分模块(如dotnet的🎯 $tfm、ocaml的切换指示、elixir的 OTP 版本)会在括号内追加次要信息。
2. 版本控制与代码托管:状态与分支简洁化
Git 系模块是方括号化最直观的受益者:
[git_branch] format = '\[$symbol$branch\]' [git_commit] format = '\[\($hash$tag\)\]' [git_status] format = '([\[$all_status$ahead_behind\]]($style))' [git_state] format = '\[$state ($progress_current/$progress_total)\]' [git_metrics] format = '\[+$added\]\[-$deleted\]'其中git_status外层(...)保证状态整体是一个可选组——当仓库没有未提交变更时不占任何空间;只有真正有内容时才渲染方括号内的状态块。fossil_branch、hg_branch、pijul_channel、jj_bookmark、jj_change等其他 VCS 模块也做了等价处理。
3. 云服务与容器上下文
AWS、Azure、Kubernetes、Docker、GCloud、OpenStack 等模块把账号/订阅/命名空间信息收进框内:
[aws] format = '\[[$symbol($profile)(\($region\))(\[$duration\])]($style)\]' [azure] format = '\[$symbol($subscription)\]' [kubernetes] format = '\[$symbol$context( \($namespace\))\]' [gcloud] format = '\[$symbol$account(@$domain)(\($region\))\]'注意aws内部又把可选的$duration用嵌套的字面量方括号\[$duration\]包了一层,形成"框中框",这正是"方括号既是展示字符、又是格式分组语法"时需要仔细转义的地方。
4. 系统状态与 shell 环境
cmd_duration、jobs、memory_usage、shlvl、status、sudo、username、hostname、directory等系统类模块同样被改造。例如命令耗时被渲染成[⏱ 3s]:
[cmd_duration] format = '\[⏱ $duration\]' [username] format = '\[$user\]' [sudo] format = '\[as $symbol\]' [time] format = '\[$time\]'5. 需要双重转义的特殊模块
少数模块因默认格式本身就含方括号语义,模板中出现了层层转义,是最容易踩坑的地方:
[container] format = '\[[$symbol \[$name\]]($style)\]' [netns] format = '\[[$symbol \[$name\]]($style)\]' [singularity] format = '\[[$symbol\[$env\]]($style)\]'它们体现出的规则是:格式串中凡是想让用户真正看到的[和],都必须写成\[与\]。
6. 完整模板
以下为该预设的完整配置内容(约覆盖 90 个内置模块),可直接作为二次定制的起点:
"$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)\]'原理深入:方括号为什么要写\[,以及格式串的结构
看懂这份模板,需要了解 Starship 格式字符串的语法。每个模块的format由若干**组件(component)**组成,而 Starship 对格式字符串中的以下字符赋予了特殊含义:$ [ ] ( ),具体语法约定详见 配置文档 中的 "Format Strings" 一节。其中最关键的一条分组语法是:
<组件内容>即:未转义的方括号用于包裹一组组件,紧跟的圆括号提供该组的样式。例如aws模板里最外层的\...\是"本组以模块自带样式渲染";而$style、$added_style等变量则引用模块内部预定义的颜色。
正因为[、]是分组语法字符,想让它们在屏幕上被真正打印出来,就必须在格式字符串中写成转义形式\[与\](这就是为什么模板里满屏都是\[、\])。可以对照下面的规则解读任意一行:
\[—— 打印一个字面左方括号,不开启分组;\[ ... \]—— 被\[、\]包围并整体再套($style)的内容,实际效果是一个"方括号内组件、括号整体上色"的样式组,如rust的\[$symbol($version)\]:外层的\[/\]是可见的框,内层的...是带样式的组件组;- 内层再次出现
\(、\)、\[、\]时同理表示可见的小括号/方括号字符,例如aws的(\($region\))中的\(、\)就是字面括号,用于把可选区域名括起来。
换言之,"显示一个框"与"声明一组样式"两件事共用[]语法,需要通过转义来区分——Bracketed Segments 正是反复运用这一机制的典型教材。
条件渲染与不占用空间的隐藏优势
模板中还大量保留了条件性组件,它进一步提升了方括号方案的可用性:
aws的($region)、($duration):仅在当前 AWS 配置包含区域/临时凭证有效期信息时才出现,否则整组连同括号一起省略,不会渲染出空框;git_status整体外套(...):没有变更时整段消失,出现时则输出[?? +1 ~2]之类带框状态;- 大多数语言模块的
($version):探测不到版本时只显示图标而不显示空括号。
这保证了提示符在保持"每段都带框"的统一风格时,不会因环境差异而留下空壳占位,这也是它在信息密度与整洁度之间取得平衡的关键设计。从源码角度看,此类可选组件的求值逻辑依赖模块返回的段是否为None(空),再配合各模块自身的判定条件(如是否检测到对应工具链)共同决定渲染结果。
还原与二次定制
若要撤销预设效果,删除或清空~/.config/starship.toml中写入的预设区块即可恢复为默认样式;也可以先备份原配置再安装:
cp ~/.config/starship.toml ~/.config/starship.toml.bak starship preset bracketed-segments -o ~/.config/starship.toml还原时用备份文件覆盖回去:
cp ~/.config/starship.toml.bak ~/.config/starship.toml如果你只想让个别模块呈现"方括号信息块"风格而不想整体套用,可以在你的配置中为单个模块设置对应的format,例如:
[git_branch] format = '\[$symbol$branch\]'新开终端即可局部生效。把 Bracketed Segments 的方括号写法结合你常用的模块逐个替换,就能定制出既统一、又贴合个人习惯的提示符方案。更多现成预设(Nerd Font Symbols、Plain Text Symbols、No Runtime Versions、Tokyo Night 等)可查阅 Presets 总览。
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考