首页
/ Starship 的 No Nerd Fonts 预设实战指南:不装 Nerd Font 也能让模块符号完整显示

Starship 的 No Nerd Fonts 预设实战指南:不装 Nerd Font 也能让模块符号完整显示

2026-09-08 10:13:59作者:庞眉杨Will

本篇技术指南以 Starship 仓库中的 No Nerd Fonts 预设(No Nerd Fonts Preset,波兰语文档见 docs/pl-PL/presets/no-nerd-font.md,英文原文见 docs/presets/no-nerd-font.md)为核心,讲解该预设解决的问题、逐模块的符号替换细节、CLI 应用方式及其在源码中的实现原理。读完你可以掌握:无需安装任何 Nerd Font(甚至只使用系统默认字体)即可获得完整符号显示的 Starship 提示符配置方案,以及预设在 Starship 源码中如何被生成、列出与写入配置文件的底层机制。

Nerd Font 依赖问题的由来

Starship 内置模块的默认符号大量使用了位于字体**私有使用区(Private Use Area,PUA)**的码点字形,这类字形通常只存在于 Nerd Font(或 Powerline)等经过重新打包、补丁的字体中。以仓库默认配置为例:

因此,官方安装指南默认要求“在终端中安装并启用一种 Nerd Font”。但这一前提在一些场景下并不成立:远程服务器、受限的 CI/CD 容器、团队共享的默认终端环境,或你只是不想为了一个提示符去更换系统字体。当缺少对应字体时,这些 PUA 码点会显示为空白或“豆腐块”(tofu),信息虽然仍在,体验却大打折扣。

No Nerd Fonts 预设做了什么

No Nerd Fonts 预设正是为上述场景设计的。根据 docs/pl-PL/presets/no-nerd-font.md 的说明,这一预设把符号的使用限制在 emoji 与 powerline 符号集合内,从而在不安装 Nerd Font 的情况下,也能完整显示各模块的符号;文档同时指出,该预设将在 Starship 未来的某个版本中成为默认预设(docs/presets/README.md 中也用提示块标注了这一点)。

整个预设的实际内容是一个很小的 TOML 文件: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 = "🧊 "

首行 $schema 指向官方 config-schema.json,是为了让编辑器在编辑该文件时能获得基于 JSON Schema 的自动补全与校验,可参考 docs/config/README.md 的用法。$schema 本身不会影响运行时的符号渲染。

逐模块替换明细:从 PUA 字形到通用符号

将上述预设内容与 src/configs/ 下各模块的默认值逐项对照,可以清楚看到它的替换思路——凡是默认值落在字体私有使用区、需要 Nerd Font 支撑的符号,一律换成 emoji 或常见 Unicode 区块(Dingbats、Geometric Shapes、Arrows 等)里宽泛支持的字形:

模块 配置文件中的默认符号 No Nerd Fonts 预设符号 类型变化
azure ""(PUA) ☁️ 云朵 emoji
erlang ""(PUA) 圈字字符
nodejs ""(PUA) 几何图形 + 样式
pulumi ""(PUA) 🧊 冰块 emoji
battery 五种 PUA 字形 / / / / 通用符号

Azure 模块

默认配置位于 src/configs/azure.rs,符号是 PUA 字形 "",且该模块默认处于禁用状态(disabled: true)。预设将其改写为云朵 emoji ☁️。若你希望在提示符中使用 Azure 订阅信息,只需启用模块并将这段 [azure] 配置并入你自己的配置。

Battery 模块

电量模块涉及五个配置项,均在 src/configs/battery.rs 中定义,含义如下:

  • full_symbol:电量充满时显示的符号;
  • charging_symbol:充电中的符号;
  • discharging_symbol:放电中的符号;
  • unknown_symbol:状态未知时的符号;
  • empty_symbol:电量耗尽时的符号。

预设分别替换为 (上箭头)、(下箭头)、。其中 / 属于 Unicode Arrows 区块, / 属于 Dingbats 区块,绝大多数系统字体都内置或具备回退覆盖,因此即使未安装 Nerd Font,电量状态依旧一目了然。

Node.js 模块

默认符号见 src/configs/nodejs.rs,预设改为 。注意它保留了模块默认的 bold green 样式段,(U+2B22)属于 Geometric Shapes 区块,在普通字体下即可渲染,同时保持原有颜色语义不变。这种“仅替换字形、保留样式/格式串”的手法,保证了视觉风格不至于在更换符号后断裂。

Erlang 与 Pulumi

Erlang 默认符号在 src/configs/erlang.rs 中为 PUA 字形,预设改用 (U+24D4);Pulumi 默认符号在 src/configs/pulumi.rs 中同样为 PUA 字形,预设改用 🧊。两者都落在无需专用字体的通用码位上。

如何应用该预设

方式一:使用 starship preset 子命令(推荐)

官方推荐在 docs/pl-PL/presets/no-nerd-font.md 中给出的单行命令:

