论如何在 Windows Terminal 的 PowerShell 中调教好 oh-my-posh.
oh-my-posh, 看名字就知道这是 oh-my-zsh 的 PS 版本. 这有什么用呢? (好看呀).
2022 年初更新:本文的内容已经过时。官网的文档更新得比较全面了,可以参考 https://ohmyposh.dev/docs/windows 而不再阅读本文。
oh-mu-posh 的官网上对于配置讲得比较详细, 唯独没有提一些在 Windows Terminal 中会出现的问题. 踩了不少坑, 最后在 issue 中找到解了. 这里记录安装配置过程.
效果展示
首先来看一下我这里的最终效果图.

安装
安装准备
在安装之前, 你首先需要这两样东西:
- ConEmu
- 任何支持 Powerline 的字体
ComEmu 有很多方式安装, 这里我通过 scoop
scoop bucket add extras
scoop install conemu
支持 Powerline 的字体也很多, 比如 oh-my-posh 的 GitHub 页面就提供了一个包含超多 Nerd Fonts 的仓库. 这里使用微软提供的字体 Cascadia Code, 该字体是 Windows Terminal 默认字体的扩展. 如果没做过字体修改的话, 这个看起来会合原本的字体相同, 保持视觉上的一致. 下载该字体文件, 可以选择全部安装, 也可以部分安装. 但至少需要保证带 PL 后缀的字体安装了至少一个.
正式安装
首先安装程序本体
Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser
按照 oh-my-posh 文档的说法, 对于 PS-Core 用户, 还需要安装一个较高版本号的预览版 PSReadLine 以取代内置的旧版模块. 我查看了版本号貌似内置的比文档页面说的那个 beta version 还要高. 因此并不是很确定该步骤是否必要(但我还是执行了这个命令装了一个预览版的).
Install-Module -Name PSReadLine -AllowPrerelease -Scope CurrentUser -Force
安装后配置
首先需要修改一下 PowerShell 的 Profile.
你需要在 profile 中设置这样几行. Profile 可以通过 PowerShell 的环境变量 $PROFILE 找到. 使用任何文本编辑器打开该文件然后添加下述几行. 这几行的作用分别是: 隐藏那个超巨大的 user@domain, 启动时导入模块, 设置主题. 主题倒是可以选择别的啦, 不过有的主题那么多 emoji 真的难看死了.
$DefaultUser = $env:USERNAME
Import-Module posh-git
Import-Module oh-my-posh
Set-Theme Paradox
接下来需要稍微修改下 Windows Terminal 的设置, 让其使用正确的字体. 找到某个配置项目(例如这里的是 PowerShell Core 的配置项目). 添加 "fontFace": "Cascadia Code PL". 这个字体换成你电脑上安装的任何一个支持 Powerline 的字体均可.
{
"guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
"hidden": false,
"name": "PowerShell",
"source": "Windows.Terminal.PowershellCore",
"useAcrylic": true,
"acrylicOpacity": 0.75,
"colorScheme": "One Half Light",
"cursorColor": "#000000",
"historySize": 20001,
"fontFace": "Cascadia Code PL"
}
此外, 如果需要在 VS Code 中正确使用, 也需要配置字体. 在 VSC 的设置中找到 Terminal Font Family, 修改相应字体, 如下图.

Comments | 2 条评论
偶然回过头来看到了这篇, 补充一句, 新版本的 Windows Terminal 的配置文件格式和上文的已经略有变化了, 自己按照字段对着看看改改才能用.
顺带一提,virtualenv的图标如果显示不对,需要这样修改:
// 改成一条(蛇)
$ThemeSettings.PromptSymbols.VirtualEnvSymbol = [char]::ConvertFromUtf32(0x0001F40D)
// 改成一个齿轮
$ThemeSettings.PromptSymbols.VirtualEnvSymbol = [char]::ConvertFromUtf32(0x2699)
// 不显示
$ThemeSettings.PromptSymbols.VirtualEnvSymbol = ”