美化 PowerShell

美化 PowerShell


UPDATE 2022.3.4: 本文使用的 oh-my-posh 基于 V2 版本,而更新且功能更强大的新版本已经发布,如需使用请参考其官方文档。


1. 准备工作

Step1. 下载并安装 PowerShell Core(pwsh),可在 Github 页面 进行下载。

Step2. 确保 Windows 版本在 v1903 之上(可以运行 winver 进行查看)

Step3. 安装 VSCode 以及 PowerLine fonts


2. 安装 PowerShell 模块

以管理员运行 PowerShell,并执行命令:

Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser

(可选)安装预览版 PSReadLine:

Install-Module -Name PSReadLine -AllowPrerelease -Scope CurrentUser -Force -SkipPublisherCheck

3. 创建启动配置文件

执行命令:

if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force }
notepad $PROFILE

编辑并保存如下内容:

chcp 65001
Import-Module posh-git 
Import-Module oh-my-posh 
Set-Theme Agnoster

4. 配置 Pwsh 字体和主题颜色

启动 pwsh,可从标题栏右键 > 属性中配置字体,建议使用 PowerLine 字体。

在 Microsoft/Terminal 仓库 中,可以下载到 ColorTool 工具,其可以应用 iTerm2-Color-Schemes 仓库 中的主题配色。

使用方法为:

./colortool -b $THEME_FILE

接下来在标题栏右键 > 属性,之后什么都不用做,直接点击确定,就可以把当前控制台和默认控制台的配色方案进行切换。


5. VSCode 内置终端

需要配置终端的 shell 和字体

另外,需要启用 Conpty


6. 自定义主题

定位到如下路径(oh-my-posh 版本号要视情况而定):

创建的自定义主题存放在此处即可,例如我基于 Agnoster.psm1Fish.psm1 修改而成的 AgnosterPower.psm1:

#requires -Version 2 -Modules posh-gitfunction Write-Theme {param([bool]$lastCommandFailed,[string]$with)$lastColor = $sl.Colors.PromptBackgroundColor$prompt = Write-Prompt -Object $sl.PromptSymbols.StartSymbol -ForegroundColor $sl.Colors.SessionInfoForegroundColor -BackgroundColor $sl.Colors.SessionInfoBackgroundColor#check the last command state and indicate if failedIf ($lastCommandFailed) {$prompt += Write-Prompt -Object "$($sl.PromptSymbols.FailedCommandSymbol) " -ForegroundColor $sl.Colors.CommandFailedIconForegroundColor -BackgroundColor $sl.Colors.SessionInfoBackgroundColor}#check for elevated promptIf (Test-Administrator) {$prompt += Write-Prompt -Object "$($sl.PromptSymbols.ElevatedSymbol) " -ForegroundColor $sl.Colors.AdminIconForegroundColor -BackgroundColor $sl.Colors.SessionInfoBackgroundColor}$user = [System.Environment]::UserName$computer = [System.Environment]::MachineNameif (Test-NotDefaultUser($user)) {$prompt += Write-Prompt -Object "$user@$computer " -ForegroundColor $sl.Colors.SessionInfoForegroundColor -BackgroundColor $sl.Colors.SessionInfoBackgroundColor}if (Test-VirtualEnv) {$prompt += Write-Prompt -Object "$($sl.PromptSymbols.SegmentForwardSymbol) " -ForegroundColor $sl.Colors.SessionInfoBackgroundColor -BackgroundColor $sl.Colors.VirtualEnvBackgroundColor$prompt += Write-Prompt -Object "$($sl.PromptSymbols.VirtualEnvSymbol) $(Get-VirtualEnvName) " -ForegroundColor $sl.Colors.VirtualEnvForegroundColor -BackgroundColor $sl.Colors.VirtualEnvBackgroundColor$prompt += Write-Prompt -Object "$($sl.PromptSymbols.SegmentForwardSymbol) " -ForegroundColor $sl.Colors.VirtualEnvBackgroundColor -BackgroundColor $sl.Colors.PromptBackgroundColor}else {$prompt += Write-Prompt -Object "$($sl.PromptSymbols.SegmentForwardSymbol) " -ForegroundColor $sl.Colors.SessionInfoBackgroundColor -BackgroundColor $sl.Colors.PromptBackgroundColor}# Writes the drive portion$prompt += Write-Prompt -Object (Get-ShortPath -dir $pwd) -ForegroundColor $sl.Colors.PromptForegroundColor -BackgroundColor $sl.Colors.PromptBackgroundColor$prompt += Write-Prompt -Object ' ' -ForegroundColor $sl.Colors.PromptForegroundColor -BackgroundColor $sl.Colors.PromptBackgroundColor$status = Get-VCSStatusif ($status) {$themeInfo = Get-VcsInfo -status ($status)$lastColor = $themeInfo.BackgroundColor$prompt += Write-Prompt -Object $sl.PromptSymbols.SegmentForwardSymbol -ForegroundColor $sl.Colors.PromptBackgroundColor -BackgroundColor $lastColor$prompt += Write-Prompt -Object " $($themeInfo.VcInfo) " -BackgroundColor $lastColor -ForegroundColor $sl.Colors.GitForegroundColor}if ($with) {$prompt += Write-Prompt -Object $sl.PromptSymbols.SegmentForwardSymbol -ForegroundColor $lastColor -BackgroundColor $sl.Colors.WithBackgroundColor$prompt += Write-Prompt -Object " $($with.ToUpper()) " -BackgroundColor $sl.Colors.WithBackgroundColor -ForegroundColor $sl.Colors.WithForegroundColor$lastColor = $sl.Colors.WithBackgroundColor}# Writes the postfix to the prompt$prompt += Write-Prompt -Object $sl.PromptSymbols.SegmentForwardSymbol -ForegroundColor $lastColor$prompt += ' '$prompt
}$sl = $global:ThemeSettings #local settings
$sl.PromptSymbols.SegmentForwardSymbol = [char]::ConvertFromUtf32(0xE0B0)
$sl.Colors.SessionInfoBackgroundColor = [ConsoleColor]::DarkGray
$sl.Colors.PromptForegroundColor = [ConsoleColor]::White
$sl.Colors.PromptSymbolColor = [ConsoleColor]::White
$sl.Colors.PromptHighlightColor = [ConsoleColor]::DarkBlue
$sl.Colors.GitForegroundColor = [ConsoleColor]::Black
$sl.Colors.WithForegroundColor = [ConsoleColor]::White
$sl.Colors.WithBackgroundColor = [ConsoleColor]::DarkRed
$sl.Colors.VirtualEnvBackgroundColor = [System.ConsoleColor]::Red
$sl.Colors.VirtualEnvForegroundColor = [System.ConsoleColor]::White

7. 最终效果


参考链接

  • PowerShell 美化指南
  • README - oh-my-posh

本文链接:https://my.lmcjl.com/post/6950.html

展开阅读全文

4 评论

留下您的评论.