Starship Pure Preset 详解:用一份 TOML 复刻 Pure 风格的两行极简提示符
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
本文以 Starship 官方预设库中的 Pure Preset 为主体,完整讲解该预设的安装命令、逐段配置参数及其源码级默认值对照。Pure Preset 的目标是模拟 Pure 这款经典 zsh 提示符的外观与行为:提示符分为两行,首行只显示目录、git 分支与状态,次要信息(如虚拟环境、耗时)下沉到第二行,整体风格克制、留白充足。读完后你将掌握该预设的完整 TOML 配置、每个模块配置项的取值含义与默认值差异,并理解“零宽空格”这类实现技巧背后的设计意图。
预设的定位与安装方式
Pure Preset 是 Starship 预设集合(docs/presets/README.md)中的官方成员之一,位于文档 docs/id-ID/presets/pure-preset.md。它模拟的是 Pure 提示符——一种以“两行式布局 + 最少化信息密度”著称的提示符风格。
Starship 内置了preset子命令来分发预设。从 src/main.rs 的命令行定义可以看到,Preset子命令支持三种用法:
- 按名称输出预设内容到标准输出(
starship preset <name>); - 通过
-o/--output参数直接写入文件; - 通过
--list列出全部可用预设名。
对应的官方推荐安装命令是:
starship preset pure-preset -o ~/.config/starship.toml该命令会把预设内容直接写入 Starship 的配置文件(XDG 配置目录下的starship.toml),无需手工复制粘贴。预设的原始 TOML 文件同样以源码形式存放在仓库中,见 pure-preset.toml。
完整配置逐段解析
以下是 pure-preset.toml 的完整内容,下文将按模块逐一展开。其中git_status各分类符号使用了不可见的零宽空格(U+200B,UTF-8 编码为 E2 80 8B),在编辑器里看不到字符,但从字节层面可以确认其存在,这也是该预设最精巧的设计点,后文专门说明。
"$schema" = 'https://starship.rs/config-schema.json' format = """ $username\ $hostname\ $directory\ $git_branch\ $git_state\ $git_status\ $cmd_duration\ $line_break\ $python\ $character""" [directory] style = "blue" [character] success_symbol = "❯" error_symbol = "❯" vimcmd_symbol = "❮" [git_branch] format = "$branch" style = "bright-black" [git_status] format = "[(*$conflicted$untracked$modified$staged$renamed$deleted) ($ahead_behind$stashed)]($style)" style = "cyan" conflicted = "" untracked = "" modified = "" staged = "" renamed = "" deleted = "" stashed = "≡" [git_state] format = '\($state( $progress_current/$progress_total)\) ' style = "bright-black" [cmd_duration] format = "$duration " style = "yellow" [jj_bookmark] format = "$bookmark(@$remote)$diverged( \(+$overflow_count others\))" style = "bright-black" [python] format = "$virtualenv " style = "bright-black" detect_extensions = [] detect_files = []顶层 format:两行布局的骨架
顶层format用 TOML 多行字符串把模块排成两行,行尾的\用于抑制换行,$line_break显式制造换行:
- 第一行:
$username $hostname $directory $git_branch $git_state $git_status $cmd_duration——工作身份、位置与 git 上下文; - 第二行:
$python $character——运行时环境与命令执行符号(❯)。
这与 Starship 默认的单行、多模块堆叠风格完全不同,正是 Pure“主行只放最重要信息、次行承载补充信息”的布局思想。模块顺序即渲染顺序;任何一个模块当前不可用(如非 git 仓库、无虚拟环境)时自动消失,不会留下空白。
[directory]:目录改为纯蓝色
[directory] style = "blue"默认配置中目录样式是cyan bold(见 src/configs/directory.rs 的Default实现),其余字段全部保持默认:truncation_length = 3、truncate_to_repo = true、home_symbol = "~"等。预设仅把颜色改成不粗体的blue,让路径呈现为柔和的蓝色而非默认的青色加粗,降低视觉噪音。
[character]:与 Pure 一致的 ❯ 符号
[character] success_symbol = "❯" error_symbol = "❯" vimcmd_symbol = "❮"对照 src/configs/character.rs 中的默认值:
| 配置项 | 预设取值 | 默认值 | 差异 |
|---|---|---|---|
success_symbol | ❯ | ❯ | 去掉 bold,改为紫色 |
error_symbol | ❯ | ❯ | 去掉 bold |
vimcmd_symbol | ❮ | ❮ | 去掉 bold |
符号本身沿用默认的 ❯ / ❮,只是统一去掉了bold修饰,使整条提示符的字重更一致。注意 Starship 源码中vimcmd_symbol还带有一个历史别名#[serde(alias = "vicmd_symbol")](见 src/configs/character.rs),老配置里的旧键名仍可被正确解析。另外,vimcmd_visual_symbol、vimcmd_replace_symbol等 vim 细分模式符号在本预设中未配置,沿用默认值。
[git_branch]:去掉 “on ⎇ ” 前缀
[git_branch] format = "$branch" style = "bright-black"默认的分支模块格式是on $symbol$branch(:$remote_branch),样式为bold purple(见 src/configs/git_branch.rs)。预设做了两处减法:
format只保留$branch,删掉了on字样、分支符号⎇以及(:$remote_branch)远程分支后缀;style从紫色加粗改为bright-black(终端 ANSI 8 号色,即亮灰),得到 Pure 式“安静分支名”的效果。
其余如truncation_length(默认i64::MAX,即不截断长分支名)等字段保持默认。
[git_status]:零宽空格技巧与*/≡指示器
[git_status] format = "[(*$conflicted$untracked$modified$staged$renamed$deleted) ($ahead_behind$stashed)]($style)" style = "cyan" conflicted = "" untracked = "" modified = "" staged = "" renamed = "" deleted = "" stashed = "≡"这是整个预设最核心的部分,它复刻了 Pure 的 git 状态指示方式:工作区有改动时显示一个*,有 stash 时显示≡,而不是逐类罗列??、+、~等符号。
其实现机制可以结合 Starship 的模块渲染规则理解:git_status的各个$conflicted、$untracked等占位符只在对应文件列表非空时才会渲染其符号值。本预设把六个分类符号全部设为零宽空格(U+200B),因此:
- 某个状态类别存在文件时,占位符会渲染,但输出一个不可见字符,肉眼看不到分类细节;
format中的*和(...)括号结构只要有任何分类非空就会整体出现,于是视觉上等价于“有改动 → 显示*”;stashed单独设为≡,stash 存在时显示在$ahead_behind之后;- 着色分两层:
(*...)这组使用 256 色色号218(亮黄),外层括号与$stashed使用模块style的cyan。
这样提示符里既不会出现 Pure 之外的冗余符号,又保留了ahead/behind进度与 stash 信息,行为上与 Pure 的 git 状态行一一对应。
[git_state]:rebase / cherry-pick 等交互状态
[git_state] format = '\($state( $progress_current/$progress_total)\) ' style = "bright-black"git_state模块在仓库处于 rebase、merge、cherry-pick 等交互状态时显示状态名,并可用$progress_current/$progress_total展示进度(如 rebase 到第几步)。预设沿用默认的双层括号格式,只把样式改为bright-black,使其与分支名同色系、低调地嵌入第一行。
[cmd_duration]:去掉 “took” 前缀
[cmd_duration] format = "$duration " style = "yellow"默认格式是took $duration,样式为yellow bold,且min_time默认为 2000 毫秒——即上条命令耗时不足 2 秒时整个模块不显示(见 src/configs/cmd_duration.rs)。预设保留了 2 秒阈值这一默认行为,仅把format简化为$duration,省掉took一词,得到 Pure 式的裸时长显示,例如5s。
[jj_bookmark]:为 Jujutsu 版本库预留分支位
[jj_bookmark] format = "$bookmark(@$remote)$diverged( \(+$overflow_count others\))" style = "bright-black"Starship 支持 Jujutsu(jj)版本控制系统的书签(bookmark)模块。该段配置让 jj 仓库在第一行显示类似 git 分支的书签名(带@$remote后缀,分叉时追加(+N others)),样式同样是bright-black,与 git 分支的视觉权重保持一致。不在 jj 仓库中时该模块自动不显示。
[python]:只显示虚拟环境名
[python] format = "$virtualenv " style = "bright-black" detect_extensions = [] detect_files = []对照 src/configs/python.rs 的默认值,预设做了两处关键改动:
format从默认的via ${symbol}${pyenv_prefix}(${version} )(\($virtualenv\) )简化为$virtualenv——不再显示 🐍 符号、via前缀与 Python 版本号,只保留虚拟环境名;detect_extensions = []与detect_files = []清空了触发文件检测的列表(默认包含py/ipynb扩展名以及requirements.txt、pyproject.toml等 7 类文件)。
第 2 点意味着:模块是否显示将主要依赖环境检测(默认detect_env_vars仍含VIRTUAL_ENV),而非“目录里有 Python 相关文件”这一启发式。这与 Pure 的行为一致——有虚拟环境就显示,没有就不显示,避免在纯 Python 目录里凭空出现版本号。
设计要点小结
Pure Preset 的“Pure 味”来自三个层面的克制,均可在上述配置中直接对应:
- 布局克制:顶层
format用$line_break把信息切成两行,第一行只留位置与 git 上下文,第二行只留运行时与执行符号; - 符号克制:
git_branch去掉on与⎇,character去掉 bold,cmd_duration去掉took,python只显示 venv 名; - 着色克制:分支、git 状态、git state、jj bookmark、venv 统一使用
bright-black,仅目录(blue)、命令耗时(yellow)、git 状态括号(cyan / 256 色 218)保留少量强调色。
相关仓库文件
| 内容 | 路径 |
|---|---|
| 预设文档 | docs/id-ID/presets/pure-preset.md |
| 预设 TOML 源文件 | docs/public/presets/toml/pure-preset.toml |
| 效果截图 | docs/public/presets/img/pure-preset.png |
| 预设索引页 | docs/presets/README.md |
| character 模块默认值 | src/configs/character.rs |
| git_status 所在 git 模块配置 | src/configs/git_branch.rs |
| cmd_duration 默认阈值 | src/configs/cmd_duration.rs |
| python 模块默认检测项 | src/configs/python.rs |
| directory 模块默认值 | src/configs/directory.rs |
preset子命令定义 | src/main.rs |
如果你希望在此基础上微调,推荐做法是先用starship preset pure-preset -o ~/.config/starship.toml生成文件,再在此基础上编辑;由于配置项支持 JSON Schema 校验(文件首行的"$schema"字段),现代编辑器可以为starship.toml提供字段级补全与拼写检查。
【免费下载链接】starship☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell!项目地址: https://gitcode.com/GitHub_Trending/st/starship
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考