2026 Windows 11 终端美化完全指南

Windows 11 终端美化完全指南

适用环境 :Windows 11 22H2 及以上、Windows Terminal 1.20+、PowerShell 7.2+ 标签栏 UI 主题 :需要 Windows Terminal 1.24 及以上(见 3.5 节) 目标 :从「白底黑字、满屏方块」到「毛玻璃、Nerd 图标、Git 状态、智能补全」的现代化终端 阅读方式:赶时间 → 看第 2 章「10 分钟速通」;想一次搞明白 → 从第 0 章顺序读


效果图

写在前面

这是一篇从零开始的 Windows 11 终端美化教程,覆盖 Windows Terminal 外观、Nerd Font、Oh My Posh 提示符、PSReadLine 补全、常用命令行工具,以及一套可以直接使用的 profile。

文中以 Catppuccin Mocha 和 Tokyo Night Storm 两套配色为例,但所有步骤都不绑定具体主题:你可以换成任意喜欢的配色和 OMP 主题。

本文以较新的 Windows Terminal 和 Oh My Posh 版本为例;遇到版本差异时,文中会注明兼容范围。

  • 不需要重装系统,所有配置都在用户目录
  • 每一步都可以单独回滚,文末有卸载与恢复章节
  • 命令默认在 PowerShell 7 中执行,不是 Windows PowerShell 5.1

