Windows Terminal 更新后 oh-my-posh 报错的问题分析与解决

目录
[隐藏]

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

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
点赞 (0)

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code