PowerShell简单美化
一直以来,我都不太习惯使用PowerShell进行命令行操作。无论是每次打开都会存在的CopyRight,还是不同命令结果中数量不等的空行,对于我这个强迫症而言都有点过于难受了。不过由于最近从Java转Go,开始尝试使用Vscode进行编程,与PowerShell的交互不可避免的多了起来,恰好也找到了一些相对而言比较合适的美化配置方案,因此进行一个简单记录。
1. 前置条件
参照官网引导,安装Windows下的软件(包)管理工具Scoop。命令如下:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
irm get.scoop.sh | iex
2. oh-my-posh安装
官方提供了通过Scoop的一键安装方法,命令如下:
scoop install https://github.com/JanDeDobbeleer/oh-my-posh/releases/latest/download/oh-my-posh.json
安装完成后会自动配置环境变量,重启终端即可。
3. oh-my-posh配置
想要启用oh-my-posh并进行进一步美化,我们需要修改PowerShell的配置文件(默认不存在)。在命令行中执行下述命令:
notepad $PROFILE
会自动创建并打开一个配置文件(空),往其中添加
oh-my-posh init pwsh | Invoke-Expression
保存后重启终端(PowerShell),即可看到默认样式。
默认字体配合初始的oh-my-posh主题会出现乱码问题,可以通过Scoop安装第三方字体解决,或者选用一个简洁、明了点的主题。执行下述命令:
Get-PoshThemes
可以展示所有主题在当前命令行和字体配置下的显示效果,从中选择一个最合适的,按照提示进行配置即可。
4. 进一步美化
首先,我们需要移除PowerShell 默认的CopyRight提示信息。使用终端的用户,在设置-配置文件(Windows PowerShell)-命令行的可执行文件路径后添加 -Nologo
。随后重启,即可清除默认提示信息。如果你想要加入一些个性化定制的提示信息,可以在上述提到的配置文件中添加,示例如下:
Get-Date -Format 'yyyy/MM/dd hh:mm:ss'
Write-Host "Hello $env:UserName, have you practiced on LeetCode today? "
其次,我们需要统一所有命令结果中的空行数量,使得界面尽可能简洁美观。这一部分为两个部分:
- 清除所有的多余空行(前后空行+连续空行),同样是在配置文件中添加下述函数对返回结果进行统一格式化:(注意,其中
Write-Host $_.Trim()
会删除每一行的前后空格,可能会导致一些格式问题,如果担心可以删去)
function Out-Default {
$emptyLineFound = $false
$firstNonEmptyLineFound = $false
$Input | Out-String -Stream | ForEach-Object {
if ($_.Trim().Length -eq 0) {
$emptyLineFound = $true
} else {
if ($emptyLineFound) {
if($firstNonEmptyLineFound){
Write-Host ""
}
$emptyLineFound = $false
$firstNonEmptyLineFound = $true
}
Write-Host $_.Trim()
}
}
}
- 在你的主题样式中,根据需求在每行开始处添加一个空行
\n
,这样就可以变相实现提示词、输出后都会有一个空行的效果。当然此处仅为实现该效果的方式之一,你也可以选择修改上述函数,进行输出结果进一步的格式化处理,从而实现类似效果。此处以ys主题为例:
"segments": [
{
"foreground": "lightBlue",
"style": "plain",
"template": "\n# ",
"type": "text"
},
]
默认每行以 #
开头,在前面添加换行即可。
5. 功能拓展
最后,在美化的基础上,如果想要一些自动补全、提示的功能,可以通过微软官方推荐的方式安装PSReadLine ,命令如下:
Install-Module -Name PSReadLine -AllowClobber -Force
注意在管理员权限下执行。