PowerShell简单美化

281

一直以来,我都不太习惯使用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? "

其次,我们需要统一所有命令结果中的空行数量,使得界面尽可能简洁美观。这一部分为两个部分:

  1. 清除所有的多余空行(前后空行+连续空行),同样是在配置文件中添加下述函数对返回结果进行统一格式化:(注意,其中 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()
        }
    }
}
  1. 在你的主题样式中,根据需求在每行开始处添加一个空行 \n,这样就可以变相实现提示词、输出后都会有一个空行的效果。当然此处仅为实现该效果的方式之一,你也可以选择修改上述函数,进行输出结果进一步的格式化处理,从而实现类似效果。此处以ys主题为例:
"segments": [
        {
          "foreground": "lightBlue",
          "style": "plain",
          "template": "\n# ",
          "type": "text"
        },
]

默认每行以 #开头,在前面添加换行即可。

5. 功能拓展

最后,在美化的基础上,如果想要一些自动补全、提示的功能,可以通过微软官方推荐的方式安装PSReadLine ,命令如下:

Install-Module -Name PSReadLine -AllowClobber -Force

注意在管理员权限下执行。