Starship No Runtime Versions 预设详解:隐藏语言运行时版本,为容器与虚拟环境打造简洁提示符
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
Starship(当前仓库 GitHub_Trending/st/starship)是一款极简、高速、可无限定制的跨 Shell 提示符。No Runtime Versions预设(官方中文文档见 docs/zh-CN/presets/no-runtimes.md)专门解决一类真实痛点:当你在容器(Container)或虚拟环境(Virtual Environment)中工作时,Shell 提示符上显示的 Python、Node.js、Rust 等运行时版本往往与宿主机不一致,不仅信息失真,还白白增加提示符渲染开销。通过本文,你将掌握该预设的完整 TOML 内容、starship preset命令的正确用法、手动等价配置方法,以及它背后的源码级实现原理,能够按需隐藏或保留特定运行时信息。
No Runtime Versions 预设运行效果截图
一、这个预设解决什么问题
默认情况下,Starship 会在检测到对应语言项目时,在提示符中显示运行时的具体版本。例如在src/configs/python.rs中,Python 模块的默认format为:
format = "via ${symbol}${pyenv_prefix}(${version} )(\\($virtualenv\\) )"即提示符会渲染为类似via 🐍 v3.12.0 (venv)的形式;Rust、Node.js、Bun 等模块默认格式也均为via $symbol($version )(见 src/configs/rust.rs、src/configs/nodejs.rs)。
在以下场景中,这种版本显示反而成为干扰:
- 容器环境:镜像内固定安装的运行时版本与宿主机或项目要求不一致,显示的版本没有参考意义;
- 虚拟环境 / 版本管理器:
pyenv、nvm、conda等工具已经通过环境变量或目录上下文表达了版本信息,提示符重复展示显得冗余; - 追求极简:希望提示符只保留“当前语言是什么”,不关心具体版本号。
No Runtime Versions预设的定位正如原文档所述:“此预设隐藏语言运行时版本。如果你在容器或虚拟环境中使用,这个适合你!”它通过为每个运行时模块覆盖format字段、剔除$version变量来实现隐藏,属于官方预设总览(见 docs/zh-CN/presets/README.md)中维护的一套开箱即用配置。
二、预设完整 TOML:逐个模块覆盖 format
该预设的完整配置存放在仓库的 docs/public/presets/toml/no-runtime-versions.toml 中,编译时通过shadow_rs嵌入二进制(见 src/lib.rs 中的shadow!(shadow)及 src/print.rs 的取值逻辑),运行时由starship preset命令输出。全文如下:
"$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'2.1 三类格式模式
对这 49 个模块的format覆盖可归纳为以下模式:
| 模式 | 涉及的模块 | 效果 |
|---|---|---|
via $symbol | bun、cmake、cobol、crystal、daml、dart、deno、elixir、elm、erlang、fennel、fortran、gleam、golang、gradle、haskell、haxe、helm、java、julia、kotlin、lua、maven、meson、nim、nodejs、odin、opa、perl、php、purescript、python、quarto、raku、red、rlang、ruby、rust、scala、solidity、swift、typst、vagrant、vlang、xmake、zig 等 | 只显示符号 + 固定的via引导词,版本号完全不出现 |
via $symbol($name) | c、cpp | 保留编译器名称(如gcc/clang),隐藏具体版本号 |
| 保留环境标识类 | dotnet($tfm)、ocaml($switch_indicator$switch_name)、pixi($environment)、pulumi($stack) | 隐藏版本,但保留与当前环境强相关的上下文标识 |
值得注意的是,buf与mojo两个模块使用with而非via作为引导词,这是它们各自模块默认行为的一部分(可在src/configs/下对应模块配置中核对),预设并未改动这一细节。
2.2 为什么保留这些“非版本”变量
预设的设计取舍很清晰:只隐藏“版本号”,不隐藏“环境身份”。
- dotnet的
$tfm(Target Framework Moniker,如net8.0)描述的是目标框架而非运行时版本,在容器中依然有参考价值; - ocaml的
$switch_name与$switch_indicator表示当前 opam switch(全局/本地),是 OCaml 工作区的关键上下文,原默认格式为via $symbol($version )(\\($switch_indicator$switch_name\\) )(见 src/configs/ocaml.rs),预设仅剔除$version; - pixi的环境名
$environment与pulumi的$stack同理,都是“你在操作哪个环境/栈”的定位信息。
这种“隐版本、留身份”的思路,正是该预设适合容器与虚拟环境的原因:提示符依然能告诉你“当前上下文是什么”,但不再给出可能与实际不符的版本号。
三、快速上手:使用 starship preset 命令
原文档给出的唯一一条命令即可完成安装:
starship preset no-runtime-versions -o ~/.config/starship.toml命令解析:
no-runtime-versions是预设名称,需与嵌入二进制中的预设列表完全一致(可通过--list查看全部可用预设);-o(即--output)指定输出文件路径,此处为 Starship 的默认配置文件~/.config/starship.toml;- 若目标文件已存在,命令默认拒绝覆盖,需要追加
-f/--force强制写入。
其底层实现位于 src/print.rs:preset_command首先从构建期嵌入的预设内容(shadow::get_preset_content)取出对应 TOML,再通过原子写入(crate::utils::write_file_atomic)落盘或直接输出到标准输出。因此,还有两种等价用法:
# 1. 预览预设内容(不写入文件) starship preset no-runtime-versions # 2. 通过 shell 重定向写入配置文件 starship preset no-runtime-versions > ~/.config/starship.toml # 3. 列出所有可用预设 starship preset --list写入完成后,重新打开一个终端窗口(或执行exec $SHELL重载当前会话)即可看到效果:提示符中的via 🐍 v3.12.0之类片段会变为via 🐍。
3.1 配置文件的加载机制
Starship 的配置查找逻辑支持通过STARSHIP_CONFIG环境变量指定配置文件,未设置时使用~/.config/starship.toml(这一行为可在 src/configure.rs 及src/utils/env.rs中印证)。因此如果你不想覆盖默认路径,也可以输出到自定义位置并设置环境变量:
starship preset no-runtime-versions -o ~/.config/starship-custom.toml export STARSHIP_CONFIG=~/.config/starship-custom.toml四、手动配置:不依赖命令的等价做法
如果你偏好手工维护配置,或只想隐藏部分模块的版本,可以自行在~/.config/starship.toml中写入以下片段(以 Python、Rust、Node.js 为例):
[python] format = "via $symbol" [rust] format = "via $symbol" [nodejs] format = "via $symbol"也可以利用starship config子命令逐项修改,无需打开编辑器。该命令对 TOML 的点分路径(如python.format)进行更新,实现位于 src/configure.rs 的handle_update_configuration:
starship config python.format 'via $symbol' starship config rust.format 'via $symbol'注意:无论采用哪种方式,只需覆盖
format即可,symbol、style、detect_extensions、detect_files等其余键都会沿用各模块的默认值(各默认值可在src/configs/*.rs中逐一查看)。原预设 TOML 也正是“只改 format、其余全默认”的极简风格。
五、源码实现:format 如何决定版本是否渲染
要理解这个预设为何有效,需要看 Starship 模块的渲染流程。以 Python 模块 src/modules/python.rs 为例:
- 模块先构造
format字符串并解析其中的变量($symbol、$version、$virtualenv等); - 只有当
format中出现version变量时,代码才会调用get_python_version,进而执行python --version并解析输出(如parse_python_version对Python 3.7.2、Anaconda、PyPy 等输出的解析,见同文件测试用例 src/modules/python.rs); - 版本号随后经
VersionFormatter::format_module_version按version_format(默认"v${raw}")格式化后嵌入提示符。
同理,Node.js、Rust、Bun 等模块的默认format均为"via $symbol($version )",一旦被预设覆盖为"via $symbol",$version变量从格式串中消失,对应运行时进程(python --version、node --version等)便不会再被调用。
由此可以得出两个重要结论(属于从代码结构可以推断的实现事实):
- 隐藏版本不只是“显示美化”,还能减少子进程调用:每次渲染都少执行一次运行时二进制,在频繁刷新提示符的交互式 Shell 中,能让提示符渲染更快,这也契合 Starship “blazing-fast” 的设计目标;
- 格式化是完全声明式的:你可以在任何模块的
format中自由增删变量(如把$version移入右侧提示符right_format),渲染逻辑会自动跟随,无需改动任何模块代码。
六、适用场景与注意事项
适用场景
- Docker / Podman 容器内的交互式 Shell,避免提示符显示与镜像内实际环境不符的版本;
venv、conda、pyenv、nvm等虚拟环境或版本管理器工作流;- 追求极简提示符、不关心具体版本号的日常开发。
注意事项
- 该预设只影响其清单内列出的运行时模块;未被覆盖的模块(如
git_branch、directory、cmd_duration等)行为不变; - 若你后续通过包管理器或
starship preset重新安装其他预设,会整体覆盖~/.config/starship.toml,如需保留本预设效果请先备份; - 配置文件格式为 TOML,语法错误会导致提示符回退,可用
starship print-config(实现在 src/configure.rs)校验当前生效配置; - 想要了解
format语法(变量、$all、样式嵌套等),可参考官方配置文档 docs/zh-CN/config/README.md;完整预设清单见 docs/zh-CN/presets/README.md。
总而言之,No Runtime Versions预设用一套极简的 TOML 覆盖,精准实现了“隐藏版本、保留环境上下文”的目标,是容器与虚拟环境用户低成本获得干净提示符的官方推荐方案。
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考