Windows Terminal 更新后 oh-my-posh 报错的问题分析与解决
- 电脑基础
- 2023-01-30
- 4471热度
- 1评论
两年前在 windows 10 中安装并配置了 Windows Terminal
,并记录了一片相关文章:自定义 Windows Terminal 终端界面与配色方案。当时 Windows Terminal
还处于预览版。
最近在 windows 应用商店对 Windows Terminal
进行了更新,然后再打开 则 PowserShell
中的 oh-my-posh
报错如下而无法使用:
oh-my-posh : 无法将“oh-my-posh”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
参考之前的文章记录,当时安装配置 PowserShell
中支持 oh-my-posh
主要为执行如下命令:
Install-Module -Name PSReadLine -Scope AllUsers -SkipPublisherCheck
Install-Module posh-git -Scope AllUsers
Install-Module oh-my-posh -Scope AllUsers
重新执行以上命令并没有效果。于是前往 oh-my-posh
官方文档查找了最新的方案,记录有效的解决方法如下。
重安装与配置 oh-my-posh
首先以管理员身份打开 PowderShell
,执行如下命令,卸载已安装的 oh-my-posh
,并升级 posh-git
和 PSReadLine
:
Remove-Module oh-my-posh -Force
Install-Module -Name PSReadLine -Scope AllUsers -Force -SkipPublisherCheck
Install-Module posh-git -Scope AllUsers -Force
然后根据oh-my-posh
官方文档的指引重新安装它。执行如下命令:
# 使用 winget 安装 OhMyPosh
winget install JanDeDobbeleer.OhMyPosh -s winget
# (后续需要更新时)使用 winget 更新 OhMyPosh
winget upgrade JanDeDobbeleer.OhMyPosh -s winget
安装完成后关闭并重新打开 Windows Terminal
。然后执行如下命令,打开 PowerShell
配置文件:
notepad $PROFILE
内容修改参考如下:
Import-Module posh-git
Import-Module PSReadLine
# 这里配置的主题为 robbyrussell。可打开如下路径文件夹,查看全部的主题并选择自己喜欢的: $env:POSH_THEMES_PATH
oh-my-posh init pwsh --config $env:POSH_THEMES_PATH\robbyrussell.omp.json | Invoke-Expression
然后打开新的 Powsershell
Tab,应该即可正常加载 oh-my-posh
了。
oh-my-posh 主题设置参考
在配置文件中可以指定自定义的主题。需要注意的是,部分主题虽然丰富好看,但加载时间也比较长,注意选择使用。以下为个人推荐参考:
# Import-Module PSReadLine
# $env:POSH_THEMES_PATH\<theme_name.json>
# 不加载自定义主题
# oh-my-posh init pwsh | Invoke-Expression
# 好看但速度较慢的主题
# oh-my-posh init pwsh --config $env:POSH_THEMES_PATH\atomic.omp.json | Invoke-Expression
# oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/jandedobbeleer.omp.json" | Invoke-Expression
# oh-my-posh init pwsh --config $env:POSH_THEMES_PATH\night-owl.omp.json | Invoke-Expression
# oh-my-posh init pwsh --config $env:POSH_THEMES_PATH\iterm2.omp.json | Invoke-Expression
# 简洁、加载速度较快的主题
# oh-my-posh init pwsh --config $env:POSH_THEMES_PATH\avit.omp.json | Invoke-Expression
oh-my-posh init pwsh --config $env:POSH_THEMES_PATH\robbyrussell.omp.json | Invoke-Expression
# oh-my-posh init pwsh --config $env:POSH_THEMES_PATH\json.omp.json | Invoke-Expression
# oh-my-posh init pwsh --config $env:POSH_THEMES_PATH\remk.omp.json | Invoke-Expression
# oh-my-posh init pwsh --config $env:POSH_THEMES_PATH\spaceship.omp.json | Invoke-Expression # 简洁
# oh-my-posh init pwsh --config $env:POSH_THEMES_PATH\amro.omp.json | Invoke-Expression
# oh-my-posh init pwsh --config $env:POSH_THEMES_PATH\mt.omp.json | Invoke-Expression
#### 以下为其他个性化设置参考 ####
# 设置预测文本来源为历史记录
Set-PSReadLineOption -PredictionSource History
# 设置 Tab 键补全
Set-PSReadlineKeyHandler -Key Tab -Function Complete
# 设置 Ctrl+d 为菜单补全和 Intellisense
Set-PSReadLineKeyHandler -Key "Ctrl+d" -Function MenuComplete
# 设置 Ctrl+z 为撤销
Set-PSReadLineKeyHandler -Key "Ctrl+z" -Function Undo
# 设置向上键为后向搜索历史记录
# Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadLineKeyHandler -Key UpArrow -ScriptBlock {
[Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchBackward()
[Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine()
}
# 设置向下键为前向搜索历史纪录
# Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward
Set-PSReadLineKeyHandler -Key DownArrow -ScriptBlock {
[Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchForward()
[Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine()
}
实际上默认主题就挺不错的。
安装 Nerd fonts 字体解决 oh-my-posh 乱码问题
如果遇到乱码问题,则是字体的原因,需要修改为 Nerd fonts
类型的字体。oh-my-posh
提供了此类字体的安装命令:
# 执行该命令并选择一个合适的字体安装
oh-my-posh font install
在安装了 Nerd fonts
类字体后重启 Windows Terminal
。
然后使用快捷键 CTRL + SHIFT + ,
打开 Windows Terminal
的配置文件,编辑并设置字体配置。主要内容结构参考如下:
{
"profiles":
{
"defaults":
{
"font":
{
"face": "Fira Code Retina"
}
}
}
}
当然也可以在设置界面的 默认值->外观->字体
处选择字体并设置。
若一切顺利,则可正常使用 oh-my-posh
了。
不用 oh-my-posh
?
你是否感觉到 oh-my-posh
太慢了?powershell
脚本的性能确实是其最大的瓶颈。或许我们不应该在 windows 上使用它。一个替代的方案是在 $PROFILE
文件中自定义 prompt
函数,实现自定义的行提示。示例:
# 设置预测文本来源为历史记录
Set-PSReadLineOption -PredictionSource History
# 设置 Tab 键补全
Set-PSReadlineKeyHandler -Key Tab -Function Complete
# 设置 Ctrl+d 为菜单补全和 Intellisense
Set-PSReadLineKeyHandler -Key "Ctrl+d" -Function MenuComplete
# 设置 Ctrl+z 为撤销
Set-PSReadLineKeyHandler -Key "Ctrl+z" -Function Undo
# 设置向上键为后向搜索历史记录
# Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadLineKeyHandler -Key UpArrow -ScriptBlock {
[Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchBackward()
[Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine()
}
# 设置向下键为前向搜索历史纪录
# Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward
Set-PSReadLineKeyHandler -Key DownArrow -ScriptBlock {
[Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchForward()
[Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine()
}
function prompt {
Write-Host " $pwd>" -ForegroundColor:green
return " "
}
相关参考
- https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/remove-module
- https://ohmyposh.dev/docs/installation/windows
[…] 如果你喜欢 oh-my-posh 风格,可以参考该文:安装与配置 oh-my-posh […]