尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Starship No Empty Icons 预设详解:只为可检测工具显示图标

Starship No Empty Icons 预设详解:只为可检测工具显示图标 Starship No Empty Icons 预设详解只为可检测工具显示图标【免费下载链接】starship☄️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship本篇技术指南围绕 Starship 官方预设No Empty Icons展开讲解它如何改变各语言/工具模块图标的显示逻辑——只有当工具集信息如版本号能被实际检测到时才渲染图标避免在未安装对应工具的项目目录中出现空图标。读完本文你将掌握该预设的完整 TOML 配置结构、starship preset命令的使用方法以及其背后的 format 字符串解析与模块版本检测原理可直接复用到自己的 Starship 配置中。预设要解决的问题Starship 的每个工具模块如nodejs、rust、python都由两部分信息驱动检测当前目录是否存在该工具的项目特征文件如package.json、Cargo.toml、pyproject.toml决定模块是否出现渲染模块format中的$symbol、$version等变量决定显示内容。默认情况下只要模块被检测到其符号icon就会显示而本预设要求只有能确定工具版本信息时才显示该工具及其图标。换句话说当某目录具备工具特征文件但系统中并未安装该工具因而无法取得版本号时No Empty Icons 会连图标一起隐藏避免出现有图标、无内容的空洞显示。原文档对这一点的表述为只有确认 toolset 文件后才显示 toolset 图标如果没有找到 toolset 的版本号就不会显示 toolset。本预设改变了图标的显示条件只有找到 toolset 信息时才显示。见 docs/uk-UA/presets/no-empty-icons.md英文原版见 docs/presets/no-empty-icons.md快速上手一条命令应用预设原文档给出的安装方式只有一条命令docs/uk-UA/presets/no-empty-icons.mdstarship preset no-empty-icons -o ~/.config/starship.toml命令各部分的含义starship presetStarship 的内置预设子命令用于向标准输出打印某个预设的 TOML 配置no-empty-icons预设名称对应仓库中的 docs/public/presets/toml/no-empty-icons.toml-o ~/.config/starship.toml将输出写入用户级配置文件-o即--output。在 Linux/macOS 上默认配置路径为~/.config/starship.tomlWindows 上为%USERPROFILE%\.config\starship.toml。从 src/main.rs 的 CLI 定义约第 102–113 行可以确认preset子命令支持三个关键选项预设名称、输出文件路径-o/--output、强制覆盖标志--force以及列出全部预设名称的--list参数。若目标配置文件已存在且未加--force命令会拒绝覆盖以免误伤已有配置若你只想先预览内容直接运行starship preset no-empty-icons即可将完整 TOML 打印到终端。应用后重新加载 shell或执行exec $SHELL即可看到效果。该预设与 Nerd Font 符号、纯文本符号等其他预设相互独立可以按需叠加或替换。完整 TOML 配置逐段精读预设的全部内容由约 45 个模块的format重写组成源文件位于 docs/public/presets/toml/no-empty-icons.toml。其核心手法统一而精妙把版本号放入圆括号可选组($version )中版本变量缺失时整组内容连同图标一并消失。以下是完整配置与仓库中no-empty-icons.toml完全一致$schema https://starship.rs/config-schema.json [buf] format (with $symbol($version )) [bun] format (via $symbol($version )) [c] format (via $symbol($version(-$name) )) [cpp] format (via $symbol($version(-$name) )) [cmake] format (via $symbol($version )) [cobol] format (via $symbol($version )) [crystal] format (via $symbol($version )) [daml] format (via $symbol($version )) [dart] format (via $symbol($version )) [deno] format (via $symbol($version )) [dotnet] format (via $symbol($version )( $tfm )) [elixir] format (via $symbol($version \(OTP $otp_version\) )) [elm] format (via $symbol($version )) [erlang] format (via $symbol($version )) [fennel] format (via $symbol($version )) [fortran] format (via $symbol($version )) [gleam] format (via $symbol($version )) [golang] format (via $symbol($version )) [haskell] format (via $symbol($version )) [helm] format (via $symbol($version )) [java] format (via $symbol($version )) [julia] format (via $symbol($version )) [kotlin] format (via $symbol($version )) [lua] format (via $symbol($version )) [nim] format (via $symbol($version )) [nodejs] format (via $symbol($version )) [ocaml] format (via $symbol($version )(\($switch_indicator$switch_name\) )) [opa] format (via $symbol($version )) [package] format (is $symbol$version ) [perl] format (via $symbol($version )) [php] format (via $symbol($version )) [purescript] format (via $symbol($version )) [python] format (via ${symbol}${pyenv_prefix}(${version} )(\($virtualenv\) )) [quarto] format (via $symbol($version )) [raku] format (via $symbol($version-$vm_version )) [red] format (via $symbol($version )) [rlang] format (via $symbol($version )) [ruby] format (via $symbol($version )) [rust] format (via $symbol($version )) [scala] format (via $symbol($version )) [swift] format (via $symbol($version )) [typst] format (via $symbol($version )) [vagrant] format (via $symbol($version )) [vlang] format (via $symbol($version )) [xmake] format (via $symbol($version )) [zig] format (via $symbol($version ))配置的三种模式将 45 个模块归类可看到该预设只用了三种结构① 标准模式(via $symbol($version ))覆盖绝大多数模块bun、dart、deno、elm、go、haskell、java、kotlin、lua、nodejs、perl、php、python、ruby、rust、scala、swift、zig 等。渲染逻辑为前缀文字via恒定显示[$symbol($version )]是带样式的整段$symbol与($version )同处一个方括号样式组内。由于$version位于圆括号可选组中版本缺失时圆括号连同内部内容整体不渲染于是方括号组内只剩空串图标也随之消失若版本检测成功则显示via 图标 版本号 空格例如via v1.80.0。② 定制前缀模式[buf]使用(with ...)而非via[package]使用(is $symbol$version )对应 npm/Cargo 等包管理器版本信息显示为is v2.5.1。③ 复合变量模式在标准结构上追加了更多可选变量组版本存在时一并展示附加信息[c]/[cpp]$version(-$name)附带编译器名称如 gcc 版本与名称[dotnet]($version )( $tfm )附带目标框架Target Framework Moniker[elixir]($version \(OTP $otp_version\) )附带 OTP 版本括号需用\(\)转义以作为字面文本[ocaml]($version )(\($switch_indicator$switch_name\) )附带当前 opam switch 名称[python]${pyenv_prefix}(${version} )(\($virtualenv\) )附带 pyenv 前缀与虚拟环境名[raku]($version-$vm_version )同时显示 Raku 与虚拟机MoarVM 等版本。注意这些附加组同样包在圆括号内因此若对应信息不可用它们会被独立隐藏不会产生半截输出。底层原理format 字符串如何做到版本缺失即整组隐藏No Empty Icons 之所以仅凭format就能实现行为变更得益于 Starship 的字符串格式化引擎对可选变量组的处理。核心实现在 src/formatter/string_formatter.rsStringFormatter::new解析 format 字符串将所有变量如$version、$symbol缓存为变量映射表第 63–88 行模块通过map/map_meta为变量赋值。源码注释明确约定mapper 返回None表示该变量保留给后续 mapper若在parse()时仍为None该变量将被丢弃第 99–112 行圆括号( ... )是 Starship format 语法中的可选组只要组内任一变量为空整组内容就不渲染。于是($version )中的$version无法解析时圆括号组连同其内的空格一起消失而$symbol与$version同处一个样式块[...]中当块内所有内容为空时样式块本身也输出为空——最终整个模块呈现为仅有via文字甚至被外层隐藏图标不会单独出现。这一机制的运行时证据可从 src/modules/nodejs.rs 的测试用例中看到no_node_installed测试第 364–374 行当node --version命令无法执行返回None时渲染结果为via 绿色图标 空格版本号与括号整体被移除folder_with_package_json测试第 151–159 行存在package.json且 node 可执行时输出为via 绿色图标 v12.0.0版本正常展示。也就是说模块的$version是通过执行对应命令如node --version、rustc --version实时探测的见 src/modules/nodejs.rs 第 33–37 行的exec_cmd调用。No Empty Icons 正是利用探测失败 → 变量为空 → 可选组隐藏这条链路把默认的模块在、图标在改成了版本可知、图标才在。适用场景与注意事项推荐场景在同时混用多种语言项目的目录树中未安装对应 SDK 的目录不再显示误导性的图标提示更干净希望提示信息始终有依据——显示的每个图标都代表一个真实可用的工具版本追求极简提示minimal prompt的用户可显著减少无关符号干扰。注意事项该预设不会阻止模块本身出现只要检测到项目特征文件via前缀仍可能渲染它隐藏的是图标与版本等无内容的部分若想完全隐藏未检测到工具的模块需另行配合模块的disabled或检测条件调整预设仅重写了各模块的format不会改动符号、颜色、检测文件等其它配置因此可与 No Nerd Fonts、Plain Text Symbols 等以符号为主题的预设协同使用配置中含$schema声明与字面 emoji如写入配置后建议执行starship config校验或直接重载 shell 观察效果不同模块的探测命令可能较慢每次渲染 prompt 都会执行若目录很多且工具链庞大可关注 prompt 响应时间。小结No Empty Icons 是理解 Starship 配置威力的一扇窗口它不修改任何检测逻辑仅通过把$version放入可选组($version )、与$symbol同组就完成了图标只跟随可检测信息出现的行为改造。你可以将此手法推广到任意自定义模块——把任何有值才显示的变量用圆括号包起来即可获得同样优雅的条件渲染。完整配置可随时从仓库 docs/public/presets/toml/no-empty-icons.toml 获取或通过starship preset no-empty-icons在线生成。【免费下载链接】starship☄️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表