Starship No Runtime Versions 预置实战:在容器与虚拟化环境中隐藏语言运行时版本
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
Starship 默认会在提示符中展示当前项目所用的语言运行时版本(如🦀 v1.45.0、🐍 v3.12.1),但对于容器、虚拟化环境或固定工具链的团队而言,这些版本号往往是噪音而非信息。官方No Runtime Versions预置通过重写各语言模块的format,只保留语言图标与连接词,彻底隐藏版本号。本文将以 俄语预置文档 为主体,结合仓库中的 预置 TOML 文件 与 preset 命令的源码实现,完整讲解该预置的用途、安装方式、配置结构、底层原理与自定义方法,读完即可在自己的环境中落地使用。
一、这个预置解决什么问题
Starship 的绝大多数语言模块(python.rs、rust.rs、nodejs.rs 等)默认格式中都包含$version变量,例如 Python 模块的默认格式为"via $symbol($version )",因此每次进入项目目录都会探测并渲染运行时版本。
No Runtime Versions预置的定位十分明确:隐藏语言运行时的版本号,同时保留语言图标。官方文档给出的适用人群是:
如果你工作在容器或虚拟化环境中,这个预置就是为你准备的。
典型场景包括:
- 容器 / Docker 镜像内:镜像内通常只装一个固定版本的工具链,版本号对开发者没有增量信息,反而挤占提示符宽度;
- 虚拟化 / 远程开发环境:通过 SSH、Dev Container、VM 等进入环境时,提示符更应聚焦"我在哪个目录、哪个分支"而非"环境里装了什么版本";
- 演示与录屏:隐藏版本号可避免截图/录屏中暴露环境细节,也让提示符更简洁;
- 团队固定工具链:当版本由 CI 或容器编排统一锁定时,终端里重复展示版本属于冗余信息。
预置保留的是via/with连接词与$symbol图标,因此提示符仍能一眼看出"当前项目是什么语言",只是不再显示具体版本。
二、快速上手:应用预置
官方文档给出的应用命令只有一行:
starship preset no-runtime-versions -o ~/.config/starship.toml其中:
starship preset是 Starship 内置的子命令,负责输出某个预置的 TOML 配置;no-runtime-versions是预置名称(即No Runtime Versions的 kebab-case 形式);-o(--output)指定输出文件,这里直接写回 Starship 的全局配置文件~/.config/starship.toml。
执行后,预置会覆盖你现有的~/.config/starship.toml。如果该文件已存在且你希望保留原有自定义配置,建议先备份,或改用下面的方式将预置内容与现有配置合并:
# 1. 先查看预置内容(输出到 stdout,不做任何写入) starship preset no-runtime-versions # 2. 追加/合并到已有配置(示意) starship preset no-runtime-versions >> ~/.config/starship.toml如果目标文件已存在,preset命令默认会拒绝覆盖并报错,需要追加--force参数强制写入(对应 print.rs 中force参数与write_file_atomic的覆盖逻辑)。执行完成后,重新打开终端或执行exec $SHELL即可看到效果。
另外可以通过--list参数列出所有可用的预置名称:
starship preset --listpreset子命令的完整 CLI 定义位于 src/main.rs,包含预置名称、输出文件、强制覆盖与列表四个选项,分发逻辑在 src/main.rs 处调用print::preset_command。
三、预置配置逐模块解析
该预置的完整配置位于 docs/public/presets/toml/no-runtime-versions.toml,内容如下:
"$schema" = 'https://starship.rs/config-schema.json' [bun] format = "via $symbol" [buf] format = "with $symbol" [c] format = "via $symbol($name)" [cmake] format = "via $symbol" [cobol] format = "via $symbol" [cpp] format = "via $symbol($name)" [crystal] format = "via $symbol" [daml] format = "via $symbol" [dart] format = "via $symbol" [deno] format = "via $symbol" [dotnet] format = "$symbol(🎯 $tfm )" [elixir] format = 'via $symbol' [elm] format = 'via $symbol' [erlang] format = 'via $symbol' [fennel] format = 'via $symbol' [fortran] format = 'via $symbol' [gleam] format = 'via $symbol' [golang] format = 'via $symbol' [gradle] format = 'via $symbol' [haskell] format = 'via $symbol' [haxe] format = 'via $symbol' [helm] format = 'via $symbol' [java] format = 'via $symbol' [julia] format = 'via $symbol' [kotlin] format = 'via $symbol' [lua] format = 'via $symbol' [maven] format = 'via $symbol' [meson] format = 'via $symbol' [mojo] format = 'with $symbol' [nim] format = 'via $symbol' [nodejs] format = 'via $symbol' [ocaml] format = 'via $symbol(\($switch_indicator$switch_name\) )' [odin] format = 'via $symbol' [opa] format = 'via $symbol' [perl] format = 'via $symbol' [php] format = 'via $symbol' [pixi] format = 'via $symbol($environment )' [pulumi] format = 'via $symbol$stack' [purescript] format = 'via $symbol' [python] format = 'via $symbol' [quarto] format = 'via $symbol' [raku] format = 'via $symbol' [red] format = 'via $symbol' [rlang] format = 'via $symbol' [ruby] format = 'via $symbol' [rust] format = 'via $symbol' [scala] format = 'via $symbol' [solidity] format = 'via $symbol' [swift] format = 'via $symbol' [typst] format = 'via $symbol' [vagrant] format = 'via $symbol' [vlang] format = 'via $symbol' [xmake] format = "via $symbol" [zig] format = 'via $symbol'整份配置的核心手法只有一招:把每个语言模块的format从默认的"连接词 + 图标 + 版本号"改写为"连接词 + 图标",即删掉$version变量。配置文件开头的"$schema"字段声明了这份 TOML 遵循 Starship 官方配置 JSON Schema(对应仓库中的 docs/public/config-schema.json),编辑器可据此获得自动补全与校验。
3.1 三种基本格式模板
覆盖 55 个模块的配置可以归纳为三个模板:
| 模板 | 含义 | 应用模块(部分) |
|---|---|---|
via $symbol | 默认连接词via+ 语言图标,无版本 | python、rust、nodejs、java、ruby、go 等绝大多数模块 |
with $symbol | 连接词换成with+ 图标 | buf、mojo |
$symbol(...) | 图标保留,但括号内只保留"名字类"变量 | c/cpp、dotnet、ocaml、pixi、pulumi |
$symbol是语言图标变量,$style继承自各模块的style配置项(保留原有的前景/背景色),连接词via/with是 Starship 在工具类模块前的默认措辞。换句话说,这份预置只动格式,不动样式,隐藏版本后配色和图标与原版完全一致。
3.2 保留"名字"而非"版本"的特例模块
少数模块的format并未简单地删到只剩图标,而是保留了除版本以外的信息型变量,这是该预置最值得注意的设计细节:
- c / cpp:
via $symbol($name)—— 保留编译器名称(如gcc/clang),隐藏编译器版本; - dotnet:
$symbol(🎯 $tfm )—— 保留目标框架标识(Target Framework Moniker,如net8.0),隐藏 SDK 版本号; - ocaml:
via $symbol(\($switch_indicator$switch_name\) )—— 保留 opam switch 指示符与 switch 名称,隐藏 OCaml 编译器版本; - pixi:
via $symbol($environment )—— 保留 pixi 环境名,隐藏版本; - pulumi:
via $symbol$stack—— 保留栈(stack)名称,隐藏 Pulumi 版本。
这种取舍逻辑很清晰:在容器/虚拟化场景中,"正在用哪个工具链/环境/框架目标"依然是有用的上下文,而"工具本身的版本号"则被判定为噪音。若你想隐藏得更彻底(比如连编译器名、tfm 一起隐藏),参照 3.1 的第一种模板自行改写即可。
四、源码视角:preset 命令如何工作
starship preset并不是去磁盘上读取某个文件,而是在编译期把预置配置内嵌进二进制,运行时直接取出并写出。这一机制可以从 src/print.rs 的相关实现得到印证:
- Preset 结构体与 ValueEnum 实现:
Preset(pub &'static str)是一个静态字符串包装,value_variants()通过shadow::get_preset_list()获取全部预置名称,这也解释了--list为什么能列出预置清单; - preset_command 函数:根据
--list直接打印预置列表;否则通过shadow::get_preset_content(variant.0)取回预置 TOML 内容,再依据是否传入-o决定写入文件(write_file_atomic,支持--force覆盖)还是输出到 stdout; - preset_list 函数:遍历
Preset::value_variants()逐行输出预置名。
仓库还为该命令提供了单元测试(见 src/print.rs),覆盖了"列表非空、正确输入不 panic、输出到文件、强制覆盖已有文件"等路径,其中preset_command_output_to_file测试直接以include_str!("../docs/public/presets/toml/nerd-font-symbols.toml")比对输出内容,印证了"docs 下的 TOML 与二进制内嵌内容一致"这一事实。no-runtime-versions.toml与nerd-font-symbols.toml位于同一目录(docs/public/presets/toml/),采用完全相同的内嵌机制。
五、验证效果与自定义进阶
5.1 验证效果
应用预置后,官方提供的效果截图为 docs/public/presets/img/no-runtime-versions.png,展示了在多个语言项目(如 Rust、Python、Node.js 项目)之间切换时提示符的表现:目录、Git 分支与 Git 状态正常显示,语言图标(🦀、🐍、⚡等)与via连接词保留,而各语言版本号被隐藏。该截图与预置文档中的插图一一对应。
也可以在任意语言项目目录下直接验证:
starship preset no-runtime-versions # 输出完整预置配置 starship preset --list # 确认 no-runtime-versions 在列表中5.2 只对部分模块隐藏版本
预置一次性改写 55 个模块,如果你只想隐藏个别语言的版本(例如只隐藏 Python 版本),完全不必应用整个预置,手动在~/.config/starship.toml中针对单个模块覆写format即可:
[python] format = "via $symbol"其余模块保持默认行为不变。这条规则的原理与预置完全相同——format中不写$version,模块就不会渲染版本号(版本探测逻辑位于各模块源码中,例如 Python 模块的version变量处理见 src/modules/python.rs)。
5.3 反向操作:恢复版本显示
若之后想恢复默认的版本展示,删除~/.config/starship.toml中对应的[xxx] format行,或直接删除整个配置文件让 Starship 回落到内置默认配置即可。默认配置定义在各模块源码的default()方法中,例如 Python 模块默认格式包含$version变量。
六、注意事项
- 覆盖行为:
starship preset no-runtime-versions -o ~/.config/starship.toml会整体覆盖目标文件,执行前请确认是否已有自定义配置需要合并或备份; - 只影响格式不影响探测:预置只是删除了
format中的$version变量,各模块"何时显示"仍由detect_files、detect_extensions、detect_folders、detect_env_vars等探测规则决定,未安装对应工具链时模块依旧不会出现(这与No Empty Icons等其他预置的职责不同); - 连接词差异:
buf与mojo使用with而非via,这是刻意保留的措辞差异,不是笔误; - 图标依赖:保留的
$symbol图标多为 Nerd Font 字符,若终端未安装 Nerd Font,可搭配仓库中的 No Nerd Fonts 预置 使用。
七、更多预置与延伸阅读
- 预置总览与社区提交入口:docs/ru-RU/presets/README.md;
- 本文所依据的原始文档:docs/ru-RU/presets/no-runtimes.md(英文版见 docs/presets/no-runtimes.md);
- 本预置的完整 TOML:docs/public/presets/toml/no-runtime-versions.toml;
- 效果截图:docs/public/presets/img/no-runtime-versions.png;
- preset 命令源码与测试:src/print.rs、CLI 参数定义见 src/main.rs。
按需应用本预置,你可以在容器、虚拟化或固定工具链环境中获得更干净、更聚焦的 Starship 提示符;理解其"改写 format 以剔除版本变量"的机制后,你也能自由定制出只属于自己的精简版提示符。
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考