Starship 的 Plain Text Symbols 预设:不依赖 Unicode 的纯文本提示符配置全解
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
Plain Text Symbols(纯文本符号)是 Starship 官方提供的一组配置预设,它把提示符中各个模块默认使用的图形符号(Nerd Font 图标、Unicode 特殊字符)统一替换为纯 ASCII 文本。本指南以仓库中的 Plain Text Symbols 预设文档(对应英文版 docs/presets/plain-text.md)为核心,结合 预设 TOML 文件与src/下的源码实现,完整讲解该预设的用途、安装方式、配置内容与底层原理,帮助你在一行命令内获得一个在任何终端、任何编码环境下都不会乱码的 Starship 提示符。
Plain Text Symbols 预设效果截图
一、这个预设解决什么问题
Starship 默认提示符大量使用了 Nerd Font 字形与 Unicode 符号:例如character模块的❯、git_branch模块的分支图标、各语言模块的专属 Logo 图标等。这在大多数现代终端下表现良好,但存在两种场景会出问题:
- 无法渲染 Unicode 的环境:老旧的终端模拟器、某些远程/嵌入式会话、编码设置为非 UTF-8 的终端,会把图标渲染成
?、方块或乱码; - 未安装 Nerd Font 的系统:默认配置中的部分符号依赖 Nerd Font 字体,缺字体会显示为占位符。
Plain Text Symbols 预设正是为这些场景设计的:它将每个模块的 symbol 都改为普通文本(例如aws、py、git),同时保留模块原有的颜色与格式逻辑,使提示符在不依赖任何特殊字体的前提下依然信息完整。用官方文档的原话来说:"This preset changes the symbols for each module into plain text. Great if you don't have access to Unicode."(该预设将每个模块的符号改为纯文本,非常适合无法使用 Unicode 的场景)。
二、安装与使用:一条命令完成配置
该预设的使用方式非常简单,官方文档给出的命令如下:
starship preset plain-text-symbols -o ~/.config/starship.toml这条命令会把完整的预设配置写入用户配置文件~/.config/starship.toml(Windows 下默认路径为%USERPROFILE%\.config\starship.toml)。执行后重启终端(或执行exec $SHELL)即可生效。
从源码看,这条命令走的是 Starship 内置的preset子命令。在 src/main.rs 中定义了该子命令的完整参数:
name:预设名称,这里即plain-text-symbols,必须与内置预设列表匹配(value_enum校验);-o, --output:输出到文件而非 stdout,与-l互斥;-f, --force:当输出文件已存在时强制覆盖,需要配合-o使用;-l, --list:列出所有可用预设名称。
其实现位于 src/print.rs 的preset_command函数:先通过shadow::get_preset_content取得内嵌的预设内容,然后调用crate::utils::write_file_atomic原子写入目标文件(若文件已存在且未加-f会报错退出)。也就是说,预设的 TOML 内容是编译进二进制文件的,并非运行时从网络或外部目录读取。
几个实用变体:
# 先看看这个预设会输出什么,不写入文件 starship preset plain-text-symbols # 列出全部可用预设 starship preset --list # 输出到指定文件,并允许覆盖已存在文件 starship preset plain-text-symbols -o ~/.config/starship.toml -f注意事项
-o会整体覆盖目标文件。如果你已有自定义配置,应先备份(如cp ~/.config/starship.toml ~/.config/starship.toml.bak),或手动把预设中需要的段落合并进现有文件;- 仓库中同一份预设的源码位于 docs/public/presets/toml/plain-text-symbols.toml,想手动下载或审阅内容可直接查看该文件;
- 预设索引页 docs/presets/README.md 展示了包括 Plain Text Symbols 在内的全部社区预设。
三、配置文件逐段解析:每个模块改了什么
该预设的完整 TOML 如下(与仓库中 docs/public/presets/toml/plain-text-symbols.toml 完全一致):
"$schema" = 'https://starship.rs/config-schema.json' continuation_prompt = ". " [character] success_symbol = ">" error_symbol = "x" vimcmd_symbol = "<" vimcmd_visual_symbol = "<" vimcmd_replace_symbol = "<" vimcmd_replace_one_symbol = "<" [git_commit] tag_symbol = " tag " [git_status] ahead = ">" behind = "<" diverged = "<>" renamed = "r" deleted = "x" [aws] symbol = "aws " [azure] symbol = "az " [battery] full_symbol = "full " charging_symbol = "charging " discharging_symbol = "discharging " unknown_symbol = "unknown " empty_symbol = "empty " [buf] symbol = "buf " [bun] symbol = "bun " [c] symbol = "C " [cpp] symbol = "C++ " [cobol] symbol = "cobol " [conda] symbol = "conda " [container] symbol = "container " [crystal] symbol = "cr " [cmake] symbol = "cmake " [daml] symbol = "daml " [dart] symbol = "dart " [deno] symbol = "deno " [dotnet] format = "via $symbol($version )(target $tfm )" symbol = ".NET " [directory] read_only = " ro" [docker_context] symbol = "docker " [elixir] symbol = "exs " [elm] symbol = "elm " [erlang] symbol = "erl " [fennel] symbol = "fnl " [fortran] symbol = "fortran " [fossil_branch] symbol = "fossil " truncation_symbol = "..." [gcloud] symbol = "gcp " [git_branch] symbol = "git " truncation_symbol = "..." [gleam] symbol = "gleam " [golang] symbol = "go " [gradle] symbol = "gradle " [guix_shell] symbol = "guix " [haskell] symbol = "haskell " [haxe] symbol = "hx " [helm] symbol = "helm " [hg_branch] symbol = "hg " truncation_symbol = "..." [hostname] ssh_symbol = "ssh " [java] symbol = "java " [jj_bookmark] symbol = "jj " truncation_symbol = "..." [jobs] symbol = "*" [julia] symbol = "jl " [kotlin] symbol = "kt " [kubernetes] symbol = "kubernetes " [lua] symbol = "lua " [maven] symbol = "maven " [nodejs] symbol = "nodejs " [memory_usage] symbol = "memory " [meson] symbol = "meson " truncation_symbol = "..." [mojo] symbol = "mojo " [nats] symbol = "nats " [netns] symbol = "netns " [nim] symbol = "nim " [nix_shell] symbol = "nix " [ocaml] symbol = "ml " [odin] symbol = "odin " [opa] symbol = "opa " [openstack] symbol = "openstack " [os.symbols] AIX = "aix " Alpaquita = "alq " AlmaLinux = "alma " Alpine = "alp " ALTLinux = "alt " Amazon = "amz " Android = "andr " AOSC = "aosc " Arch = "rch " Artix = "atx " Bazzite = "bazz " Bluefin = "blfn " CachyOS = "cach " CentOS = "cent " Debian = "deb " DragonFly = "dfbsd " Elementary = "elem " Emscripten = "emsc " EndeavourOS = "ndev " Fedora = "fed " FreeBSD = "fbsd " Garuda = "garu " Gentoo = "gent " HardenedBSD = "hbsd " Hurd = "hurd " Illumos = "lum " Ios = "ios " InstantOS = "inst " Kali = "kali " KDENeon = "kde " Linux = "lnx " Mabox = "mbox " Macos = "mac " Manjaro = "mjo " Mariner = "mrn " MidnightBSD = "mid " Mint = "mint " NetBSD = "nbsd " NixOS = "nix " Nobara = "nbra " OpenBSD = "obsd " OpenCloudOS = "ocos " openEuler = "oeul " openSUSE = "osuse " OracleLinux = "orac " PikaOS = "pika " Pop = "pop " Raspbian = "rasp " Redhat = "rhl " RedHatEnterprise = "rhel " RockyLinux = "rky " Redox = "redox " Solus = "sol " SUSE = "suse " Ubuntu = "ubnt " Ultramarine = "ultm " Unknown = "unk " Uos = "uos " Void = "void " Windows = "win " Zorin = "zorn " [package] symbol = "pkg " [perl] symbol = "pl " [php] symbol = "php " [pijul_channel] symbol = "pijul " truncation_symbol = "..." [pixi] symbol = "pixi " [pulumi] symbol = "pulumi " [purescript] symbol = "purs " [python] symbol = "py " [quarto] symbol = "quarto " [raku] symbol = "raku " [red] symbol = "red " [rlang] symbol = "r " [ruby] symbol = "rb " [rust] symbol = "rs " [scala] symbol = "scala " [shlvl] symbol = "shlvl " [spack] symbol = "spack " [solidity] symbol = "solidity " [status] symbol = "x " not_executable_symbol = "noexec" not_found_symbol = "notfound" sigint_symbol = "sigint" signal_symbol = "sig" [sudo] symbol = "sudo " [swift] symbol = "swift " [typst] symbol = "typst " [vagrant] symbol = "vagrant " [terraform] symbol = "terraform " [xmake] symbol = "xmake " [zig] symbol = "zig "3.1 全局与交互类模块
"$schema":声明配置 schema 地址,帮助编辑器(如 VS Code、Zed 等支持 JSON Schema 的 TOML 编辑器)提供补全与校验;continuation_prompt:多行输入时换行的续行提示符,由默认的❯图形改为.——一个亮黑色的点,完全 ASCII;[character]:主提示符符号。默认配置(见 src/configs/character.rs)使用❯(成功)、❯(错误)以及 vim 模式下的❮系列。预设全部改为 ASCII:成功为>、失败为x,vim 普通/可视/替换模式均为<,并保留了绿/红/黄/紫的语义配色;[jobs]:后台任务指示,默认是✦,这里改为*。
3.2 Git 相关模块
[git_branch]:分支前缀symbol由图标改为git,truncation_symbol(分支名过长时的截断符)由默认的…改为...;[git_status]:状态指示符全部 ASCII 化——ahead = ">"、behind = "<"、diverged = "<>"(分叉)、renamed = "r"、deleted = "x";[git_commit]:tag_symbol(提交为 tag 时的标识)改为tag;[hg_branch]、[fossil_branch]、[jj_bookmark]、[pijul_channel]等版本控制模块同样采用"模块名 + 空格"的纯文本前缀,并统一使用...作为截断符。
3.3 语言运行时模块
覆盖了仓库 src/configs 下几乎全部语言模块的symbol,命名规律为"可读性缩写 + 空格":
| 模块 | 纯文本符号 | 模块 | 纯文本符号 |
|---|---|---|---|
| c | C | cpp | C++ |
| cobol | cobol | crystal | cr |
| dart | dart | deno | deno |
| dotnet | .NET | elixir | exs |
| elm | elm | erlang | erl |
| fennel | fnl | fortran | fortran |
| gleam | gleam | golang | go |
| haskell | haskell | haxe | hx |
| java | java | julia | jl |
| kotlin | kt | lua | lua |
| nodejs | nodejs | ocaml | ml |
| perl | pl | php | php |
| python | py | rlang | r |
| ruby | rb | rust | rs |
| scala | scala | swift | swift |
| zig | zig | … | … |
其中[dotnet]额外重写了format(via $symbol($version )(target $tfm )),保证在去掉图标后版本与目标框架信息仍然按原布局展示。
3.4 云服务与基础设施模块
aws、azure、gcloud(gcp)、kubernetes、docker_context、openstack、pulumi、terraform、vagrant、helm、nats、netns、spack、guix_shell、nix_shell、conda、container等模块的前缀统一替换为各自的纯文本名称,便于在 SSH、容器等受限环境下仍能一眼识别当前上下文。
3.5 系统与状态模块
[battery]:五种电量状态的符号全部改为单词——full、charging、discharging、unknown、empty;[status]:命令退出码非零时的符号改为x,并补充了noexec(不可执行)、notfound(命令不存在)、sigint(SIGINT 中断)、sig(其他信号)四种纯文本细分标识;[shlvl]:shell 层级前缀改为shlvl;[memory_usage]:内存占用前缀改为memory;[directory]:只读目录标识由默认图标改为ro;[hostname]:SSH 会话标识改为ssh;[sudo]:sudo 凭据缓存标识改为sudo。
3.6 操作系统符号([os.symbols])
这是本预设中体量最大的一个段:为os模块覆盖了60 余种操作系统/发行版的纯文本缩写,例如Arch = "rch "、Debian = "deb "、Fedora = "fed "、Ubuntu = "ubnt "、Windows = "win "、Macos = "mac "、NixOS = "nix "等,并包含Unknown = "unk "兜底。该段与 src/modules/os.rs 中定义的发行版枚举一一对应,确保无论运行在哪种系统上,os模块都能以纯文本形式正确显示。
四、源码视角:预设是如何生效的
把上述 TOML 与 Starship 默认值对比,可以更清楚地看到这个预设"只改符号、不动逻辑"的设计原则:
- 配置项即模块字段:预设中的每个
symbol、truncation_symbol等,都对应 src/configs 下各模块config.rs中定义的字段。例如 src/configs/character.rs 声明了success_symbol、error_symbol、vimcmd_symbol等字段及其默认值;Starship 在启动时通过 src/configure.rs 将用户 TOML 与这些默认值做深度合并(merge),因此预设只需要列出"要改动的键",其余全部沿用内置默认; - 符号跟随模块渲染:模块渲染时(如 src/modules/character.rs)会把配置中的符号拼进
format模板,所以更换 symbol 不影响各模块的显示逻辑、颜色与顺序; - 预设内嵌于二进制:如前所述,
preset子命令读取的是编译期内嵌的 TOML(preset_command的实现见 src/print.rs,测试用例见同文件preset_command_output_to_file等),仓库中的 docs/public/presets/toml/plain-text-symbols.toml 就是这份内嵌内容的源文件——你看到的配置与starship preset plain-text-symbols输出的内容完全一致,不存在版本漂移。
五、与同类预设的取舍
在预设索引 docs/presets/README.md 中,与符号相关的预设共有三个,适用场景各不相同:
- Nerd Font Symbols:面向已安装 Nerd Font 的用户,最大化使用图形符号(见 nerd-font.md);
- No Nerd Fonts:只移除 Nerd Font 专属字形,但仍保留普通 Unicode 符号(见 no-nerd-font.md);
- Plain Text Symbols(本文):把符号全部降级为 ASCII 纯文本,兼容性最强,适合嵌入式终端、串口会话、老旧终端、无字体自定义权限的 CI 环境等。
如果你的环境偶尔能显示 Unicode 但字体不全,可优先尝试 No Nerd Fonts;如果追求"任何环境下都不乱码",Plain Text Symbols 是更稳妥的选择。由于它保留了各模块的format与配色,切换到其他预设只需重新执行对应的starship preset <名称> -o ~/.config/starship.toml即可,随时可逆。
六、小结
Plain Text Symbols 预设用一份约 340 行的 TOML,把 Starship 全部模块的图形符号系统性地替换为可读的纯文本:❯变成>、✦变成*、各语言 Logo 变成py、rs之类的缩写,同时完整保留颜色、格式与信息布局。你既可以用官方推荐的starship preset plain-text-symbols -o ~/.config/starship.toml一键应用,也可以参考仓库中的 docs/public/presets/toml/plain-text-symbols.toml 按需挑选段落手动合并进现有配置。对于需要在受限终端环境下保持提示符可读性的开发者,这是一份开箱即用、且完全可审计的参考实现。
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考