Published on

"终端美化全记录:从"看不清"到"全平台统一"

Authors
  • avatar
    作者
    子君
"终端美化全记录:从"看不清"到"全平台统一"

终端美化全记录:从"看不清"到"全平台统一"

适用系统:Windows 11(PowerShell 7 + Git Bash)+ Linux 云服务器
最终效果:本地终端、Git Bash、SSH 远程服务器,三处提示符风格统一,白色毛玻璃背景下也清晰可读


目录

  1. 起点:一个让人抓狂的小问题
  2. 第一战:PSReadLine 语法高亮配色修复
  3. 第二战:从 Oh My Posh 迁移到 Starship
  4. 第三战:Starship 配置与踩坑
  5. 第四战:让 Git Bash 也用上 Starship
  6. 第五战:云服务器远程部署
  7. 最终效果
  8. 核心教训总结

1. 起点:一个让人抓狂的小问题

1.1 发生了什么

我在 PowerShell 里输入命令连接云服务器:

ssh root@139.155.183.138

ssh 显示为亮黄色,后面的 root@139.155.183.138 显示为白色。而我的 Windows Terminal 背景是白色毛玻璃效果(Acrylic 材质),白字 + 白底 = 几乎看不见。

1.2 为什么会这样

两个工具在协同工作,搞清楚它们的职责是解决问题的关键:

工具负责什么我的配置
Oh My Posh提示符的外观(~/path > 那一行的颜色、图标、Git 信息)Tokyo Night Storm 主题
PSReadLine你输入命令时的语法高亮(ssh 变黄、引号内字符串变色、参数变色等)默认配置