starship preset no-nerd-font -o ~/.config/starship.toml

该命令把预设内容直接写入 Starship 的全局配置文件 ~/.config/starship.toml(该路径即 docs/config/README.md 中约定的默认配置位置)。如果文件已存在且你希望覆盖,可追加 -f/--force 参数:

starship preset no-nerd-font -o ~/.config/starship.toml -f

相关 CLI 定义位于 src/main.rsstarship preset 子命令支持:

  • name:要输出的预设名(value_enum 约束,必须是内置预设之一);
  • -o, --output <FILE>:写入文件而非标准输出(与 --list 互斥);
  • -f, --force:若输出文件已存在则强制覆盖(必须配合 --output);
  • -l, --list:列出全部可用预设名。

若不提供 --output,预设内容会打印到标准输出,方便先预览再决定:

# 先在终端里查看即将应用的完整 TOML
starship preset no-nerd-font

# 查看本机内置的全部预设名称
starship preset --list

方式二:从仓库直接获取 TOML 后手工合并

预设的源文件为 docs/public/presets/toml/no-nerd-font.toml,同时它也随构建流程被打包进二进制(见下文)。如果你只想对现有配置做增量修改而非整体覆盖,可以把其中的 [battery][nodejs] 等配置段抄入自己已有的 starship.toml,手动挑选需要的模块符号。

预设命令的底层实现

从源码看,starship preset 并不是硬编码了一套逻辑,而是在编译期由构建脚本自动生成预设清单与内容映射

  • build.rs 中的 gen_presets_hook 会扫描 docs/public/presets/toml/ 目录下的全部 .toml 文件(并声明 rerun-if-changed 依赖该目录),逐一生成形如 "no-nerd-font" => include_str!(...) 的匹配分支;
  • 也就是说,预设目录下的 TOML 文件名即预设名,新增预设只需向该目录投放一个 TOML 文件并重新编译;
  • src/print.rs 中的 ValueEnum 实现与 preset_command 负责运行期分发:先由 Preset 变体解析参数,再调用 shadow::get_preset_content 取出编译期内嵌的 TOML 内容,最后通过 crate::utils::write_file_atomic 原子写入目标文件或输出到 stdout;
  • src/print.rs 中的测试用例验证了 preset --list 至少返回一项、所有内置预设调用不 panic,并断言 -o 写出的文件内容与源码目录下的 TOML 完全一致(include_str! 直接比对),确保“CLI 输出的预设”与“仓库里的预设文件”永不漂移。

对使用方而言,这意味着 starship preset no-nerd-font 输出的内容与仓库中 no-nerd-font.toml 文件逐字节一致,你可以放心信任命令行产物。

生效位置、验证与恢复默认

生效与自定义位置

写入完成后,新开一个终端标签页即可看到效果(提示符在每次渲染时读取配置)。若你的配置并不在默认路径,可通过环境变量 STARSHIP_CONFIG 指定(详见 docs/config/README.md 的 Config File Location 一节):

export STARSHIP_CONFIG=~/example/non/default/path/starship.toml

PowerShell 下则把这一行加入 $PROFILE

$ENV:STARSHIP_CONFIG = "$HOME\example\non\default\path\starship.toml"

恢复与后续演进

该预设只覆盖了配置文件中未出现过的键,若你想回到各模块默认的 Nerd Font 符号,删除 ~/.config/starship.toml(或删除其中 [azure][battery][erlang][nodejs][pulumi] 段)即可恢复默认。

需要留意的是,仓库文档声明“该预设将在未来版本中成为 Starship 的默认预设”。因此,从适配未来的角度讲,尽早把个人配置迁移到 emoji / powerline 符号体系,或至少让关键符号不依赖 PUA 码点,能降低后续版本升级时提示符外观发生跳变的概率。如果希望了解当前版本所有内置预设的整体定位,可查阅 docs/presets/README.md(其中同样收录了 Nerd Font Symbols、Plain Text Symbols、No Runtime Versions 等姊妹预设,构成一套完整的符号策略工具箱)。

小结

  • 问题本质:Starship 多数模块默认符号位于字体私有使用区,只有在 Nerd Font 下才能正常渲染;
  • 预设方案:No Nerd Fonts 预设将 Azure、Battery、Erlang、Node.js、Pulumi 等模块的符号统一替换为 emoji 或通用 Unicode 符号(🧊☁️),源文件见 docs/public/presets/toml/no-nerd-font.toml
  • 落地命令starship preset no-nerd-font -o ~/.config/starship.toml(可加 -f 覆盖),辅以 --list 与无 -o 的 stdout 预览;
  • 实现保证:预设清单在编译期由 build.rs 从预设目录生成并内嵌,src/print.rs 负责运行期分发与原子写入,并有测试确保 CLI 输出与仓库文件一致。
登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.81 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
531
596
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
920
1.84 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.79 K
1.02 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.36 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.02 K
519
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
390