
Starship No Runtime Versions 预设详解隐藏语言运行时版本为容器与虚拟环境打造简洁提示符【免费下载链接】starship☄️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starshipStarship当前仓库 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 $symbol2.1 三类格式模式对这 49 个模块的format覆盖可归纳为以下模式模式涉及的模块效果via $symbolbun、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的$tfmTarget Framework Moniker如net8.0描述的是目标框架而非运行时版本在容器中依然有参考价值ocaml的$switch_name与$switch_indicator表示当前 opam switch全局/本地是 OCaml 工作区的关键上下文原默认格式为via $symbol($version )(\\($switch_indicator$switch_name\\) )见 src/configs/ocaml.rs预设仅剔除$versionpixi的环境名$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.rspreset_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_configurationstarship 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),仅供参考