目录

  • [0. 先搞清楚:你到底在美化什么](#0. 先搞清楚:你到底在美化什么 "#0-%E5%85%88%E6%90%9E%E6%B8%85%E6%A5%9A%E4%BD%A0%E5%88%B0%E5%BA%95%E5%9C%A8%E7%BE%8E%E5%8C%96%E4%BB%80%E4%B9%88")
  • [1. 环境自检](#1. 环境自检 "#1-%E7%8E%AF%E5%A2%83%E8%87%AA%E6%A3%80")
  • [2. 10 分钟速通(懒人版)](#2. 10 分钟速通(懒人版) "#2-10-%E5%88%86%E9%92%9F%E9%80%9F%E9%80%9A%E6%87%92%E4%BA%BA%E7%89%88")
  • [3. 第 1 步:Windows Terminal 配置](#3. 第 1 步:Windows Terminal 配置 "#3-%E7%AC%AC-1-%E6%AD%A5windows-terminal-%E9%85%8D%E7%BD%AE")
  • [4. 第 2 步:Nerd Font 字体](#4. 第 2 步:Nerd Font 字体 "#4-%E7%AC%AC-2-%E6%AD%A5nerd-font-%E5%AD%97%E4%BD%93")
  • [5. 第 3 步:Oh My Posh 提示符](#5. 第 3 步:Oh My Posh 提示符 "#5-%E7%AC%AC-3-%E6%AD%A5oh-my-posh-%E6%8F%90%E7%A4%BA%E7%AC%A6")
  • [6. 第 4 步:PSReadLine 补全与预测](#6. 第 4 步:PSReadLine 补全与预测 "#6-%E7%AC%AC-4-%E6%AD%A5psreadline-%E8%A1%A5%E5%85%A8%E4%B8%8E%E9%A2%84%E6%B5%8B")
  • [7. 第 5 步:效率工具全家桶](#7. 第 5 步:效率工具全家桶 "#7-%E7%AC%AC-5-%E6%AD%A5%E6%95%88%E7%8E%87%E5%B7%A5%E5%85%B7%E5%85%A8%E5%AE%B6%E6%A1%B6")
  • [8. 第 6 步:完整 profile 模板](#8. 第 6 步:完整 profile 模板 "#8-%E7%AC%AC-6-%E6%AD%A5%E5%AE%8C%E6%95%B4-profile-%E6%A8%A1%E6%9D%BF")
  • [9. 第 7 步:统一配色](#9. 第 7 步:统一配色 "#9-%E7%AC%AC-7-%E6%AD%A5%E7%BB%9F%E4%B8%80%E9%85%8D%E8%89%B2")
  • [10. 进阶玩法](#10. 进阶玩法 "#10-%E8%BF%9B%E9%98%B6%E7%8E%A9%E6%B3%95")
  • [11. 排错手册](#11. 排错手册 "#11-%E6%8E%92%E9%94%99%E6%89%8B%E5%86%8C")
  • [12. 回滚与卸载](#12. 回滚与卸载 "#12-%E5%9B%9E%E6%BB%9A%E4%B8%8E%E5%8D%B8%E8%BD%BD")
  • [附录 A:把配置固化成脚本(可选)](#附录 A:把配置固化成脚本(可选) "#%E9%99%84%E5%BD%95-a%E6%8A%8A%E9%85%8D%E7%BD%AE%E5%9B%BA%E5%8C%96%E6%88%90%E8%84%9A%E6%9C%AC%E5%8F%AF%E9%80%89")
  • [附录 B:命令速查表](#附录 B:命令速查表 "#%E9%99%84%E5%BD%95-b%E5%91%BD%E4%BB%A4%E9%80%9F%E6%9F%A5%E8%A1%A8")

0. 先搞清楚:你到底在美化什么

很多人一上来就抄一堆配置,结果不知道哪一层出了问题。终端美化其实只有四层:

text 复制代码
┌─────────────────────────────────────────────────────┐
│  Windows Terminal(终端宿主)                        │
│  负责:窗口、标签、字体渲染、配色、透明度、背景图      │
│  ┌───────────────────────────────────────────────┐  │
│  │  PowerShell 7(Shell)                         │  │
│  │  负责:执行命令、历史记录、补全、语法高亮       │  │
│  │  ┌─────────────────────────────────────────┐  │  │
│  │  │  Oh My Posh(提示符框架)                │  │  │
│  │  │  负责:路径、Git 分支、耗时、版本号...     │  │  │
│  │  └─────────────────────────────────────────┘  │  │
│  └───────────────────────────────────────────────┘  │
│  字体(Nerd Font):提供箭头、文件/语言图标与等宽对齐      │
└─────────────────────────────────────────────────────┘
层 组件 出问题时你会看到
终端宿主 Windows Terminal 配色不对、不透明、字体选不到
Shell PowerShell 7 命令不生效、profile 报错
提示符 Oh My Posh 提示符还是老的 PS C:\>
字体 Nerd Font 满屏 □、?,图标错位

正确顺序:终端 → 字体 → 提示符 → 补全 → 工具链。 字体不对,后面所有图标都会变成方块------这是新手最常见的翻车点。


1. 环境自检

先花 1 分钟确认现状。在 PowerShell 7 里执行(不是 Windows PowerShell 5.1):

powershell 复制代码
# 1. PowerShell 版本,应为 7.x
$PSVersionTable.PSVersion

# 2. Windows Terminal 是否存在
(Get-Command wt.exe).Source

# 3. PowerShell 7 的配置文件路径(不存在是正常的)
$PROFILE
Test-Path $PROFILE

# 4. 执行策略,RemoteSigned 即可
Get-ExecutionPolicy -List

# 5. 是否已装 Nerd Font(有输出说明装过)
@(
    (Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts').PSObject.Properties.Name
    (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts').PSObject.Properties.Name
) | Where-Object { $_ -match 'Nerd|NF|Maple|Cascadia|Sarasa|Meslo' } | Sort-Object -Unique

怎么判断自己的环境:

检查项 正常情况
PowerShell 7.x;如果只有 5.1,需要先安装 PowerShell 7
Windows Terminal Get-Command wt.exe 有结果
PowerShell 7 profile 路径不存在也正常,第 8 章会创建
Nerd Font 没装也没关系,第 4 章会装
执行策略 RemoteSigned 或 Unrestricted 都可以

只要 PowerShell 7 和 Windows Terminal 就位,其他组件都可以边做边装。本文不要求先清理旧配置;profile 和 settings.json 都是纯文本,改坏了可以恢复。

⚠️ 两个 PowerShell 不要搞混

  • Windows PowerShell 5.1:系统自带,profile 在 Documents\WindowsPowerShell
  • PowerShell 7:你装的,profile 在 Documents\PowerShell

本文所有配置都写在 7 的 profile 里;在 5.1 里不生效是正常的。


2. 10 分钟速通(懒人版)

只想快速变好看,按这 5 步走,细节后面章节再补:

powershell 复制代码
# ① 装 Oh My Posh(已装可跳过)
winget install --id JanDeDobbeleer.OhMyPosh -e --source winget --accept-package-agreements --accept-source-agreements

# ② 装字体(交互式列表,方向键选 CascadiaCode 回车;中文用户见第 4 章)
oh-my-posh font install

# ③ 复制全部主题,写入当前主题,再创建 profile
$ompThemes = if ($env:POSH_THEMES_PATH) { $env:POSH_THEMES_PATH } else { (Get-AppxPackage ohmyposh.cli).InstallLocation + '\themes' }
New-Item -ItemType Directory "$HOME\.config\oh-my-posh" -Force | Out-Null
Copy-Item "$ompThemes\*.omp.json" -Destination "$HOME\.config\oh-my-posh" -Force
Set-Content "$HOME\.config\oh-my-posh\active-theme.txt" 'catppuccin_mocha' -Encoding utf8
New-Item -ItemType File -Path $PROFILE -Force
notepad $PROFILE   # 粘贴第 8 章的模板,保存

如果 Get-AppxPackage 报「拒绝访问」,用 5.3 节的 Get-OmpThemesDir 函数代替。

④ 打开 Windows Terminal → Ctrl + , → 外观 → 字体选 Cascadia Code NF(以字体下拉框里显示的名字为准,中文用户选 Maple Mono NF CN),字号 11。配色方案想用 Catppuccin 的话,先把 3.5 节的 JSON 加进 schemes;懒得改就先选内置的 One Half Dark。

⑤ 关掉所有终端标签页,重新打开。应该能看到带图标、带 Git 信息的提示符了。

想更精致(毛玻璃、Catppuccin 配色、智能补全、ll/z/fzf),继续往下读。


3. 第 1 步:Windows Terminal 配置

3.1 把 Windows Terminal 设为默认终端

不设置的话,双击 .ps1、从「运行」启动 cmd 等场景仍会弹出老旧的 conhost 窗口。

方式一(推荐) :Windows 设置 → 系统 → 开发者选项 → 找到 终端 → 默认终端应用程序选 Windows Terminal。

方式二 :Windows Terminal → Ctrl + , → 启动 → 默认终端应用程序 → Windows Terminal。

3.2 默认打开 PowerShell 7

Ctrl + , → 启动 → 默认配置文件 → 选 PowerShell (图标是黑色 >_ 的那个,不是 Windows PowerShell)。

顺手把 启动时 设为「最大化」或「默认」,看你习惯。

3.3 找到并备份 settings.json

Windows Terminal 的所有外观最终都落在 settings.json 里。GUI 能改的只是子集,透明毛玻璃、背景图、滚动条隐藏、抗锯齿这些必须改 JSON。

Ctrl + , → 左下角 打开 JSON 文件。文件通常在:

text 复制代码
# Store 版(绝大多数人)
%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json

# 非 Store 版(winget / scoop / 便携版)
%LOCALAPPDATA%\Microsoft\Windows Terminal\settings.json

备份(强烈建议,改坏了能秒回滚):

powershell 复制代码
$wt = "$env:LOCALAPPDATA\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json"
if (Test-Path $wt) {
    Copy-Item $wt "$wt.bak" -Force
    "已备份到 $wt.bak"
} else {
    "没找到 Store 版配置,检查 %LOCALAPPDATA%\Microsoft\Windows Terminal\settings.json"
}

💡 也可以直接编辑:code $wt(需要 VS Code),或者 notepad $wt。

3.4 外观:核心 JSON

在 settings.json 里找到 "profiles" → "defaults"。没有 defaults 就手动加一个,然后把下面这些键合并进去(已有同名键就改值,别重复写):

json 复制代码
"profiles":
{
    "defaults":
    {
        "font":
        {
            "face": "Maple Mono NF CN",
            "size": 11,
            "weight": "normal"
        },
        "colorScheme": "Catppuccin Mocha",
        "opacity": 88,
        "useAcrylic": true,
        "padding": "10, 10, 8, 10",
        "cursorShape": "bar",
        "antialiasingMode": "grayscale",
        "scrollbarState": "hidden",
        "intenseTextStyle": "bright",
        "copyOnSelect": true,
        "multiLinePasteWarning": false
    }
}

上面只是示意结构。实际编辑时:profiles 下如果已有 defaults,只把里面的键合并进去;list 数组保持原样不动。

逐条解释:

键 作用 建议
font.face 字体名,必须和系统里完全一致 Maple Mono NF CN / Cascadia Code NF
font.size 字号 1080p 用 11,2K 用 12,4K 用 13--14
font.weight 字重 normal;高分屏可试 light
colorScheme 配色方案名 见 3.5
opacity 不透明度 0--100 85--92 比较舒服,太低费眼
useAcrylic 亚克力毛玻璃 true;老显卡觉得卡就改 false
padding 内边距,左、上、右、下 "10, 10, 8, 10" 留白刚好
cursorShape 光标形状 bar(竖线)/ filledBox(方块)/ doubleUnderline
antialiasingMode 抗锯齿 grayscale 对细字体更清晰;cleartype 更锐利
scrollbarState 滚动条 hidden 最干净;需要时改 visible(旧版 WT 可能不支持)
intenseTextStyle 加粗颜色增强 bright 让 16 色更鲜艳
copyOnSelect 选中即复制 true 谁用谁知道
multiLinePasteWarning 多行粘贴警告 false 少一次回车

defaults 对所有 profile 生效(包括 cmd、WSL)。如果只想改 PowerShell 7,把同样的键写进 profiles.list 里对应那一项。

3.5 配色方案:Catppuccin Mocha

Windows Terminal 自带几套配色(Campbell、One Half Dark、Solarized...),但都不如社区配色耐看。这里给一套完整可用的 Catppuccin Mocha。

在 settings.json 根层级找到或新增 "schemes": [ ... ],把下面这整段加进数组:

json 复制代码
{
    "name": "Catppuccin Mocha",
    "background": "#1E1E2E",
    "foreground": "#CDD6F4",
    "cursorColor": "#F5E0DC",
    "selectionBackground": "#585B70",
    "black": "#45475A",
    "red": "#F38BA8",
    "green": "#A6E3A1",
    "yellow": "#F9E2AF",
    "blue": "#89B4FA",
    "purple": "#F5C2E7",
    "cyan": "#94E2D5",
    "white": "#BAC2DE",
    "brightBlack": "#585B70",
    "brightRed": "#F38BA8",
    "brightGreen": "#A6E3A1",
    "brightYellow": "#F9E2AF",
    "brightBlue": "#89B4FA",
    "brightPurple": "#F5C2E7",
    "brightCyan": "#94E2D5",
    "brightWhite": "#A6ADC8"
}

然后确认 profiles.defaults.colorScheme 的值和 "name" 一模一样(包括空格)。

Windows Terminal 1.24 及以上还有独立的 "themes" 数组,控制标签栏/标题栏颜色,和 "schemes" 不是一回事。两套都配好,视觉才统一。
如果保存后提示配色方案重名:说明你的 WT 版本已内置同名方案,直接删掉你粘贴的这段、在 UI 里选它即可;或者把两处 Catppuccin Mocha 都改成 Catppuccin Mocha Custom。

备选:Tokyo Night Storm(更偏蓝紫、对比更强)

json 复制代码
{
    "name": "Tokyo Night Storm",
    "background": "#24283B",
    "foreground": "#C0CAF5",
    "cursorColor": "#C0CAF5",
    "selectionBackground": "#364A82",
    "black": "#1D202F",
    "red": "#F7768E",
    "green": "#9ECE6A",
    "yellow": "#E0AF68",
    "blue": "#7AA2F7",
    "purple": "#BB9AF7",
    "cyan": "#7DCFFF",
    "white": "#A9B1D6",
    "brightBlack": "#414868",
    "brightRed": "#F7768E",
    "brightGreen": "#9ECE6A",
    "brightYellow": "#E0AF68",
    "brightBlue": "#7AA2F7",
    "brightPurple": "#BB9AF7",
    "brightCyan": "#7DCFFF",
    "brightWhite": "#C0CAF5"
}

3.6 背景图与毛玻璃(可选)

喜欢二次元壁纸/暗色纹理的,在 profiles.defaults 里加:

json 复制代码
"backgroundImage": "C:\\Users\\<你的用户名>\\Pictures\\terminal-bg.jpg",
"backgroundImageOpacity": 0.22,
"backgroundImageStretchMode": "uniformToFill",
"backgroundImageAlignment": "center"

注意:

  • 把 <你的用户名> 换成自己的 Windows 用户名,或直接改成任意图片路径。
  • 路径里的反斜杠必须写成两个反斜杠(JSON 转义)。
  • useAcrylic: true 和背景图同时开,部分驱动下背景图会被盖掉------二选一。
  • 背景图透明度建议 0.15--0.3,太高会影响文字对比度。

3.7 启动与窗口

根层级(和 "profiles" 平级):

json 复制代码
"launchMode": "maximized",
"startOnUserLogin": false,
"confirmCloseAllTabs": true
  • launchMode:default / maximized / fullscreen / focus
  • confirmCloseAllTabs:手滑关掉一堆标签页时的后悔药

3.8 快捷键小抄

快捷键 作用
Ctrl + Shift + T 新建标签页
Ctrl + Shift + W 关闭标签页
Alt + Shift + D 复制当前 profile 并分屏(默认垂直)
Alt + Shift + + / - 左右分屏 / 上下分屏
Ctrl + Shift + P 命令面板(搜索所有操作)
Ctrl + Shift + F 查找
Win + 反引号 Quake 下拉终端(全局呼出)
Ctrl + + / Ctrl + - 字号缩放

分屏 + Quake 模式是效率提升最大的两个功能,建议练熟。


4. 第 2 步:Nerd Font 字体

4.1 为什么必须换字体

PowerShell 本身不需要特殊字体,但 Oh My Posh / Terminal-Icons / eza / Starship 会输出这些字符:

  • Powerline 箭头:U+E0B0、U+E0B2
  • Git 分支:U+E725
  • 文件夹:U+F07B
  • 各种语言 logo、电池、时钟图标(U+F179 等)

普通字体(微软雅黑、Consolas、Cascadia Code 原版)没有这些字形,就会显示成 □ 或 ?。 Nerd Font = 在等宽编程字体上 patch 了 3000+ 图标,一次解决。

4.2 字体怎么选

字体 中文 图标 连字 风格 适合
Maple Mono NF CN ✅ ✅ ✅ 圆润、偏手写、有柔和斜体 中文用户首选,本文默认
Sarasa Term SC Nerd Font(更纱黑体) ✅✅ ✅ ❌ 严谨、字面覆盖最全 中文为主、讨厌花哨
Cascadia Code NF ❌ ✅ ✅ 微软官方、现代 全英文环境
JetBrainsMono Nerd Font ❌ ✅ ✅ 硬朗、辨识度高 写代码
MesloLGS NF ❌ ✅ ❌ p10k 标配 抄 macOS 配置

⚠️ 中文用户的关键坑 :Cascadia Code / JetBrains Mono 不含中文 。Windows Terminal 会逐字回退到微软雅黑,结果中文变成比例字体------宽度对不齐、行高跳动、表格错位。所以中文环境请优先选带 CJK 的 Maple Mono NF CN 或 Sarasa Term SC Nerd Font。

4.3 安装 Maple Mono NF CN(推荐,手动最稳)

  1. 打开 Release 页:github.com/subframe753...
  2. 在最新版本的 Assets 里下载 MapleMono-NF-CN.zip
    • NF = Nerd Font(带图标)
    • CN = 含中文
    • 不要选 Variable 版本,静态版兼容性更好
  3. 解压,进入目录,全选所有 .ttf
  4. 右键 → 安装 (或「为所有用户安装」,需要管理员)
    • Windows 11 的右键菜单要先点 「显示更多选项」 才能看到「安装」
  5. 完全关闭并重开 Windows Terminal(字体缓存要刷新)

4.4 用 scoop 安装(一条命令,适合已装 scoop)

没有 scoop 先装:

powershell 复制代码
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned -Force
Invoke-RestMethod get.scoop.sh | Invoke-Expression

然后:

powershell 复制代码
scoop bucket add nerd-fonts
scoop install nerd-fonts/Maple-Mono-NF-CN

更纱黑体(包名以 scoop search 的结果为准):

powershell 复制代码
scoop search sarasa          # 先看包名
scoop install nerd-fonts/Sarasa-Term-SC-Nerd

scoop 的好处:升级、卸载都一条命令,不用手动删字体。

4.5 验证字体装好了没

powershell 复制代码
# 注册表里应该能看到字体的完整名字
@(
    (Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts').PSObject.Properties.Name
    (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts').PSObject.Properties.Name
) | Where-Object { $_ -match 'Maple|Nerd|Sarasa|Cascadia' } | Sort-Object -Unique

或者直接在终端里打印图标测试串:

powershell 复制代码
"`u{e0b0}  `u{e0b2}  `u{f07b}  `u{e725}  `u{f1d3}  `u{e70f}"
  • 显示成一串彩色/单色图标 → 字体生效 ✅
  • 显示成 □ □ □ 或 ? → 字体没生效或选错名字 ❌

最后在 Windows Terminal → 设置 → 外观 → 字体 → 字体面 的下拉列表里确认能搜到 Maple Mono NF CN。

4.6 字号与清晰度

分辨率 建议字号
1920×1080 11
2560×1440 12
3840×2160 13--14(或 12 + 系统缩放 150%)

配合 "antialiasingMode": "grayscale",细字重会更干净。

4.7 字体相关坑

现象 原因 解决
WT 里搜不到字体 装完没重启终端 完全退出 WT 再开
选对了字体但图标仍是方块 装的是普通版不是 NF 版 重装 *NF* 包
字体名写错 实际叫 Maple Mono NF CN,不是 Maple Mono 下拉列表里复制准确名字
中文宽度不齐 字体不含 CJK,回退了雅黑 换 Maple Mono NF CN / 更纱黑体
图标挤在一起 用了非等宽 Nerd Font 换等宽版本

5. 第 3 步:Oh My Posh 提示符

5.1 它是什么

Oh My Posh 只做一件事:根据当前目录、Git 状态、上条命令耗时、语言版本等信息,渲染一行漂亮的提示符。 它不接管你的 Shell,也不改命令行为------所以可以随时删掉,零风险。

同类竞品:Starship(Rust 写的,更快更简单,配置是 TOML)。后面第 10 章会讲怎么选。

5.2 安装

powershell 复制代码
# 推荐:winget
winget install --id JanDeDobbeleer.OhMyPosh -e --source winget --accept-package-agreements --accept-source-agreements

# 或者 scoop
scoop install oh-my-posh

装完新开一个终端验证:

powershell 复制代码
oh-my-posh --version

5.3 MSIX 安装有个坑:主题不在 POSH_THEMES_PATH 里

网上大多数教程会让你用 $env:POSH_THEMES_PATH 拼主题路径。在部分 MSIX 安装方式下,这个变量可能是空的 ,照抄会得到 CONFIG NOT FOUND。

不同安装方式的主题目录:

安装方式 主题目录
MSIX(较新的 winget 安装) C:\Program Files\WindowsApps\ohmyposh.cli_<版本>_x64__<hash>\themes
便携版 / 旧版 winget %LOCALAPPDATA%\Programs\oh-my-posh\themes(= $env:POSH_THEMES_PATH)
winget 便携包 %LOCALAPPDATA%\Microsoft\WinGet\Packages\JanDeDobbeleer.OhMyPosh_*\themes
scoop %USERPROFILE%\scoop\apps\oh-my-posh\current\themes

用下面这段自动定位(粘进终端执行一次即可):

powershell 复制代码
function Get-OmpThemesDir {
    # 旧版 / 便携版
    if ($env:POSH_THEMES_PATH -and (Test-Path $env:POSH_THEMES_PATH)) {
        return $env:POSH_THEMES_PATH
    }

    # MSIX 版
    $pkg = $null
    try { $pkg = Get-AppxPackage -Name ohmyposh.cli -ErrorAction Stop } catch { $pkg = $null }

    if ($pkg) {
        $p = Join-Path $pkg.InstallLocation 'themes'
        if (Test-Path $p) { return $p }
    }

    # Get-AppxPackage 被策略拦住时,直接找安装目录
    $pkgDir = $null
    try {
        $pkgDir = Get-ChildItem 'C:\Program Files\WindowsApps' -Directory -Filter 'ohmyposh.cli_*' -ErrorAction Stop |
            Sort-Object LastWriteTime -Descending |
            Select-Object -First 1
    }
    catch {
        $pkgDir = $null
    }
    if ($pkgDir) {
        $p = Join-Path $pkgDir.FullName 'themes'
        if (Test-Path $p) { return $p }
    }

    # winget 便携包
    $wingetPkg = Get-ChildItem (Join-Path $env:LOCALAPPDATA 'Microsoft\WinGet\Packages') -Directory -Filter 'JanDeDobbeleer.OhMyPosh*' -ErrorAction SilentlyContinue |
        Select-Object -First 1
    if ($wingetPkg) {
        $p = Join-Path $wingetPkg.FullName 'themes'
        if (Test-Path $p) { return $p }
    }

    # scoop
    $scoop = Join-Path $HOME 'scoop\apps\oh-my-posh\current\themes'
    if (Test-Path $scoop) { return $scoop }

    return $null
}

$ompThemes = Get-OmpThemesDir
$ompThemes
Get-ChildItem $ompThemes -Filter *.omp.json |
    ForEach-Object { $_.Name -replace '\.omp\.json$', '' }

最后一行会列出一百多个主题名(catppuccin_mocha、tokyonight_storm、atomic...)。

如果 Get-OmpThemesDir 返回空:在普通(非管理员也可以) PowerShell 里跑 Get-AppxPackage ohmyposh.cli | Select-Object InstallLocation,把输出路径手动拼上 \themes。

5.4 第一步:把全部主题复制到自己的目录

不要直接引用安装目录------MSIX 升级后路径里的版本号会变,下次启动就找不到主题了。把主题全部复制出来,保持原文件名:

powershell 复制代码
$configDir = "$HOME\.config\oh-my-posh"
New-Item -ItemType Directory -Path $configDir -Force | Out-Null

Copy-Item "$ompThemes\*.omp.json" -Destination $configDir -Force
(Get-ChildItem $configDir -Filter *.omp.json).Count

这样每个主题都保留原名,后面可以按名字切换,不用反复覆盖同一个文件。升级 Oh My Posh 也不会影响这份副本。

重新执行这一步会用安装目录里的版本覆盖同名主题;如果你已经改过某个主题,先备份,或者只复制需要的文件。
只想留几个主题也可以,把需要的 .omp.json 复制进去即可;下面按"全部复制"的方式讲。

5.5 初始化

先写入当前主题名:

powershell 复制代码
Set-Content "$HOME\.config\oh-my-posh\active-theme.txt" 'catppuccin_mocha' -Encoding utf8

然后在 $PROFILE 里写:

powershell 复制代码
$ompThemeDir = "$HOME\.config\oh-my-posh"
$ompThemeState = Join-Path $ompThemeDir 'active-theme.txt'

$ompThemeName = if (Test-Path $ompThemeState) {
    (Get-Content $ompThemeState -Raw).Trim()
}
else {
    'catppuccin_mocha'
}

$ompTheme = Join-Path $ompThemeDir "$ompThemeName.omp.json"

if (-not (Test-Path $ompTheme)) {
    $ompTheme = Join-Path $ompThemeDir 'catppuccin_mocha.omp.json'
}

if ((Get-Command oh-my-posh -ErrorAction SilentlyContinue) -and (Test-Path $ompTheme)) {
    oh-my-posh init pwsh --config $ompTheme | Invoke-Expression
}

保存后执行 . $PROFILE,提示符立刻变样。以后每次开新标签页,profile 都会读取 active-theme.txt,自动加载当前主题。

还没复制主题、只想先看默认效果的话:

powershell 复制代码
oh-my-posh init pwsh | Invoke-Expression

如果报 oh-my-posh 不是内部或外部命令:PATH 没刷新。关掉所有终端重开;仍不行就手动补:

powershell 复制代码
$env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') + ';' + [Environment]::GetEnvironmentVariable('Path','User')

5.6 挑一个主题

较新版本的 init 脚本里可能不再提供 Get-PoshThemes;如果你的版本还有这个命令,也可以直接用。先列出所有主题:

powershell 复制代码
Get-ChildItem "$HOME\.config\oh-my-posh" -Filter *.omp.json |
    ForEach-Object { $_.Name -replace '\.omp\.json$', '' }

想单个预览(不切换):

powershell 复制代码
function Show-OmpTheme {
    param([Parameter(Mandatory)][string]$Name)

    $dir = Get-OmpThemesDir
    if (-not $dir) {
        "先执行 5.3 节的 Get-OmpThemesDir,确认能找到主题目录"
        return
    }

    $file = Join-Path $dir "$Name.omp.json"
    if (Test-Path $file) {
        oh-my-posh print primary --config $file
    }
    else {
        "没有这个主题:$Name"
    }
}

Show-OmpTheme catppuccin_mocha
Show-OmpTheme tokyonight_storm

几个口碑不错的(主题名就是文件名去掉 .omp.json):

主题 风格
jandedobbeleer 默认款,信息全、平衡
catppuccin_mocha 和本文配色完美配套,柔和
tokyonight_storm 蓝紫霓虹,科技感
atomic 简洁两段式,速度快
clean-detailed 极简,只有路径和 Git
powerlevel10k_rainbow 仿 p10k,花哨
montys 彩色块状,辨识度高

切换主题用 poshtheme。把下面两个函数放进 $PROFILE(第 8 章模板已包含):

powershell 复制代码
function poshthemes {
    $dir = "$HOME\.config\oh-my-posh"
    $state = Join-Path $dir 'active-theme.txt'
    $active = if (Test-Path $state) { (Get-Content $state -Raw).Trim() } else { '' }

    Get-ChildItem $dir -Filter *.omp.json |
        ForEach-Object {
            $name = $_.Name -replace '\.omp\.json$', ''
            [pscustomobject]@{
                Active = if ($name -eq $active) { '*' } else { '' }
                Name   = $name
            }
        } |
        Sort-Object Name
}

function poshtheme {
    param([Parameter(Position = 0)][string]$Name)

    $dir = "$HOME\.config\oh-my-posh"
    $state = Join-Path $dir 'active-theme.txt'

    if (-not $Name) {
        $current = if (Test-Path $state) { (Get-Content $state -Raw).Trim() } else { '(未设置)' }
        "当前主题:$current"
        "用法:poshtheme <主题名>"
        "查看全部:poshthemes"
        return
    }

    $file = Join-Path $dir "$Name.omp.json"
    if (-not (Test-Path $file)) {
        Write-Warning "没有这个主题:$Name"
        return
    }

    Set-Content -Path $state -Value $Name -Encoding utf8
    Remove-Module oh-my-posh-core -Force -ErrorAction SilentlyContinue
    $global:_ompInitialized = $false
    oh-my-posh init pwsh --config $file | Invoke-Expression
    Write-Host "已切换主题:$Name" -ForegroundColor Green
}

用法:

powershell 复制代码
poshthemes                  # 列出全部,* 是当前
poshtheme tokyonight_storm  # 切换
poshtheme catppuccin_mocha  # 切回
poshtheme                   # 当前主题

poshtheme 会把名字写进 active-theme.txt,并重新初始化当前会话;新标签页也会读取这个文件。

如果切换后提示符没变:. $PROFILE 或重开标签页。个别 OMP 版本的模块名不同,自动重载可能失效,但主题名已经写入,重开一定生效。

5.7 自定义主题

主题按原名放在 $HOME\.config\oh-my-posh 目录下。改当前主题:

powershell 复制代码
$name = (Get-Content "$HOME\.config\oh-my-posh\active-theme.txt" -Raw).Trim()
code "$HOME\.config\oh-my-posh\$name.omp.json"   # 没有 VS Code 就用 notepad

也可以直接改任意一个文件,例如:

powershell 复制代码
code "$HOME\.config\oh-my-posh\catppuccin_mocha.omp.json"

一个最小可用的主题长这样(较新的 v4 写法):

json 复制代码
{
  "version": 4,
  "final_space": true,
  "blocks": [
    {
      "type": "prompt",
      "alignment": "left",
      "segments": [
        {
          "type": "path",
          "style": "powerline",
          "powerline_symbol": "\ue0b0",
          "foreground": "#1e1e2e",
          "background": "#89b4fa",
          "options": { "style": "folder", "max_depth": 3 }
        },
        {
          "type": "git",
          "style": "powerline",
          "powerline_symbol": "\ue0b0",
          "foreground": "#1e1e2e",
          "background": "#a6e3a1",
          "options": { "branch_icon": "\ue725 " }
        },
        {
          "type": "executiontime",
          "style": "plain",
          "foreground": "#6c7086",
          "template": " {{ .FormattedMs }}"
        },
        {
          "type": "text",
          "style": "plain",
          "foreground": "#89b4fa",
          "template": "\u276f"
        }
      ]
    }
  ]
}
  • blocks:一行提示符(可以有多行、左右对齐)
  • segments:一个个信息块(路径、Git、Node、Python、耗时...)
  • template:Go template 语法,控制显示内容
  • style:plain / powerline / diamond
  • foreground / background:颜色,支持 #RRGGBB、transparent、p:调色板名
  • options:segment 的专属设置(旧版叫 properties,较新版本仍兼容旧写法)

版本差异 :老主题是 "version": 3 + "properties";较新版本默认导出的是 "version": 4 + "options"。两种都能加载,新写配置建议用 v4。

常用 options:

json 复制代码
{
  "style": "folder",
  "max_depth": 3,
  "fetch_status": false,
  "branch_max_length": 25,
  "display_mode": "directory"
}
  • style: folder 只显示文件夹名(不显示完整路径)
  • max_depth 限制层级
  • fetch_status: false 不查 Git 工作区状态,明显更快
  • display_mode:directory / compact / files

想让配色好维护,可以在主题顶部加 palette,然后颜色写 p:blue:

json 复制代码
"palette": {
  "blue": "#89B4FA",
  "green": "#A6E3A1",
  "text": "#CDD6F4"
}

改完保存,poshtheme <主题名> 或重开一个标签页就能看到效果。

5.8 升级与卸载

powershell 复制代码
winget upgrade --id JanDeDobbeleer.OhMyPosh -e
winget uninstall --id JanDeDobbeleer.OhMyPosh -e

5.9 性能

Oh My Posh 每个提示符都会执行一次,Git 仓库大时可能卡顿(100ms+ 就能感觉到)。

powershell 复制代码
oh-my-posh debug

会打印每个 segment 的耗时。优化手段:

  1. 关掉 fetch_status(最有效)
  2. 少放几个语言版本 segment
  3. 大仓库里用 clean-detailed 这类轻量主题
  4. 还是慢 → 换 Starship

6. 第 4 步:PSReadLine 补全与预测

PSReadLine 是 PowerShell 的「行编辑器」,负责语法高亮、历史、补全、预测。PowerShell 7 自带,一般不需要单独安装。

6.1 必开配置

写进 profile:

powershell 复制代码
Set-PSReadLineOption -EditMode Windows
Set-PSReadLineOption -PredictionSource HistoryAndPlugin
Set-PSReadLineOption -PredictionViewStyle ListView
Set-PSReadLineOption -HistorySearchCursorMovesToEnd
Set-PSReadLineOption -HistoryNoDuplicates
Set-PSReadLineOption -MaximumHistoryCount 20000

Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward

如果 PredictionViewStyle ListView 那一行报错,说明 PSReadLine 版本较旧;删掉这一行即可,其他配置不受影响。

效果:

  • 输入命令时,灰色文字根据历史实时预测 ,按 → 接受
  • 下方弹出列表视图 ,↑/↓ 选择
  • Tab 变成菜单式补全(而不是循环切换)
  • ↑/↓ 按前缀搜索历史,而不是逐条翻

6.2 可选:语法高亮配色

默认配色在深色背景上也能看,但想和 Catppuccin 统一可以加这段(不生效就删掉,不影响其他功能):

powershell 复制代码
Set-PSReadLineOption -Colors @{
    Command          = "`e[38;2;137;180;250m"
    Parameter        = "`e[38;2;249;226;175m"
    Operator         = "`e[38;2;148;226;213m"
    Variable         = "`e[38;2;245;194;231m"
    String           = "`e[38;2;166;227;161m"
    Number           = "`e[38;2;250;179;135m"
    Type             = "`e[38;2;249;226;175m"
    Comment          = "`e[38;2;108;112;134m"
    Keyword          = "`e[38;2;203;166;247m"
    Error            = "`e[38;2;243;139;168m"
    InlinePrediction = "`e[38;2;108;112;134m"
}

6.3 插件预测(更准)

默认只预测历史。装 CompletionPredictor 后,能从模块的补全结果里预测参数:

powershell 复制代码
Install-Module CompletionPredictor -Scope CurrentUser -Force

profile 里:

powershell 复制代码
Import-Module CompletionPredictor -ErrorAction SilentlyContinue

PredictionSource 里的 Plugin 就会自动启用。

6.4 键位表

按键 作用
→ / End 接受行内预测
Tab 打开补全菜单 / 在菜单中下一个
Shift + Tab 补全菜单上一个
↑ / ↓ 前缀历史搜索
Ctrl + R 反向搜索历史(装 PSFzf 后变模糊搜索)
Ctrl + L 清屏(保留当前输入)
Ctrl + C 取消当前行
F2 切换预测视图(需手动绑定)

想给 F2 绑定视图切换:

powershell 复制代码
Set-PSReadLineKeyHandler -Key F2 -Function SwitchPredictionView

7. 第 5 步:效率工具全家桶

这些不是「好看」,但装完你的终端才算真正好用。全部可选,按需装。

工具 替代/增强 作用 winget ID
Terminal-Icons ls 文件和文件夹显示图标 PSGallery 模块
zoxide cd 智能跳转,z proj 直达常用目录 ajeetdsouza.zoxide
fzf Ctrl+R 模糊搜索历史/文件 junegunn.fzf
PSFzf --- fzf 与 PSReadLine 集成 PSGallery 模块
posh-git --- Git 分支/命令 Tab 补全 PSGallery 模块
ConsoleGuiTools --- Out-ConsoleGridView 交互式表格选择 PSGallery 模块
PSScriptAnalyzer --- PowerShell 脚本静态检查 PSGallery 模块
bat cat 语法高亮 + 行号 sharkdp.bat
eza ls 彩色、图标、Git 状态、树形 eza-community.eza
ripgrep grep 快得多的递归搜索 BurntSushi.ripgrep.MSVC
fd find 更友好的文件查找 sharkdp.fd
delta git diff 并排 diff、语法高亮 dandavison.delta
fastfetch systeminfo 启动时显示系统信息 Fastfetch-cli.Fastfetch
gsudo --- 类似 Linux 的 sudo gerardog.gsudo

7.1 一次性安装

powershell 复制代码
$apps = @(
    'ajeetdsouza.zoxide',
    'junegunn.fzf',
    'sharkdp.bat',
    'eza-community.eza',
    'BurntSushi.ripgrep.MSVC',
    'sharkdp.fd',
    'dandavison.delta',
    'Fastfetch-cli.Fastfetch',
    'gerardog.gsudo'
)

foreach ($id in $apps) {
    winget install --id $id -e --source winget --accept-package-agreements --accept-source-agreements
}

PowerShell 模块:

powershell 复制代码
Install-Module Terminal-Icons, PSFzf, CompletionPredictor, posh-git, Microsoft.PowerShell.ConsoleGuiTools, PSScriptAnalyzer -Scope CurrentUser -Force -AllowClobber

首次 Install-Module 可能提示安装 NuGet 提供程序,输 Y 即可。 若报「不受信任的存储库」,先执行 Set-PSRepository PSGallery -InstallationPolicy Trusted,或在提示时输 Y。

7.2 各工具怎么用

Terminal-Icons :装完 import 一下,ls 自动带图标:

powershell 复制代码
Import-Module Terminal-Icons

zoxide:记住你去过的目录,按频率跳转:

powershell 复制代码
zoxide init powershell | Out-String | Invoke-Expression   # 写进 profile
z proj          # 跳到任何名字含 proj 的常用目录
z -             # 回上一个目录
zi              # 交互式选择

进阶:zoxide init powershell --cmd cd 可以让 cd 本身支持模糊跳转。

fzf + PSFzf:

powershell 复制代码
Ctrl + R   # 模糊搜索命令历史
Ctrl + T   # 模糊选择当前目录下的文件,插入命令行

posh-git :给 git checkout、git branch 等命令加 Tab 补全(分支名、远程名),不接管提示符。

powershell 复制代码
git checkout feat<Tab>   # 补全分支名

ConsoleGuiTools :Get-Process | Out-ConsoleGridView,在表格里筛选、排序、多选对象。

PSScriptAnalyzer :Invoke-ScriptAnalyzer -Path .\script.ps1,检查脚本里的常见问题。

bat:

powershell 复制代码
bat README.md
bat --list-themes        # 看可用主题

想默认用 bat 代替 cat:Set-Alias -Name cat -Value bat -Force(bat 检测到管道时会自动退化成纯文本,不会污染脚本)。

eza:

powershell 复制代码
eza -la --group-directories-first --icons
eza --tree --level=2 --icons

ripgrep / fd:

powershell 复制代码
rg "TODO" -n
fd "\.ps1$"

delta :配置到 ~/.gitconfig:

ini 复制代码
[core]
    pager = delta

[interactive]
    diffFilter = delta --color-only

[delta]
    navigate = true
    line-numbers = true
    side-by-side = false
    syntax-theme = Catppuccin Mocha

[merge]
    conflictstyle = zdiff3

如果 syntax-theme 报错,执行 bat --list-themes 换个存在的名字,比如 Monokai Extended。

如果 git diff 看起来没走 delta:运行 git var GIT_PAGER,应为 delta。若输出 cat,说明环境变量 GIT_PAGER 覆盖了 core.pager,执行 Remove-Item Env:GIT_PAGER 或在 profile 里清掉。Git 只在交互式终端启用 pager,重定向输出不会走 delta。

fastfetch:

powershell 复制代码
fastfetch
fastfetch --gen-config     # 生成配置文件,路径见输出

配置文件在 ~\.config\fastfetch\config.jsonc(fastfetch --gen-config 会打印实际路径)。

这套配色基于 Tokyo Night 的蓝/紫/青;想换颜色,改 display.color 和 logo.color 即可。

gsudo:

powershell 复制代码
gsudo Get-Service   # 单条命令提权,弹 UAC
sudo ...            # Windows 11 24H2+ 自带 sudo,可在 设置 → 系统 → 开发者选项 开启

8. 第 6 步:完整 profile 模板

把下面整段 复制进 $PROFILE(先 New-Item -ItemType File -Path $PROFILE -Force,再 code $PROFILE 或 notepad $PROFILE)。

已经写好了存在性判断:没装的工具会自动跳过,不会报错。

这是最小可用版。如果你需要 Git 快捷命令、系统工具函数、主题切换等,可以在这个模板基础上继续扩展。

powershell 复制代码
# ============================================================
#  PowerShell 7 终端美化配置
#  位置:%USERPROFILE%\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
#  改完执行:. $PROFILE   或重开标签页
# ============================================================

# ---------- 0. UTF-8(解决中文乱码) ----------
$OutputEncoding = [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)

# ---------- 1. PSReadLine:预测、历史、补全 ----------
if (Get-Module -ListAvailable -Name PSReadLine) {
    try {
        Set-PSReadLineOption -EditMode Windows
        Set-PSReadLineOption -PredictionSource HistoryAndPlugin
        Set-PSReadLineOption -PredictionViewStyle ListView
        Set-PSReadLineOption -HistorySearchCursorMovesToEnd
        Set-PSReadLineOption -HistoryNoDuplicates
        Set-PSReadLineOption -MaximumHistoryCount 20000

        Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete
        Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
        Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward
    }
    catch {
        # 少数不支持虚拟终端的宿主会在这里报错,跳过即可
    }
}

# ---------- 2. 模块 ----------
Import-Module Terminal-Icons -ErrorAction SilentlyContinue
Import-Module CompletionPredictor -ErrorAction SilentlyContinue

# posh-git:Git 分支/命令的 Tab 补全(不接管提示符)
Import-Module posh-git -ErrorAction SilentlyContinue

if ((Get-Module -ListAvailable -Name PSFzf) -and (Get-Command fzf -ErrorAction SilentlyContinue)) {
    Import-Module PSFzf
    Set-PsFzfOption -PSReadlineChordProvider 'Ctrl+t' -PSReadlineChordReverseHistory 'Ctrl+r'
}

# ---------- 3. zoxide ----------
if (Get-Command zoxide -ErrorAction SilentlyContinue) {
    zoxide init powershell | Out-String | Invoke-Expression
}

# ---------- 4. 别名与小函数 ----------
function ll {
    Get-ChildItem -Force @args
}

function la {
    Get-ChildItem -Force @args
}

function .. {
    Set-Location ..
}

function ... {
    Set-Location ../..
}

function mkcd {
    param(
        [Parameter(Mandatory)]
        [string]$Path
    )
    New-Item -ItemType Directory -Force -Path $Path | Out-Null
    Set-Location $Path
}

function reload {
    . $PROFILE
}

function myprofile {
    if (Get-Command code -ErrorAction SilentlyContinue) {
        code $PROFILE
    }
    else {
        notepad $PROFILE
    }
}

# eza 存在时,用 eza 重写 ll / lt
if (Get-Command eza -ErrorAction SilentlyContinue) {
    function ll {
        eza --long --all --group-directories-first --icons @args
    }
    function lt {
        eza --tree --level=2 --icons @args
    }
}

# bat 存在时,cat 走 bat
if (Get-Command bat -ErrorAction SilentlyContinue) {
    $env:BAT_THEME = 'Catppuccin Mocha'
    Set-Alias -Name cat -Value bat -Force
}

# ---------- 5. 主题切换 ----------
function poshthemes {
    $dir = "$HOME\.config\oh-my-posh"
    $state = Join-Path $dir 'active-theme.txt'
    $active = if (Test-Path $state) { (Get-Content $state -Raw).Trim() } else { '' }

    Get-ChildItem $dir -Filter *.omp.json |
        ForEach-Object {
            $name = $_.Name -replace '\.omp\.json$', ''
            [pscustomobject]@{
                Active = if ($name -eq $active) { '*' } else { '' }
                Name   = $name
            }
        } |
        Sort-Object Name
}

function poshtheme {
    param([Parameter(Position = 0)][string]$Name)

    $dir = "$HOME\.config\oh-my-posh"
    $state = Join-Path $dir 'active-theme.txt'

    if (-not $Name) {
        $current = if (Test-Path $state) { (Get-Content $state -Raw).Trim() } else { '(未设置)' }
        "当前主题:$current"
        "用法:poshtheme <主题名>"
        "查看全部:poshthemes"
        return
    }

    $file = Join-Path $dir "$Name.omp.json"
    if (-not (Test-Path $file)) {
        Write-Warning "没有这个主题:$Name"
        return
    }

    Set-Content -Path $state -Value $Name -Encoding utf8
    Remove-Module oh-my-posh-core -Force -ErrorAction SilentlyContinue
    $global:_ompInitialized = $false
    oh-my-posh init pwsh --config $file | Invoke-Expression
    Write-Host "已切换主题:$Name" -ForegroundColor Green
}

# ---------- 6. Oh My Posh(放最后,覆盖提示符) ----------
if (Get-Command oh-my-posh -ErrorAction SilentlyContinue) {
    $ompThemeDir = "$HOME\.config\oh-my-posh"
    $ompThemeState = Join-Path $ompThemeDir 'active-theme.txt'
    $ompThemeName = if (Test-Path $ompThemeState) { (Get-Content $ompThemeState -Raw).Trim() } else { 'catppuccin_mocha' }
    $ompTheme = Join-Path $ompThemeDir "$ompThemeName.omp.json"

    if (-not (Test-Path $ompTheme)) {
        $ompTheme = Join-Path $ompThemeDir 'catppuccin_mocha.omp.json'
    }

    try {
        if (Test-Path $ompTheme) {
            oh-my-posh init pwsh --config $ompTheme | Invoke-Expression
        }
        else {
            # 还没复制主题时,退回 Oh My Posh 默认配置
            oh-my-posh init pwsh | Invoke-Expression
        }
    }
    catch {
        # 提示符加载失败不应影响 Shell 启动
    }
}

8.1 保存并生效

powershell 复制代码
. $PROFILE

或者用模板里的快捷函数(新会话生效后):reload。

如果报错,先看错误信息定位到哪一行;临时跳过 profile 启动用:

powershell 复制代码
pwsh -NoProfile

8.2 如果你用 VS Code

VS Code 的集成终端默认是 Windows PowerShell 5.1 ,且字体是独立设置的。在 settings.json 里加:

json 复制代码
"terminal.integrated.defaultProfile.windows": "PowerShell",
"terminal.integrated.fontFamily": "Maple Mono NF CN",
"terminal.integrated.fontSize": 13

9. 第 7 步:统一配色

视觉统一的关键是:终端背景色、Oh My Posh 主题、bat 主题、delta 主题、PSReadLine 高亮用同一套色板。

Catppuccin Mocha 全家桶:

组件 设置
Windows Terminal colorScheme: "Catppuccin Mocha" 或 "Tokyo Night Storm"(3.5 节)
Windows Terminal UI 根级 "theme" 选同名 UI 主题,控制标签栏/标题栏
Oh My Posh poshtheme catppuccin_mocha / poshtheme tokyonight_storm
bat $env:BAT_THEME = 'Catppuccin Mocha'
delta syntax-theme = Catppuccin Mocha
PSReadLine 6.2 节的 RGB 配色

Tokyo Night 用户:WT 选 Tokyo Night Storm,OMP 用 poshtheme tokyonight_storm;bat / delta 没有对应主题时保留 Catppuccin 或 OneHalfDark。

bat / delta 的主题名必须真实存在,用 bat --list-themes 查。找不到 Catppuccin 说明 bat 版本旧,winget upgrade sharkdp.bat 即可。


10. 进阶玩法

10.1 Oh My Posh vs Starship 怎么选

Oh My Posh Starship
配置格式 JSON TOML
主题数量 100+ 现成 少而精,自己拼
速度 中等 更快
上手 装完即用 需要写配置
跨 Shell 全平台 全平台

建议:想要「装完就好看」用 Oh My Posh;追求极简和速度用 Starship。

Starship 安装:

powershell 复制代码
winget install --id Starship.Starship -e

profile:

powershell 复制代码
Invoke-Expression (&starship init powershell)

配置:$HOME\.config\starship.toml,官方预设见 starship.rs/presets/。

两者不要同时初始化,否则提示符会打架。

10.2 给 Git 加颜色和图标

Oh My Posh 的 git segment 自动读取仓库状态,不需要额外配置。想更细可以加:

json 复制代码
{
  "type": "git",
  "style": "powerline",
  "powerline_symbol": "\ue0b0",
  "foreground": "#1e1e2e",
  "background": "#a6e3a1",
  "options": {
    "branch_icon": "\ue725 ",
    "fetch_status": true,
    "fetch_upstream_icon": true
  }
}

fetch_status: true 会显示 +3 ~2 -1(新增/修改/删除),但大仓库会变慢。

10.3 SSH 到 Linux 也想要同款

Oh My Posh 支持远程;更简单的做法是在远端装 Starship,本地终端只负责渲染。字体图标是本地渲染的,所以本地装了 Nerd Font 就够。

10.4 中文对齐:别指望字体回退

Windows Terminal 的字体回退(fallback)是自动的:当前字体没有某个字形时,系统临时找别的字体补上。它没有可靠的配置项,也控制不了宽度。

结果就是:用 Cascadia Code 显示中文时,汉字会回退到微软雅黑------比例字体,和英文的等宽格栅对不齐,表格、eza 的列、进度条全都会歪。

唯一靠谱的解法是选一个自带中文的等宽字体(Maple Mono NF CN、Sarasa Term SC Nerd Font),而不是配 fallback。

10.5 使用 Windows Terminal 预览版

想第一时间体验新特性(命令面板增强、新渲染器):

powershell 复制代码
winget install --id Microsoft.WindowsTerminal.Preview -e

预览版和稳定版可以共存,配置独立。


11. 排错手册

11.1 满屏方块 / 问号

原因 :字体没装、没选对、或名字写错。 排查:

powershell 复制代码
"`u{e0b0} `u{e725} `u{f07b}"

仍是方块 → 装 Nerd Font;图标正常但 OMP 里个别图标是方块 → 该主题用了字体里没有的私有区字符,换个主题。

11.2 中文乱码 / 宽度不齐

  • 终端里执行 chcp,显示 65001 最好;如果是 936,执行 chcp 65001,或在 profile 里加上 UTF-8 那行。
  • PowerShell 7 默认 UTF-8;从 5.1 或 cmd 启动的旧会话可能不是。
  • 宽度不齐 = 字体不含 CJK,换 Maple Mono NF CN。

11.3 提示符没变

按顺序查:

  1. 当前是不是 PowerShell 7?$PSVersionTable.PSVersion
  2. profile 路径对不对?$PROFILE,文件是否存在?
  3. profile 里有报错吗?pwsh -NoProfile 能启动,说明是 profile 的问题。
  4. OMP 初始化那行是否在 profile 最后?被后面的代码覆盖了?
  5. 改完执行 . $PROFILE 了吗?

11.4 「无法加载文件,因为在此系统上禁止运行脚本」

powershell 复制代码
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

11.5 oh-my-posh 命令找不到

PATH 没刷新。关掉所有终端重开;或临时补 PATH:

powershell 复制代码
$env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') + ';' + [Environment]::GetEnvironmentVariable('Path','User')

11.6 启动明显变慢

powershell 复制代码
oh-my-posh debug

看哪个 segment 耗时。最常见是 Git 的 fetch_status。想对比的话,用 pwsh -NoProfile 启动一个不加载 profile 的会话即可。

11.7 winget 报错

powershell 复制代码
winget source reset --force
winget source update

仍不行就去 Microsoft Store 更新「应用安装程序」。

11.8 设置保存后终端打不开 / 闪退

settings.json JSON 语法错了。恢复备份:

powershell 复制代码
$wt = "$env:LOCALAPPDATA\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json"
Copy-Item "$wt.bak" $wt -Force

常见语法错误:多了一个逗号、少了一个引号、路径没转义(反斜杠要写两个)。

11.9 VS Code 终端里图标是方块

VS Code 的终端字体要在 terminal.integrated.fontFamily 单独设置,不跟随 Windows Terminal。

11.10 装了 Oh My Posh 但 Git 图标不显示

  • 字体不是 NF 版
  • 当前目录不是 Git 仓库
  • 主题里 git segment 被禁用

12. 回滚与卸载

12.1 只回滚配置

powershell 复制代码
# profile 整个备份/清空
Copy-Item $PROFILE "$PROFILE.bak" -Force
Set-Content $PROFILE -Value '' -Encoding utf8

# Windows Terminal
$wt = "$env:LOCALAPPDATA\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json"
Copy-Item "$wt.bak" $wt -Force

12.2 卸载软件

powershell 复制代码
$ids = @(
  'JanDeDobbeleer.OhMyPosh','ajeetdsouza.zoxide','junegunn.fzf','sharkdp.bat',
  'eza-community.eza','BurntSushi.ripgrep.MSVC','sharkdp.fd','dandavison.delta',
  'Fastfetch-cli.Fastfetch','gerardog.gsudo'
)
foreach ($id in $ids) { winget uninstall --id $id -e }

模块:

powershell 复制代码
Uninstall-Module Terminal-Icons, PSFzf, CompletionPredictor, posh-git, Microsoft.PowerShell.ConsoleGuiTools, PSScriptAnalyzer -AllVersions -Force

12.3 删除字体

设置 → 个性化 → 字体 → 搜索字体名 → 卸载(仅对当前用户安装的字体有效)。

或手动删注册表项 + 文件:

powershell 复制代码
# 先确认要删什么!
Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts' |
    Select-Object -Property *Maple* | Format-List

删字体有风险,建议用设置界面。


附录 A:把配置固化成脚本(可选)

如果经常给新机器配环境,可以把本文步骤写成一个 PowerShell 脚本。建议按这个顺序:

  1. 检查 winget、PowerShell 7、Windows Terminal
  2. 用 winget 安装 Oh My Posh、Git、常用工具
  3. 安装 PowerShell 模块
  4. 安装 Nerd Font:下载字体包,或调用 oh-my-posh font install
  5. 把 OMP 主题复制到 ~\.config\oh-my-posh
  6. 写入 profile(用标记块,便于以后替换)
  7. 合并 Windows Terminal 的 settings.json(先备份)
  8. 写入 ~\.gitconfig

几个关键点:

  • 每一步先判断是否已安装,保证脚本可以重复执行
  • 改 settings.json 前先备份;用 ConvertFrom-Json -AsHashtable 合并,而不是整文件覆盖
  • profile 用 # >>> ... >>> 和 # <<< ... <<< 标记包起来,脚本只替换标记之间的内容
  • 字体装到当前用户(%LOCALAPPDATA%\Microsoft\Windows\Fonts + HKCU 注册表),不需要管理员

这样即使某一步失败,也可以回滚后重新运行。


附录 B:命令速查表

powershell 复制代码
# 重新加载配置
. $PROFILE

# 列出主题 / 切换主题
poshthemes
poshtheme tokyonight_storm

# 预览当前主题
$name = (Get-Content "$HOME\.config\oh-my-posh\active-theme.txt" -Raw).Trim()
oh-my-posh print primary --config "$HOME\.config\oh-my-posh\$name.omp.json"

# 当前 profile 路径
$PROFILE

# 验证字体
"`u{e0b0} `u{e725} `u{f07b}"

# 测 OMP 性能
oh-my-posh debug

# 更新所有软件
winget upgrade --all --include-unknown

# 打开 WT 设置 JSON
code "$env:LOCALAPPDATA\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json"

最后一句话

终端美化的终点不是「装了多少插件」,而是你打开终端时心情好、敲命令时手不累 。 如果某天觉得花哨了,把 profile 清空、执行 poshtheme clean-detailed,随时可以重新开始------所有配置都是纯文本,删了就没了,坏不了系统。

希望这篇教程能帮你搭出一套顺手的终端。

相关推荐
foreverYoung1 小时前
给开源后台做等保适配,我发现了 5 个"看起来有、其实没用"的功能 从一个尴尬的现场测试说起
后端
程序猿阿越1 小时前
从 StatefulSet 到容器挂载:CSI 源码走读
后端·kubernetes·源码阅读
用户1880687493521 小时前
戴着 Rokid 接成语:用 AIUI 做一局有提示、有复盘的“接着说”
前端
Sakura_j_h_2 小时前
Three.js 单文件离线机械臂工作台:爆炸图、透明外壳与剖面
前端·机械臂·webgl·three.js·1024程序员节·esbuild
苏三说技术2 小时前
继PHP之后,Java也爆出了重大安全漏洞!
后端
计算机魔术师3 小时前
管谷歌的不是Pichai一个人,是一整层AI智能体
前端
米米商聊3 小时前
图标能点,按钮就可用了吗?键盘、名称与收藏状态
前端·javascript
程序猿乐锅3 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节
code2cat4 小时前
Java高级篇之Hibernate:让对象映射到表,理解持久化与事务
java·后端·hibernate·1024程序员节