两年前在 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