Starship「No Nerd Fonts」预设详解:不装 Nerd Font,也能完整渲染全部模块符号
这篇指南围绕 Starship 官方预设 No Nerd Fonts(no-nerd-font) 展开,说明它的设计目标、适用场景,以及如何通过 starship preset 一键应用。文章同时结合本仓库(starship 源码)中的 CLI 实现与各模块默认符号定义,帮你理解它究竟替换了哪些符号、为什么只需要替换这几个模块,以及它与 Nerd Font Symbols、Plain Text Symbols 等其他符号预设的关系。读完你不仅能立刻用上该预设,还能按需微调符号配置。
预设要解决什么问题
Starship 为了在终端中呈现出丰富多彩的图标效果,许多模块默认使用 Nerd Font 私有区字形(位于 Unicode 私有使用区,PUA)作为前缀符号。这类字形在绝大多数普通终端字体中并不存在——如果用户没有安装 Nerd Font,提示符上就会出现一个个方块(tofu),严重影响可读性。
no-nerd-font 预设的思路非常直接:把符号使用范围限制在 emoji 与 powerline 字形集合内。这样即使没有安装 Nerd Font,Starship 所有内置模块的符号也能被普通终端字体正常显示。官方页面(英文原版及挪威语翻译版)对此的表述是:
This preset restricts the use of symbols to those from emoji and powerline sets. This means that even without a Nerd Font installed, you should be able to view all module symbols.
需要强调的是,官方同时声明:该预设将在未来某个版本的 starship 中成为默认预设。这一规划在 presets 索引页 中以 [!TIP] 的形式再次标注,因此在今天提前适配该方案,意味着你的配置在未来切换默认值时会更加平滑。
一条命令完成应用
应用该预设的方式在页面中有明确说明,即通过内置的 starship preset 子命令把预设写入配置文件:
starship preset no-nerd-font -o ~/.config/starship.toml
-o(即 --output)表示把预设内容写入指定文件而非打印到标准输出。命令执行后,重新加载 shell 即可看到效果。若你已经配置过 starship,执行前建议先备份现有 ~/.config/starship.toml。
preset 子命令的完整用法
starship preset 的功能定义位于 src/main.rs,它支持以下选项:
| 选项 | 作用 | 约束 |
|---|---|---|
no-nerd-font(位置参数) | 指定要输出的预设名称,值由 Preset 枚举校验 | 与 --list 二选一,必填其一 |
-o, --output <PATH> | 将预设写入目标文件,而不是打印到 stdout | 与 --list 互斥 |
-f, --force | 目标文件已存在时强制覆盖 | 依赖 --output |
-l, --list | 列出所有可用的预设名称 | 与 --output 互斥 |
常见的几种使用方式:
# 只把预设内容打印到终端,先预览再决定
starship preset no-nerd-font
# 列出当前版本内置的全部预设名称(如 no-nerd-font、plain-text-symbols 等)
starship preset --list
# 写入默认配置文件;文件已存在时用 --force 覆盖
starship preset no-nerd-font -o ~/.config/starship.toml --force
其背后实现位于 src/print.rs:Preset 实现了 clap 的 ValueEnum,可用预设集合来自内部 shadow 模块的 get_preset_list();当指定名称后,preset_command 通过 get_preset_content() 取出对应 TOML 内容,再调用 write_file_atomic 原子地写入目标文件(覆盖与否由 force 参数决定),写失败时打印错误并以状态码 1 退出。仓库还附带了对该命令的测试用例(见 src/print.rs),其中直接以 include_str!("../docs/public/presets/toml/...") 引用了仓库内置的预设 TOML 文件作为期望值进行断言。
注:
~/.config/starship.toml是类 Unix 系统上的默认配置路径;写入其它路径(例如想分别管理多套配置)时可借助-o指定任意输出位置。
预设到底改了什么
预设的完整内容存储于仓库的 docs/public/presets/toml/no-nerd-font.toml,也是官方文档页中直接内嵌展示的那份配置,全文如下:
"$schema" = 'https://starship.rs/config-schema.json'
[azure]
symbol = "☁️ "
[battery]
full_symbol = "• "
charging_symbol = "⇡ "
discharging_symbol = "⇣ "
unknown_symbol = "❓ "
empty_symbol = "❗ "
[erlang]
symbol = "ⓔ "
[nodejs]
symbol = "⬢ "
[pulumi]
symbol = "🧊 "
可以看到它没有大动干戈地重写每一个模块,而只覆盖了 azure、battery、erlang、nodejs、pulumi 这五个模块的符号键。这并非遗漏,而是因为这些模块的默认符号恰好是"只有 Nerd Font 才带"的私有区字形,其余模块的默认符号本身就已经是 emoji、powerline 字形或通用字符。
对照源码中各模块的默认符号定义(src/configs/ 目录)可以验证这一点:
| 配置节 | 被覆盖的键 | 源码默认值形态 | 预设替换值 |
|---|---|---|---|
[azure] | symbol | Nerd Font 私有区字形(见 src/configs/azure.rs) | ☁️(云朵 emoji) |
[battery] | full_symbol 等 5 个状态符号 | 全部为 Nerd Font 私有区字形(见 src/configs/battery.rs) | • ⇡ ⇣ ❓ ❗ |
[erlang] | symbol | Nerd Font 私有区字形(见 src/configs/erlang.rs) | ⓔ(带圈字母) |
[nodejs] | symbol | Nerd Font 私有区字形(见 src/configs/nodejs.rs) | ⬢(绿色粗体六边形) |
[pulumi] | symbol | Nerd Font 私有区字形(见 src/configs/pulumi.rs) | 🧊(冰块 emoji) |
其中的语法与普通配置完全一致:
[nodejs] symbol = "⬢ "里的文本是 starship 的样式字符串语法,表示把⬢渲染为粗体绿色;[battery]的五个键分别对应电池充满、充电中、放电中、状态未知、电量耗尽五种状态的前缀符号。
由于 starship 的 TOML 配置在运行时与各模块默认值逐键合并(预设只覆盖它写到的键,未涉及的键仍走内置默认),应用该预设后即可保证:凡是这里五个模块的符号,都不再依赖 Nerd Font;而其它默认就使用 emoji/powerline 字形的模块(例如 aws 的云朵、buf 的水牛等,可对比 src/configs/aws.rs 等同目录文件)本来就不受影响。
与其它符号类预设的关系
在 presets 索引页 收录的多套官方社区预设中,与本主题直接相关的还有两套,恰好构成"三种字形策略":
- Nerd Font Symbols(见 nerd-font.md,对应 TOML 为 docs/public/presets/toml/nerd-font-symbols.toml):反向操作——把每个模块的符号都替换成对应的 Nerd Font 字形(例如
azure用云朵图标、battery用填充电池图标、nodejs用图标等),面向已经安装 Nerd Font、希望最大化图标表现力的用户。 - Plain Text Symbols(见 plain-text.md,对应 TOML 为 docs/public/presets/toml/plain-text-symbols.toml):比 no-nerd-font 走得更远,把符号全部换成
az、erl、nodejs、pulumi这类纯 ASCII 文本,连 Unicode 都不依赖,适合对字符集支持最苛刻的环境。
三者的取舍关系可以这样理解:Nerd Font Symbols ≈ 默认的图标化上限 → no-nerd-font(emoji + powerline,兼容性折中)→ plain-text-symbols(纯文本,极致兼容)。如果你只是想解决"Nerd Font 没装/装不上导致乱码"的问题,no-nerd-font 是保留视觉信息量最多的方案;如果连 emoji 字体都不可靠(例如某些 CI 或嵌入式终端),再考虑纯文本预设。
适用场景与注意事项
综合上面的机制,这套预设尤其适合以下场景:
- 日常终端未安装 Nerd Font,但又想用 starship 的完整模块(如电池状态、Azure/Erlang/Node.js/Pulumi 环境提示)而不出现乱码方块;
- SSH 到远程服务器、在容器/CI 环境中使用 starship,那里不便安装额外字体;
- 团队协作中需要统一的、跨环境表现一致的提示符(emoji 在现代终端字体中通常天然可用)。
几点使用上的提醒:
-o会覆盖整个目标文件:如果你已经有大量自定义配置,不要直接把预设覆盖到同一文件,而应把上面那份 TOML 的各个节手动合并进现有~/.config/starship.toml,或用-f/--force前先备份。- 预设并非全局"一键去 Nerd Font"开关:它只替换默认符号;若你此前已把其它模块的
symbol手动设置成 Nerd Font 字形,或format里写入了特殊字符,仍需自行调整。 - 未来默认值的平滑迁移:官方已在文档中声明该预设将成为 starship 后续版本的默认配置。提前采用它,可以保证将来升级 starship 后提示符符号与你预期一致,不会因为默认值切换而"突然变样"。
- 本页面所示内容以当前仓库为准:源码中
src/configs/各文件的默认符号、docs/public/presets/toml/下的预设 TOML 均以仓库当前快照为准,若后续版本调整了默认符号集合,以对应版本源码为准。
如果你希望进一步探索符号体系的更多可能性(例如隐藏无运行时版本、隐藏空图标等),可以继续阅读 presets 目录 下的其它预设文档。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



