Starship No Runtime Versions Preset 详解:隐藏语言运行时版本号,打造干净的容器/虚拟化环境提示符
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
导读
Starship 是跨 Shell 的极简、高速、可无限定制的提示符(prompt)工具。No Runtime Versions(隐藏运行时版本)预设用于屏蔽所有语言运行时(runtime)的版本号显示,仅保留模块符号与样式,让提示符保持精简。它尤其适合在容器(container)或虚拟化(virtualized)环境中工作、不希望提示符被v3.11.5之类的版本号占满屏幕的开发者。读完本文,你将掌握该预设的完整配置内容、starship preset命令的用法与底层实现,并能根据自身需求自由裁剪这份配置。
预设概述与适用场景
No Runtime Versions是 Starship 官方收录的社区预设之一(见 docs/presets/README.md),其定位与介绍原文一致:
该预设会隐藏语言运行时的版本。如果你在容器或虚拟化环境中工作,这个预设就是为你准备的。
它的核心思想非常简单:保留运行时模块的“存在感”(符号 + 样式),去掉“版本信息”(version 变量)。这样你依然能一眼看出当前目录属于哪个语言生态(如 Python、Node、Rust),但不会被具体的版本字符串干扰。
典型的适用场景包括:
- 容器 / Docker 环境:镜像内的运行时版本往往固定且已知,无需每次都在提示符中重复显示;
- CI / 远程开发环境:版本由环境管理工具(如 mise、pyenv、conda)统一控制,提示符只需反映“当前是什么环境”;
- 追求极简提示符:希望提示符信息密度更低、更清爽的用户。
需要注意的是,该预设只影响模块的显示格式,不改变任何模块的探测逻辑——运行时是否被检测到、符号是否显示,仍然由各模块自身的detect_*配置与命令探测决定(下文会结合源码说明)。
预设的完整配置内容
本预设的完整 TOML 配置文件位于 docs/public/presets/toml/no-runtime-versions.toml。其本质是为每一个带版本号的语言运行时模块覆盖format字段,去掉$version变量。配置文件开头还带上了 JSON Schema 引用,便于编辑器获得补全与校验:
"$schema" = 'https://starship.rs/config-schema.json'下面按模块分类列出全部配置(与仓库文件逐条对应):
单一符号模块(format 仅保留符号):
[bun] format = "via $symbol" [buf] format = "with $symbol" [cmake] format = "via $symbol" [cobol] format = "via $symbol" [crystal] format = "via $symbol" [daml] format = "via $symbol" [dart] format = "via $symbol" [deno] format = "via $symbol" [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' [odin] format = 'via $symbol' [opa] format = 'via $symbol' [perl] format = 'via $symbol' [php] format = 'via $symbol' [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'保留额外上下文的模块(除符号外仍显示少量非版本信息):
[c] format = "via $symbol($name)" [cpp] format = "via $symbol($name)" [dotnet] format = "$symbol(🎯 $tfm )" [ocaml] format = 'via $symbol(\($switch_indicator$switch_name\) )' [pixi] format = 'via $symbol($environment )' [pulumi] format = 'via $symbol$stack'这些模块之所以保留额外变量,是因为它们属于“非版本”信息:
$name:C / C++ 编译器名称(如 gcc、clang);$tfm:.NET 目标框架名(Target Framework Moniker);$switch_indicator/$switch_name:OCaml 的 switch 指示器与名称;$environment:pixi 环境名;$stack:Pulumi 的堆栈名。
快速上手:应用预设
原文档给出的核心命令(在 docs/presets/no-runtimes.md 中):
starship preset no-runtime-versions -o ~/.config/starship.toml这条命令的作用是:将no-runtime-versions预设的 TOML 内容写入~/.config/starship.toml(-o/--output指定输出文件),从而覆盖默认配置。应用后重新加载 Shell(或重新执行starship init对应的初始化),即可看到所有运行时模块不再显示版本号。
如果你希望先查看内容再决定,可以不带-o,让预设内容直接打印到标准输出(stdout):
starship preset no-runtime-versions如果想查看当前 Starship 支持的所有预设名称:
starship preset --list命令的底层实现
preset子命令在 src/main.rs 中定义,其参数包括:
name:预设名称(必填,除非使用--list),通过value_enum约束为内置预设集合;-o, --output <FILE>:将预设写入指定文件而非标准输出;-f, --force:配合-o使用,输出文件已存在时强制覆盖;-l, --list:列出所有内置预设名。
对应的处理逻辑在 src/print.rs 的preset_command函数中:
- 若传入
--list,直接打印预设名列表; - 否则通过
shadow::get_preset_content(name)从编译期嵌入的预设资源中取出 TOML 文本; - 若指定了
output路径,则调用write_file_atomic原子写入(配合force决定是否覆盖已存在文件,见 src/utils/mod.rs 中的write_file_atomic);否则将内容写入 stdout。
预设名称到内容的映射由shadow_rs在构建期生成(参见 src/lib.rs 中的shadow!(shadow)宏),因此预设内容在编译时就被嵌入二进制,运行时无需访问网络。仓库中对应的测试用例preset_command_output_to_file与preset_command_output_existing_file_force(见 src/print.rs)验证了“输出到文件”和“强制覆盖已存在文件”两条路径的行为,测试中直接以include_str!引入docs/public/presets/toml/nerd-font-symbols.toml作为期望输出比对。
逐模块分析:隐藏了什么,保留了什么
为了理解该预设的“裁剪”逻辑,对比各模块的默认 format与预设覆盖后的 format 即可一目了然。以 Python 模块为例,其默认配置定义在 src/configs/python.rs:
format = "via ${symbol}${pyenv_prefix}(${version} )(\\($virtualenv\\) )" version_format = "v${raw}"即默认显示symbol + pyenv 前缀 + 版本号 + 虚拟环境名;应用本预设后 format 被覆盖为via $symbol,$version与$virtualenv均不再渲染。
同理可推广到其他模块:预设对format的覆盖等价于删除了各模块默认 format 中的$version等版本相关变量,而保留$symbol(图标)与$style(样式)。需要强调的是,这只影响“显示什么”,不影响“模块是否出现”的判定——各模块的启用条件(如detect_files、detect_extensions、detect_commands以及命令探测)依然生效,详见各模块配置文件,如 src/configs/nodejs.rs、src/configs/rust.rs。
此外,本预设没有覆盖version_format或detect_*系列字段,也没有触碰非语言运行时模块(如git_branch、directory、character等),因此其余模块保持默认行为。
手动定制:只隐藏部分运行时
starship preset命令会把全部模块的配置一次性写入目标文件。如果你只想隐藏部分运行时版本(例如只隐藏 Python 和 Node 的版本,但保留 Rust 版本),可以分两步操作:
- 先把预设内容导出查看(或直接参考 docs/public/presets/toml/no-runtime-versions.toml);
- 在
~/.config/starship.toml中只保留你关心的模块段落,删掉其余[xxx]块。
例如只隐藏 Python 与 Node 的版本号:
[python] format = "via $symbol" [nodejs] format = "via $symbol"由于 TOML 中未出现的模块字段会回落到默认值,这种局部覆盖是安全且可预期的。同样地,若想恢复某个模块的版本显示,删除对应的[xxx]配置块即可。
与其他预设的关系
No Runtime Versions是 Starship 官方预设集(docs/presets/README.md)中的一员,与它同属“精简/去装饰”思路的还有:
- No Nerd Fonts 预设:让整个提示符不使用任何 Nerd Font 符号;
- No Empty Icons 预设:未检测到工具集时不显示图标;
- Plain Text Symbols 预设:将各模块符号替换为纯文本。
三者可以按需组合:例如在容器内同时应用no-runtime-versions与no-nerd-font,即可得到一个既无版本号、又无需安装 Nerd Font 字体的最小化提示符。组合方式也很简单——把多个预设的 TOML 段落合并进同一个~/.config/starship.toml即可(注意同名模块段落取最后一次出现的值)。
结语
No Runtime Versions预设以一行命令、数十个模块format覆盖的方式,精准解决了“容器/虚拟化环境提示符过于嘈杂”的问题。它不改变模块探测逻辑,只裁剪显示内容,因此行为可预期、回退容易。配合starship preset --list、-o输出与 TOML 局部覆盖机制,你可以从这份预设出发,快速构建属于自己的极简提示符。
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考