问题出在 PSReadLine 的默认配色方案:它是为深色背景设计的,DefaultTokenColor(普通文本)默认是白色(ANSI [37m)。在深色背景上很清晰,在白色毛玻璃上就隐身了。


2. 第一战:PSReadLine 语法高亮配色修复

2.1 查看当前配置

在 PowerShell 中执行:

Get-PSReadLineOption | Select-Object *color*

输出示例:

DefaultTokenColor           : [37m      ← 白色(问题根源)
CommandColor                : [93m      ← 亮黄色
ParameterColor              : [90m      ← 亮黑色(灰色)

这些 ANSI 转义码的颜色含义:

代码颜色在白色背景上
[37m白色❌ 看不见
[93m亮黄⚠️ 勉强能看
[90m亮黑/灰⚠️ 勉强能看

2.2 第一次尝试:用 ConsoleColor 枚举(失败 ❌)

我最初的想法很简单——把颜色从"亮"改成"暗":

# ❌ 错误示范 — 不会生效,还会报错
Set-PSReadLineOption -Colors @{
    DefaultToken = [ConsoleColor]::DarkGray
    Command      = [ConsoleColor]::DarkYellow
    Parameter    = [ConsoleColor]::DarkCyan
}

报错信息:

Set-PSReadLineOption: 'DefaultToken' is not a valid color property

错误分析: -Colors 参数的 Hashtable Key 不叫 DefaultToken。那加个 Color 后缀试试?

2.3 第二次尝试:加 Color 后缀(还是失败 ❌)

# ❌ 还是不对
Set-PSReadLineOption -Colors @{
    DefaultTokenColor = [ConsoleColor]::DarkGray
    CommandColor      = [ConsoleColor]::DarkYellow
    ParameterColor    = [ConsoleColor]::DarkCyan
}

报错信息:

Set-PSReadLineOption: 'DefaultTokenColor' is not a valid color property

错误分析: 这就有意思了。Get-PSReadLineOption 显示的属性名明明是 DefaultTokenColor,但 Set-PSReadLineOption -Colors 偏偏不认这个 Key。最后试验发现——正确的 Key 既不是 DefaultToken 也不是 DefaultTokenColor,而是 Default:

Get 属性名(只读)Set -Colors Key(写入)
DefaultTokenColorDefault
CommandColorCommand
ParameterColorParameter
StringColorString
NumberColorNumber
OperatorColorOperator

教训: PowerShell 模块的 getter 和 setter 命名不一定对称,报错了先试试去掉后缀。

2.4 第三次尝试:颜色名对了,但颜色还是浅(仍然不够好 ⚠️)

# ⚠️ Key 对了,但颜色效果不对
Set-PSReadLineOption -Colors @{
    Default   = [ConsoleColor]::DarkGray
    Command   = [ConsoleColor]::DarkYellow
    Parameter = [ConsoleColor]::DarkCyan
}

这次不报错了,但输入的命令看起来颜色还是偏浅。为什么?

根因分析: 我的 Windows Terminal 配色方案是 Tokyo Night Storm——一个暗色主题。在这个主题下,终端会把 [ConsoleColor]::DarkGray 重新映射为一种在暗底上能看清的浅灰色。所以虽然我写的是 DarkGray,实际渲染出来的还是浅色。

用一张图说明:

你的意图:ConsoleColor::DarkGray  →  深灰色(白色背景上可见)
实际映射:Tokyo Night Storm 主题  →  浅灰色(暗色背景上可见)
                                     ↑ 正好相反!

2.5 最终方案:24-bit RGB ANSI 转义码,绕过主题映射 ✅

核心思路: 不用 ConsoleColor 枚举(会被终端主题重映射),直接用 24-bit RGB ANSI 转义码,精确指定颜色,完全绕过主题。

# ✅ 最终方案 — 硬编码 RGB,终端主题影响不了
Set-PSReadLineOption -Colors @{
    Default   = "`e[38;2;60;60;60m"     # 普通文本 → 深炭灰 RGB(60,60,60)
    Command   = "`e[38;2;180;140;20m"   # 命令名   → 深琥珀 RGB(180,140,20)
    Parameter = "`e[38;2;0;140;140m"    # 参数     → 深青   RGB(0,140,140)
    String    = "`e[38;2;180;80;180m"   # 字符串   → 深紫   RGB(180,80,180)
    Number    = "`e[38;2;60;120;200m"   # 数字     → 深蓝   RGB(60,120,200)
    Operator  = "`e[38;2;100;100;100m"  # 操作符   → 中灰   RGB(100,100,100)
}

ANSI RGB 转义码格式解读:

`e[38;2;R;G;Bm
│   │  │ │ │
│   │  │ │ └─ 结束符
│   │  │ └─── Blue  (0-255)
│   │  └───── Green (0-255)
│   └──────── Red   (0-255)
└──────────── ESC 字符 + 38;2 表示"前景色 24-bit RGB"

小技巧: 微调 RGB 值就可以改变颜色深浅。觉得某个颜色太深就加大数值(上限 255),太浅就减小。RGB(60,60,60) 在白色背景上是清晰的深炭灰;RGB(30,30,30) 则近乎纯黑。

2.6 写入 PowerShell Profile

把配置写入 PowerShell 的 profile 文件,每次启动自动生效:

  1. 找到 profile 文件路径:
# 查看路径
echo $PROFILE
# 典型路径:C:\Users\你的用户名\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

# 如果文件不存在,创建它
if (!(Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }

# 用记事本打开编辑
notepad $PROFILE
  1. 添加配置:
# 在 profile 文件中加入以下内容(放在其他 Set-PSReadLineOption 之前)

Set-PSReadLineOption -Colors @{
    Default   = "`e[38;2;60;60;60m"
    Command   = "`e[38;2;180;140;20m"
    Parameter = "`e[38;2;0;140;140m"
    String    = "`e[38;2;180;80;180m"
    Number    = "`e[38;2;60;120;200m"
    Operator  = "`e[38;2;100;100;100m"
}
  1. 重新加载生效:
. $PROFILE

输入 ssh root@139.155.183.138 试试——现在每个部分在白色毛玻璃背景上都清晰可读了。


3. 第二战:从 Oh My Posh 迁移到 Starship

3.1 为什么要换

Oh My Posh 和 Starship 是同一个品类的工具——Shell 提示符美化引擎。二者二选一,不能同时用(后初始化的那个会覆盖前一个)。

Oh My PoshStarship
主题数量海量内置主题一种,通过 TOML 定制
配置文件JSON单个 starship.toml
速度Go 编译,稍慢Rust 编译,更快
风格预设花哨、信息密集默认极简,按需加模块
安装方式winget / scoop / brewwinget / scoop / brew / cargo / 单文件二进制

换 Starship 的主要理由:更快、配置更简洁、跨平台一致性更好。

3.2 安装 Starship

Windows 上推荐用 winget:

winget install Starship.Starship

验证安装:

starship --version
# starship 1.26.0

3.3 切换 Profile

打开 PowerShell profile 文件,做以下修改:

# 注释掉 Oh My Posh(保留以备回退)
# oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/tokyonight_storm.omp.json" |
#     Invoke-Expression

# 启用 Starship
Invoke-Expression (&starship init powershell)

重新打开 PowerShell 或执行 . $PROFILE,提示符就变成 Starship 了。


4. 第三战:Starship 配置与踩坑

4.1 使用 Preset 快速上手

Starship 内置了社区预设主题,一键套用:

# 列出所有可用预设
starship preset --list

# 我选了 gruvbox-rainbow(暗色暖调,信息丰富)
starship preset gruvbox-rainbow -o ~/.config/starship.toml

配置文件位置:~/.config/starship.toml

4.2 错误一:重复 Section(duplicate key ❌)

重新执行 preset 命令覆盖已有文件时会报错:

starship preset gruvbox-rainbow -o ~/.config/starship.toml
Error writing preset: Error saving file, use --force to overwrite existing configuration file

原因: Starship 防止你误操作覆盖已有的配置文件。

解决: 加 --force:

starship preset gruvbox-rainbow -o ~/.config/starship.toml --force

4.3 错误二:TOML 重复键(duplicate key ❌)

手动编辑 starship.toml 时,可能不小心让同一个 Section 出现了两次:

# 文件开头
[character]
success_symbol = '[➜](bold green)'

# ... 中间很多配置 ...

# 文件末尾又写了一次
[character]
success_symbol = '[](bold fg:color_green)'

报错信息:

[ERROR] - (starship::config): Unable to parse the config file:
TOML parse error at line 194, column 2
    |
194 | [character]
    |  ^^^^^^^^^
duplicate key

根因: TOML 格式不允许同一个 [section] 出现两次。Starship 的每个模块([character]、[git_branch]、[nodejs] 等)在配置文件中只能定义一次。

解决: 搜一下文件,把同名 Section 合并或删掉多余的。

4.4 配置文件核心结构解读

一个典型的 Starship 配置文件长这样:

# === 全局设置 ===
"$schema" = 'https://starship.rs/config-schema.json'  # 编辑器自动补全(可删)
add_newline = true              # 命令之间空一行
palette = 'gruvbox_dark'        # 引用下方自定义调色板

# === 自定义调色板 ===
[palettes.gruvbox_dark]
color_fg0 = '#fbf1c7'
color_blue = '#458588'
# ...

# === 提示符布局 format ===
format = """
[](color_orange)\
$os\
$username\
[](bg:color_yellow fg:color_orange)\
$directory\
# ...更多模块...
$line_break$character"""

# === 各模块配置 ===
[os]                    # 操作系统图标
disabled = false

[directory]             # 当前目录显示
truncation_length = 3   # 路径最多显示 3 层

[git_branch]            # Git 分支
symbol = ""

[character]             # 提示符末尾的箭头
success_symbol = '[](bold fg:color_green)'

format 字段解读——模块之间的连接符:

[](color_orange)\       ← 圆角起始,橙色
$os\                      ← OS 图标模块
$username\                ← 用户名模块
[](bg:color_yellow fg:color_orange)\  ← 三角分隔符,橙色→黄色过渡
$directory\               ← 目录模块
...
$line_break$character     ← 换行 + 输入提示符

每个 [](bg:X fg:Y) 是一个 Powerline 风格的三角分隔符,bg 是分隔符自己的颜色,fg 是分隔符前面区域的颜色。这种 fg → bg 的渐变效果就是 Powerline 风格的核心。


5. 第四战:让 Git Bash 也用上 Starship

5.1 问题

PowerShell 里主题很漂亮,但一切换到 Git Bash——又是光秃秃的默认提示符。

根因: Starship 是通过 Shell 的 profile 文件初始化的。PowerShell 有 $PROFILE,Bash 有 .bashrc。需要在 Git Bash 的 .bashrc 里也加上初始化命令。

5.2 尝试创建符号链接(失败 ❌)

Starship 通过 winget 安装在:

C:\Users\你的用户名\AppData\Local\Microsoft\WinGet\Packages\
    Starship.Starship_Microsoft.Winget.Source_8wekyb3d8bbwe\starship.exe

Git Bash 的 PATH 里有 WinGet\Links\ 目录(里面是其他程序的快捷方式),但没有 starhip 的链接。

尝试用 PowerShell 创建符号链接:

# ❌ 需要管理员权限
New-Item -ItemType SymbolicLink `
    -Path '...\WinGet\Links\starship.exe' `
    -Target '...\WinGet\Packages\...\starship.exe'
# 报错:Administrator privilege required for this operation.

为什么不走这条路: 没有管理员权限时无法创建符号链接,而且这个方案比较 hacky。

5.3 最终方案:直接加目录到 PATH ✅

在 ~/.bashrc 中添加:

# Starship prompt(与 PowerShell 共用同一份配置文件)
STARSHIP_PATH="/c/Users/你的用户名/AppData/Local/Microsoft/WinGet/Packages/Starship.Starship_Microsoft.Winget.Source_8wekyb3d8bbwe"
export PATH="$STARSHIP_PATH:$PATH"
eval "$(starship init bash)"

说明: Git Bash 中 /c/ 就是 C:\。Starship 会自动读取 ~/.config/starship.toml,所以配置文件不用动。

重新打开 Git Bash 或执行 source ~/.bashrc 生效。


6. 第五战:云服务器远程部署

6.1 问题

云服务器(Linux)不能直接跑 Starship 官网的一键安装脚本:

# ❌ 服务器上 GitHub 连接不稳定,这一步会卡住
curl -sS https://starship.rs/install.sh | sh

因为脚本内部会去 GitHub Releases 下载二进制,国内服务器访问 GitHub 经常超时。

6.2 手动部署方案

思路: Starship 就是一个独立的二进制文件(约 6MB),没有依赖。在本地下载好,scp 传上去就行。

步骤 1:确认服务器 CPU 架构

ssh root@你的服务器IP "uname -m"
# 输出 x86_64 → 下载 x86_64 版本
# 输出 aarch64 → 下载 ARM 版本

步骤 2:本地下载对应版本

在浏览器打开 Starship Releases,下载文件名包含 x86_64-unknown-linux-musl 的 .tar.gz 包。

或者用 PowerShell:

# x86_64 架构
Invoke-WebRequest -Uri "https://github.com/starship/starship/releases/latest/download/starship-x86_64-unknown-linux-musl.tar.gz" `
    -OutFile "$env:TEMP\starship.tar.gz"

步骤 3:上传到服务器

scp starship-x86_64-unknown-linux-musl.tar.gz root@你的服务器IP:/usr/local/bin/

步骤 4:在服务器上解压并配置

ssh root@你的服务器IP
cd /usr/local/bin

# 解压
tar -xzf starship-x86_64-unknown-linux-musl.tar.gz

# 赋权
chmod +x starship

# 清理压缩包
rm starship-x86_64-unknown-linux-musl.tar.gz

# 验证
starship --version
# 输出:starship 1.26.0

# 写入 bashrc
echo 'eval "$(starship init bash)"' >> ~/.bashrc

# 立即生效
source ~/.bashrc

如果 starship --version 报 command not found,说明 /usr/local/bin 不在 PATH 里,先执行:

export PATH=$PATH:/usr/local/bin

步骤 5:上传配置文件(与本地保持一致)

在本地 PowerShell 中执行:

scp ~/.config/starship.toml root@你的服务器IP:~/.config/starship.toml

注意: 如果服务器没有安装 Nerd Font,那些特殊图标字符( 󰍲 等)会显示为乱码方块。有两个选择:

  1. 在服务器上也安装 Nerd Font
  2. 专门给服务器写一份不用特殊字符的简化配置,上传到服务器后把 starship.toml 里的图标 symbol 替换为普通字符

6.3 可选:SSH 登录快捷配置

每次登录输完整 IP 很麻烦,在本地 ~/.ssh/config 中配置别名:

Host myserver
    HostName xxx.xxx.xxx.xxx
    User root
    IdentityFile ~/.ssh/my_key   # 如果有密钥的话

之后:

ssh myserver          # 登录
scp file.txt myserver:/root/   # 传文件

对 ssh、scp、sftp、rsync 全部生效。


7. 最终效果

三处终端提示符风格完全一致,同时 PSReadLine 配色在白色毛玻璃背景下清晰可读。

环境Shell配置文件
Windows TerminalPowerShell 7$PROFILE + ~/.config/starship.toml
Windows TerminalGit Bash~/.bashrc + ~/.config/starship.toml
SSH 远程Linux Bash~/.bashrc + ~/.config/starship.toml

核心思路: 三个 Shell → 同一个 starship 二进制 → 同一份 starship.toml 配置文件。

terminal-combined


8. 核心教训总结

遇到的问题根因教训
PSReadLine -Colors Key 报错Get 属性名有 Color 后缀,Set Key 没有读写 API 的命名不一定对称,试错即可
ConsoleColor 枚举颜色偏浅终端暗色主题会重映射颜色名用 RGB ANSI 转义码绕过主题映射
Starship TOML 报 duplicate key同一个 [section] 写了两次TOML 每个 Section 只能出现一次,搜一下合并
Starship preset 提示覆盖失败默认保护已有配置加 --force 强制覆盖
Git Bash 找不到 starshipwinget 安装的二进制不在 Git Bash PATH手动把安装目录加到 .bashrc 的 PATH
符号链接需要管理员权限Windows 安全策略不用符号链接,改 PATH 更简单
服务器安装脚本卡住GitHub 网络不通本地下载 → scp 上传,二进制单文件无依赖

本文记录了从"终端看不清命令"这个微小痛点出发,一路打通 PowerShell、Git Bash、Linux 服务器三端统一美化的全过程。核心经验只有一条:当终端主题和你的背景色不匹配时,绕过主题直接控制颜色,而不是跟主题的映射表较劲。


附录:完整配置文件参考

PowerShell Profile(点击展开)

文件路径:C:\Users\用户名\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

# 强制 UTF-8:解决中文乱码
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding =
    New-Object System.Text.UTF8Encoding

# Starship 初始化
Invoke-Expression (&starship init powershell)

# PSReadLine 语法高亮(RGB 硬编码,适配白色毛玻璃背景)
Set-PSReadLineOption -Colors @{
    Default   = "`e[38;2;60;60;60m"
    Command   = "`e[38;2;180;140;20m"
    Parameter = "`e[38;2;0;140;140m"
    String    = "`e[38;2;180;80;180m"
    Number    = "`e[38;2;60;120;200m"
    Operator  = "`e[38;2;100;100;100m"
}

# 历史预测补全
Set-PSReadLineOption -PredictionSource History
Git Bash .bashrc(点击展开)

文件路径:C:\Users\用户名\.bashrc

# Starship prompt(与 PowerShell 共用配置文件)
STARSHIP_PATH="/c/Users/用户名/AppData/Local/Microsoft/WinGet/Packages/Starship.Starship_Microsoft.Winget.Source_8wekyb3d8bbwe"
export PATH="$STARSHIP_PATH:$PATH"
eval "$(starship init bash)"
Starship 配置文件片段(点击展开)

文件路径:~/.config/starship.toml

完整内容较长,关键结构已在 4.4 节 解读。完整文件可通过 starship preset gruvbox-rainbow 生成。