Starship 的 Plain Text Symbols 预设:不依赖 Unicode 的纯文本提示符配置全解
2026/9/10 22:05:25 网站建设 项目流程

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 都改为普通文本(例如awspygit),同时保留模块原有的颜色与格式逻辑,使提示符在不依赖任何特殊字体的前提下依然信息完整。用官方文档的原话来说:"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由图标改为gittruncation_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,命名规律为"可读性缩写 + 空格":

模块纯文本符号模块纯文本符号
cCcppC++
cobolcobolcrystalcr
dartdartdenodeno
dotnet.NETelixirexs
elmelmerlangerl
fennelfnlfortranfortran
gleamgleamgolanggo
haskellhaskellhaxehx
javajavajuliajl
kotlinktlualua
nodejsnodejsocamlml
perlplphpphp
pythonpyrlangr
rubyrbrustrs
scalascalaswiftswift
zigzig

其中[dotnet]额外重写了formatvia $symbol($version )(target $tfm )),保证在去掉图标后版本与目标框架信息仍然按原布局展示。

3.4 云服务与基础设施模块

awsazuregcloudgcp)、kubernetesdocker_contextopenstackpulumiterraformvagranthelmnatsnetnsspackguix_shellnix_shellcondacontainer等模块的前缀统一替换为各自的纯文本名称,便于在 SSH、容器等受限环境下仍能一眼识别当前上下文。

3.5 系统与状态模块

  • [battery]:五种电量状态的符号全部改为单词——fullchargingdischargingunknownempty
  • [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 默认值对比,可以更清楚地看到这个预设"只改符号、不动逻辑"的设计原则:

  1. 配置项即模块字段:预设中的每个symboltruncation_symbol等,都对应 src/configs 下各模块config.rs中定义的字段。例如 src/configs/character.rs 声明了success_symbolerror_symbolvimcmd_symbol等字段及其默认值;Starship 在启动时通过 src/configure.rs 将用户 TOML 与这些默认值做深度合并(merge),因此预设只需要列出"要改动的键",其余全部沿用内置默认;
  2. 符号跟随模块渲染:模块渲染时(如 src/modules/character.rs)会把配置中的符号拼进format模板,所以更换 symbol 不影响各模块的显示逻辑、颜色与顺序;
  3. 预设内嵌于二进制:如前所述,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 变成pyrs之类的缩写,同时完整保留颜色、格式与信息布局。你既可以用官方推荐的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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询