Starship No Runtime Versions 预设:在容器与虚拟化环境中隐藏语言运行时版本
导读
No Runtime Versions 是 Starship 内置的社区预设(Preset),其核心作用是通过为各语言运行时模块重写 format 字符串,隐藏提示符中检测到的运行时版本号,仅保留语言图标与必要的上下文信息。如果你经常工作在 Docker 容器、虚拟机或共享开发机中(此时提示符中的 v20.11.0、3.12.1 这类版本号往往是噪声),这篇指南将带你了解该预设的适用场景、启用命令、完整 TOML 内容与它的实现原理。读完你既能一键套用,也能理解它是如何做到"只藏版本、不丢上下文"的,从而灵活地把同样手法合并进自己的 starship.toml。
一、这个预设解决什么问题
对应文档 docs/pl-PL/presets/no-runtimes.md(及其英文原版 docs/presets/no-runtimes.md)对该预设的描述非常直白:它隐藏语言运行时(runtime)的版本信息,特别适合在容器(containers)或虚拟化环境(virtualized environments)中工作的用户。
容器镜像通常会"钉死"一套运行时版本(例如镜像内固定 Node.js 18),进入容器后每个目录都显示同样的 node v18.19.0 意义不大;此时把横条收缩为"有一个 Node 运行时在工作目录生效",提示符会显著更干净、也更贴合"环境由镜像保证"的心智模型。下面是该预设的官方效果截图:
二、一键启用:命令与参数说明
在 docs/pl-PL/presets/no-runtimes.md 中给出的启用命令如下:
starship preset no-runtime-versions -o ~/.config/starship.toml
这条命令把内置预设写入 Starship 的默认配置文件。要理解各参数,可以对照 src/main.rs 中 preset 子命令的定义,它由 src/print.rs 的 preset_command 负责执行:
| 命令形式 | 作用 |
|---|---|
starship preset no-runtime-versions |
把该预设的 TOML 内容打印到标准输出(stdout),先预览再决定是否应用 |
starship preset no-runtime-versions -o ~/.config/starship.toml |
将预设内容写入指定文件,即 Starship 默认配置,开箱即用 |
starship preset --list |
列出二进制内置的全部预设名称(由 preset_list 输出,见 src/print.rs) |
starship preset no-runtime-versions -o 目标文件 --force |
当目标文件已存在时强制覆盖写入 |
其中 --output(短选项 -o)用于"输出到文件而非 stdout",而"文件已存在时是否覆盖"由 force 标志控制——这与 src/print.rs 中 preset_command_output_existing_file_force 测试覆盖的"向已存在文件输出"路径相互印证。写入完成后重新加载配置(新开一个 shell 或执行 exec $SHELL)即可生效。
注意:
-o ~/.config/starship.toml会直接覆盖整个配置文件。如果你已经手写了很多自定义配置,请先备份,或参考本文第六节的手动合并方式。
三、预设内容全解析
该预设的完整 TOML 维护在仓库 docs/public/presets/toml/no-runtime-versions.toml,与 Starship 官方文档目录中"Config Schema"对应的 docs/public/config-schema.json 配套,第一行 "$schema" 即指向该 JSON Schema,用于在编辑器中获得补全与校验。
3.1 工作原理:覆盖 format、摘掉 $version
Starship 中每个运行时模块(如 nodejs、python、rust)的渲染结果由各自的 format 模板决定,其中版本号通常由形如 $version 的变量占位并提供。该预设没有去关停某个模块,而是为数十个语言模块逐个重写 format:保留 $symbol(模块图标),删掉渲染版本的那部分变量。以 nodejs 为例,原样摘录如下:
[nodejs]
format = 'via $symbol'
对比模块默认格式中"via $symbol($version )"这类写法可以直观看到:$version 连同其外层的括号、空格一并被移除,最终提示符只会出现 Node 的图标。而整个文件的配置骨架非常统一,例如 Python、Rust、Java、Go:
[python]
format = 'via $symbol'
[rust]
format = 'via $symbol'
[java]
format = 'via $symbol'
[golang]
format = 'via $symbol'
3.2 并不是一刀切:保留必要上下文变量的模块
细读完整 TOML 可以发现,预设作者在"隐藏版本"之外还谨慎保留了部分模块真正有信息量的变量,这正是该预设值得逐行研究的地方:
[c]
format = "via $symbol($name)"
[cpp]
format = "via $symbol($name)"
[ocaml]
format = 'via $symbol(\($switch_indicator$switch_name\) )'
[dotnet]
format = "$symbol(🎯 $tfm )"
[pixi]
format = 'via $symbol($environment )'
[pulumi]
format = 'via $symbol$stack'
| 模块 | 隐藏掉的 | 仍然保留的 |
|---|---|---|
c / cpp |
编译器版本 | $name(检测到的编译器名称) |
ocaml |
编译器版本 | $switch_indicator 与 $switch_name(当前 opam switch) |
dotnet |
SDK 版本 | $tfm(目标框架,带 🎯 前缀) |
pixi |
环境版本 | $environment(当前 pixi 环境名) |
pulumi |
版本 | $stack(当前栈名) |
mojo / buf |
版本 | 仅保留图标,且连接词分别改写为 with 而非 via |
也就是说,这个预设的设计取向是"去掉与镜像锁定内容强相关的版本号,保留与当前工作区/工程状态强相关的上下文"。
四、覆盖的语言模块全景
No Runtime Versions 覆盖的模块在 TOML 中均以模块名作为段头。为便于快速核对与你相关的语言是否在列,下表按生态归类(段头名称与 TOML 中完全一致,格式均为 via $symbol,带 * 者另有保留字段):
| 生态 | 模块 |
|---|---|
| JavaScript / TypeScript | bun、deno、nodejs |
| 系统级 / 编译语言 | c、cpp、rust、zig、swift、mojo*、odin、vlang、nim、red、fortran、cobol、raku |
| JVM 系 | java、gradle、kotlin、scala、maven |
| 脚本语言 | python、ruby、perl、php、lua、rlang、julia、dart、elixir、erlang、elisp 类(fennel)、haskell、ocaml*、purescript、gleam、crystal、daml |
| 工具链 / 构建 | cmake、meson、xmake、helm、buf*、opa、quarto、typst、vagrant |
| 云 / 环境 | pulumi、pixi、dotnet* |
提示:该清单以 docs/public/presets/toml/no-runtime-versions.toml 现有段头为准。个别 Starship 模块(如
gcloud、aws、docker_context)本就不渲染"语言版本",自然不在本预设范围内。
五、从源码看 preset 是如何交付的
这套机制的工程实现值得顺带了解,便于你判断命令行为的边界:
- 命令入口定义在 src/main.rs:CLI 帮助文本写明其作用是"打印一个预设配置"(Prints a preset config),可选参数包括预设名、
-o/--output输出文件、--list列出全部预设,并在 src/main.rs 处将请求分发到print::preset_command。 - 执行逻辑集中在 src/print.rs:当
list为真时打印预设清单;否则根据预设名取出预设内容,写入output指定的文件或直接输出到 stdout。预设正文的获取经由shadow::get_preset_content,返回的内容即仓库 docs/public/presets/toml 下对应 TOML 的完整文本。 - src/print.rs 中的测试覆盖了三条关键路径:
preset_list_returns_one_or_more_items(清单非空)、preset_command_does_not_panic_on_correct_inputs(对每个内置预设调用不 panic)、preset_command_output_to_file与preset_command_output_existing_file_force(写入文件以及覆盖已存在文件的场景)。测试中通过include_str!("../docs/public/presets/toml/nerd-font-symbols.toml")比对输出,由此可以推断:预设 TOML 是作为资源随二进制一同构建、并在运行时被读取的。
因此无需联网即可使用 starship preset,也意味着你安装的 Starship 版本决定它内置的预设快照;若想更新到社区最新修订的预设内容,升级 Starship 即可。
六、进阶玩法:把它合并进现有自定义配置
因为预设本质就是"每个模块一段 format 覆盖",你完全不必整文件覆盖。若你的 ~/.config/starship.toml 已积累了大量自定义,只需要把预设中你关心的模块段落摘出、追加到你的配置中即可。例如只想隐藏 Node 与 Python 的版本:
[nodejs]
format = 'via $symbol'
[python]
format = 'via $symbol'
同理,若你只想"恢复某一个模块的版本号",删除或注释掉该模块对应的 format 覆盖行,Starship 就会回落到该模块的默认 format。也就是说,这套预设与普通配置遵循完全相同的 TOML 合并规则,可以按模块粒度自由组合。
七、其它相关信息
- 该预设对应的独立页面位于 docs/pl-PL/presets/no-runtimes.md,波兰语索引页见 docs/pl-PL/presets/README.md。
- 完整预设家族的英文总索引位于 docs/presets/README.md,其中的 "No Runtime Versions" 卡片即指向该预设。
- 官方对该预设的命名有两处写法:命令/文件名使用中划线连字符
no-runtime-versions(对应 TOML 文件名no-runtime-versions.toml),而文档页面文件名使用复数缩写no-runtimes.md——两者指代同一个预设,命令中请务必使用前者。 - 若主题相近,可顺带对比 docs/presets/no-empty-icons.md(不显示空图标)与 docs/presets/no-nerd-font.md(不依赖 Nerd Font),它们同属"通过覆盖各模块格式让提示符更克制"的一类社区预设,实现手法彼此相通。
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 StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python07
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
